Módulo:Ficha de libro

De Wikipedia, la enciclopedia libre
Icono de documentación de módulo Documentación del módulo[ver] [editar] [historial] [purgar]

A continuación se muestra la documentación transcluida desde la subpágina /doc. [salta a la caja de código]


Uso


Esta documentación está transcluida desde Módulo:Ficha de libro/doc.
Por favor, añade las categorías en la subpágina de documentación y los interwikis en Wikidata. Subpáginas de este módulo.

local z = {}

local argumentos    -- Tabla de argumentos con los que se llama a la función 
local argumento={}  -- Argumentos eliminando los argumentos sin datos
local Entidad       -- Tabla con los datos en Wikidata del libro.
--                         Ver Wikidata:WikiProject Books para las propicedades posibles
local etiqueta

-- Módulos y funciones externas
local ModuloArgumentos        = require('Módulo:Argumentos')
local ModuloFicha             = require('Módulo:Ficha')	
local ModuloIdentificadores   = require('Módulo:Identificadores')
local ModuloPaginas           = require('Módulo:Páginas')	
local ModuloWikidataFormatos  = require('Módulo:Wikidata/Formatos')
	local formatoObraAnyo     = ModuloWikidataFormatos.formatoObraAgnyo
local ModuloWikidata          = require('Module:Wikidata')
	local addLinkbackWikidata = ModuloWikidata.addLinkback
	local categorizarWikidata = ModuloWikidata.categorizar
	local formatoIdEntidad    = ModuloWikidata.formatoIdEntidad	
	local getPropiedadWikidata= ModuloWikidata.getPropiedad
local ModuloTablas            = require('Module:Tablas')
	local elementoTabla       = ModuloTablas.elemento
    local enTabla             = ModuloTablas.en
    local insertarEn          = ModuloTablas.insertar
local ModuloFormatoTexto      = require('Módulo:Formato texto')
	local enlazarTexto        = ModuloFormatoTexto.enlazar
	local enVariasLineasTexto = ModuloFormatoTexto.enVariasLineas
local sinBandera             = require('Módulo:Bandera').sinBandera

-- Constantes
local debeExistir     = {['debeExistir'] = 'sí', ['formatoTexto'] = 'mayúscula', ['linkback']='sí'}
local enMayusculas    = {['formatoTexto'] = 'mayúscula', ['linkback']='sí'}
local enlazar         = {['enlace']='sí', ['linkback']='sí'}
local normal          = {['linkback']='sí'}
local listaNoOrdenadaEnlazada = {['enlace']='sí', ['lista'] = 'no ordenada', ['linkback']='sí'}

local categoriasGeneros2 = {
	  [693    ] = 'Fábulas'
    , [1072723] = 'Libros de viajes' -- literatura de viajes
    , [1164267] = 'Libros de viajes' -- libro de viajes
	, [131539 ] = 'Obras infantiles' -- literatura infantil
	, [995600 ] = 'Libros de divulgación científica' -- divulgación científica
	, [254554 ] = 'Álbumes ilustrados' -- álbum ilustrado
}

local tablaGeneros={ -- Tabla de géneros exceptuando los subgéneros.
      'Q8261'    -- Novela
	, 'Q482'   -- Poesía
	, 'Q49084'   -- Cuento
	, 'Q11635'   -- Teatro
	, 'Q1279564' -- Colección de cuentos
	, 'Q37484' -- Epopeyas
	, 'Q213051' -- No ficción
}

local categoriasGenerosNovelas = {
	 [3056541] = 'Novelas autobiográficas'	
	,[4184   ] = 'Novelas autobiográficas'	--autobiografía
	,[908667 ] = 'Novelas bélicas'
	,[4914883] = 'Novelas biográficas'
	,[174526 ] = 'Novelas ciberpunk'
	,[26228231] = 'Novelas ciberpunk' -- novela ciberpunk
	,[1077883] = 'Novelas ciberpunk' -- biopunk
	,[26228228] = 'Novelas ciberpunk' -- novela biopunk	
	,[1341831] = 'Novelas ciberpunk' -- postciberpunk
	,[27022710] = 'Novelas ciberpunk' -- novela postciberpunk	
	,[223945 ] = 'Novelas de aprendizaje'
	,[1312571] = 'Novelas de aprendizaje' 	-- novela de desarrollo
	,[319226 ] = 'Novelas de aventuras'
	,[1436734] = 'Novelas de aventuras' -- aventura. FALTA468478 corregir el enlace par que enlace a novela de aventuras.
	,[24925  ] = 'Novelas de ciencia ficción'
	,[12132683]= 'Novelas de ciencia ficción'
	,[3238422]= 'Novelas de ciencia ficción' -- literatura de ciencia ficción
	,[905770 ] = 'Novelas de ciencia ficción' -- ciencia ficción blanda
	,[468478 ] = 'Novelas de ciencia ficción' -- space opera
	,[725757 ] = 'Ciencia ficción dura' -- ciencia ficción dura
	,[2435402] = 'Novelas de ciencia ficción feministas' -- ciencia ficción feminista
	,[2561390] = 'Novelas de humor'
	,[40831  ] = 'Novelas de humor'		  -- Comedia
	,[6585139] = 'Novelas de misterio'
	,[182015 ] = 'Novelas de suspenso'
	,[193606 ] = 'Novelas de terror'      -- literatura de terror
	,[16575965 ] = 'Novelas de terror'      -- ficción de terror
	,[20667180] = 'Novelas de terror'     -- novela de terror	
	,[1425557] = 'Novelas de vampiros'
	,[10453828] = 'Novelas de viajes en el tiempo'-- novela de viajes en el tiempo
	,[253732 ] = 'Novelas de viajes en el tiempo' -- Viaje en el tiempo en la ficción
	,[182154 ] = 'Novelas de viajes en el tiempo' -- Viaje a través del tiempo	
	,[180774 ] = 'Novelas distópicas'             -- Distopía
	,[20443047] = 'Novelas distópicas' -- literatura distópica
	,[26928598 ] = 'Novelas distópicas'           -- novela distópica
	,[25372  ] = 'Novelas dramáticas'	
	,[465821 ] = 'Novelas epistolares'
	,[747483 ] = 'Novelas eróticas' -- literatura erótica
	,[11452132 ] = 'Novelas eróticas'    -- novela erótica	
	,[1426213] = 'Novelas de espionaje'
	,[11825887]= 'Novelas fantásticas' -- novela fantástica	
	,[10992055]= 'Novelas fantásticas' -- novela fantástica	
	,[132311 ] = 'Novelas fantásticas' -- Género fantástico	
	,[1057172] = 'Novelas fantásticas' -- Literatura fantástica
	,[603291 ] = 'Novelas fantásticas' -- fantasía histórica
	,[794912 ] = 'Novelas fantásticas' -- dark fantasy/fantasía oscura
	,[2625243] = 'Novelas fantásticas' -- fantasía heroica
	,[2016518] = 'Novelas filosóficas'
	,[20669641]= 'Novelas góticas'	  -- Ficción gótica	
	,[192782 ] = 'Novelas góticas'	  -- Narrativa gótica
	,[276709 ] = 'Novelas góticas'    -- Gótico sureño
	,[1196408] = 'Novelas históricas' -- Ficción histórica
	,[192239 ] = 'Novelas históricas'
	,[131539]  = 'Novelas infantiles' -- Literatura infantil
	,[21615367] = 'Novelas infantiles' -- novela infantil
	,[11825892] = 'Novelas juveniles' -- novela juvenil
	,[1233720] = 'Novelas juveniles' -- Literatura juvenil
	,[1940294] = 'Novela negra'
	,[1619888] = 'Novelas pastoriles'	
	,[208505 ] = 'Novelas policíacas' -- Novela policíaca
	,[186424 ] = 'Novelas policíacas' -- El detective de ficción
	,[5937792 ] = 'Novelas policíacas' -- Género policíaco	
	,[26906554] = 'Novelas posapocalípticas' -- novela posapocalíptica
	,[197949]   = 'Novelas posapocalípticas' -- ficción posapocalíptica
	,[113013 ] = 'Novelas posmodernas' -- Literatura posmoderna
	,[286328 ] = 'Novelas psicológicas'
	,[147516]  = 'Novelas de realismo mágico'	
	,[858330 ] = 'Novelas románticas'
	,[6045975] = 'Novelas satíricas' -- novela satírica
	,[128758 ] = 'Novelas satíricas' -- Sátira
	,[7225114] = 'Novelas satíricas' -- Sátira política
	,[223685] = 'Novelas steampunk' -- steampunk
	,[27020789] = 'Novelas steampunk' -- novela steampunk	
	,[3440959] = 'Novelas de suspenso' -- Novela de suspense
	,[2490520] = 'Novelas de thriller legal' -- thriller legal
	,[590103]  = 'Novelas de suspenso psicológico' -- suspense psicológico, thriller psicológico
	,[580850 ] = 'Novelas tecno-thriller' -- tecno-thriller
	,[224989 ] = 'Novelas ucrónicas'
	,[16681629 ] = 'Novelas ucrónicas' --literatura ucrónica
	,[26225470 ] = 'Novelas ucrónicas' --Novela ucrónica
	,[667661] = 'Novelas del Realismo' --realismo literario
	,[3940779] = 'Novelas del Realismo' --novela realista
	,[26987767] = 'Novelas feministas'
	,[26987750] = 'Novelas feministas' --literatura feminista
	,[7252] = 'Novelas feministas' --feminismo
}

local categoriasTemasNovelas = {
	  [2763]   = 'Novelas sobre el Holocausto'	
 	, [180046] = 'Novelas de exploración espacial' -- exploración espacial
	, [362   ] = 'Novelas de la Segunda Guerra Mundial' -- Segunda Guerra Mundial
	, [10453828] = 'Novelas de viajes en el tiempo'-- novela de viajes en el tiempo	
	, [253732] = 'Novelas de viajes en el tiempo' --viaje en el tiempo en la ficción
	, [182154] = 'Novelas de viajes en el tiempo' --viaje a través del tiempo	
	, [10859 ] = 'Novelas sobre la guerra civil española'	
}
	
function z.Ficha(frame)
--  Hacer que funcione la función formatBandera	
    ModuloWikidata:setFrame(frame)  -- No funciona si se pone ModuloWikidata.setFrame(marco)
    
    --Obtener una copia de los argumentos eliminando los argumentos sin valor
    local argumento = ModuloArgumentos.obtenerArgumentosConValor(frame)
    
    -- Obtener los datos de la página donde se inserta la ficha de Wikidata.
    Entidad = mw.wikibase.getEntityObject(argumento.id) or {}
    
    --if true then return ModuloTablas.tostring(Entidad) end
  
    corregirIdiomaWikidata(Entidad, 'P364') -- Obsoleto
    corregirIdiomaWikidata(Entidad, 'P407')
    
    local generoWikidata, subgeneroWikidata, temaWikidata = obtenerGeneroWikidata()
    
    genero    = argumento['género'] or 
                argumento['genero'] or
                argumento['Género'] or
                generoWikidata
    subgenero = argumento['subgénero'] or
                argumento['subgenero'] or
                argumento['Subgénero'] or
                subgeneroWikidata

    -- Comprobar que la instancia es una serie o un libro
    
    local declaracionesInstancias = elementoTabla(Entidad, 'claims', 'P31')
    local declaracionesFormas = elementoTabla(Entidad, 'claims', 'P7937')
    local identificadorInstancia, esUnaSerie, esUnLibro, esUnLibroDeCuentos
    
    if declaracionesInstancias then
    	for k,v in pairs(declaracionesInstancias) do
    		identificadorInstancia = elementoTabla(v, 'mainsnak', 'datavalue','value','id')
    		if identificadorInstancia == 'Q277759' or -- serie de libros
    		   identificadorInstancia == 'Q2475679' or -- ciclo literario. Ekumen
    		   identificadorInstancia == 'Q1667921' then -- serie de novelas
    			esUnaSerie = true
    		end
    		if identificadorInstancia == 'Q571' or -- libro
    			identificadorInstancia == 'Q12106333' then -- poemario
    			esUnLibro = true
    		end
    		if identificadorInstancia == 'Q1279564' or -- libro de cuentos
    		   identificadorInstancia == 'Q27560760' then -- libro de cuentos de hadas
    			esUnLibroDeCuentos = true
    		    esUnLibro = true
    		end
    	end
    end
    
    if declaracionesFormas then
    	for k,v in pairs(declaracionesFormas) do
    		identificadorForma = elementoTabla(v, 'mainsnak', 'datavalue','value','id')
    		if identificadorForma == 'Q277759' or -- serie de libros
    		   identificadorForma == 'Q2475679' or -- ciclo literario. Ekumen
    		   identificadorForma == 'Q1667921' then -- serie de novelas
    			esUnaSerie = true
    		end
    		if identificadorForma == 'Q571' or -- libro
    			identificadorForma == 'Q12106333' then -- poemario
    			esUnLibro = true
    		end
    		if identificadorForma == 'Q1279564' or -- libro de cuentos
    		   identificadorForma == 'Q27560760' then -- libro de cuentos de hadas
    			esUnLibroDeCuentos = true
    		    esUnLibro = true
    		end
    	end
    end
             
    if esUnaSerie then
    	ColorFondoTitulos   = '#C63A3A'
    	ColorTitulos        = '#ffffff' -- blanco
    	ColorFondoSubtitulo = '#F49494'  
    elseif not genero then
    	ColorFondoTitulos = 'LightSteelBlue'
    	ColorTitulos        = '#000'
    	ColorFondoSubtitulo = '#d8e2ee'    	
    elseif genero:find('[Rr]elato')  or 
    	   genero:find('[Cc]uento')  or
    	   genero:find('[Ll]eyenda') or 
    	   genero:find('[Aa]ntología') then
        ColorFondoTitulos = 'LightSalmon'
        ColorTitulos        = '#000'
    	ColorFondoSubtitulo = '#f9d9cb'        	
    elseif genero:find('[Tt]eatro') then
        ColorFondoTitulos = '#FBCEB1'
        ColorTitulos        = '#000'
    	ColorFondoSubtitulo = '#f9d9cb'      
    elseif genero:find('didáctico') or
    	   genero:find('[Ee]nsayo')  or 
    	   genero:find('[Dd]ivulgación')  or
    	   genero:find('[Cc]rítica')  or
    	   genero:find('[Tt]ratado') or
    	   genero:find('[Cc]rónica') then
        ColorFondoTitulos = 'NavajoWhite'
        ColorTitulos        = '#000'
    	ColorFondoSubtitulo =  '#FBE7C9'
    elseif genero:find('[Pp]oesía') or
    	genero:find('[Ee]popeya') or
        genero:find('[Ll]írico') or
        genero:find('[Ll]írica') or
    	genero:find('[Pp]oema') then
    	ColorFondoTitulos = 'darkseagreen'
    	ColorTitulos        = '#000'
    	ColorFondoSubtitulo = '#afdeaf'
    else
    	ColorFondoTitulos = 'LightSteelBlue'
    	ColorTitulos        = '#000'
    	ColorFondoSubtitulo = '#d8e2ee'
    end
    
    Autor = argumento['autor']   or 
            argumento['autores'] or 
            argumento['Autor']   or
            argumento['Autores'] or
            propiedad('P50',{['enlace']='sí', 
               ['calificativo'] = 'P742' -- seudónimo
               , ['linkback']='sí'
            })
            
    if Autor and argumento['Acotaciones al autor'] then
    	Autor = Autor .. '<br /><small>' .. argumento['Acotaciones al autor'] .. '</small>'
    end
    
    if  argumento['publicación original'] or argumento['tipo original'] or 
        argumento['tipo de publicación original'] or argumento['editorial original'] or 
        argumento['ilustrador original'] or argumento['ciudad original'] or 
        argumento['país original'] or argumento['fecha original'] or
        argumento['formato original'] or argumento['páginas original'] or
        argumento['Año original']     or argumento['Año de publicación original'] or
        argumento['Ilustrador original'] or argumento['Ilustrador de la publicación original'] or        
        argumento['Artista de cubierta original'] or argumento['Artista de cubierta de la publicación original'] or
        argumento['Editorial original'] or argumento['Editorial de publicación original'] or
        argumento['Ciudad original'] or argumento['Ciudad de publicación original'] or
        argumento['País original'] or argumento['País de publicación original'] or
        argumento['Formato original'] or 
        argumento['Páginas original']
        then
        	
       EdicionOriginal = true
    end
    
    if argumento['Título traducción']              or argumento['Título de la traducción']             or 
       argumento['Año traducción']                 or argumento['Año de publicación de la traducción'] or
       argumento['Traductor']                      or argumento['traductor']                           or
       argumento['Ilustrador traducción']          or argumento['Ilustrador de la traducción']         or
       argumento['Artista de cubierta traducción'] or argumento['Artista de cubierta de la traducción'] or
       argumento['Editorial traducción']           or argumento['Editorial de la traducción']           or
       argumento['Ciudad traducción']              or argumento['Ciudad de publicación de la traducción'] or
       argumento['País traducción']                or argumento['País de publicación de la traducción']   or
       argumento['Formato traducción']             or argumento['Formato de la traducción'] or
       argumento['Páginas traducción']   or argumento['Número de páginas de la traducción']
                           then
    	EdicionTraduccion = true
    end
    
    if EdicionOriginal or EdicionTraduccion then
        IdiomaOriginal =
                         enlazarIdioma(
        	                 argumento['lengua'] or 
        	                 argumento['idioma'] or 
        	                 argumento['idioma original'] or
        	                 argumento['Idioma original'], 'no') or
        propiedad('P407',{['enlace']='sí', ['linkback']='sí'}) or
        propiedad('P364',{['enlace']='sí', ['linkback']='sí'}) -- Obsoleto

        IlustradorOriginal = argumento['ilustrador original'] or 
                             argumento['Ilustrador original'] or
                             argumento['Ilustrador de la publicación original'] or
                             propiedad('P110',enlazar)
                            
        ArtistaOriginal    = argumento['artista original'] or
                             argumento['Artista de cubierta original'] or
                             argumento['Artista de cubierta de la publicación original'] or
                             propiedad('P736',enlazar)
        
        PublicacionOriginal      = argumento['Publicación original'] or
                                   argumento['publicación original'] or
                                   propiedad('P1433',enlazar)

        TipoPublicacionOriginal  = argumento['Tipo de publicación original'] or 
                                   argumento['tipo de publicación original'] or 
                                   argumento['tipo original']

        EditorialOriginal        = argumento['editorial original'] or 
                                   argumento['Editorial original'] or
                                   argumento['Editorial de publicación original'] or
                                   propiedad('P123',listaNoOrdenadaEnlazada)

        LugarPublicacionOriginal = argumento['ciudad original'] or 
                                   argumento['Ciudad original'] or
                                   argumento['Ciudad de publicación original'] or
                                   propiedad('P291')
                                   
        PaisOriginal             = sinBandera(argumento['país original'] or
                                   argumento['País original'] or
                                   argumento['País de publicación original']) or
                                   propiedad('P495')

        AnyoOriginal             = argumento['Año original'] or 
                                   argumento['Año de publicación original']

        FechaOriginal            = argumento['Fecha original'] or 
                                   argumento['fecha original'] or 
                                   AnyoOriginal or
                                   propiedad('P577', {['formatoTexto'] = 'mayúscula', ['linkback']='sí',
        							['calificativo'] = 'P437', -- distribución
        							['lista'] = 'no ordenada',
        							['enlace'] = 'no'
        							})
                                   
        FormatoOriginal          = argumento['formato original'] or 
                                   argumento['Formato original'] or
                                   propiedad('P437', enMayusculas) -- Distribución (cartoné, etc)
                                   
        PaginasOriginal          = argumento['páginas original'] or 
                                   argumento['Número de páginas original'] or
                                   propiedad('P1104')

        PremiosOriginal = argumento['Premios'] or
                          argumento['premios'] or
                          propiedad('P166', {
                          	['lista']         = 'no ordenada',
                          	['valor-módulo']  = 'Wikidata/Formato premio',
                          	['valor-función'] = 'formatoPremio',
                            ['calificativo']  = 'P585', -- Fecha de ocurrencia                          	          
                          	['enlace']        = 'sí',
                          	['ordenar']       = 'por fecha',
                          	['linkback']='sí'})
        
        Artista          = argumento['artista_cubierta']                     or
        		           argumento['artista']                              or
        		           argumento['Artista de cubierta traducción']       or 
        		           argumento['Artista de cubierta de la traducción']
        Ilustrador       = argumento['ilustrador']                  or
                           argumento['Ilustrador traducción']       or
                           argumento['Ilustrador de la traducción']
        Editorial        = argumento['editorial']                  or
                           argumento['Editorial traducción']       or 
                           argumento['Editorial de la traducción']
        LugarPublicacion = argumento['ciudad']                                 or
                           argumento['Ciudad traducción']                      or 
                           argumento['Ciudad de publicación de la traducción']
        Publicacion      = argumento['publicación']
        Pais             = sinBandera(argumento['país'] or 
                           argumento['pais'] or
                           argumento['País traducción'] or 
                           argumento['País de publicación de la traducción'])
        Fecha            = argumento['fecha_publicación'] or 
                           argumento['fecha publicacion'] or 
                           argumento['fecha']             or
                           argumento['Año traducción'] or 
                           argumento['Año de publicación de la traducción']
        Paginas          = argumento['páginas']                            or
                           argumento['Páginas traducción']       or 
                           argumento['Páginas de la traducción']

        if IdiomaOriginal then
        	if IdiomaOriginal:find('[e]spañol') or IdiomaOriginal:find('[Cc]astellano') then
        		WikisourceOriginal = obtenerWikisource('español')
        	else
        		WikisourceOriginal = obtenerWikisource(IdiomaOriginal)
        		Wikisource         = obtenerWikisource('español')
        	end
        end
    else
        IdiomaOriginal   = enlazarIdioma(argumento['lengua'] or 
        	                             argumento['idioma'] or 
        	                             argumento['idioma original'], 'sí') or
        				   propiedad('P407',enMayusculas) or
        				   propiedad('P364',enMayusculas) -- Obsoleto
        Artista          = argumento['artista_cubierta'] or
        		           argumento['artista'] or
        		           propiedad('P736',enlazar)
        Ilustrador       = argumento['ilustrador'] or propiedad('P110',enlazar)
        Editorial        = argumento['editorial'] or propiedad('P123',listaNoOrdenadaEnlazada)
        LugarPublicacion = argumento['ciudad'] or propiedad('P291',enlazar)
        Publicacion      = argumento['publicación'] or propiedad('P1433',enlazar)
        Pais             = sinBandera(argumento['país'] or argumento['pais']) or propiedad('P495')
        Fecha            = argumento['fecha_publicación'] or 
                           argumento['fecha publicacion'] or 
                           argumento['fecha'] or
                           propiedad('P577', {['formatoTexto'] = 'mayúscula', ['enlace']='no', ['linkback']='sí'})
        Formato          = argumento['formato']    or 
            	           argumento['tipo_medio'] or
            	           argumento['Formato traducción'] or 
            	           argumento['Formato de la traducción'] or
            	           propiedad('P437', enMayusculas) -- Distribución (cartoné, etc)
                          
        Paginas          = argumento['páginas'] or argumento['paginas'] or propiedad('P1104')
        Premios         =  argumento['premios'] or
                           propiedad('P166', {
                            ['lista']         = 'no ordenada',
                          	['valor-módulo']  = 'Wikidata/Formato premio',
                          	['valor-función'] = 'formatoPremio',
                            ['calificativo']  = 'P585', -- Fecha de ocurrencia
                            ['enlace']        = 'sí',
                            ['ordenar']       = 'por fecha',
                            ['linkback']='sí'})
                            
        if IdiomaOriginal and (IdiomaOriginal:find('[Ee]spañol') or IdiomaOriginal:find('[Cc]astellano')) then
        	-- Libro en español
        	Wikisource         = obtenerWikisource('español')
        elseif IdiomaOriginal then
        	-- Libro no en español sin datos de la edición en español
        	WikisourceOriginal = obtenerWikisource(IdiomaOriginal)
        	Wikisource         = obtenerWikisource('español')
        end
    end
    
    -- Titulo         --> Título del libro en español
    -- TituloOriginal --> Título original del libro si no está en español
    
    etiquetaWikidata = obtenerEtiquetaWikidata()
    
    if IdiomaOriginal and (IdiomaOriginal:find('[Ee]spañol') or IdiomaOriginal:find('[Cc]astellano')) then
    	--Libro escrito en español
        Titulo      =  argumento['título original'] or
                       argumento['título_orig']     or
                       argumento['titulo_orig']     or
                       argumento['título orig']     or
                       argumento['Título original'] or
                       argumento['título']          or 
                       argumento['nombre']          or
                       propiedad('P1476')           or 
                       etiquetaWikidata             or
                       ModuloPaginas.nombrePagina({desambiguar='sí'})
    else
    	--Libro no escrito en español
    	-- o del que se desconoce el idioma
        TituloOriginal  = argumento['título original'] or
                          argumento['título_orig']     or
                          argumento['titulo_orig']     or
                          argumento['título orig']     or
                          argumento['Título original'] or
                          obtenerTitulo()

        Titulo       = argumento['título']          or 
                       argumento['nombre']          or
                       etiquetaWikidata             or
                       ModuloPaginas.nombrePagina({desambiguar='sí'})    	
    end

	local Contenido = argumento['Contenido'] or argumento['contenido']
	if Contenido and (Contenido == '' or Contenido == 'no') then
		Contenido = ''
	elseif not Contenido then
		Contenido = propiedad('P527',{['enlace']='sí', ['lista'] = 'no ordenada', ['valor-función'] = formatoObraAnyo,})
	end

    local FichaLibro = {
    	entidad         = argumento.id,
        titulo          = Titulo,
        clasetitulo     = 'libro',
        estilotitulo    = 'background-color:' .. ColorFondoTitulos .. '; color:' .. ColorTitulos .. '; font-style:italic',
        subtitulo       = Autor and '<small>de</small>&nbsp;' .. "'''" .. Autor .. "'''",
        estilosubtitulo = 'font-size:105%; background-color:' .. ColorFondoSubtitulo .. ';',
        estiloseccion   = 'background-color:' .. ColorFondoTitulos .. '; color:' .. ColorTitulos .. ';',
        estiloetiqueta  = 'width:35%',
        estilodatos     = 'width:65%',
        imagen          = argumento['imagen'] or argumento['Imagen'] or propiedad('P18', {uno='sí'}),
        ['tamañoimagen']= argumento['Tamaño de imagen'] or '220px', -- FALTA {{px|{{{Tamaño de imagen}}}}}
        pie             = argumento['texto_imagen'] or argumento['texto imagen'] or 
                          argumento['pie de imagen'] or argumento['Pie de imagen'],
        estilopie       = 'font-size:88%',
        {'Editor(es)', argumento['Editor']   or
        	           argumento['editor']   or 
        	           argumento['Editores'] or 
                       argumento['editores'] or
                       propiedad('P98')
                       },
        {'Fotografía', argumento['Fotografía'] or
        	           argumento['fotografía']},
        {'Género'    , genero},
        {'Subgénero' , subgenero},
        {'Basado en' , propiedad('P144', {['formatoTexto'] = 'cursivas',['enlace']='sí', ['debeExistir'] = 'sí',['linkback']='sí'})},
        {'Tema(s)'   , argumento['tema'] or
        	           argumento['Tema'] or
        	           temaWikidata
        	           },
        {'Universo ficticio', propiedad('P1434', debeExistir)},
        {'Ambientada en', enVariasLineasTexto({propiedad('P2408', enMayusculas),propiedad('P840', enMayusculas)})},
        {tipo='sección',
            -- El título de la sección solo se muestra si hay datos de las dos ediciones.        	
            titulo = (EdicionOriginal or EdicionTraduccion) and IdiomaOriginal and 'Edición original en ' .. IdiomaOriginal,
            {'Idioma', not EdicionOriginal and not EdicionTraduccion and IdiomaOriginal},
            {'Título original'     , TituloOriginal,
                                     estilodatos='font-style:italic'},
            {'Ilustrador', IlustradorOriginal},  -- FALTA si enlazar
            {'Cubierta'            , ArtistaOriginal},
            {'Publicado en'        , PublicacionOriginal
            	                   , estilodatos='font-style:italic'},
            {'Tipo de publicación' , TipoPublicacionOriginal},
            {'Editorial'           , EditorialOriginal, clase='plainlist'},
            {'Ciudad'              , LugarPublicacionOriginal},	
            {'País'                , PaisOriginal},
            {'Fecha de publicación', FechaOriginal, clase='plainlist'},
            {'Formato'             , FormatoOriginal},
            {'Páginas'             , PaginasOriginal},
            {'Premios'             , PremiosOriginal, clase='plainlist'},
            {'Texto original'      , WikisourceOriginal}            
        },
        {tipo='sección',
            -- El título de la sección solo se muestra si hay datos de las dos ediciones.
        	titulo        = (EdicionOriginal or EdicionTraduccion) and 'Edición traducida al [[idioma español|español]]',
        	{'Título'         ,argumento['Título traducción']  or 
                       argumento['Título de la traducción'], estilodatos='font-style:italic'},
        	{'Traducido por'         , argumento['traductor'] or argumento['Traductor']},
        	{'Adaptación'            , argumento['adaptación'] or
        		                   argumento['adaptador']},
        	{'Ilustrador'            , Ilustrador},
        	{'Artista de la cubierta', Artista},
        	{'Publicado en'          , Publicacion
        		                     , estilodatos='font-style:italic'},
        	{'Tipo de publicación'   , argumento['tipo de publicación'] or
        		                   argumento['tipo']},
        	{'Editorial', Editorial, clase='plainlist'},
        	{'Ciudad'              , LugarPublicacion},
        	{'País'                , Pais},
            {'Fecha de publicación', Fecha},
            {'Formato'             , Formato},
            {'Páginas'             , Paginas},
            --{'Tamaño y peso',       argumento['tamano_peso']},  -- Usar los parámetros para el formato
            {'Premios'             , Premios, clase='plainlist'},
            {'Texto en español'    , Wikisource}
        },
        
        {tipo='sección',
        	titulo        = 'Contenido',
        	{'', Contenido, clase='plainlist'}
        }
    }
        
    -- Series de libros
    
    if Entidad and Entidad.claims and Entidad.claims.P179 and Entidad.claims.P179[1]  then
    	declaracionSerie1 = Entidad.claims.P179[1]
    	
    	tituloSerie       = "''" .. formatoIdEntidad('Q' .. declaracionSerie1.mainsnak.datavalue.value['numeric-id'],
    	    	{['enlace'] = 'sí'}) .. "''"
    	
    	if declaracionSerie1.qualifiers and declaracionSerie1.qualifiers.P155 and declaracionSerie1.qualifiers.P155[1] and declaracionSerie1.qualifiers.P155[1].datavalue then 
    	    precedidaPor      = formatoIdEntidad('Q' .. declaracionSerie1.qualifiers.P155[1].datavalue.value['numeric-id'],
    	    	{['enlace'] = 'sí'})
    	end

    	if declaracionSerie1.qualifiers and declaracionSerie1.qualifiers.P156 and declaracionSerie1.qualifiers.P156[1] and declaracionSerie1.qualifiers.P156[1].snaktype == 'value' then     	
    	    sucedidaPor       = formatoIdEntidad('Q' .. declaracionSerie1.qualifiers.P156[1].datavalue.value['numeric-id'],
    	    	{['enlace'] = 'sí'})
    	end
    	
    	if precedidaPor or sucedidaPor then
            serieConCualificador = true      
        
            table.insert(FichaLibro,    
                {tipo   = 'sección',
        	     titulo = tituloSerie,
        	     {tipo  = 'sucesión',
        	        anterior          = precedidaPor,
        	        siguiente         = sucedidaPor,
                    color             = ColorFondoSubtitulo,
                    ['estilo fuente'] = 'italic'
                  }            
                }
            )        
        end
    end
    
    if not serieConCualificador then  
    table.insert(FichaLibro,
        {tipo='sección',
        	titulo                = argumento['serie']           or 
        	                        argumento['Serie de libros'] or
        	                        propiedad('P179',{['formatoTexto'] = 'cursivas',['enlace']='sí'}) or
        	                        'Serie',
        	{tipo = 'sucesión',
        	    anterior          = argumento['precedido_por'] or  -- FALTA ver El Mago de la Serpiente
        	                        argumento['anterior']      or 
        	                        argumento['Libro que le precede'] or
        	                        argumento['Libro que le precede en la serie'] or
        	                        propiedad('P155',enlazar)
        	                        ,
        	    siguiente         = argumento['seguido_por'] or 
        	                        argumento['posterior']   or 
        	                        argumento['siguiente']   or 
        	                        argumento['Libro que le sigue'] or
        	                        argumento['Libro que le sigue en la serie'] or
        	                        propiedad('P156',enlazar)
        	                        ,
                color             = ColorFondoSubtitulo,
                ['estilo fuente'] = 'italic'
            }
        }
    )
    end

    table.insert(FichaLibro,    
        {tipo='sección',
        	titulo                = argumento['Serie de libros 2'] or
        	                        'Serie',
        	{tipo = 'sucesión',
        	    anterior          = argumento['Libro que le precede 2'] or
        	                        argumento['Libro que le precede en la serie 2'],
        	    siguiente         = argumento['Libro que le sigue 2'] or
        	                        argumento['Libro que le sigue en la serie 2'],
                color             = ColorFondoSubtitulo,
                ['estilo fuente'] = 'italic'
            }            
        }
    )
    table.insert(FichaLibro,        
        {tipo='sección',
        	titulo                = argumento['Autor'] and 'Cronología&nbsp;de ' .. argumento['Autor'],
        	{tipo = 'sucesión',
        	    anterior          = argumento['Libro anterior'] or
        	                        argumento['Libro que le precede en la cronología'],
        	    siguiente         = argumento['Libro posterior'] or
        	                        argumento['Libro que le sigue en la cronología'],
        	    ['año anterior']  = argumento['Año anterior'] or argumento['Año del libro que le precede en la cronología'],
        	    ['año']           = AnyoOriginal,
        	    ['año siguiente'] = argumento['Año posterior'] or argumento['Año del libro que le sigue en la cronología'],
                color             = ColorFondoSubtitulo,
                ['estilo fuente'] = 'italic'
            }            
        }        
    )
    
    -- Añadir categorías si es posible
    
    if not ModuloPaginas.sePuedeCategorizar() then
    	return ModuloFicha.infobox(FichaLibro)
    end
    
    local categorias = ''

    -- Errores

    if etiquetaWikidata and etiquetaWikidata:match('%(') then
       categorias=categorias .. '[[Categoría:Wikipedia:Páginas con etiquetas de Wikidata con paréntesis]]'
    end
   
    -- Géneros

    local categoriasGeneros = {}
    
    if Entidad and Entidad.claims then
    	if generoWikidata then
    		if generoWikidata:find('[Cc]uento') or esUnLibroDeCuentos then
    			if esUnLibro then
    				esUnLibroDeCuentos = true
    			end
    			-- Cuentos del autor
    		    if esUnLibroDeCuentos then
    				table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Libros de cuentos de $1'},Entidad.claims['P50']))
    			else
    				table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Cuentos de $1'},Entidad.claims['P50']))
    			end
    		    -- Cuentos de un año
    		    if esUnLibroDeCuentos then
                	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Libros de cuentos de $1', ['formatoFecha']='año'},Entidad.claims['P577']))
                else
                	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Cuentos de $1', ['formatoFecha']='año'},Entidad.claims['P577']))
                end
                -- Cuentos de un país
    		    if esUnLibroDeCuentos then
                	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Libros de cuentos de $1'},Entidad.claims['P495']))
                else
                	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Cuentos de $1'},Entidad.claims['P495']))
                end
            	-- Cuentos de un idioma
    		    if esUnLibroDeCuentos then
            		table.insert(categoriasGeneros, categorizarWikidata({['categoría']     = 'Libros de cuentos en $1'}, Entidad.claims['P407'] or Entidad.claims['P364']))
                else
            		table.insert(categoriasGeneros, categorizarWikidata({['categoría']     = 'Cuentos en $1'}, Entidad.claims['P407'] or Entidad.claims['P364']))
                end

                if subgeneroWikidata then
                    if subgeneroWikidata:find('[Cc]iencia ficción') then
	    		    	if esUnLibroDeCuentos then
	                    	table.insert(categoriasGeneros, '[[Categoría:Libros de cuentos de ciencia ficción]]')
	                    else
	                    	table.insert(categoriasGeneros, '[[Categoría:Cuentos de ciencia ficción]]')
	                    end
                    end
                    
                    if subgeneroWikidata:find('[Ff]antástica') or subgeneroWikidata:find('[Ff]antasía') then
	    		    	if esUnLibroDeCuentos then
	                    	table.insert(categoriasGeneros, '[[Categoría:Libros de cuentos de fantasía]]')
	                    else
                    		table.insert(categoriasGeneros, '[[Categoría:Cuentos fantásticos]]')
                    	end
                    end
                    
                    if subgeneroWikidata:find('[Hh]orror') or subgeneroWikidata:find('[Tt]error') then
	    		    	if esUnLibroDeCuentos then
	                    	table.insert(categoriasGeneros, '[[Categoría:Libros de cuentos de terror]]')
	                    else
                    		table.insert(categoriasGeneros, '[[Categoría:Cuentos de terror]]')
                    	end
                    end                    
                end
            end
            
            if generoWikidata:find('[Tt]eatro') then
            	-- Obras de teatro por autor
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Obras de teatro de $1'},Entidad.claims['P50']))
            	-- Obras de teatro de un año
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Obras de teatro de $1', ['formatoFecha']='año'},Entidad.claims['P577']))
       
            	-- Obras de teatro de un país
            	table.insert(categoriasGeneros, categorizarWikidata(
            		   {['categoría']     = 'Obras de teatro de $1'
            	 	   },Entidad.claims['P495']))
       	   
            	-- Obras de teatro de un idioma
            	table.insert(categoriasGeneros, categorizarWikidata(
       	            {['categoría']     = 'Obras de teatro en $1',
                	   },Entidad.claims['P407'] or Entidad.claims['P364']))
            end
            
            if generoWikidata:find('[Nn]ovela') then
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = categoriasGenerosNovelas},Entidad.claims['P136']))
    	
            	-- Novelas por tema
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = categoriasTemasNovelas},Entidad.claims['P921']))
       
            	-- Novelas del autor
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Novelas de $1'},Entidad.claims['P50']))
       
            	-- Novelas de un año
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Novelas de $1', ['formatoFecha']='año'},Entidad.claims['P577']))
       
            	-- Novelas ambientadas en una ubicación
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Novelas ambientadas en $1'},Entidad.claims['P840']))
            	
            	-- Novelas de un país
            	table.insert(categoriasGeneros, categorizarWikidata(
       	           {['categoría']     = 'Novelas de $1'
       	           },Entidad.claims['P495']))
       
            	-- Novelas de un idioma
            	table.insert(categoriasGeneros, categorizarWikidata(
       	           {['categoría']     = 'Novelas en $1',
       	           }, Entidad.claims['P407'] or Entidad.claims['P364']))
            end
    		if generoWikidata:find('[Pp]oesía') then
    			-- Poemas del autor
    			table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Poemas de $1'},Entidad.claims['P50']))
    		    -- Poemas de un año
                table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Poemas de $1', ['formatoFecha']='año'},Entidad.claims['P577']))
       
                -- Poemas de un país
                table.insert(categoriasGeneros, categorizarWikidata(
       	             {['categoría']     = 'Poemas de $1'
       	           },Entidad.claims['P495']))
                -- Pendiente si categorizar por el idioma.
       
            	-- Poemas de un idioma
            	table.insert(categoriasGeneros, categorizarWikidata(
       	           {['categoría']     = 'Poemas en $1',
       	           }, Entidad.claims['P407'] or Entidad.claims['P364']))
            end
            if generoWikidata:find('[Nn]o ficción') then
            	-- Obras literarias de no ficción por autor
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Obras literarias de no ficción de $1'},Entidad.claims['P50']))
            	-- Obras literarias de no ficción de un año
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Obras literarias de no ficción de $1', ['formatoFecha']='año'},Entidad.claims['P577']))
       
            	-- Obras literarias de no ficción de un país
            	table.insert(categoriasGeneros, categorizarWikidata(
            		   {['categoría']     = 'Obras literarias de no ficción de $1'
            	 	   },Entidad.claims['P495']))
       	   
            	-- Obras literarias de no ficción de un idioma
            	table.insert(categoriasGeneros, categorizarWikidata(
       	            {['categoría']     = 'Obras literarias de no ficción en $1',
                	   },Entidad.claims['P407'] or Entidad.claims['P364']))
            end
        end
        
        if not categoriasGeneros[1] then
        	-- Libros de un año
        	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Libros de $1', ['formatoFecha']='año'},Entidad.claims['P577']))
        	-- Libros de un país
        	table.insert(categoriasGeneros, categorizarWikidata(
        	   {['categoría']     = 'Libros de $1'}
       	       ,Entidad.claims['P495']))
        end
        
        if categoriasGeneros[1] then
           categorias = categorias .. table.concat(categoriasGeneros)
        end
        
        -- Obras infantiles, fábulas, etc.    
        categorias=categorias .. categorizarWikidata({['categoría'] = categoriasGeneros2},Entidad.claims['P136'])
        
        -- Premios
        categorias = categorias .. categorizarWikidata({['categoría'] = 'Obras ganadoras del $1'}, Entidad.claims['P166'])  
        
        -- Publicaciones de una editorial
        categorias = categorias .. categorizarWikidata({['categoría'] = 'Libros publicados por $1'}, Entidad.claims['P123'])      
    end
    
    return ModuloFicha.infobox(FichaLibro) .. categorias
end
 
function enlazarIdioma(idioma, mayuscula)
    if not idioma then
        return idioma
    else
    	inicio, medio, fin=idioma:match('(%[[^|%]]*|)(.)(.*)')
    	if inicio and medio and fin  then
    		if mayuscula == 'sí' then
    		    return inicio .. medio:upper() .. fin
    		else
    		    return inicio .. medio:lower() .. fin
    	    end
         end
    
        if idioma:find('%[') then
             return idioma
        end

        idioma= idioma:lower()
        
  		if mayuscula == 'sí' then
  		    return '[[idioma ' .. idioma .. '|' .. idioma:gsub("%a", string.upper,1) .. ']]'
   		else
   		    return '[[idioma ' .. idioma .. '|' .. idioma .. ']]'
   	    end
    end
end

-- Función que devuelve la lista de los valores de una propiedad en Wikidata formateados
function propiedad(idPropiedad,opciones)
    if Entidad and Entidad.claims and Entidad.claims[idPropiedad] then
    	if not opciones then
    		opciones = normal
    	end
    	
    	opciones.entityId  = Entidad.id
    	opciones.propiedad = idPropiedad

        valorPropiedad = getPropiedadWikidata(opciones,Entidad.claims[idPropiedad])

    	return valorPropiedad
    end
end

-- Función que devuelve el género y el subgénero de Wikidata.
-- La novela, novela corta o cuento, se devolverán siempre en el género.
-- El resto de géneros se devolverán como subgénero o como género dependiendo de
-- si en Wikidata se utiliaz uno de los géneros anteriores.
-- Por ejemplo:
--  - En Wikidata Novela + ciencia ficción --> género = Novela, subgénero = Ciencia ficción
--  - En Wikidata ciencia ficción --> género = Ciencia ficción

function obtenerGeneroWikidata()
    if not Entidad or not Entidad.claims then
        return 
    end
    
    
	-- Subgéneros de novelas sin un artículo en la Wikipedia y que se reemplazan por el subgénero que existe
	local subgenerosNovelas = {
		['Q3056541' ] = 'Q4184'   , -- novela autobiográfica / autobiografía
		['Q26228228'] = 'Q1077883', -- novela biopunk / biopunk		
		['Q26228231'] = 'Q174526' , -- novela ciberpunk / ciberpunk
		['Q12132683'] = 'Q24925'  , -- novela de ciencia ficción /
		['Q10992055'] = 'Q1057172', -- novela fantástica / literatura fantástica
		['Q11825892'] = 'Q1233720', -- novela juvenil /	literatura juvenil
		['Q26906554'] = 'Q197949' , -- novela posapocalíptica /	ficción posapocalíptica
		['Q27022710'] = 'Q1341831', -- novela postciberpunk / postciberpunk
		['Q27020789'] = 'Q223685' , -- novela steampunk /	steampunk
		['Q3440959' ] = 'Q182015' , -- novela de suspense /	suspense
		['Q26225470'] = 'Q224989' , -- novela ucrónica / ucronía
		['Q21616374'] = 'Q1425557', -- novela de vampiros /	literatura de vampiros
		['Q21615367'] = 'Q131539' , -- novela infantil / literatura infantil
	}
	
	local subgenerosCuentos = {
		['Q21905924'] = 'Q24925'  , -- cuento de ciencia ficción / ciencia ficción
	}
	
	local subgenerosGeneros = {
		['Q132311'  ] = 'Q1057172', -- Género fantástico / Literatura fantástica 
		['Q16681629'] = 'Q224989' , -- literatura ucrónica / Ucronía
		['Q516626'  ] = 'Q193606' , -- Terror (sentimiento de miedo o fobia en su escala máxima) / Terror (género literario)	
	}
	
	local temasGeneros = {
		['Q1481165' ] = 'Q2763'   , -- literatura del Holocausto / Holocausto
		['Q182154'  ] = 'Q253732' , -- viaje a través del tiempo / viaje en el tiempo en la ficción
		['Q253732'  ] = 'Q253732' , -- viaje en el tiempo en la ficción / viaje en el tiempo en la ficción
	}	
 
    local declaracionesGeneros = Entidad.claims['P136']
    local declaracionesInstancias = Entidad.claims['P31']
    local declaracionesFormas = Entidad.claims['P7937']
    local declaracionesTemas   = Entidad.claims['P921']
 
    local identificadorGenero, identificadorTema
    local generos    = {}
    local subgeneros = {}
    local temas      = {}
 
 	if declaracionesTemas then
 		for k,v in pairs(declaracionesTemas) do
 			identificadorTema = 'Q' .. v.mainsnak.datavalue.value['numeric-id']
 			if identificadorTema == 'Q182154'   then -- viaje a través del tiempo
				insertarEn(temas, 'Q253732')                 -- viaje en el tiempo en la ficción
			else
 				insertarEn(temas, identificadorTema)
 			end
 		end
 	end
 	
 	if declaracionesInstancias then
    	for k,v in pairs(declaracionesInstancias) do
	    	identificadorGenero = 'Q' .. v.mainsnak.datavalue.value['numeric-id']
    		
    		if insertarEn(subgeneros, subgenerosNovelas[identificadorGenero]) or
    		    identificadorGenero == 'Q8261' or -- novela
    		    identificadorGenero == 'Q149537' then -- novela corta
    			insertarEn(generos, 'Q8261') -- novela
    		elseif insertarEn(subgeneros, subgenerosCuentos[identificadorGenero]) or
    		    identificadorGenero == 'Q49084' or   -- cuento 
    		    identificadorGenero == 'Q1279564' or   -- libro de cuentos 
    		    identificadorGenero == 'Q27560760' or   -- libro de cuentos de hadas
    		    identificadorGenero == 'Q7679101' or   -- conte
    		    identificadorGenero == 'Q17991521' or   -- tale
    		    identificadorGenero == 'Q5457615' or   -- microrelato
    		    identificadorGenero == 'Q472808' then   -- cuento largo 
    			insertarEn(generos, 'Q49084')                 -- cuento
			elseif identificadorGenero == 'Q5185279' or   -- poema
    		    identificadorGenero == 'Q482' or   -- poesia
    		    identificadorGenero == 'Q12106333' then -- poemario
    			insertarEn(generos, 'Q482')                 -- poesia   
			elseif identificadorGenero == 'Q25379' then   -- obra teatral
    			insertarEn(generos, 'Q11635')                 -- teatro   
    		end
		end
 	end
 	
 	if declaracionesFormas then
    	for k,v in pairs(declaracionesFormas) do
	    	identificadorGenero = 'Q' .. v.mainsnak.datavalue.value['numeric-id']
    		
    		if insertarEn(subgeneros, subgenerosNovelas[identificadorGenero]) or
    		    identificadorGenero == 'Q8261' or -- novela
    		    identificadorGenero == 'Q149537' then -- novela corta
    			insertarEn(generos, 'Q8261') -- novela
    		elseif insertarEn(subgeneros, subgenerosCuentos[identificadorGenero]) or
    		    identificadorGenero == 'Q49084' or   -- cuento 
    		    identificadorGenero == 'Q1279564' or   -- libro de cuentos 
    		    identificadorGenero == 'Q27560760' or   -- libro de cuentos de hadas
    		    identificadorGenero == 'Q7679101' or   -- conte
    		    identificadorGenero == 'Q17991521' or   -- tale
    		    identificadorGenero == 'Q5457615' or   -- microrelato
    		    identificadorGenero == 'Q472808' then   -- cuento largo 
    			insertarEn(generos, 'Q49084')                 -- cuento
			elseif identificadorGenero == 'Q5185279' or   -- poema
    		    identificadorGenero == 'Q482' or   -- poesia
    		    identificadorGenero == 'Q12106333' then -- poemario
    			insertarEn(generos, 'Q482')                 -- poesia   
			elseif identificadorGenero == 'Q25379' then   -- obra teatral
    			insertarEn(generos, 'Q11635')                 -- teatro   
    		end
		end
 	end

 	if declaracionesGeneros then
    	for k,v in pairs(declaracionesGeneros) do
    		identificadorGenero = 'Q' .. v.mainsnak.datavalue.value['numeric-id']
    		
    		if insertarEn(subgeneros, subgenerosNovelas[identificadorGenero]) then
    			insertarEn(generos, 'Q8261') -- novela
    		elseif insertarEn(subgeneros, subgenerosGeneros[identificadorGenero]) or
    			insertarEn(temas, temasGeneros[identificadorGenero])then
    		elseif identificadorGenero == 'Q3547700' then  -- ucronía de fantasía
    			insertarEn(subgeneros, 'Q224989')            -- Ucronía    			
    			insertarEn(subgeneros, 'Q1057172')           -- Literatura fantástica 
    		elseif insertarEn(subgeneros, subgenerosCuentos[identificadorGenero]) or
    		    identificadorGenero == 'Q5457615' or   -- microrelato
    		    identificadorGenero == 'Q472808' then   -- cuento largo 
    			insertarEn(generos, 'Q49084')                 -- cuento 
			elseif identificadorGenero == 'Q149537' then   -- novela corta
    			insertarEn(generos, 'Q8261')                 -- novela
			elseif identificadorGenero == 'Q3326349' then   -- lirica
    			insertarEn(generos, 'Q482')                 -- poesia
			elseif identificadorGenero == 'Q5185279' then   -- poema
    			insertarEn(generos, 'Q482')                 -- poesia
    		elseif identificadorGenero == 'Q25379' then  -- Obra teatral
    			insertarEn(generos, 'Q11635')            -- Teatro
    		elseif identificadorGenero == 'Q27801' then  -- Literatura de no ficción
    			insertarEn(generos, 'Q213051')           -- No ficción
			elseif identificadorGenero == 'Q1347298'  then -- novela por entregas
				-- No es un género en sí. No mostrarlo.
    		elseif identificadorGenero == 'Q10453828' then -- novela de viajes en el tiempo
    			insertarEn(generos, 'Q8261')                 -- novela
    			insertarEn(temas, 'Q253732')                 -- viaje en el tiempo en la ficción				
    		elseif identificadorGenero == 'Q26928598' or -- novela distópica
    			identificadorGenero == 'Q20443047' then -- Literatura distópica 
    			insertarEn(generos, 'Q8261')                 -- novela
    			insertarEn(temas, 'Q180774')                 -- Distopía
    		elseif identificadorGenero == 'Q3238422' then    -- literatura de ciencia ficción
    			insertarEn(subgeneros, 'Q24925')             -- ciencia ficción
    		elseif ModuloTablas.en(tablaGeneros, identificadorGenero) then
		    	insertarEn(generos, identificadorGenero)
    		else
		  		insertarEn(subgeneros, identificadorGenero)
    		end
		end
	end
	
	for k,v in pairs(subgeneros) do
		if enTabla(generos, 'Q8261') then -- novela
		   if v == 'Q193606' then             -- literatura de terror
    			subgeneros[k] = 'Q20667180'   -- novela de terror
    		elseif v == 'Q5937792' then       -- género políciaco
    			subgeneros[k] = 'Q208505'  -- novela políciaca    		
    		end
    	end
	end
	
	-- Eliminar subgeneros duplicados
	for k,v in pairs(subgeneros) do
		if enTabla(subgeneros, v) < k then
			subgeneros[k] = nil
    	end
	end	
	
	local subgenerosConFormato = formatear(subgeneros)
	
	-- Reemplazar en los géneros "novela de ciencia ficción" por "ciencia ficción" y similares
	if subgenerosConFormato then
		subgenerosConFormato = subgenerosConFormato:gsub('|novela de ', '|')
		subgenerosConFormato = subgenerosConFormato:gsub('|Novela de ciencia ficción', '|Ciencia ficción')
		subgenerosConFormato = subgenerosConFormato:gsub('%[%[Novela de terror%]%]', '[[Novela de terror|Terror]]')
		subgenerosConFormato = subgenerosConFormato:gsub('|Novela de terror', '|Terror')
		subgenerosConFormato = subgenerosConFormato:gsub('%[%[Literatura de ficción%]%]', '[[Literatura de ficción|Ficción]]')
		subgenerosConFormato = subgenerosConFormato:gsub('%[%[literatura de ficción%]%]', '[[Literatura de ficción|ficción]]')
	end

    if generos[1] then
        return addLinkbackWikidata(formatear(generos), Entidad.id, 'P136')
        	, addLinkbackWikidata(subgenerosConFormato, Entidad.id, 'P136')
        	, addLinkbackWikidata(formatear(temas), Entidad.id, 'P921')
    else
        return addLinkbackWikidata(subgenerosConFormato, Entidad.id, 'P136')
        	, nil
        	, addLinkbackWikidata(formatear(temas), Entidad.id, 'P921')
    end
end
 
-- Formatear una tabla de identificadores de entidades de Wikidata
function formatear(identificadores)
	local identificadoresFormateados = {}
	local primero = true
 
    for k,v in pairs(identificadores) do
    	if primero then
    	    table.insert(identificadoresFormateados, formatoIdEntidad(v,{['mayúscula'] = 'sí', ['enlace'] = 'sí'}))
    	    primero = false
    	else
    		table.insert(identificadoresFormateados, formatoIdEntidad(v, {['mayúscula'] = 'no', ['enlace'] = 'sí'}))
    	end
    end

    -- No devolver nada si la lista no tiene elementos
    if not primero then
        return mw.text.listToText(identificadoresFormateados)
    end
end

function obtenerEtiquetaWikidata()
	if Entidad and Entidad.labels and Entidad.labels.es then
        return Entidad.labels.es.value
    end
end

function obtenerWikisource(idioma)
	if not idioma or not Entidad or not Entidad.sitelinks then
		return
	end
	
	if idioma:find('[Ee]spañol') then
		if not Entidad.sitelinks.eswikisource or not Entidad.sitelinks.eswikisource.title then
			return
		end

		tituloWikiSource = Entidad.sitelinks.eswikisource.title		
		--[[Archivo:Wikisource-logo.svg|15px| ]] 
		return "''[[s:" .. tituloWikiSource .. "|" .. tituloWikiSource .. "]]'' en [[Wikisource]]"
	elseif idioma:find('[Ii]nglés') then
		if not Entidad.sitelinks.enwikisource or not Entidad.sitelinks.enwikisource.title then
			return
		end		
		
		tituloWikiSource = Entidad.sitelinks.enwikisource.title		
		
		return "''[[:en:s:" .. tituloWikiSource .. "|" .. tituloWikiSource .. "]]'' en [[Wikisource]]"		
	elseif idioma:find('[Ff]rancés') then
		if not Entidad.sitelinks.frwikisource or not Entidad.sitelinks.frwikisource.title then
			return
		end		
		
		tituloWikiSource = Entidad.sitelinks.frwikisource.title			

		return "''[[:fr:s:" .. tituloWikiSource .. "|" .. tituloWikiSource .. "]]'' en [[Wikisource]]"		
	end
end

function corregirIdiomaWikidata(entidad, idPropiedad)
	if not entidad or not idPropiedad then
		return
	end
    
	local declaracion= elementoTabla(entidad, 'claims', idPropiedad)
	local idIdioma
	
	if not declaracion then
		return
	end
	
	for k,v in pairs(declaracion) do
		idIdioma=elementoTabla(v,'mainsnak','datavalue','value','id')
		
		if idIdioma == 'Q7979' or -- inglés británico
 		   idIdioma == 'Q44676' or -- inglés canadiense
 		   idIdioma == 'Q7976' or -- inglés estadounidense
 		   idIdioma == 'Q665624' then -- inglés en Irlanda
 		   	v.mainsnak.datavalue.value.id='Q1860'
 			v.mainsnak.datavalue.value['numeric-id']=1860
 		end
	end
end

function obtenerTitulo()
	--De momento solo obtener el título de Wikidata si solo hay definido uno.
	--if true then return ModuloTablas.tostring(Entidad) end	
	if not elementoTabla(Entidad, 'claims', 'P1476', 2) then
		return propiedad('P1476') 
	end
end
return z