Módulo:Ficha de persona

Vikipetãmegua

La documentación para este módulo puede ser creada en Módulo:Ficha de persona/doc

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 de la persona.
local algunaPropiedadEnlazaWikidata -- Para alguna propiedad no existe la etiqueta ni el enlace mostrándose algo de la forma d:...
local datosautoridad={} --inicializa la tabla que genera los cargos para cada autoridad

local obtenerDatosWikidata -- true si se deben obtener datos de Wikidata

-- Módulos y funciones externas
local ModuloFecha            = require('Módulo:Fecha')
local   edad                 = ModuloFecha.edad
local ModuloFicha            = require('Módulo:Ficha')
local ModuloFormatoTexto     = require('Módulo:Formato texto')
local   enVariasLineas       = ModuloFormatoTexto.enVariasLineas
local   entreParentesis      = ModuloFormatoTexto.entreParentesis
local ModuloIdentificadores  = require('Módulo:Identificadores')
local ModuloPaginas          = require('Módulo:Páginas')	
local ModuloWikidataFormatos = require('Módulo:Wikidata/Formatos')
local   formatoFacebook      = ModuloWikidataFormatos.formatoFacebook
local   formatoTwitter       = ModuloWikidataFormatos.formatoTwitter
local   formatoURL           = ModuloWikidataFormatos.formatoURL
local   formatoPeriodo       = ModuloWikidataFormatos.formatoPeriodo
local ModuloWikidata         = require('Módulo:Wikidata')
local   lapizWikidata        = ModuloWikidata.addLinkback
local   categorizarWikidata  = ModuloWikidata.categorizar
local 	getPropiedadWikidata = ModuloWikidata.getPropiedad
local elementoTabla          = require('Módulo:Tablas').elemento
local enlazarURL             = require('Módulo:URL').enlazar
local sinBandera             = require('Módulo:Bandera').sinBandera

-- Constantes
local enMayusculas    = {['formatoTexto'] = 'mayúscula', ['linkback']='sí'}
local enMayusculasO   = {['formatoTexto'] = 'mayúscula', ['conjunción']=' o ', ['linkback']='sí'}
local listaNoOrdenada = {['lista'] = 'no ordenada', ['linkback']='sí'} --, ['debeExistir'] = 'sí'
local lugar           = {['conjunción']=' o ', ['valor-función'] = ModuloWikidataFormatos.formatoLugar, ['linkback']='sí'}
local debeExistir     = {['debeExistir'] = 'sí', ['formatoTexto'] = 'mayúscula', ['linkback']='sí'}
local conPeriodo      = {['lista'] = 'no ordenada', ['formatoTexto'] = 'mayúscula', ['calificativo'] = formatoPeriodo, ordenar='por fecha', ['linkback']='sí'}
local conPeriodoDebeExistir = {['lista'] = 'no ordenada', ['formatoTexto'] = 'mayúscula', ['calificativo'] = formatoPeriodo, ordenar='por fecha', ['debeExistir'] = 'sí', ['linkback']='sí'}
local sinEnlazar = {['enlace']='no', ['linkback']='sí'}
local sinLapiz   = {}
local normal     = {['linkback']='sí'}

local nombre = ''

function fechaiso(x)
 return x.time
end

function z.Ficha(frame)
    ModuloWikidata:setFrame(frame)  -- No funciona si se pone ModuloWikidata.setFrame(marco)    
    -- Obtener una copia de los argumentos eliminando los argumentos sin valor
    -- y dejando en blanco (aunque no nil) aquellos que valen "no"
    argumento = obtenerArgumentosConValor(frame) -- No poner local. Es global.
    
    --Determinar si se deben obtener datos de Wikidata
    if argumento['wikidata'] == 'no' and (argumento['fecha de fallecimiento'] or argumento['lugar de fallecimiento']
    	or argumento['fecha de desaparición'] or argumento['lugar de desaparición']
    	) then
        obtenerDatosWikidata = false
      	Entidad = nil
    else
    	obtenerDatosWikidata = true
    	-- Obtener los datos de la página donde se inserta la ficha de Wikidata.
    	Entidad   = mw.wikibase.getEntityObject(argumento['id']) or {}
    end

    --Determinar datos para la ficha
    local educacion = argumento['educación'] or argumento['educacion'] or propiedad('P512',sinEnlazar)
    local almamater = argumento['alma máter'] or argumento['alma_mater'] or argumento['alma mater'] or argumento['almamáter'] or argumento['alma_máter']
            	or propiedad('P69', { ['formatoTexto'] = 'mayúscula', ['lista'] = 'no ordenada', ['calificativo']   = 'P512',['separadorcalificador']='<br>', ['linkback']='sí'})
    
	if propiedad('P21', sinLapiz) == 'femenino' or propiedad('P21', sinLapiz) == 'mujer transgénero' then
    	etiquetaAnyosActivo = 'Años activa'
    	etiquetaConocidoPor = 'Conocida&nbsp;por'
    	etiquetaInfluencias = 'Influida por'
    	etiquetacampeon 	= '[[Campeonato del mundo de ajedrez|Campeona del mundo]]'
    	etiquetaAlumnoDe    = 'Alumna de'
    	funcionOcupacion    = formatoOcupacionFemenino
    else
    	etiquetaAnyosActivo = 'Años activo'
    	etiquetaConocidoPor = 'Conocido&nbsp;por'    	
    	etiquetaInfluencias = 'Influido por'
    	funcionOcupacion    = formatoOcupacionMasculino
    	etiquetacampeon		= '[[Campeonato del mundo de ajedrez|Campeón del mundo]]'
    	etiquetaAlumnoDe    = 'Alumno de'
    end
	seccionartistica='Carrera artística'

--GENERAR CARGOS
if argumento['cargo']==nil then
datosautoridad['cargo1']={tipo='sección',{'',''},}
else
saltoautoridad='<hr>'
datosautoridad['cargo1']=generarcargo(argumento,1,frame)
SiHayCargos = true
argumento['predecesor']= nil
argumento['sucesor']= nil
end
for i=2, 10 do
	campovacio=0
	if argumento['cargo'..i]==nil and argumento['inicio'..i]==nil  then
	   datosautoridad['cargo'..i]={tipo='sección',{'',''},}
	else
	datosautoridad['cargo'..i]=generarcargo(argumento,i,frame)
	SiHayCargos = true
	end
end

    -- La ocupación y el área solo se obtienen de Wikidata si no se informan los campos de ocupación y área.
    -- Esto es porque para los artistas puede tener en Wikidata como ocupación "pintor y escultor" y 
    -- tener informada el área con "pintura y escultura".

    local ocupacion = argumento['ocupación'] or argumento['ocupacion'] or  argumento['Ocupación']  or argumento['profesión']
    local area      = argumento['área'] or argumento['area'] or argumento['especialidad'] or argumento['campos']
    
    if not ocupacion and not area then
    	ocupacion = propiedad('P106', {['formatoTexto'] = 'mayúscula', ['valor-función']=funcionOcupacion, ['calificativo'] = formatoPeriodo, ['linkback']='sí'})
    	area      = propiedad('P101', enMayusculas) -- Campo de trabajo
    end

    local ocupacionOArea = ocupacion or area 
             
    nombre = argumento['nombre'] or argumento['Nombre'] or
         obtenerEtiquetaWikidata() or 
         ModuloPaginas.nombrePagina({desambiguar='sí'})

    local nombre_completo   = argumento['nombre completo']          
	local nombre_nacimiento = argumento['nombre de nacimiento'] or propiedad('P1477')
	local nombre_nacimiento_sin_lapiz = argumento['nombre de nacimiento'] or propiedad('P1477', sinLapiz)

	-- Nombre en la escritura nativa.
	-- Solo se muestra si no coincide con el nombre o el nombre de nacimiento o el nombre completo
	local nombresNativos={tipo='sección'}
	local nombreNativo, textoNombreNativo, idiomaNombreNativo
	
	if argumento['nombre nativo'] then
		if argumento['nombre nativo'] ~= nombre and 
		   argumento['nombre nativo'] ~= nombre_nacimiento_sin_lapiz and
		   argumento['nombre nativo'] ~= nombre_completo then
		   	table.insert(nombresNativos,{'Nombre nativo', argumento['nombre nativo']})
		end
	elseif Entidad then
		-- En el caso de obtener de Wikidata puede haber varios nombres nativos
		
		local declaracion = elementoTabla(Entidad, 'claims','P1559')
		
		if declaracion then

			for k,v in pairs(declaracion) do
				nombreNativo = elementoTabla(v, 'mainsnak', 'datavalue', 'value')
				if nombreNativo then
					textoNombreNativo  = nombreNativo.text
					idiomaNombreNativo = nombreNativo.language
					if textoNombreNativo and idiomaNombreNativo and 
				   		textoNombreNativo ~= nombre and 
				   		textoNombreNativo ~= nombre_nacimiento_sin_lapiz and
				   		textoNombreNativo ~= nombre_completo then
							table.insert(nombresNativos, {
								'Nombre en ' .. mw.language.fetchLanguageName(idiomaNombreNativo, 'es') , 
								lapizWikidata(textoNombreNativo,Entidad.id,'P1559')
								}
							)
					end
				end
			end
		end

	end
             
    -- Informar los datos de nacimiento, desaparición y de fallecimiento
    -- No se debe alterar el orden para que en caso de que el lugar de fallecimiento o el de desaparición sea el mismo
    -- que el de nacimiento esté enlazado el lugar de nacimiento
    local nacimiento, desaparicion, fallecimiento
    local lugarNacimiento    = argumento['lugar de nacimiento'] or propiedad('P19', lugar)
    local lugarDesaparicion  = argumento['lugar de desaparición']
    local lugarFallecimiento = argumento['lugar de fallecimiento'] or propiedad('P20', lugar)
    
    fallecimiento = enVariasLineas({
    	argumento['fecha de fallecimiento'] or (obtenerDatosWikidata and entreParentesis(propiedad('P570', enMayusculasO), obtenerEdadWikidata('P570'))), 
    	lugarFallecimiento
    })

    if fallecimiento then
    	desaparicion = enVariasLineas({
    					argumento['fecha de desaparición'] or propiedad('P746', enMayusculasO), 
    					lugarDesaparicion
					    })    	
    else
    	desaparicion = enVariasLineas({
    					argumento['fecha de desaparición'] or (obtenerDatosWikidata and entreParentesis(propiedad('P746', enMayusculasO), obtenerEdadWikidata('P746'))), 
    					argumento['lugar de desaparición']
					    })
    end
    
    if fallecimiento or desaparicion then
    	nacimiento = enVariasLineas({
    					argumento['fecha de nacimiento'] or propiedad('P569', enMayusculasO), 
    					lugarNacimiento
					    })
    else
    	nacimiento = enVariasLineas({
    					argumento['fecha de nacimiento'] or (obtenerDatosWikidata and entreParentesis(propiedad('P569', enMayusculasO), obtenerEdadWikidata())), 
    					lugarNacimiento
					    })
    end
    
    if argumento['padres'] then
    	padres = estaEnlazado(argumento['padres'])
    else
    	padre = propiedad('P22')
    	madre = propiedad('P25')
    	
    	if padre and madre then
    		padres = padre .. '<br/>' .. madre
    		padre  = nil
    		madre  = nil
    	end
    end
    
    firma = argumento['firma'] or argumento['Firma'] or
        	propiedad('P109', {['no añadir enlace Wikidata'] = true})
    
    -- Título según la ocupación y si la persona ha muerto
    
    local tipocabecera, estilotitulo, clasetitulo
        
    if ocupacionOArea then
    	if ocupacionOArea:find('[Aa]ctor') or ocupacionOArea:find('[Aa]ctriz') or ocupacionOArea:find('[Pp]roductor de cine')
    	or ocupacionOArea:find('[Dd]irector de cine') then
    		tipocabecera   = 'cine'
    		estilotitulo = 'background-color:#f9e999'
    		seccionartistica = ''

    	elseif ocupacionOArea:find('[Aa]rtista') or ocupacionOArea:find('[Pp]intor') or 
    	 	 ocupacionOArea:find('[Ee]scultor') or ocupacionOArea:find('[Pp]intura') or ocupacionOArea:find('[Ee]scultura') or
    		 ocupacionOArea:find('[Ff]otograf') or ocupacionOArea:find('[Aa]rtes visuales') then
        	tipocabecera = ''
        	estilotitulo = 'background-color:#8DB1C3;color:#FFF'
    	elseif ocupacionOArea:find('[Aa]jedrecista') or argumento['elo'] or rankingajedrez then
        	tipocabecera = ''
        	estilotitulo = 'background-color: #D8BFD8'
    	elseif ocupacionOArea:find('[Ee]scritor') or ocupacionOArea:find('[Nn]ovelista') or 
    	       ocupacionOArea:find('[Pp]oeta') or ocupacionOArea:find('[Dd]ramaturgo') then
        	tipocabecera = 'libro'
        	estilotitulo = 'background-color:#4c6099;color:#FFF'
       	elseif ocupacionOArea:find('[Mm]úsico') or ocupacionOArea:find('[Cc]ompositor') or 
    	ocupacionOArea:find('[Cc]antante') then
        	tipocabecera = 'música'
        	estilotitulo = 'background-color:#f0e68c'
		--
    	--Pendiente por poner el estilo de POLITICO!
    	elseif ocupacionOArea:find('[Pp]olític[oa]') or argumento['cargo'] then
        --	tipocabecera = 'libro'
        --	estilotitulo = 'background-color:#4c6099;color:#FFF'
    		tipocabecera = 'humano fn'
       		estilotitulo = 'background-color:#8DB1C3;color:#FFF'        
        
    	elseif ocupacionOArea:find('[Pp]eriodista') then
    		tipocabecera   = 'revista'
    		estilotitulo   = 'background-color:#ED8;color:#000'
		elseif ocupacionOArea:find('[Dd]iseñador') then
    		estilotitulo     = 'background-color:#ccccff' 
    	elseif ocupacionOArea:find('[Pp]resentador') or ocupacionOArea:find('[Cc]onductor') then
    		tipocabecera   = 'cabecera televisión'
    		estilotitulo   = 'background-color:#ED8;color:#000'
   		elseif ocupacionOArea:find('[Mm]odelo') then
    		tipocabecera   = 'hombremujer'
    		estilotitulo   = 'background-color:#9F9;color:#000'
    	elseif ocupacionOArea:find('[Mm]ilitar') then
			clasetitulo    = 'militar'
            estilotitulo   = 'background-color:#b0c4de;color:#000'    		
    	else
    		tipocabecera = 'humano fn'
       		estilotitulo = 'background-color:#8DB1C3;color:#FFF'
   		end  
    end
    
    if fallecimiento or desaparicion then
    	estilotitulo = 'background-color:#c0c0c0;color:#000'
    end
    estilocabecera = estilotitulo
    if SiHayCargos == true then
    cargosocupados = ''
    tipocabecera= nil
    estilocabecera= 'background-color:transparent;'
	--estilotitulo   ='background-color:#8DB1C3;color:#FFF'
     estilotitulo   ='background-color:#E6E6FA;'
 else
 	cargosocupados = argumento['cargo ocupado'] or propiedad('P39', {['lista'] = 'no ordenada', ['formatoTexto'] = 'mayúscula', 
 		ordenar='por fecha', 
 		['linkback']='sí',
 		['valor-función'] = ModuloWikidataFormatos.formatoCargo
 		})
end

if argumento['ranking'] or argumento['ránking'] then
	rankingajedrez= (argumento['ranking'] or argumento['ránking']) .. frame:preprocess('<ref> [http://ratings.fide.com/toplist.phtml Clasificación FIDE] </ref>')
end    
	-- Imagen y pie de la imagen
	local imagen = argumento['imagen']  or argumento['Imagen'] or argumento['foto']
	local pieDeImagen
	
	if imagen then
		pieDeImagen = argumento['pie de imagen'] or argumento['pieimagen'] or
                      argumento['descripción'] or argumento['descripcion'] or
                      argumento['pie de foto'] or argumento['piedefoto'] or
                      argumento['textoimagen'] or argumento['TextoImagen'] or argumento['texto_imagen'] or
                      argumento['pie de foto']
	else
		imagen, pieDeImagen = obtenerImagenWikidata()
		-- Pendiente obtener el pie del calificativo P2096
	end
                            
    local Ficha = {
    	wikidata        = not obtenerDatosWikidata and 'no',
        clase           = 'biography vcard',

        -- Título
        tipocabecera    = tipocabecera,                   
        titulo          = nombre,
        colorfondo      = colorfondo,        
        estilotitulo    = estilocabecera,
        clasetitulo     = clasetitulo,
        --Imagen
        --De momento no se pone una raya como en la ficha de escritor tras la imagen
        imagen          = imagen,
        ['tamañoimagen']= argumento['tamaño de imagen'] or argumento['tamaño'] or 
                          argumento['tamaño imagen'] or argumento['tamañoimagen'] or argumento['tamañodelaimagen'] or
                          argumento['tamaño de foto'] or 
                          '220px', -- or '200px' en la ficha de escritor, 192 en la ficha de artista. Tomo por defecto 220, el tamaño de thumb
        pie             = pieDeImagen,
        -- Pendiente: en la ficha de escritor el texto se pone entre <small> y en la de artista se usa el estilo font-size:smaller
        --Etiquetas y datos                  
        estiloetiqueta  = 'width:33%', -- 25% en la ficha de escritor. Sin especificar en la de persona
                          --'padding:0.2em 1.0em 0.2em 0.2em; background-color:transparent; line-height:1.2em;', -- En la ficha de persona original
        estilodatos     = 'padding:0.2em; line-height:1.3em; vertical-align:middle;',
        {tipo='sección',
            {'', saltoautoridad},
        },
       	datosautoridad['cargo1'],
 		datosautoridad['cargo2'],
 		datosautoridad['cargo3'],
 		datosautoridad['cargo4'],
 		datosautoridad['cargo5'],
 		datosautoridad['cargo6'],
 		datosautoridad['cargo7'],
 		datosautoridad['cargo8'],
 		datosautoridad['cargo9'],
 		datosautoridad['cargo10'],
        {tipo='sección',
        	['titulo']   = 'Información personal',   -- Ver la ficha de noble o la ficha de diseñador
            estilotitulo = estilotitulo,
            {'Nombre completo',                                      -- solo si no coincide con:
            	(nombre_completo ~= nombre) and                      --    - el nombre que se muestra en el título de la ficha
            	(nombre_completo ~= nombre_nacimiento_sin_lapiz) and --    - o con el nombre de nacimiento
            	 nombre_completo},
            {'Nombre de nacimiento', -- solo si no coincide con el nombre que se muestra en el título de la ficha
            	(nombre_nacimiento_sin_lapiz ~= nombre) 
            	and nombre_nacimiento},
            nombresNativos,
            {'Apodo',              argumento['apodo']},
            {'Otros&nbsp;nombres', argumento['otros nombres'] or argumento['alias'], -- ¿No es lo mismo que el apodo?????
        	                       clase='nickname'},        	                   
            {'Nacimiento',         nacimiento},
			{'Desaparición',	   desaparicion},
            {'Fallecimiento',      fallecimiento},
            {'Causa de la muerte', siNoEs(argumento['causa muerte'] or
        	                       propiedad('P509', enMayusculas) or 
        	                       propiedad('P1196', enMayusculas), 'Causas naturales')}, -- circunstancias de la muerte
        	{'Lugar de sepultura',  argumento['lugar de descanso'] or propiedad('P119', debeExistir)},

            {'Residencia',     sinBandera(argumento['residencia'] or 
            	               argumento['país_de_residencia'] or argumento['pais_de_residencia'] or
            	               argumento['lugar_de_residencia']) or
            	               propiedad('P551', {['debeExistir'] = 'sí', ['linkback']='sí', ['rangoMayor'] = 'sí'}),
        	                   clase='etiqueta'},        	
            {'Nacionalidad',   sinBandera(argumento['nacionalidad'] or argumento['Nacionalidad'] or argumento['ciudadanías']) or --Pendiente hacer que salga el gentilicio
        	                   propiedad('P27', {['valor-función'] = ModuloWikidataFormatos.formatoGentilicio, 
        	                   	                 ['formatoTexto'] = 'mayúscula',  
        	                   	                 ['calificativo'] = formatoPeriodo,
        	                   	                 ordenar='por fecha',
        	                   	                 ['linkback']='sí'}), 
        	                   clase='category'},  
            {'Ciudadanía',     sinBandera(argumento['ciudadanía'] or -- ¿No es lo mismo que la nacionalidad?
        	                   argumento['ciudadania']),
        	                   clase='category'},
        	{'Lengua materna',  argumento['lengua_materna'] or argumento['Lengua_materna'] or propiedad('P103', enMayusculas)},
            {'Etnia',          --propiedad('P172', enMayusculas) or 
        	                   argumento['etnia'] or argumento['grupo étnico'],
        	                   clase='category'},
            {'Religión', 		argumento['religión'] or propiedad('P140', debeExistir)},
        	{'Orden religiosa', argumento['congregación'] or propiedad('P611', enMayusculas)},
        	{'Partido político',   argumento['partido político'] or argumento['partido'] or propiedad('P102')},
        	{'Otras afiliaciones políticas',   argumento['afiliaciones'] or propiedad('P1416')},
            
        },
        {tipo='sección',
        	estilotitulo = estilotitulo,
        	['titulo']   = 'Características físicas',
        	{'Altura',             argumento['altura'] or argumento['estatura'] or propiedad('P2048')},
        	{'Peso',               argumento['peso'] or propiedad('P2067')},
        	{'Medidas', argumento['medidas']},
        	{'Ojos', argumento['color de ojos'] or propiedad('P1340', enMayusculas)},
        	{'Cabello', argumento['color de cabello'] or propiedad('P1884', enMayusculas)},
        	{'[[Implante de mama|Pecho natural]]', argumento['busto natural']},
        	--{'[[Orientación sexual]]', propiedad('P91', enMayusculas) or argumento['orientación sexual'] or argumento['orientación real']}
          },
        {tipo='sección',
            -- Familia. 
            estilotitulo  = estilotitulo,
            ['titulo']    = 'Familia', -- Ver la ficha de noble
            
        -- En el caso del cónyuge tiene preferencia el argumento hasta que se muestre los calificativos.
            clase       ='plainlist', -- Mostrar las listas sin viñetas
            {'Familia nobiliaria', propiedad('P53', debeExistir)},
            {(padres and 'Padres') or (padre and 'Padre') or 'Madre', -- Mostrar padres, padre o madre según esté informado ambos o solo uno de ellos
            	padres or padre or madre},
            {'Cónyuge',    estaEnlazado(argumento['cónyuge'] or argumento['conyuge'] or argumento['Cónyuge'] or argumento['Conyuge'] or
        	               propiedad('P26', conPeriodo))},
            {'Pareja',     estaEnlazado(argumento['pareja'] or propiedad('P451', conPeriodo))},
            {'Hijos',      estaEnlazado(argumento['hijos'] or argumento['Hijos']) or
        	               propiedad('P40', {['lista'] = 'no ordenada', ['debeExistir'] = 'sí', ['linkback']='sí'}) or
        	               propiedad('P1971', sinEnlazar)
			},
            {'Familiares', estaEnlazado(argumento['familiares'])}, --- ¿¿¿¿¿¿¿¿¿??????????? -- Hermano: P7, padastro: p43, pariente: p1038
        },
        {tipo='sección',
        	['titulo']   = 'Educación',
            estilotitulo = estilotitulo,
            {'Educación',  educacion},
            {'Alma máter', almamater, clase='plainlist'},
            {'Posgrado',   argumento['posgrado']},
            {'[[Tesis]]', 
            	entreParentesis(
            		(argumento['url tesis'] and enlazarURL(argumento['url tesis'], ModuloFormatoTexto.enCursivas(argumento['título tesis']))-- Si se informa la url
            		) or (not argumento['url tesis'] and ModuloFormatoTexto.enCursivas(argumento['título tesis']) -- Si no se informa la url
            		) 
            	, argumento['año tesis'])
            },
            {'Supervisora doctoral', argumento['supervisora doctoral']},
            {'Supervisores doctorales'  , argumento['supervisores doctorales']},
            {'Supervisor doctoral' , argumento['supervisor doctoral'] or propiedad('P184')},
            {etiquetaAlumnoDe, argumento['alumno de'] or  propiedad('P1066', conPeriodoDebeExistir), clase='plainlist'},
        },
        {tipo='sección',
        	['titulo'] = 'Información profesional',
            estilotitulo = estilotitulo,
            {'Ocupación',      ocupacion, clase='role'},
            {'Área',           area},
            {etiquetaConocidoPor,  argumento['conocido por'] or argumento['conocido']},
            {'Cargos ocupados',    cargosocupados,clase='plainlist'}, -- políticos o en empresas
        	
        	{'Empresa',            argumento['empresa']},
        	{'Estudio',            argumento['nombre estudio']}, -- Arquitectos
        	{'Restaurantes',       argumento['restaurantes']},   -- Para cocineros. Restaurantes en los que ha trabajado.
        	
        	{'Salario',            argumento['salario']},
        	{'Patrimonio',         argumento['patrimonio'] or argumento['fortuna']},
        	{'Tratamiento',        argumento['tratamiento']},
        	{etiquetaAnyosActivo,  argumento['años activo'] or argumento['años activa'] or
        					   argumento['añosactivo'] or 
        	                   argumento['periodo'] or argumento['período'] or argumento['Periodo'] or
        	                   argumento['tiempo'] or argumento['Tiempo'] or 
        	                   formatoPeriodo({ -- falta que salga el lápiz
        	                   		['P580']={[1]=elementoTabla(Entidad, 'claims','P2031',1,'mainsnak')},
        	                   		['P582']={[1]=elementoTabla(Entidad, 'claims','P2032',1,'mainsnak')}
        	                   	})},
        	
        	-- Sección artística (actores y ¿presentadores?)
        	{tipo='sección',
        		['titulo']   = seccionartistica,
            	estilotitulo = estilotitulo,
            	{'Rol debut'    , argumento['rol debut']},
            	{'Año de debut' , argumento['año debut']},
            	{'Año de retiro', argumento['año retiro']},
            	{'Películas'    , argumento['número de películas']},
            	{'Serie'        , argumento['serie']},
    		},
    	
            {'Empleador',      argumento['empleador'] or
        	                   argumento['institución_de_trabajo'] or
        	                   argumento['nombre_estudio'] or
        	                   propiedad('P108', conPeriodo),
                               clase       ='plainlist'},
            --Profesores
            {'Estudiantes doctorales',   argumento['estudiantes doctorales'] or propiedad('P185', debeExistir)},
            {'Estudiantes', argumento['estudiantes'] or propiedad('P802', debeExistir)},
            
            -- Periodistas y presentadores
            {tipo='sección',
            	{'Medio',          argumento['medio de comunicación']}, -- Unas veces informados con el significado de área y otras con el empleador
            	{'Canal',          argumento['canal']},
            	{'Programas',      argumento['programas'] or argumento['programa']},
            },
             
            -- Ocupación (escritores, artistas, periodistas, diseñadores, etc)
            -- Información artística
            {tipo='sección',
            	{'[[Seudónimo]]', argumento['seudónimo'] or argumento['Seudónimo'] or propiedad('P742')},
            	{'Lengua de producción literaria',  argumento['lengua_literaria'] or argumento['Lengua_literaria']},
            	{'Género',          argumento['género'] or argumento['Género'] or propiedad('P136', enMayusculas)},
            	plural(argumento['instrumento'] or propiedad('P1303', enMayusculas), 'Instrumento', 'Instrumentos'),
            	plural(argumento['compañía discográfica'] or propiedad('P264', conPeriodo), 'Discográfica', 'Discográficas', 'plainlist'),
            	{'[[Movimiento artístico|Movimientos]]', argumento['movimiento'] or 
        	                                     argumento['Movimiento'] or
        	                                     argumento['movimientos'] or 
        	                                     propiedad('P135', enMayusculas)},
            },        	
        	-- Obras notables. Se ponen de momento en cursivas pero es incorrecto en el caso de arquitectos.
            {'Obras notables', argumento['obras destacadas'] or
        	                   argumento['obras notables'] or argumento['obras_notables'] or argumento['Obras notables'] or
        	                   argumento['obras'] or
        	                   argumento['proyectos_representativos'] or propiedad('P800',{['enlace']='sí', ['lista'] = 'no ordenada',  ['debeExistir'] = 'sí', ['formatoTexto']='cursivas', ['linkback']='sí'}),
        	                   clase='plainlist'
        	                       },
            {'Proyectos representativos', argumento['proyectos representativos']},
            {'Artistas relacionados', argumento['relacionados']},
            {'[[Autor de nombre científico#Abreviatura del autor|Abreviatura en botánica]]',
            	argumento['abreviatura en botánica'] or propiedad('P428')},
            {'[[Autor de nombre científico|Abreviatura en zoología]]',
            	argumento['abreviatura en zoología'] or propiedad('P835')},
            {'[[Autor de nombre científico|Abreviatura en astronomía]]',
            	argumento['abreviatura en astronomía']},
            	
            --{'', listaDesplegable(etiquetaInfluencias, argumento['influenciado por'] or argumento['influido por'] or 
            --	                  argumento['influencias'] or argumento['Influencias'], frame)},
            --{'',         listaDesplegable('Influyó a', argumento['influyó en'] or argumento['influyó'] or argumento['Influyó'], frame)},
            
            -- Militares
            {'Rama militar', argumento['rama']       or propiedad('P241', enMayusculas)},
            {'Rango',        argumento['rango']      or propiedad('P410', conPeriodo), clase='plainlist'},
            {'Participó en', argumento['conflictos'] or argumento['batallas'] or propiedad('P607', enMayusculas)},
            
            -- Ajedrecistas
            {tipo='sección',
            	{'Título',             	argumento['título']		or argumento['titulo']}, -- <!-- Su majestad, primera dama, etc -->
            	{etiquetacampeon,		argumento['campeón'] 	or argumento['campeon']},
            	{'[[Sistema de puntuación Elo|Elo]]',   		propiedad('P1087',{['formatoUnidad'] = 'número', ['calificativo']   = 'P585', ['linkback']='sí', ['rangoMayor'] = 'sí'}) or argumento['elo'] }, -- 
            	{'[[Sistema de puntuación Elo|Mejor elo]]',   	argumento['mejor elo']},
            	{'Ránking',				rankingajedrez},
            	{'Mejor ránking',   	argumento['mejor ranking']},
            	{'Término',            	argumento['término'] or -- <!--Años bajo los cuales la persona tuvo el título (el de arriba xD) -->
        	    		               	argumento['termino']},
            	{'Predecesor',         	argumento['predecesor']},
            	{'Sucesor',            	argumento['sucesor']},
            }, 
            {'Miembro de', argumento['miembro de'] or propiedad('P463', conPeriodoDebeExistir), clase='plainlist'},
        },

        {tipo='sección',
        	['titulo']   = 'Premios artísticos',   -- Ver la ficha de noble o la ficha de diseñador
            estilotitulo = estilotitulo,
            {'[[Premios Óscar]]', argumento['premios óscar']},
            {'[[Premios Globo de Oro|Globos de Oro]]', argumento['premios globo de oro']},
            {'[[Premios BAFTA]]', argumento['premios bafta']},
            {'[[Premios Emmy]]', argumento['premios emmy']},
            {'[[Premios del Sindicato de Actores|Premios SAG]]', argumento['premios sag']},
            {'[[Premios Tony]]', argumento['premios tony']},
            {'[[Premios Grammy]]', argumento['premios grammy']},
            {'[[Festival de Cannes]]', argumento['premios cannes']},
            {'[[Berlinale]]', argumento['premios berlinale']},
            {'[[Festival Internacional de San Sebastián]]', argumento['premios san sebastian']},
            {'[[Festival Internacional de Cine de Moscú]]', argumento['premios moscu']},
            {'[[Premios Goya]]', argumento['premios goya'] },
            {'[[Premios César]]', argumento['premios césar']   or argumento['premios cesar']},
            {'[[Premios Ariel]]', argumento['premios ariel']},
            {'[[Premios Cóndor de Plata]]', argumento['premios cóndor'] or argumento['premios condor']},
            {'Otros premios', argumento['otros premios']},
        },
        {tipo='sección',
        	['titulo']   = 'Carrera deportiva',   -- Ver la ficha de noble o la ficha de diseñador
            estilotitulo = estilotitulo,
            {'Deporte', argumento['deporte']},
        },
        {'',seccionDesplegable('Títulos y <br> reconocimientos',argumento['títulos'], frame,estilotitulo)},
        -- Los premios pueden ser para varias ocupaciones por lo que se ponen al final
        -- Premios, condecoraciones, medallas, distinciones, etc.
        {'Distinciones', argumento['premios'] or argumento['Premios'] or
                         argumento['premio']  or argumento['Premio']  or
                         argumento['premios2'] or
                         obtenerPremios()
                       , clase       ='plainlist'}, -- Mostrar las listas sin viñetas
        	                   
        -- Con etiqueta/datos como en las fichas de escritor y artista en vez de como en la ficha de persona
        {'Firma', (firma and ('[[Archivo:' .. firma .. '|150px]]'))}, -- 150 px como en la ficha de escritor en vez de 128

        {tipo='sección', -- Web
            clase       ='plainlinks',
            titulo      ='Web',
            estilotitulo  = estilotitulo,
            {'Sitio web', noAlargar(enlazarURL(argumento['web'] or argumento['página web'] or argumento['website'] or argumento['sitio web'] or argumento['sitioweb']) or
            	propiedad('P856', {['valor-función'] = formatoURL, ['linkback']='sí', ['rangoMayor'] = 'sí'}))},
            {'Facebook', obtenerFacebook()}, -- Ver la plantilla facebook
            {'Twitter',  obtenerTwitter()},  -- Ver la plantilla twitter
        },
        {tipo='sección',
            titulo      ='Notas',
            estilotitulo='border-top:1px solid #c0c0c0;text-align:left',
            {'', argumento['notas'], estilodatos='text-align:left;font-size:90%; line-height:1.2em'}
        },        
        --{'Fuente biográfica', argumento['fuentebiográfica']},
    }

    categorias = {}
    
    if  argumento['lugar_de_descanso'] or --renombrado
    	argumento['supervisora_doctoral'] or --renombrado
    	argumento['supervisores_doctorales'] or --renombrado
    	argumento['supervisor_doctoral'] or --renombrado
    	argumento['tesis_url'] or --renombrado
    	argumento['tesis_título'] or --renombrado
    	argumento['tesis_año'] or --renombrado
    	argumento['abreviatura en astronomía']
    	--or argumento['influyó en'] or argumento['influyó'] or argumento['Influyó'] -- eliminado
    	--or argumento['predecesor'] or argumento['sucesor']-- eliminado
    	or argumento['fuentebiográfica'] --por eliminar
    	or argumento['mail'] --por eliminar
    	then
      	table.insert(categorias, '[[Categoría:Wikipedia:Páginas con parámetros a reemplazar de la plantilla ficha de persona ]]')
    end
    
    if nacimiento and not fallecimiento then
    	table.insert(categorias, '[[Categoría:Personas vivas]]')
    end
    
    if Entidad and Entidad.claims and Entidad.claims['P21'] then
    	table.insert(categorias,
    		categorizarWikidata(
    			{['categoría'] = {
    				[6581097] = 'Hombres',
    				[6581072] = 'Mujeres'
    			}
    			}, Entidad.claims['P21'])
    	)
    end
    
    namespace = mw.title.getCurrentTitle().namespace
    if categorias[1] and (namespace == 0 or namespace == 104) then
    	return ModuloFicha.infobox(Ficha) .. table.concat(categorias)
    else
    	return ModuloFicha.infobox(Ficha)
    end
end

function generarcargo(argumento,numero,frame)
	dato=numero --se requieren dos variables por el primer parámetro
	if numero == 1 then numero ='' end --si es el primer cargo, entonces no tiene número
	if argumento ['cargo'..numero] == nil then titulo=''
	elseif argumento['escudo'..numero] == nil then titulo=argumento['cargo'..numero] -- si no tiene escudo entonces dejar en blanco, si tiene escudo ponerlo
	else	titulo='[[Archivo:'..argumento['escudo'..numero]..'|44x40px]]<br />'..argumento['cargo'..numero] end
	if argumento['distrito'..numero] then titulo = titulo..'<br /><small>por '..argumento['distrito'..numero]..'</small>' end
	if argumento['embajadorde'..numero] then titulo = titulo .. frame:preprocess('{{bandera|'.. argumento['embajadorde'..numero] ..'|tamaño=44x40px}}') end--{{bandera|{{{embajadorde}}}|tamaño=44x40px}} 
	if argumento['país'..numero] then titulo = titulo .. frame:preprocess('{{bandera|'.. argumento['país'..numero] ..'|tamaño=44x40px}}') end
	if argumento['subtítulo'..numero] then titulo = titulo .. '<br /><small>'..argumento['subtítulo'..numero]..'</small>' end
	periodo = ''
	if argumento['inicio'..numero] and argumento['final'..numero] then
		periodo = argumento['inicio'..numero]..'-'.. argumento['final'..numero]
	elseif argumento['final'..numero] then
		periodo = 'Hasta el ' .. argumento['final'..numero]
	elseif argumento['inicio'..numero] then
		titulo = titulo .. '<br /> <small> Actualmente en el cargo</small>'
		periodo = 'Desde el '..argumento['inicio'..numero]
	end
	
	cadenatexto={tipo='sección',
        	['titulo']=titulo,
            estilotitulo = 'background-color:#E6E6FA;',
            {'', periodo},
    	    {'Vicegobernador', argumento['vicegobernador'..numero] },
    	    {'[[Presidente]]', argumento['presidente'..numero] },
    	    {'[[Monarca]]', argumento['monarca'..numero] },
    	    {'[[Primer ministro]]', argumento['primerministro'..numero] },
    	    {'[[Gobernador]]', argumento['gobernador'..numero] },
    	    {'[[Jefe de Gobierno]]', argumento['jefe'..numero]},
    	    {'Junto a', argumento['juntoa'..numero] },
    	    {'Nominado por', argumento['nominado'..numero] },
    	    {'Designado por', argumento['designado'..numero] },
    	    {'Gabinete', argumento['gabinete'..numero] },
    	    {'[[Vicepresidente]]', argumento['vicepresidente'..numero] },
    	    {'Viceprimerministro', argumento['viceprimerministro'..numero] },
    	    {'[[Teniente gobernador]]', argumento['teniente'..numero] },
    	    {'Vicealcalde', argumento['vicealcalde'..numero] },
    	    {'Vicejefe de gobierno', argumento['vicejefe'..numero]},
    	    {'[[Canciller]]', argumento['canciller'..numero]},
    	    {'Vicecanciller', argumento['vicecanciller'..numero]},
    	    {'Predecesor', argumento['predecesor'..numero]},
    	    {'Sucesor', argumento['sucesor'..numero]},
    	    {'Compañero de fórmula', argumento['fórmula'..numero]},
    	    {'Oponente/s', argumento['oponentes'..numero]},
    	    {'En el cargo', argumento['enelcargo'..numero] },
    	    {argumento[dato..'data1'], argumento[dato..'data2'] },
    	    {argumento[dato..'data3'], argumento[dato..'data4'] },
    	    {'','<hr>'}
        }
return cadenatexto

end
-- Función que devuelve la lista de los valores de una propiedad en Wikidata formateados
function propiedad(idPropiedad,opciones)
	-- No obtener ninguna propiedad de Wikidata para las personas fallecidas si se accede con el parámetro wikidata=no
	if not obtenerDatosWikidata then
		return
	end
	
    if Entidad and Entidad.claims and Entidad.claims[idPropiedad] then
    	if not opciones then
    		opciones = {['linkback']='sí'}
    	end
    	
    	opciones.entityId = Entidad.id
    	--if idPropiedad =='P1477' then return require('Módulo:Tablas').tostring(Entidad) end -- FALTA
    	opciones.propiedad = idPropiedad

        valorPropiedad = getPropiedadWikidata(opciones,Entidad.claims[idPropiedad])
        
        if not valorPropiedad then
        	return
        end

        if valorPropiedad:match('%[%[:d:') then
          algunaPropiedadEnlazaWikidata = true
        end
        
       	return valorPropiedad
    end
end

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

function listaDesplegable(titulo, lista, frame)
	if not lista then
		return
	end
	formatoprevio='background:transparent'
	return frame:preprocess('{{lista desplegable|título=' .. titulo .. 
		--'|marco_estilo=border:0; padding:0; border-top:1px solid #c0c0c0;' ..
		'|marco_estilo=border:0; padding:0;' ..
		'|título_estilo=background-color:#8DB1C3;color:#FFF; text-align:left|lista_estilo=padding-left:33%;text-align:left; display:none|1='
		.. lista .. '}}')
end
function seccionDesplegable(titulo, lista, frame,estilotitulo)
	if not lista then
		return
	end
	return frame:preprocess('{{Sección desplegable|título=' .. titulo .. 
		--'|marco_estilo=border:0; padding:0; border-top:1px solid #c0c0c0;' ..
		'|datos=<div style="text-align:left;margin: 1px; padding: 2px; border:1px">'.. lista .. '</div>|estilotitulo='..estilotitulo ..';}}')
end

function estaEnlazado(que)
	-- De momento devolver siempre que está enlazado pues falla en por ejemplo:
	-- |Hijos = 6{{#tag:ref|Entre ellos [[Catalina Parra|Catalina]], [[Colombina Parra|Colombina]], Juan de Dios y Ricardo Nicanor «Chamaco».<ref>[http://www.caras.cl/libros/nicanor-parra-cronologia-intima/ Nicanor Parra: Cronología íntima]</ref>|group=nota}}
	if true then return que end
	
	if not que then 
		return
	end
	
	for contenido in que:gmatch("%[%[(.+)]]") do
		if not contenido:match('^:d:') and
		   not contenido:match('^Categoría:') then
			return que
		end
	end
end

function formatoOcupacionMasculino(valor, opciones, frame, calificativos)
	local enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion = ModuloWikidataFormatos.obtenerDatos(valor)
	return ModuloWikidataFormatos.enlazar(enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion, opciones)
end

function formatoOcupacionFemenino(valor, opciones, frame, calificativos)
	local enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion = ModuloWikidataFormatos.obtenerDatos(valor)
	
	-- Para las ocupaciones más frecuentes no se accederá a Wikidata
	local tablaOcupacionesFemeninas={
		['Q40348'   ] = 'abogada',
		['Q16631371'] = 'académica',
		['Q15253558'] = 'activista',
		['Q1476215' ] = 'activista por los derechos humanos',
		['Q33999'   ] = 'actriz',
		['Q10800557'] = 'actriz de cine',
		['Q11481802'] = 'actriz de doblaje',
		['Q948329'  ] = 'actriz de género',		
		['Q2259451' ] = 'actriz de teatro',
		['Q10798782'] = 'actriz de televisión',
		['Q2405480' ] = 'actriz de voz',
		['Q488111'  ] = 'actriz pornográfica',
		['Q10873124'] = 'ajedrecista',
		['Q4773904' ] = 'antropóloga',			
		['Q2478141' ] = 'aristócrata',		
		['Q42973'   ] = 'arquitecta',
		['Q483501'  ] = 'artista',
		['Q7019111' ] = 'asistenta social',
		['Q11063'   ] = 'astrónoma',		
		['Q18814623'] = 'autobiógrafa',		
		['Q482980'  ] = 'autora',
		['Q5716684' ] = 'bailarina',
		['Q805221'  ] = 'bailarina de ballet',		
		['Q864503'  ] = 'bióloga',
		['Q8246794' ] = 'bloguera',		
		['Q177220'  ] = 'cantante',
		['Q2865819' ] = 'cantante de ópera',
		['Q488205'  ] = 'cantautora',		
		['Q901'     ] = 'científica',
		['Q15212951'] = 'cineasta',
		['Q1086863' ] = 'columnista',		
		['Q245068'  ] = 'comediante',
		['Q36834'   ] = 'compositora',
		['Q2722764' ] = 'conductora radiofónica',		
		['Q2490358' ] = 'coreógrafa',
		['Q18939491'] = 'diarista',
		['Q193391'  ] = 'diplomática',
		['Q2526255' ] = 'directora de cine',
		['Q5322166' ] = 'diseñadora',
		['Q627325'  ] = 'diseñadora gráfica',
		['Q462390'  ] = 'docente',
		['Q214917'  ] = 'dramaturga',
		['Q188094'  ] = 'economista',
		['Q974144'  ] = 'educadora',
		['Q131524'  ] = 'emprendedora',
		['Q43845'   ] = 'empresaria',
		['Q186360'  ] = 'enfermera',
		['Q11774202'] = 'ensayista',		
		['Q36180'   ] = 'escritora',
		['Q4853732' ] = 'escritora de literatura infantil',
		['Q1281618' ] = 'escultora',
		['Q11900058'] = 'exploradora',		
		['Q13472585'] = 'filántropa',
		['Q4964182' ] = 'filósofa',
		['Q169470'  ] = 'física',		
		['Q33231'   ] = 'fotógrafa',
		['Q28389'   ] = 'guionista',
		['Q201788'  ] = 'historiadora',
		['Q715301'  ] = 'historietista',		
		['Q82594'   ] = 'informática teórica',
		['Q16533'   ] = 'jueza',
		['Q185351'  ] = 'jurista',
		['Q644687'  ] = 'ilustradora',
		['Q14467526'] = 'lingüista',				
		['Q1371925' ] = 'locutora',		
		['Q2251335' ] = 'maestra',		
		['Q191633'  ] = 'mangaka',
		['Q170790'  ] = 'matemática',
		['Q39631'   ] = 'médica',
		['Q4610556' ] = 'modelo',
		['Q639669'  ] = 'música',
		['Q6625963' ] = 'novelista',
		['Q1930187' ] = 'periodista',
		['Q1028181' ] = 'pintora',
		['Q728711'  ] = 'playmate',
		['Q49757'   ] = 'poeta',		
		['Q82955'   ] = 'política',
		['Q270389'  ] = 'presentadora de noticias',
		['Q947873'  ] = 'presentadora de televisión',		
		['Q3282637' ] = 'productora de cine',
		['Q37226'   ] = 'profesora',
		['Q121594'  ] = 'profesora',
		['Q16145150'] = 'profesora de música',
                ['Q1622272' ] = 'profesora de universidad',
		['Q212980'  ] = 'psicóloga',
		['Q3242115' ] = 'revolucionaria',
		['Q3068305' ] = 'salonnière',		
		['Q622807'  ] = 'seiyū',
		['Q512314'  ] = 'socialité',		
		['Q2306091' ] = 'socióloga',
		['Q1141526' ] = 'stripper',		
		['Q1234713' ] = 'teóloga',		
		['Q333634'  ] = 'traductora',
		['Q350979'  ] = 'zoóloga',
	}
	
	local etiquetaOcupacionCorregida = tablaOcupacionesFemeninas[idEntidadOcupacion]
	
	if etiquetaOcupacionCorregida then
		return ModuloWikidataFormatos.enlazar(enlaceOcupacion, etiquetaOcupacionCorregida, idEntidadOcupacion, opciones)
	else 
		-- La ocupación no está en la tabla anterior. Se intenta obtener de la propiedad P2522 en Wikidata de la ocupación
		etiquetaOcupacionCorregida = ModuloWikidata.getPropiedadEnEspanyol(idEntidadOcupacion, 'P2521') or etiquetaOcupacion
		return ModuloWikidataFormatos.enlazar(enlaceOcupacion, etiquetaOcupacionCorregida, idEntidadOcupacion, opciones) .. '[[Categoría:Wikipedia:Ocupaciones femeninas]]'
	end
end

function obtenerValorCalificativo(Propiedad, Calificativo, ValorPropiedad)
	-- Obtener el valor del primer calificativo de la propiedad con el valor recibido 
	if not Entidad or not Entidad.claims or not Entidad.claims[Propiedad] then
		return
	end
	
	for k,v in pairs(Entidad.claims[Propiedad]) do
		if     v.mainsnak
		   and v.mainsnak.datavalue
		   and v.mainsnak.datavalue.value
		   and v.mainsnak.datavalue.value['numeric-id'] == ValorPropiedad
		   and v.qualifiers
		   and v.qualifiers[Calificativo]
		   and v.qualifiers[Calificativo][1]
		   and v.qualifiers[Calificativo][1].datavalue then 
			return v.qualifiers[Calificativo][1].datavalue.value
		end
    end		
end

function obtenerFacebook()
	local Facebook = argumento['facebook'] or argumento['Facebook']
	if Facebook then
		return formatoFacebook(Facebook)
	end
	
	Facebook =  propiedad('P2013', {['valor-función'] = formatoFacebook, ['linkback']='sí'})
	
	if Facebook then
		return Facebook
	end
	
	Facebook = obtenerValorCalificativo('P553' -- cuenta en red social
                      , 'P554' --dirección en red social
                      , 2013)   -- Facebook
    
    if Facebook then
		return formatoFacebook(Facebook)
	end
end

function obtenerTwitter()
	local twitter = argumento['twitter']  or argumento['Twitter']
	if twitter then
		return formatoTwitter(twitter)
	end
	
	twitter =  propiedad('P2002', {['valor-función'] = formatoTwitter, ['linkback']='sí'})
	
	if twitter then
		return twitter
	end
	
	twitter = obtenerValorCalificativo('P553' -- cuenta en red social
                      , 'P554' --dirección en red social
                      , 2002)   -- Twitter
    
    if twitter then
		return formatoTwitter(twitter)
	end
end

function obtenerArgumentosConValor(frame)
	local original
	
    if frame == mw.getCurrentFrame() then
        original = frame:getParent().args
    else
        original = frame.args or frame
    end
    
	local copia= {}
	
    for k,v in pairs(original) do
        if v == 'no' then
        	--Si vale "no" dejar en blanco el argumento para no obtener el valor
        	--de Wikidata
        	copia[k] = ''
        elseif v~='' then
        	--Si está en blanco dejarlo a nil para obtener en su caso el valor de 
        	-- Wikidata si no hay otro argumento con un nombre similar
            copia[k] = original[k]
        end
    end	
    
    return copia
end


function obtenerImagenWikidata()
	local imagen, valorImagen, piesDeImagen, k, pieDeImagen
	if not Entidad then
		return
	end
	
	--  Obtener la primera imagen en Wikidata de la persona
	local imagen = elementoTabla(Entidad, 'claims','P18',1)
	
	if not imagen then
		return
	end
	
	-- Obtener el nombre de la imagen
	valorImagen =  elementoTabla(imagen, 'mainsnak','datavalue','value') -- Por ejemplo, imagen.jpg
	
	-- Obtener los pies de la imagen, uno por idioma
	piesDeImagen =  elementoTabla(imagen, 'qualifiers','P2096')
	
	-- Encontrar el pie en español (aquel con datavalue.value.language = "es")
	if piesDeImagen then
		for k,pieDeImagen in pairs(piesDeImagen) do
			if pieDeImagen.datavalue.value.language=='es' then
				-- devolver la imagen y el texto del pie de la imagen en español
				return valorImagen, pieDeImagen.datavalue.value.text
			end
		end
	end
	
	-- Si no hay pie de imagen en español comprueba si hay fecha especificada para la imagen
	piesDeImagen = elementoTabla(imagen, 'qualifiers', 'P585')
	
	if piesDeImagen and piesDeImagen[1] then
		return valorImagen, nombre .. ' en ' .. require('Módulo:Wikidata/Fecha').FormateaFechaHora(piesDeImagen[1].datavalue.value, {['formatoFecha']='año',['enlace']='no'})
	end
	
	-- Sin pie de imagen en español
	return valorImagen
end

function obtenerFechaWikidata(propiedad)
	local declaracionesFecha = elementoTabla(Entidad, 'claims', propiedad)
	
	-- No devolver la edad si no hay ninguna o si hay varias fechas.
	if not declaracionesFecha or declaracionesFecha[2] then
		return
	end
	
	local declaracionFecha = declaracionesFecha[1]
	
	if not declaracionFecha then
		return
	end
	
	local valorFecha = elementoTabla(declaracionFecha, 'mainsnak', 'datavalue', 'value')
	
	if not valorFecha then
		return
	end
	
	--La precisión debe llegar hasta el día
	if valorFecha.precision ~= 11 then
		return
	end
	
	local iso = valorFecha.time	
	
	if not iso then
		return
	end
	
	local fecha = {}
	
	fecha.calendario = valorFecha.calendarmodel
	fecha.anyo       = tonumber(iso:sub(2, 5))
	fecha.mes        = tonumber(iso:sub(7,8))
	fecha.dia        = tonumber(iso:sub(10,11))
	
	return fecha
end

function obtenerEdadWikidata(propiedadFin)
	local fechaNacimiento = obtenerFechaWikidata('P569')
	
	if not fechaNacimiento then
		return
	end
	
	if propiedadFin then
		local fechaFin = obtenerFechaWikidata(propiedadFin)
		
		if fechaFin and
		   fechaFin.calendario == fechaNacimiento.calendario then
			
			return edad(fechaNacimiento, fechaFin)
		end
	else
		return edad(fechaNacimiento)
	end
end

function noAlargar(que)
	if not que then
		return
	end
	
	return '<div style="width:14.66em;overflow:hidden;text-overflow:ellipsis;white-space: nowrap;">' .. que .. '</div>'
end

function plural(que, singular, plural, pClase)
	if not que then
		return
	elseif que:match(',') or que:match('</li><li>') then
		return {plural, que, clase=pClase}
	else
		return {singular, que, clase=pClase}
	end
end

function obtenerPremios()
	if not Entidad then
		return
	end
	
	local moduloWikidataFormatos = require('Módulo:Wikidata/Formatos')
		local obtenerDatos = moduloWikidataFormatos.obtenerDatos
		local enlazar      = moduloWikidataFormatos.enlazar	
	local moduloWikidata = require('Módulo:Wikidata')
		local formatoDatoWikidata  = moduloWikidata.formatoDato	
	local moduloTablas = require('Módulo:Tablas') 
		local elementoTabla   = moduloTablas.elemento
		local ordenarTabla    = moduloTablas.ordenar
		local agruparTabla    = moduloTablas.agrupar
	local opcionesFecha= {['formatoTexto']='mayúscula', ['formatoFecha'] = 'año', ['enlace']='no'}
	local noMostrarPremio={
		['Q11415564'] = true, -- doctor honoris causa
	}
	
	-- Obtenemos los datos primarios (ids y años de los premios)
	local premios = {}
	
	local declaracionPremios = elementoTabla(Entidad, 'claims', 'P166')
	
	if not declaracionPremios then
		return
	end
	
	local premio, idPremio, anyo
	
	-- 1. Identificadores de los premios y años
	--    Se eliminan los premios de la tabla noMostrarPremio
	
	for k,v in pairs(declaracionPremios) do
		idPremio = elementoTabla(v, 'mainsnak', 'datavalue', 'value', 'id')
		
		if idPremio and not noMostrarPremio[idPremio] then
			premio = {}	
			premio.id = idPremio
			
			anyo =  formatoDatoWikidata(elementoTabla(v, 'qualifiers','P585',1), opcionesFecha , {})
			if anyo ~= '' then
				premio.anyo =  anyo
			end

			table.insert(premios, premio)
		end
	end	
	
	ordenarTabla(premios, {'id', 'anyo'})
	premios = agruparTabla(premios, 'id', 'anyo')
	
	-- 2. Añado el nombre completo del premio, el enlace y la categoría
	local nombreCompleto, nombre, categoria, enlace
	
	for k,v in pairs(premios) do
		if v.anyo then
			v.primerAnyo = v.anyo[1] or ''
		else
			v.primerAnyo = ''
		end
		
		nombreCompleto   = (mw.wikibase.label( v.id ) or ''):gsub(".", string.upper,1) -- El primer carácter en mayúscula
		enlace           = mw.wikibase.sitelink( v.id )
		
		-- Corregir el nombre del premio
		nombreCompleto = nombreCompleto:gsub('Premios ', 'Premio ')
		nombreCompleto = nombreCompleto:gsub('Anexo:', '')
		
		-- Determinar si es una categoría de un premio
		nombre, categoria = nombreCompleto:match('^(.*)%s+(a%s.*)$')  -- Ejemplo: Premio Nébula a la mejor novela corta  --> Premio Nébula
			
		if not nombre then
			nombre, categoria = nombreCompleto:match('^(.*)%s+(al%s.*)$')  -- Ejemplo: Premio Hugo al mejor relato --> Premio Hugo
		end
		
		if nombre then
			v.nombre = nombre
			v.categoria = {
				['id'] = v.id,
				['anyo'] = v.anyo,				
				['nombre'] = categoria,
				['enlace'] = enlace,
				['nombreCompleto'] = nombreCompleto,
			}
			v.id     = nil
			v.anyo   = nil
		else
			v.nombre = nombreCompleto
			v.enlace = enlace
		end
	end
	
	ordenarTabla(premios, {'nombre', 'primerAnyo'})
	
	premios = agruparTabla(premios, 'nombre', 'categoria')
	
	ordenarTabla(premios, {'primerAnyo'})
	
	--if true then return require('Módulo:Tablas').tostring(premios) end
	
	-- 3. Doy formato eliminando algunos premios
	
	local premiosFormateados = {}
	local premioFormateado, categoriaFormateada, categoriasPremio
	local nombrePremio
	
	for k,premio in ipairs(premios) do
		nombrePremio = premio.nombre
		if nombrePremio:match('^[dD]octor honoris causa') or 
		   nombrePremio:match('^[hH]onorary doctor') or 
		   (argumento['premios emmy'] and nombrePremio:match('Emmy')) or 
		   (argumento['premios grammy'] and nombrePremio:match('Grammy')) or 
		   (argumento['premios cannes'] and nombrePremio:match('Cannes')) or 
		   (argumento['premios globo de oro'] and nombrePremio:match('Globo')) or
		   (argumento['premios tony'] and nombrePremio:match('Tony')) or
		   (argumento['premios óscar'] and nombrePremio:match('Óscar')) or
		   (argumento['premios bafta'] and nombrePremio:match('BAFTA')) or 
		   (argumento['premios sag'] and nombrePremio:match('Sindicato de Actores')) or
		   (argumento['premios san sebastian'] and nombrePremio:match('San Sebastián'))
		   then
			-- No mostrar
		elseif premio.categoria then
			categoriasPremio = {}
			
			for k2,categoria in ipairs(premio.categoria) do
				categoriaFormateada = enlazar(categoria.enlace, categoria.nombre, categoria.id)
				
				-- Añadir los años entre paréntesis
				if categoria.anyo then
					categoriaFormateada =  categoriaFormateada .. '&nbsp;<small>(' .. mw.text.listToText( categoria.anyo, ', ',' y ' ) .. ')</small>'
				end
				
				table.insert(categoriasPremio, categoriaFormateada)
			end
			
			table.insert(premiosFormateados, premio.nombre .. ' ' .. mw.text.listToText( categoriasPremio, ', ',' y ' ))
		else
			premioFormateado =  enlazar(premio.enlace, premio.nombre, premio.id)
			if premio.anyo and premio.anyo[1] then
				premioFormateado = premioFormateado .. '&nbsp;<small>(' .. mw.text.listToText( premio.anyo, ', ',' y ' ) .. ')</small>'
			end
			table.insert(premiosFormateados, premioFormateado)
		end
	end
	
	return lapizWikidata('<ul><li>' .. mw.text.listToText( premiosFormateados, '</li><li>','</li><li>' ),Entidad.id,'P166') .. '</li></ul>'
end

function siNoEs(que, valor)
	if not que then
		return
	end
	
	if not que:match(valor) then
		return que
	end
end

return z