Módulu:Ficha de llibru

De Wikipedia

La documentación pa esti módulu pue crease en Módulu:Ficha de llibru/usu

local z = {}

local argumentos    -- Tabla d'argumentos colos que se llama a la función 
local argumento={}  -- Argumentos eliminando los argumentos ensin datos
local Entidad       -- Tabla colos datos en Wikidata del llibru.
--                         Ver Wikidata:WikiProject Books pa les propiedaes posibles
local etiquetaWikidata

-- Módulos y funciones esternes
local ModuloArgumentos        = require('Módulu:Argumentos')
local ModuloFicha             = require('Módulu:Ficha')	
local ModuloIdentificadores   = require('Módulu:Identificadores')
local ModuloPaginas           = require('Módulu:Páxines')	
local ModuloWikidataFormatos  = require('Módulu:Wikidata/Formatos')
	local formatoObraAnyo     = ModuloWikidataFormatos.formatoObraAnyo
	local formatoPremio       = ModuloWikidataFormatos.formatoPremio
local ModuloWikidata          = require('Módulu:Wikidata')
	local addLinkbackWikidata = ModuloWikidata.addLinkback
	local categorizarWikidata = ModuloWikidata.categorizar
	local formatoIdEntidad    = ModuloWikidata.formatoIdEntidad	
	local getPropiedadWikidata= ModuloWikidata.getPropiedad
local ModuloTablas            = require('Módulu:Tables')
	local elementoTabla       = ModuloTablas.elemento
	local insertarEn          = ModuloTablas.insertar
  
local enlazarTexto           = require('Módulu:Formatu testu').enlazar
local sinBandera             = require('Módulu:Bandera').sinBandera

-- Constantes
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 categoriasGenerosNovelas = {
	 [3056541] = 'Noveles autobiográfiques'	
	,[4184   ] = 'Noveles autobiográfiques'	--autobiografía
	,[908667 ] = 'Noveles béliques'
	,[4914883] = 'Noveles biográfiques'
	,[174526 ] = 'Noveles ciberpunk'
	,[26228231] = 'Noveles ciberpunk' -- novela ciberpunk
	,[1077883] = 'Noveles ciberpunk' -- biopunk
	,[26228228] = 'Noveles ciberpunk' -- novela biopunk	
	,[1341831] = 'Noveles ciberpunk' -- postciberpunk
	,[27022710] = 'Noveles ciberpunk' -- novela postciberpunk	
	,[223945 ] = 'Noveles d\'aprendizaxe'	 
	,[319226 ] = 'Noveles d\'aventures'
	,[1436734] = 'Noveles d\'aventures' -- aventura. FALTA correxir l'enllaz pa qu'enllace a novela d'aventures.
	,[24925  ] = 'Noveles de ciencia ficción'
	,[12132683]= 'Noveles de ciencia ficción'
	,[905770 ] = 'Noveles de ciencia ficción' -- ciencia ficción blanda
	,[725757 ] = 'Ciencia ficción dura' -- ciencia ficción dura
	,[2435402] = 'Noveles de ciencia ficción feministes' -- ciencia ficción feminista
	,[2561390] = 'Noveles d\'humor'
	,[40831  ] = 'Noveles d\'humor'		  -- Comedia
	,[6585139] = 'Noveles de misteriu'
	,[182015 ] = 'Noveles d\'intriga'
	,[193606 ] = 'Noveles de terror'
	,[20667180] = 'Noveles de terror' -- novela de terror	
	,[1425557] = 'Noveles de vampiros'
	,[10453828] = 'Noveles de viaxes nel tiempu'-- novela de viaxes nel tiempu
	,[253732 ] = 'Noveles de viaxes nel tiempu' -- Viaxe nel tiempu na ficción
	,[182154 ] = 'Noveles de viaxes nel tiempu' -- Viaxe al traviés del tiempu	
	,[180774 ] = 'Noveles distópiques'             -- Distopía
	,[20443047] = 'Noveles distópiques' -- literatura distópica
	,[26928598 ] = 'Noveles distópiques'           -- novela distópica
	,[25372  ] = 'Noveles dramátiques'	
	,[465821 ] = 'Noveles epistolares'
	,[747483 ] = 'Noveles erótiques' -- lliteratura erótica
	,[11452132 ] = 'Noveles erótiques'    -- novela erótica	
	,[1426213] = 'Noveles d\'espionaxe'
	,[11825887]= 'Noveles fantástiques' -- novela fantástica	
	,[10992055]= 'Noveles fantástiques' -- novela fantástica	
	,[132311 ] = 'Noveles fantástiques' -- Xéneru fantásticu	
	,[1057172] = 'Noveles fantástiques' -- Lliteratura fantástica
	,[603291 ] = 'Noveles fantástiques' -- fantasía histórica
	,[794912 ] = 'Noveles fantástiques' -- dark fantasy/fantasía escura
	,[2016518] = 'Noveles filosófiques'
	,[20669641]= 'Noveles gótiques'	  -- Ficción gótica	
	,[192782 ] = 'Noveles gótiques'	  -- Narrativa gótica
	,[276709 ] = 'Noveles gótiques'    -- Góticu sureñu
	,[1196408] = 'Noveles históriques' -- Ficción histórica
	,[192239 ] = 'Noveles históriques'
	,[131539]  = 'Obres infantiles' -- Lliteratura infantil
	,[11825892] = 'Noveles xuveniles' -- novela xuvenil
	,[1233720] = 'Noveles xuveniles' -- Lliteratura xuvenil
	,[1940294] = 'Novela negra'
	,[1619888] = 'Noveles pastoriles'	
	,[208505 ] = 'Noveles policíaques'
	,[186424 ] = 'Noveles policíaques' -- El detective de ficción
	,[113013 ] = 'Noveles posmodernes' -- Lliteratura posmoderna
	,[286328 ] = 'Noveles sicolóxiques'
	,[147516]  = 'Noveles de realismu máxicu'	
	,[858330 ] = 'Noveles romántiques'
	,[6045975] = 'Noveles satíriques' -- novela satírica
	,[128758 ] = 'Noveles satíriques' -- Sátira
	,[7225114] = 'Noveles satíriques' -- Sátira política
	,[223685] = 'Noveles steampunk' -- steampunk
	,[27020789] = 'Noveles steampunk' -- novela steampunk	
	,[3440959] = 'Noveles d\'intriga' -- Novela d'intriga
	,[590103]  = 'Noveles d\'intriga sicolóxica' -- thriller sicolóxicu
	,[580850 ] = 'Noveles tecno-thriller' -- tecno-thriller
	,[224989 ] = 'Noveles ucróniques'
	,[16681629 ] = 'Noveles ucróniques' --literatura ucrónica
	,[26225470 ] = 'Noveles ucróniques' --Novela ucrónica
}

local categoriasGeneros = {
	  [693    ] = 'Fábules'
    , [1072723] = 'Llibros de viaxes' -- lliteratura de viaxes
    , [1164267] = 'Llibros de viaxes' -- llibru de viaxes
	, [131539 ] = 'Obres infantiles' -- lliteratura infantil
	, [995600 ] = 'Llibros de divulgación científica' -- divulgación científica
}

local tablaGeneros={ -- Tabla de xéneros sacante los subxéneros.
      'Q8261'    -- Novela
    , 'Q149537'  -- Novela curtia
	--, 'Q482'   -- Poesía
	, 'Q49084'   -- Cuentu
	, 'Q25379'   -- Obra de teatru
	, 'Q1279564' -- coleición de cuentos
}

local categoriasTemasNovelas = {
	  [2763]   = 'Noveles sobre l\'Holocaustu'	
 	, [180046] = 'Noveles d\'esploración espacial' -- esploración espacial
	, [362   ] = 'Noveles de la Segunda Guerra Mundial' -- Segunda Guerra Mundial
	, [10453828] = 'Noveles de viaxes nel tiempu'-- novela de viaxes nel tiempu	
	, [253732] = 'Noveles de viaxes nel tiempu' --viaxe nel tiempu na ficción
	, [182154] = 'Noveles de viaxes nel tiempu' --viaxe al traviés del tiempu	
	, [10859 ] = 'Noveles sobro la Guerra Civil Española'	
}
	
function z.Ficha(frame)
--  Facer que funcione la función formatBandera	
    ModuloWikidata:setFrame(frame)  -- Nun funciona si se pon ModuloWikidata.setFrame(marco)
    
    --Obtener una copia de los argumentos desaniciando los argumentos ensin valor
    local argumento = ModuloArgumentos.obtenerArgumentosConValor(frame)
    
    -- Obtener los datos de la páxina onde s'inxer la ficha de Wikidata.
    Entidad = mw.wikibase.getEntityObject(argumento.id) or {}
    
    --if true then
    --	return ModuloTablas.tostring(Entidad)
    --end
  
    corregirIdiomaWikidata(Entidad, 'P364')
    
    local generoWikidata, subgeneroWikidata, temaWikidata = obtenerGeneroWikidata()
    
    if generoWikidata then
        genero    = generoWikidata
        subgenero = subgeneroWikidata
    else 
        genero    = argumento['xéneru'] or 
                    argumento['xeneru'] or
                    argumento['Xéneru']
        subgenero = argumento['subxéneru'] or
                    argumento['subxeneru'] or
                    argumento['Subxéneru']    	
    end
             
    if not genero then
    	ColorFondo = 'LightSteelBlue'
    	ColorFondo2 = '#d8e2ee'    	
    elseif genero:find('[Rr]ellatu')  or 
    	   genero:find('[Cc]uentu')  or
    	   genero:find('[Ll]leenda') or 
    	   genero:find('[Aa]ntoloxía') then
        ColorFondo = 'LightSalmon'
    	ColorFondo2 = '#f9d9cb'        
    elseif genero:find('didáuticu') or
    	   genero:find('[Ee]nsayu')  or 
    	   genero:find('[Dd]ivulgación')  or
    	   genero:find('[Cc]rítica')  or
    	   genero:find('[Tt]ratáu') or
    	   genero:find('[Cc]rónica') then
        ColorFondo = 'NavajoWhite'
    	ColorFondo2 =  '#FBE7C9'
    elseif genero:find('[Pp]oesía') or
    	genero:find('[Ee]popeya') or
        genero:find('[Ll]líricu') or genero:find('[Ll]lírica') or
    	genero:find('[Pp]oema') then
    	ColorFondo = 'darkseagreen'
    	ColorFondo2 = '#afdeaf'
    else
    	ColorFondo = 'LightSteelBlue'
    	ColorFondo2 = '#d8e2ee'
    end
    
    Autor = propiedad('P50',{['enlace']='sí', 
               ['calificativo'] = 'P742' -- seudónimu
               , ['linkback']='sí'
            }) or
            argumento['autor']   or 
            argumento['autores'] or 
            argumento['Autor']   or
            argumento['Autores']
            
    if Autor and argumento['Acotaciones al autor'] then
    	Autor = Autor .. '<br /><small>' .. argumento['Acotaciones al autor'] .. '</small>'
    end
    
    if  argumento['publicación orixinal'] or argumento['triba orixinal'] or 
        argumento['triba de publicación orixinal'] or argumento['editorial orixinal'] or 
        argumento['ilustrador orixinal'] or argumento['ciudá orixinal'] or 
        argumento['país orixinal'] or argumento['data orixinal'] or
        argumento['formatu orixinal'] or argumento['páxines orixinal'] or
        argumento['isbn orixinal']    or
        argumento['Añu orixinal']     or argumento['Añu de publicación orixinal'] or
        argumento['Ilustrador orixinal'] or argumento['Ilustrador de la publicación orixinal'] or        
        argumento['Artista de cubierta orixinal'] or argumento['Artista de cubierta de la publicación orixinal'] or
        argumento['Editorial orixinal'] or argumento['Editorial de publicación orixinal'] or
        argumento['Ciudá orixinal'] or argumento['Ciudá de publicación orixinal'] or
        argumento['País orixinal'] or argumento['País de publicación orixinal'] or
        argumento['ISBN orixinal'] or 
        argumento['OCLC orixinal'] or
        argumento['Formatu orixinal'] or 
        argumento['Númberu de páxines orixinal']
        then
        	
       EdicionOriginal = true
    end
    
    if argumento['Títulu traducción']              or argumento['Títulu de la traducción']             or 
       argumento['Añu traducción']                 or argumento['Añu 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['Ciudá traducción']               or argumento['Ciudá 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['ISBN traducción']                or argumento['ISBN de la traducción']    or
       argumento['OCLC traducción']                or 
       argumento['Formatu traducción']             or argumento['Formatu de la traducción'] or
       argumento['Númberu de páxines traducción']  or argumento['Númberu de páxines de la traducción']
                           then
    	EdicionTraduccion = true
    end
    
    if EdicionOriginal or EdicionTraduccion then
        IdiomaOriginal = propiedad('P364',{['enlace']='sí', ['linkback']='sí'}) or
                         enlazarIdioma(
        	                 argumento['llingua'] or 
        	                 argumento['idioma'] or 
        	                 argumento['llingua orixinal'] or
        	                 argumento['Llingua orixinal'] or
        	                 argumento['idioma orixinal'] or
        	                 argumento['Idioma orixinal'], 'no')
        	             

        IlustradorOriginal = propiedad('P110',enlazar) or
                             argumento['ilustrador orixinal'] or 
                             argumento['Ilustrador orixinal'] or
                             argumento['Ilustrador de la publicación orixinal']
                            
        ArtistaOriginal    = propiedad('P736',enlazar) or
                             argumento['artista orixinal'] or
                             argumento['Artista de cubierta orixinal'] or
                             argumento['Artista de cubierta de la publicación orixinal']
        
        PublicacionOriginal      = propiedad('P1433',enlazar) or
                                   argumento['Publicación orixinal'] or
                                   argumento['publicación orixinal']
                                   
        TipoPublicacionOriginal  = argumento['Triba de publicación orixinal'] or 
                                   argumento['triba de publicación orixinal'] or 
                                   argumento['triba orixinal']
        EditorialOriginal        = propiedad('P123',listaNoOrdenadaEnlazada) or 
                                   argumento['editorial orixinal'] or 
                                   argumento['Editorial orixinal'] or
                                   argumento['Editorial de publicación orixinal']
                                   
        LugarPublicacionOriginal = propiedad('P291') or 
                                   argumento['ciudá orixinal'] or 
                                   argumento['Ciudá orixinal'] or
                                   argumento['Ciudá de publicación orixinal']
                                   
        PaisOriginal             = propiedad('P495') or
                                   sinBandera(argumento['país orixinal'] or
                                   argumento['País orixinal'] or
                                   argumento['País de publicación orixinal'])
                                   
        AnyoOriginal             = argumento['Añu orixinal'] or 
                                   argumento['Añu de publicación orixinal']
        FechaOriginal            = propiedad('P577', enMayusculas) or
                                   argumento['Data orixinal'] or 
                                   argumento['Data orixinal'] or 
                                   enlazarTexto(AnyoOriginal)
                                   
        FormatoOriginal          = propiedad('P437', enMayusculas) or -- Distribución (cartoné, etc)
                                   argumento['formatu orixinal'] or 
                                   argumento['Formatu orixinal']
                                   
        PaginasOriginal          = propiedad('P1104') or 
                                   argumento['páxines orixinal'] or 
                                   argumento['Númberu de páxines orixinal']
                                   
        ISBNOriginal             = propiedad('P957',{
        	                       	  ['valor-función'] = ModuloIdentificadores.enlazarISBN,
        	                       	  ['calificativo']   = 'P437', -- distribución
        	                       	  ['linkback']='sí',
        	                       }) or 
        	                       propiedad('P212',{
        	                       	  ['valor-función'] = ModuloIdentificadores.enlazarISBN,
        	                       	  ['calificativo']   = 'P437', -- distribución        	                       	  
        	                       	  ['linkback']='sí',
        	                       }) or
        	                       ModuloIdentificadores.enlazarISBN(
        	                           argumento['isbn orixinal'] or 
        	                           argumento['ISBN orixinal'])
        	                       
        OCLCOriginal             = propiedad('P243',{['valor-función'] = ModuloIdentificadores.enlazarOCLC,['linkback']='sí'}) or
                                   ModuloIdentificadores.enlazarOCLC(
        	                         argumento['oclc orixinal'] or 
        	                         argumento['OCLC orixinal'])
        	                       
        PremiosOriginal = propiedad('P166', {
                          	['lista']         = 'no ordenada',
                          	['valor-función'] = formatoPremio,
                            ['calificativo']  = 'P585', -- Data d'ocurrencia                          	          
                          	['enlace']        = 'sí',
                          	['ordenar']       = 'por fecha',
                          	['linkback']='sí'}) or
                          argumento['Premios'] or
                          argumento['premios']
        
        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['ciudá']                                 or
                           argumento['Ciudá traducción']                      or 
                           argumento['Ciudá 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['data_publicación'] or 
                           argumento['data publicacion'] or 
                           argumento['data']             or
                            enlazarTexto(
                                argumento['Añu traducción'] or 
                                argumento['Añu de publicación de la traducción'])
        Paginas          = argumento['páxines']                            or
                           argumento['Númberu de páxines traducción']       or 
                           argumento['Númberu de páxines de la traducción']
        ISBN             = ModuloIdentificadores.enlazarISBN(
        	                   argumento['isbn']            or
        	                   argumento['ISBN traducción'] or
        	                   argumento['ISBN de la traducción'])
        OCLC             = ModuloIdentificadores.enlazarOCLC(
        	                   argumento['oclc'] or
        	                   argumento['OCLC traducción'])
        	                   
        if IdiomaOriginal then
        	if IdiomaOriginal:find('[Aa]sturianu') then
        		WikisourceOriginal = obtenerWikisource('asturianu')
        	else
        		WikisourceOriginal = obtenerWikisource(IdiomaOriginal)
        		Wikisource         = obtenerWikisource('asturianu')
        	end
        end
    else
        IdiomaOriginal   = propiedad('P364',enMayusculas) or
                           enlazarIdioma(argumento['llingua'] or 
        	                             argumento['idioma'] or 
        	                             argumento['llingua orixinal'] or
        	                             argumento['idioma orixinal'], 'sí')
        Artista          = propiedad('P736',enlazar) or
                           argumento['artista_cubierta'] or
        		           argumento['artista']
        Ilustrador       = propiedad('P110',enlazar) or argumento['ilustrador']
        Editorial        = propiedad('P123',listaNoOrdenadaEnlazada) or argumento['editorial']
        LugarPublicacion = propiedad('P291',enlazar) or argumento['ciudá']
        Publicacion      = propiedad('P1433',enlazar) or argumento['publicación']
        Pais             = propiedad('P495') or 
                           sinBandera(argumento['país'] or argumento['pais'])
        Fecha            = propiedad('P577', enMayusculas) or argumento['data_publicación'] or 
                           argumento['data publicacion'] or 
                           argumento['data']
        Formato          = propiedad('P437', enMayusculas) or -- Distribución (cartoné, etc)
                           argumento['formatu']    or 
            	           argumento['triba_media'] or
            	           argumento['Formatu traducción'] or 
            	           argumento['Formatu de la traducción']
                          
        Paginas          = propiedad('P1104') or argumento['páxines'] or argumento['paxines']
        ISBN             = propiedad('P957',{
        	                   ['valor-función'] = ModuloIdentificadores.enlazarISBN,
        	                   ['calificativo']   = 'P437', -- distribución
        	                   ['linkback']='sí',
        	               }) or 
        	               propiedad('P212',{
        	                   ['valor-función'] = ModuloIdentificadores.enlazarISBN,
        	                   ['calificativo']   = 'P437', -- distribución        	   
        	                   ['linkback']='sí',
        	               }) or 
        	               ModuloIdentificadores.enlazarISBN(argumento['isbn'])
        OCLC            = propiedad('P243',{['valor-función'] = ModuloIdentificadores.enlazarOCLC,['linkback']='sí'}) or
                          ModuloIdentificadores.enlazarOCLC(argumento['oclc'])
        Premios         = propiedad('P166', {
                            ['lista']         = 'no ordenada',
                            ['valor-función'] = formatoPremio,
                            ['calificativo']  = 'P585', -- Data d'ocurrencia
                            ['enlace']        = 'sí',
                            ['ordenar']       = 'por fecha',
                            ['linkback']='sí'}) or
                            argumento['premios']
                            
        if IdiomaOriginal and IdiomaOriginal:find('[As]turianu') then
        	-- Llibru n'asturianu
        	Wikisource         = obtenerWikisource('asturianu')
        elseif IdiomaOriginal then
        	-- Llibro non n'asturianu ensin datos de la edición n'asturianu
        	WikisourceOriginal = obtenerWikisource(IdiomaOriginal)
        	Wikisource         = obtenerWikisource('asturianu')
        end
    end
    
    -- Titulu         --> Títulu del llibro n'asturianu
    -- TituluOrixinal --> Títulu orixinal del llibru si nun ta n'asturianu
    
    etiquetaWikidata = obtenerEtiquetaWikidata()
    
    if IdiomaOriginal and IdiomaOriginal:find('[Aa]sturianu') then
    	--Llibru escritu n'asturianu
        Titulo      =  propiedad('P1476')           or 
                       propiedad('P357')            or -- Obsoletu pero entá s'usa
                       etiquetaWikidata             or
                       argumento['títulu orixinal'] or
                       argumento['títulu_orix']     or
                       argumento['titulu_orix']     or
                       argumento['títulu orix']     or
                       argumento['Títulu orixinal'] or
                       argumento['títulu']          or 
                       argumento['Títulu']			or
                       argumento['nome']            or
                       ModuloPaginas.nomePaxina({desambiguar='sí'})
    else
    	--Libru non escritu n'asturianu
    	-- o del que se desconoz la llingua
        TituloOriginal  = propiedad('P1476')           or 
                          propiedad('P357')            or
                          argumento['títulu orixinal'] or
                          argumento['títulu_orix']     or
                          argumento['titulu_orix']     or
                          argumento['títulu orix']     or
                          argumento['Títulu orixinal']
                          
        Titulo       = etiquetaWikidata                or
                       argumento['Títulu traducción']  or 
                       argumento['Títulu de la traducción'] or
                       argumento['títulu']          or 
                       argumento['Títulu']			or
                       argumento['nome']          or
                       ModuloPaginas.nomePaxina({desambiguar='sí'})    	
    end

    local FichaLibro = {
    	entidad         = argumento.id,
        titulo          = Titulo,
        clasetitulo     = 'llibru',
        estilotitulo    = 'background-color:' .. ColorFondo .. '; color:#000; font-style:italic',
        subtitulo       = Autor and '<small>de</small>&nbsp;' .. "'''" .. Autor .. "'''",
        estilosubtitulo = 'font-size:105%; background-color:' .. ColorFondo2 .. ';',
        estiloseccion   = 'background-color:' .. ColorFondo .. '; color:#000;',
        estiloetiqueta  = 'width:35%',
        estilodatos     = 'width:65%',
        imagen          = argumento['imaxe'] or argumento['Imaxe'] or propiedad('P18', {uno='sí'}),
        ['tamañoimagen']= argumento['Tamañu d\'imaxe'] or '220px', -- FALTA {{px|{{{Tamaño de imagen}}}}}
        pie             = argumento['testu_imaxe'] or argumento['testu imaxe'] or 
                          argumento['pie d\'imaxe'] or argumento['Pie d\'imaxe'],
        estilopie       = 'font-size:88%',
        {'Editor(es)', propiedad('P98')      or 
        	           argumento['Editor']   or
        	           argumento['editor']   or 
        	           argumento['Editores'] or 
                       argumento['editores']
                       },
        {'Fotografía', argumento['Fotografía'] or
        	           argumento['fotografía']},
        {'Xéneru'    , genero},
        {'Subxéneru' , subgenero},
        {'Tema(es)' , temaWikidata or
        	           argumento['tema'] or
        	           argumento['Tema']
        	           },
        {'Ambientada en', propiedad('P840', enMayusculas)},        	           
        {tipo='sección',
            -- El títulu de la seición solo s'amuesa si hai datos de les dos ediciones.        	
            titulo = (EdicionOriginal or EdicionTraduccion) and IdiomaOriginal and 'Edición orixinal en ' .. IdiomaOriginal,
            {'Llingua', not EdicionOriginal and not EdicionTraduccion and IdiomaOriginal},
            {'Títulu orixinal'     , TituloOriginal,
                                     estilodatos='font-style:italic'},
            {'Ilustrador', IlustradorOriginal},  -- FALTA si enllazar
            {'Cubierta'            , ArtistaOriginal},
            {'Publicáu en'         , PublicacionOriginal
            	                   , estilodatos='font-style:italic'},
            {'Triba de publicación', TipoPublicacionOriginal},
            {'Editorial'           , EditorialOriginal, clase='plainlist'},
            {'Ciudá'               , LugarPublicacionOriginal},	
            {'País'                , PaisOriginal},
            {'Data de publicación' , FechaOriginal},
            {'Formatu'             , FormatoOriginal},
            {'Páxines'             , PaginasOriginal},
            {'[[ISBN]]'            , ISBNOriginal},
            {'[[Online Computer Library Center|OCLC]]', OCLCOriginal},
            {'Premios'             , PremiosOriginal, clase='plainlist'},
            {'Testu orixinal'      , WikisourceOriginal}            
        },
        {tipo='sección',
            -- El títulu de la seición solo s'amuesa si hai datos de les dos ediciones.
        	titulo        = (EdicionOriginal or EdicionTraduccion) and 'Edición traducida al [[llingua asturiana|asturianu]]',
        	{'Traducíu por'         , argumento['traductor'] or argumento['Traductor']},
        	{'Adaptación'            , argumento['adaptación'] or
        		                   argumento['adaptador']},
        	{'Ilustrador'            , Ilustrador},
        	{'Artista de la cubierta', Artista},
        	{'Publicáu en'          , Publicacion
        		                     , estilodatos='font-style:italic'},
        	{'Triba de publicación'   , argumento['triba de publicación'] or
        		                   argumento['triba']},
        	{'Editorial', Editorial, clase='plainlist'},
        	{'Ciudá'              , LugarPublicacion},
        	{'País'                , Pais},
            {'Data de publicación', Fecha},
            {'Formatu'             , Formato},
            {'Páxines'             , Paginas},
            --{'Tamañu y pesu',       argumento['tamanu_pesu']},  -- Usar los parámetros pal formatu
            {'[[ISBN]]',            ISBN},
            {'[[Online Computer Library Center|OCLC]]', OCLC},
            {'Premios'             , Premios, clase='plainlist'},
            {'Testu n\'asturianu'    , Wikisource}
        },
        
        {tipo='sección',
        	titulo        = 'Llibros',
        	{'',propiedad('P527',{['enlace']='sí', ['lista'] = 'no ordenada', ['valor-función'] = formatoObraAnyo,}), clase='plainlist'}
        }
    }
        
    -- Series de llibros
    
    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             = ColorFondo2,
                    ['estilo fuente'] = 'italic'
                  }            
                }
            )        
        end
    end
    
    if not serieConCualificador then  
    table.insert(FichaLibro,
        {tipo='sección',
        	titulo                = propiedad('P179',{['formatoTexto'] = 'cursivas',['enlace']='sí'}) or
        	                        argumento['serie']           or 
        	                        argumento['Serie de llibros'] or
        	                        'Serie',
        	{tipo = 'sucesión',
        	    anterior          = propiedad('P155',enlazar) or
        	                        argumento['precedíu_por'] or  -- FALTA ver El Mago de la Serpiente
        	                        argumento['anterior']      or 
        	                        argumento['Llibro que-y precede'] or
        	                        argumento['Llibro que-y precede na serie']
        	                        ,
        	    siguiente         = propiedad('P156',enlazar) or
        	                        argumento['siguíu_por'] or 
        	                        argumento['posterior']   or 
        	                        argumento['siguiente']   or 
        	                        argumento['Llibru que-y sigue'] or
        	                        argumento['Llibru que-y sigue na serie']
        	                        ,
                color             = ColorFondo2,
                ['estilo fuente'] = 'italic'
            }
        }
    )
    end

    table.insert(FichaLibro,    
        {tipo='sección',
        	titulo                = argumento['Serie de llibros 2'] or
        	                        'Serie',
        	{tipo = 'sucesión',
        	    anterior          = argumento['Llibru que-y precede 2'] or
        	                        argumento['Llibru que-y precede na serie 2'],
        	    siguiente         = argumento['Llibru que-y sigue 2'] or
        	                        argumento['Llibru que-y sigue na serie 2'],
                color             = ColorFondo2,
                ['estilo fuente'] = 'italic'
            }            
        }
    )
    table.insert(FichaLibro,        
        {tipo='sección',
        	titulo                = argumento['Autor'] and 'Cronoloxía&nbsp;de ' .. argumento['Autor'],
        	{tipo = 'sucesión',
        	    anterior          = argumento['Llibru anterior'] or
        	                        argumento['Llibru que-y precede na cronoloxía'],
        	    siguiente         = argumento['Llibru posterior'] or
        	                        argumento['Llibru que-y sigue na cronoloxía'],
        	    ['año anterior']  = argumento['Añu anterior'] or argumento['Añu del llibru que-y precede na cronoloxía'],
        	    ['añu']           = AnyoOriginal,
        	    ['año siguiente'] = argumento['Añu posterior'] or argumento['Añu del llibru que-y sigue na cronoloxía'],
                color             = ColorFondo2,
                ['estilo fuente'] = 'italic'
            }            
        }        
    )
    
    -- Amestar categoríes si ye dable
    
    if not ModuloPaginas.sePuedeCategorizar() then
    	return ModuloFicha.infobox(FichaLibro)
    end
    
    local categorias = ''

    -- Fallos

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

    local categoriasGeneros = {}
    
    if Entidad and Entidad.claims then
    	if generoWikidata then
    		if generoWikidata:find('[Cc]uento') then
    			-- Cuentos del autor
    			table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Cuentos de $1'},Entidad.claims['P50']))
    		    -- Cuentos d'un añu
                table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Cuentos de $1', ['formatoFecha']='añu'},Entidad.claims['P577']))
       
                -- Cuentos d'un país
                table.insert(categoriasGeneros, categorizarWikidata(
       	             {['categoría']     = 'Cuentos de $1'
       	           },Entidad.claims['P495']))
                -- Pendiente si categorizar pola llingua.

                if subgeneroWikidata then
                    if subgeneroWikidata:find('[Cc]iencia ficción') then
                    	table.insert(categoriasGeneros, '[[Categoría:Cuentos de ciencia ficción]]')
                    end
                    
                    if subgeneroWikidata:find('[Ff]antástica') or subgeneroWikidata:find('[Ff]antasía') then
                    	table.insert(categoriasGeneros, '[[Categoría:Cuentos fantásticos]]')
                    end
                    
                    if subgeneroWikidata:find('[Hh]orror') or subgeneroWikidata:find('[Tt]error') then
                    	table.insert(categoriasGeneros, '[[Categoría:Cuentos de terror]]')
                    end                    
                end
            end
            
            if generoWikidata:find('[Tt]eatru') then
            	-- Obres de teatru por autor
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Obres de teatru de $1'},Entidad.claims['P50']))
            	-- Obres de teatru de un año
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Obres de teatru de $1', ['formatoFecha']='añu'},Entidad.claims['P577']))
       
            	-- Obres de teatru d'un país
            	table.insert(categoriasGeneros, categorizarWikidata(
            		   {['categoría']     = 'Obres de teatru de $1'
            	 	   },Entidad.claims['P495']))
       	   
            	-- Obres de teatru d'una llingua
            	table.insert(categoriasGeneros, categorizarWikidata(
       	            {['categoría']     = 'Obres de teatru en $1',
                	   },Entidad.claims['P364']))
            end
            
            if generoWikidata:find('[Nn]ovela') then
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = categoriasGenerosNovelas},Entidad.claims['P136']))
    	
            	-- Noveles por tema
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = categoriasTemasNovelas},Entidad.claims['P921']))
       
            	-- Noveles del autor
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Noveles de $1'},Entidad.claims['P50']))
       
            	-- Noveles d'un añu
            	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Noveles de $1', ['formatoFecha']='añu'},Entidad.claims['P577']))
       
            	-- Noveles d'un país
            	table.insert(categoriasGeneros, categorizarWikidata(
       	           {['categoría']     = 'Noveles de $1'
       	           },Entidad.claims['P495']))
       
            	-- Noveles d'una llingua
            	table.insert(categoriasGeneros, categorizarWikidata(
       	           {['categoría']     = 'Noveles en $1',
       	           },Entidad.claims['P364']))
            end
        end
        
        if not categoriasGeneros[1] then
        	-- Llibros d'un añu
        	table.insert(categoriasGeneros, categorizarWikidata({['categoría'] = 'Llibros de $1', ['formatoFecha']='añu'},Entidad.claims['P577']))
        	-- Llibros d'un país
        	table.insert(categoriasGeneros, categorizarWikidata(
        	   {['categoría']     = 'Llibros de $1'}
       	       ,Entidad.claims['P495']))
        end
        
        if categoriasGeneros[1] then
           categorias = categorias .. table.concat(categoriasGeneros)
        end
        
        -- Obres infantiles, fábules, etc.    
        categorias=categorias .. categorizarWikidata({['categoría'] = categoriasGeneros},Entidad.claims['P136'])
        
        -- Premios
        categorias = categorias .. categorizarWikidata({['categoría'] = '$1'}, Entidad.claims['P166'])        
    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 '[[llingua ' .. idioma .. '|' .. idioma:gsub("%a", string.upper,1) .. ']]'
   		else
   		    return '[[llingua ' .. idioma .. '|' .. idioma .. ']]'
   	    end
    end
end

-- Función que devuelve la llista de los valores d'una propiedá en Wikidata formatiaos
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'l xéneru y subxéneru de Wikidata.
-- La novela, novela curtia o cuentu se devolverán siempre nel xéneru.
-- El restu de xéneros devolveránse como subxéneru o como xéneru dependiendo de
-- si en Wikidata s'utiliza unu de los xéneros anteriores.
-- Por exemplu:
--  - En Wikidata Novela + ciencia ficción --> xéneru = Novela, subxénero = Ciencia ficción
--  - En Wikidata ciencia ficción --> xéneru = Ciencia ficción

function obtenerGeneroWikidata()
    if not Entidad or not Entidad.claims then
        return 
    end
    
    
	-- Subxéneros de noveles ensin un artículu na Wikipedia y que se remplacen pol subxéneru qu'esiste
	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 /
		['Q12132683'] = 'Q24925'  , -- novela de ciencia ficción /
		['Q10992055'] = 'Q1057172', -- novela fantástica / lliteratura fantástica
		['Q11825892'] = 'Q1233720', -- novela xuvenil /	lliteratura xuvenil
		['Q27022710'] = 'Q1341831', -- novela postciberpunk / postciberpunk
		['Q27020789' ] = 'Q223685' , -- novela steampunk /	steampunk
		['Q26906554'] = 'Q197949' , -- novela posapocalíptica /	ficción posapocalíptica
		['Q3440959' ] = 'Q182015' , -- novela d'intriga /	intriga
		['Q26225470'] = 'Q224989' , -- novela ucrónica / ucronía
		['Q21616374'] = 'Q1425557', -- novela de vampiros /	lliteratura de vampiros
	}
	
	local subgenerosGeneros = {
		['Q132311'  ] = 'Q1057172', -- Xéneru fantásticu / Lliteratura fantástica 
		['Q16681629'] = 'Q224989' , -- lliteratura ucrónica / Ucronía
		['Q516626'  ] = 'Q193606' , -- Terror (sentimientu de mieu o fobia na so escala máxima) / Terror (xéneru lliterariu)	
	}
	
	local temasGeneros = {
		['Q20443047'] = 'Q180774' , -- Lliteratura distópica / Distopía
		['Q26928598'] = 'Q180774' , -- novela distópica / Distopía		
		['Q1481165' ] = 'Q2763'   , -- lliteratura del Holocausto / Holocausto
		['Q182154'  ] = 'Q253732' , -- viaxe al traviés del tiempu / viaje nel tiempu na ficción
		['Q253732'  ] = 'Q253732' , -- viaxe nel tiempu na ficción / viaje nel tiempu na ficción
	}	
 
    local declaracionesGeneros = Entidad.claims['P136']
    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 -- viaxe al traviés del tiempu
				insertarEn(temas, 'Q253732')                 -- viaxe nel tiempu na ficción
			else
 				insertarEn(temas, identificadorTema)
 			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')           -- Lliteratura fantástica 
			elseif identificadorGenero == 'Q149537' then   -- novela curtia
    			insertarEn(generos, 'Q8261')                 -- novela    			
			elseif identificadorGenero == 'Q1347298'  then -- novela por entregues
				-- Nun ye un xéneru en sigo mesmo. Nun amosalo.
    		elseif identificadorGenero == 'Q10453828' then -- novela de viaxes nel tiempu
    			insertarEn(generos, 'Q8261')                 -- novela
    			insertarEn(temas, 'Q253732')                 -- viaxe nel tiempu na ficción				
    		elseif ModuloTablas.en(tablaGeneros, identificadorGenero) then
		    	insertarEn(generos, identificadorGenero)
    		else
		  		insertarEn(subgeneros, identificadorGenero)
    		end
		end
	end

    if generos[1] then
        return addLinkbackWikidata(formatear(generos), Entidad.id, 'P136')
        	, addLinkbackWikidata(formatear(subgeneros), Entidad.id, 'P136')
        	, addLinkbackWikidata(formatear(temas), Entidad.id, 'P921')
    else
        return addLinkbackWikidata(formatear(subgeneros), Entidad.id, 'P136')
        	, nil
        	, addLinkbackWikidata(formatear(temas), Entidad.id, 'P921')
    end
end
 
-- Formatiar una tabla d'identificadores d'entidaes 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

    -- Nun devolver nada si la llista nun tien elementos
    if not primero then
        return mw.text.listToText(identificadoresFormateados)
    end
end

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

function obtenerWikisource(idioma)
	if not idioma or not Entidad or not Entidad.sitelinks then
		return
	end
	
	if idioma:find('[Aa]sturianu') then
		if not Entidad.sitelinks.astwikisource or not Entidad.sitelinks.astwikisource.title then
			return
		end

		tituloWikiSource = Entidad.sitelinks.astwikisource.title		
		--[[Archivu:Wikisource-logo.svg|15px| ]] 
		return "''[[s:" .. tituloWikiSource .. "|" .. tituloWikiSource .. "]]'' en [[Wikisource]]"
	elseif 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		
		
		return "''[[:es: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 estauxunidense
 		   idIdioma == 'Q665624' then -- inglés n'Irlanda
 		   	v.mainsnak.datavalue.value.id='Q1860'
 			v.mainsnak.datavalue.value['numeric-id']=1860
 		end
	end
end
return z