Ir al contenido

Diferencia entre revisiones de «Módulo:Ficha de persona»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Tiene razón -sasha-, yo no había comprobado suficientemente el código, y la solución final es más compleja de lo que yo esperaba; regreso a edición de -sasha- del 3 abr 2023 12:30 —más sencilla— y agrego únicamente la comprobación para cuando no existen datos en Wikidata —sin la fallida optimización—
En el parámetro "nombre" se tomarán datos locales o, en su defecto, el título sin coletilla, eliminando la opción de tomar la etiqueta de Wikidata. Ver este hilo en el Café.
Línea 161: Línea 161:
local ocupacionOArea = ocupacion or area
local ocupacionOArea = ocupacion or area


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

local nombre_completo = argumento['nombre completo']
local nombre_completo = argumento['nombre completo']
local nombre_nacimiento = argumento['nombre de nacimiento'] or propiedad('P1477')
local nombre_nacimiento = argumento['nombre de nacimiento'] or propiedad('P1477')
Línea 911: Línea 908:


return valorPropiedad
return valorPropiedad
end
end

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

Revisión del 16:32 27 may 2023

Este módulo implementa la plantilla {{Ficha de persona}}.

  • Esta documentación explica el funcionamiento del módulo desde un contexto técnico; para instrucciones de uso de la plantilla, véase la página de documentación sobre la plantilla.
  • La página de discusión de este módulo debe reservarse para cuestiones más técncias sobre el módulo; úsese la discusión de la plantilla para discutir sobre datos y parámetros.

local z = {}

local argumentos    -- Tabla de argumentos con los que se llama a la función 
local argumento={}  -- Argumentos, sin contar los que no tienen 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 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   formatoURL           = ModuloWikidataFormatos.formatoURL
local   formatoPeriodo       = ModuloWikidataFormatos.formatoPeriodo
local   formatoId            = ModuloWikidataFormatos.formatoId
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í', ['rangoMayor'] = 'sí'}
local enMayusculasO   = {['formatoTexto'] = 'mayúscula', ['conjunción']=' o ', ['linkback']='sí', ['rangoMayor'] = 'sí'}
local listaNoOrdenada = {['lista'] = 'no ordenada', ['linkback']='sí', ['rangoMayor'] = 'sí'} --, ['debeExistir'] = 'sí'
--local lugar           = {['conjunción']=' o ', ['valor-módulo'] = 'Wikidata/Formato lugar', ['valor-función'] = 'formatoLugar', ['linkback']='sí'}
local debeExistir     = {['debeExistir'] = 'sí', ['formatoTexto'] = 'mayúscula', ['linkback']='sí', ['rangoMayor'] = 'sí'}
local conPeriodo      = {['lista'] = 'no ordenada', ['formatoTexto'] = 'mayúscula', ['calificativo'] = formatoPeriodo, ordenar='por fecha', ['linkback']='sí', ['rangoMayor'] = 'sí'}
local conPeriodoDebeExistir = {['lista'] = 'no ordenada', ['formatoTexto'] = 'mayúscula', ['calificativo'] = formatoPeriodo, ordenar='por fecha', ['debeExistir'] = 'sí', ['linkback']='sí', ['rangoMayor'] = 'sí'}
local sinEnlazar = {['enlace']='no', ['linkback']='sí', ['rangoMayor'] = 'sí'}
local sinLapiz   = {['rangoMayor'] = 'sí'}
local normal     = {['linkback']='sí', ['rangoMayor'] = 'sí'}

-- Formatos según el tipo de cabecera

local formatos={
    ['por defecto'] = {['estiloTituloFicha'] = 'background-color:#8DB1C3;color:#FFF'}, 
    ['inherit']     = {['estiloTituloFicha'] = 'background-color:#E6E6FA;color:#000'},    
    --['actor']       = {['estiloTituloFicha'] = ''},
    ['ajedrecista'] = {['estiloTituloFicha'] = 'background-color:#d38d47;color:#FFF'},
    ['artista']     = {['estiloTituloFicha'] = 'background-color:#8DB1C3;color:#FFF'},
    ['astronauta']  = {['estiloTituloFicha'] = 'background-color:transparent;'},
    ['autoridad']   = {['estiloTituloFicha'] = 'background-color:transparent;', ['estiloTituloSecciones'] ='background-color:#E6E6FA;'},
    ['cine']        = {['estiloTituloFicha'] = 'background-color:#f9e999'}, 
    ['diseñador']   = {['estiloTituloFicha'] = 'background-color:#ED8;color:#000'},
    ['escritor']    = {['estiloTituloFicha'] = 'background-color:#4c6099;color:#FFF'},
    ['futbolista']  = {['estiloTituloFicha'] = 'background-color:#CC8;color:#000'},
    ['militar']     = {['estiloTituloFicha'] = 'background-color:#b0c4de;color:#000'},
    ['modelo']      = {['estiloTituloFicha'] = 'background-color:#9F9;color:#000'},
    --
    -- Música
    --
    ['cantante']    = {['estiloTituloFicha'] = 'background-color:#f0e68c'}, -- solista de Plantilla:Ficha de artista musical/selección de color
    ['músico']      = {['estiloTituloFicha'] = 'background-color:#F4BF92'}, -- instrumentalista_no_vocal (integrantes de grupos no vocalistas, así como solistas instrumentales y directores de orquesta)
    ['otro música'] = {['estiloTituloFicha'] = 'background-color:#BFE0BF'}, -- otro_personal (productores, compositores, ingenieros)
    --
    ['religioso']   = {['estiloTituloFicha'] = 'background-color:#ffde00; color:#000'},
    ['periodista']  = {['estiloTituloFicha'] = 'background-color:#ED8;color:#000'},
    ['televisión']  = {['estiloTituloFicha'] = 'background-color:#ED8;color:#000'},
    ['torero']      = {['estiloTituloFicha'] = 'background-color: #800000; color: white'},
    ['videojuego']  = {['estiloTituloFicha'] = 'background-color:#CCF;color:#000'},
    ['youtuber']    = {['estiloTituloFicha'] = 'background-color:#B60000;color:#fff'},
}

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', ['valor-función']='educado en', ['valor-módulo'] = 'Wikidata/Formatos educación', ['ordenar'] = 'por fecha', ['linkback']='sí'})

	local gender = propiedad('P21', {['enlace']='no', ['linkback']='no'})
    if gender == 'femenino' or gender == 'mujer transgénero' then
        etiquetaAnyosActivo = 'Años activa'
        etiquetaConocidoPor = 'Conocida por'
        etiquetaInfluencias = 'Influida por'
        etiquetacampeon     = '[[Campeonato del mundo de ajedrez|Campeona del mundo]]'
        etiquetaAlumnoDe    = 'Alumna de'
        etiquetaEducadoEn   = 'Educada en'
        funcionOcupacion    = formatoOcupacionFemenino
        etiquetaVeneradoEn  = 'Venerada en'
    else
        etiquetaAnyosActivo = 'Años activo'
        etiquetaConocidoPor = 'Conocido por'
        etiquetaInfluencias = 'Influido por'
        etiquetacampeon     = '[[Campeonato del mundo de ajedrez|Campeón del mundo]]'
        etiquetaAlumnoDe    = 'Alumno de'
        etiquetaEducadoEn   = 'Educado en'
        funcionOcupacion    = formatoOcupacionMasculino
        etiquetaVeneradoEn  = 'Venerado en'
    end
    --No entiendo para qué sirve. En principio no se muestra para actores.
    --seccionartistica='Carrera artística'

    -- Generar los cargos
    local hayCargos
    local tablaCargos = {tipo='sección'}

    if argumento['cargo'] then
        hayCargos = true

        table.insert(tablaCargos, {'', '<hr>'})
        table.insert(tablaCargos, generarcargo(argumento,1,frame))

        argumento['predecesor']= nil
        argumento['predecesora']= nil
        argumento['sucesor']= nil
        argumento['sucesora']= nil
    end
    for i=2, 10 do
        if argumento['cargo'..i] or argumento['inicio'..i] then
            hayCargos = true
            table.insert(tablaCargos, generarcargo(argumento,i,frame))
        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 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 fechaNacimientoTimestamp = elementoTabla(Entidad, 'claims', 'P569', 1, 'mainsnak', 'datavalue', 'value', 'time')
    local lugarNacimiento    = argumento['lugar de nacimiento'] or propiedad('P19', {['conjunción']=' o ', ['valor-módulo'] = 'Wikidata/Formato lugar', ['valor-función'] = 'formatoLugar', ['linkback']='sí', fecha=fechaNacimientoTimestamp, ['rangoMayor'] = 'sí'})

    local lugarDesaparicion  = argumento['lugar de desaparición']
    local fechaFallecimientoTimestamp = elementoTabla(Entidad, 'claims', 'P570', 1, 'mainsnak', 'datavalue', 'value', 'time')
    local lugarFallecimiento = argumento['lugar de fallecimiento'] or propiedad('P20', {['conjunción']=' o ', ['valor-módulo'] = 'Wikidata/Formato lugar', ['valor-función'] = 'formatoLugar', ['linkback']='sí', fecha = fechaFallecimientoTimestamp, ['rangoMayor'] = 'sí'})

    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', {['enlace'] = 'no', ['linkback'] = false, ['rangoMayor'] = 'sí', ['uno'] = 'sí'}) or ''
    if firma and firma ~= '' then
    	firma = '[[Archivo:' .. firma .. '|175x80px]]'
    end

    -- Formato del título de la ficha y de las secciones según la ocupación, si la persona tiene cargos o si ha fallecido

    local formato, cabecera

    if argumento['cabecera'] then
        cabecera = argumento['cabecera']  -- Por defecto utilizar el campo cabecera de la plantilla
    elseif hayCargos == true then
        cabecera = 'autoridad'
    elseif not ocupacionOArea then
        cabecera = 'por defecto'
    elseif ocupacionOArea:find('[Aa]ctor') or ocupacionOArea:find('[Aa]ctriz') or ocupacionOArea:find('[Pp]roductor de cine')
        or ocupacionOArea:find('[Dd]irector de cine') then
        cabecera = 'cine'
    elseif ocupacionOArea:find('[Aa]jedrecista') or argumento['elo'] or rankingajedrez then
        cabecera = 'ajedrecista'
    elseif ocupacionOArea:find('[Aa]stronauta') then
        cabecera = 'astronauta'
    elseif ocupacionOArea:find('[Ee]scritor') or ocupacionOArea:find('[Nn]ovelista') or 
           ocupacionOArea:find('[Pp]oeta') or ocupacionOArea:find('[Dd]ramaturgo') then
        cabecera = 'escritor'
    elseif ocupacionOArea:find('[Cc]antante') then
        cabecera = 'cantante'
    elseif ocupacionOArea:find('[Mm]úsico') then
        cabecera = 'músico'
    elseif ocupacionOArea:find('[Cc]ompositor') then
        cabecera = 'otro música'
    elseif ocupacionOArea:find('[Pp]olític[oa]') or argumento['cargo'] then
        cabecera = 'por defecto'
    elseif ocupacionOArea:find('[Pp]eriodista') then
        cabecera = 'periodista'
    elseif ocupacionOArea:find('[Dd]iseñador') then
        cabecera = 'diseñador'
    elseif ocupacionOArea:find('[Pp]resentador') or ocupacionOArea:find('[Cc]onductor') then
        cabecera = 'televisión'
    elseif ocupacionOArea:find('[Mm]odelo') then
        cabecera = 'modelo'
    elseif ocupacionOArea:find('[Mm]ilitar') then
        cabecera = 'militar'
    elseif ocupacionOArea:find('[Pp]apa') or ocupacionOArea:find('[Oo]bispo') or
           ocupacionOArea:find('[Cc]ardenal') or ocupacionOArea:find('[Pp]atriarca') then
        cabecera = 'religioso'
    elseif ocupacionOArea:find('[Tt]orero') then
        cabecera = 'torero'
    elseif ocupacionOArea:find('[Vv]ideojuego') then
        cabecera = 'videojuego'
    elseif ocupacionOArea:find('[Yy]ou[Tt]uber') or ocupacionOArea:find('[Vv][Tt]uber') then
        cabecera = 'youtuber'
    else
        cabecera = 'por defecto'
    end

    local OrdenacionDiaconal
    if argumento['diaconado por'] then
        OrdenacionDiaconal = argumento['diaconado'] .. '<small> por ' ..argumento['diaconado por'].. '</small>'
    else
        OrdenacionDiaconal = argumento['diaconado']
    end

    local OrdenacionSacerdotal -- ?item P793 Q41463697 Q585
    if argumento['presbiterado por'] then
        OrdenacionSacerdotal = argumento['presbiterado'] .. '<small> por ' ..argumento['presbiterado por'].. '</small>'
    else
        OrdenacionSacerdotal = argumento['presbiterado']
    end

    local OrdenacionEpiscopal -- ?item P793 Q125375 Q585
    if argumento['episcopado por'] then -- ?item P793 Q125375 Q1598
        OrdenacionEpiscopal = argumento['episcopado'] .. '<small> por ' ..argumento['episcopado por'].. '</small>'
    else
        OrdenacionEpiscopal = argumento['episcopado']
    end

    local Cardenalato -- ?item P793 Q41154026 Q585
    if argumento['cardenalato por'] then -- ?item P793 Q41154026 Q748
        Cardenalato = argumento['cardenalato'] .. '<small> por ' ..argumento['cardenalato por'].. '</small>'
    else
        Cardenalato = argumento['cardenalato']
    end

    local EscudoTitulo, Escudo
    if argumento['escudo'] ~= '' and (cabecera == 'religioso' and argumento['escudo'] or propiedad('P94')) then -- ¿deberíamos usar P237 en su lugar?
        Escudo = argumento['escudo'] or propiedad('P94', {})
        EscudoTitulo = 'Escudo'
    else
        EscudoTitulo = ''
    end
    local LemaEscudo = argumento['lema'] or propiedad('P1451')
    if LemaEscudo and argumento['lema traducido'] then
        LemaEscudo = LemaEscudo .. '<small style="display: block;"> por ' ..argumento['lema traducido'].. '</small>'
    end

    formato = formatos[cabecera] or {}

    local estiloTituloFicha, estiloTituloSecciones

    estiloTituloFicha     = formato['estiloTituloFicha']
    estiloTituloSecciones = formato['estiloTituloSecciones'] or formato['estiloTituloFicha']

    if hayCargos == true then
        cargosocupados        = ''
    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
	
	local sitioWeb
	if argumento['web'] or argumento['página web'] or argumento['website'] or argumento['sitio web'] or argumento['sitioweb'] then
		sitioWeb = noAlargar(enlazarURL(argumento['web'] or argumento['página web'] or argumento['website'] or argumento['sitio web'] or argumento['sitioweb']))
	else
		sitioWeb = propiedad('P856', {['valor-función'] = formatoURL, ['linkback']='sí', ['rangoMayor'] = 'sí'})
	end
	
	local victimas = argumento['víctimas']
	if victimas then
		local ocupacionesValidasVictimas = {'Q484188', 'Q14886050', 'Q26267537', 'Q1154323'} -- asesino en serie, terrorista, violador en serie y asesino relámpago
		for k,v in pairs(ocupacionesValidasVictimas) do
			local snak = propiedad('P106', {['valor-función'] = formatoId})
			if snak and snak:match(v) then
				victimas = argumento['víctimas']
				break
			else
				victimas = ''
			end
		end
	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 relacionados = argumento['relacionados'] or ''
	if relacionados and mw.ustring.len(relacionados) > 200 then
		relacionados = ''
	end
    local Ficha = {
        wikidata        = not obtenerDatosWikidata and 'no',
        clase           = 'biography vcard',

        -- Título
        tipocabecera    = 'persona',
        titulo          = nombre,
        --colorfondo      = colorfondo, -- No se usa
        estilotitulo    = estiloTituloFicha,
        --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     = 'line-height:1.3em; vertical-align:middle;',
        tablaCargos,
        {tipo='sección',
            ['titulo']   = 'Información personal',   -- Ver la ficha de noble o la ficha de diseñador
            estilotitulo = estiloTituloSecciones,
            {'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,
            {'Nombre religioso', argumento['nombre religioso'] or propiedad('P1635')},
            {'Apodo',              argumento['apodo'] or propiedad('P1449')},
            {'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 muerte', siNoEs(argumento['causa muerte'] or
                                   propiedad('P509', enMayusculas) or 
                                   propiedad('P1196', enMayusculas), 'Causas naturales')}, -- circunstancias de la muerte
            {'Sepultura',  argumento['lugar de descanso'] or propiedad('P119', {['valor-módulo'] = 'Wikidata/Formato lugar', ['formatoTexto'] = 'mayúscula', ['linkback'] = 'sí'}) },

            {'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
                               require('Módulo:Wikidata/Formatos país').formatoNacionalidad(elementoTabla(Entidad,'claims','P27'),{ 
                                   ['formatoTexto'] = 'mayúscula',
                                   ['propiedad'] = 'P27', 
                                   ['linkback']='sí', ['entityId']=elementoTabla(Entidad,id)}), 
                               clase='category'},
            {'Ciudadanía',     sinBandera(argumento['ciudadanía'] or -- ¿No es lo mismo que la nacionalidad?
                               argumento['ciudadania']),
                               clase='category'},
            {'Etnia',          --propiedad('P172', enMayusculas) or 
                               argumento['etnia'] or argumento['grupo étnico'],
                               clase='category'},
            {'Religión',       argumento['religión'] or propiedad('P140', debeExistir)},
            {'Lengua materna',  argumento['lengua materna'] or argumento['Lengua_materna'] or argumento['lengua_materna'] or propiedad('P103', enMayusculas)},
        },
        {tipo='sección',
            estilotitulo = estiloTituloSecciones,
            ['titulo']   = 'Características físicas',
            {'Altura',             argumento['altura'] or argumento['estatura'] or propiedad('P2048', {['valor-función']='magnitud', ['valor-módulo'] = 'Wikidata/Formato magnitud', ['linkback']='sí'})},
            {'Peso',               argumento['peso'] or propiedad('P2067', {['valor-función']='magnitud', ['valor-módulo'] = 'Wikidata/Formato magnitud', ['linkback']='sí'})},
            {'Medidas', argumento['medidas']},
            {'Ojos', argumento['color de ojos'] or propiedad('P1340', enMayusculas)},
            {'Cabello', argumento['color de cabello'] or propiedad('P1884', enMayusculas)},
            {'[[Mamoplastia de aumento|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  = estiloTituloSecciones,
            ['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', 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 = estiloTituloSecciones,
            {'Educación',  educacion},
            {etiquetaEducadoEn, almamater, clase='plainlist'},
            {'Posgrado',   argumento['posgrado']},
            {'Tesis doctoral', 
                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 = estiloTituloSecciones,
            {'Ocupación',      ocupacion, clase='role'},
            {'Área',           area},
            {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 argumento['años actividad'] or
                               formatoPeriodo({ -- falta que salga el lápiz
                                   ['P580']={[1]=elementoTabla(Entidad, 'claims','P2031',1,'mainsnak')},
                                   ['P582']={[1]=elementoTabla(Entidad, 'claims','P2032',1,'mainsnak')}
                               })},
            {etiquetaConocidoPor,  argumento['conocido por'] or argumento['conocido']},
            {'Cargos ocupados',    cargosocupados,clase='plainlist'}, -- políticos o en empresas
            {'Tratamiento',        argumento['tratamiento']},
            
            {'Salario',            argumento['salario']},
            {'Patrimonio',         argumento['patrimonio'] or argumento['fortuna']},
            
            {'Empresa',            argumento['empresa']},
            {'Estudio',            argumento['nombre estudio']}, -- Arquitectos
            {'Restaurantes',       argumento['restaurantes']},   -- Para cocineros. Restaurantes en los que ha trabajado.

            {tipo='sección',
	            ['título'] = 'Información religiosa',
	            estilotitulo = estiloTituloSecciones,
	            {'[[Sacramento del orden|Ordenación diaconal]]', OrdenacionDiaconal},
	            {'Ordenación sacerdotal', OrdenacionSacerdotal},
	            {'Ordenación episcopal', OrdenacionEpiscopal},
	            {'Proclamación cardenalicia', Cardenalato}, 
	            {'Título cardenalicio', argumento['título cardenalicio']},
	            {'Iglesia', argumento['iglesia']},
	            {'[[Secularización]]', argumento['secularización']},
	            {'[[Beatificación]]', argumento['beatificación']},
	            {'[[Canonización]]', argumento['canonización'] or propiedad('P411', enMayusculas)},
	            {'Festividad', argumento['festividad'] or propiedad('P841')},
	            {'Atributos', argumento['atributos']},
	            {etiquetaVeneradoEn, argumento['venerado en'] or propiedad('P1049')},
	            {'Patronazgo', argumento['patronazgo'] or propiedad('P417')},
	            {'Santuario', argumento['santuario']},
            },
            -- Sección artística (actores y ¿presentadores?)
            {tipo='sección',
                ['titulo']   = seccionartistica,
                estilotitulo = estiloTituloSecciones,
                {'Rol debut'    , argumento['rol debut']},
                {'Año de debut' , argumento['rol debut'] and argumento['año debut']},
                --{'Año de retiro', argumento['año retiro'] or propiedad('P2032')},
                {'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)},
            {(ocupacionOArea and ocupacionOArea:find('[Pp]rofesor') and 'Estudiantes') or 'Alumnos', argumento['estudiantes'] or propiedad('P802', debeExistir)},

            -- Periodistas, presentadores y videoblogueros
            {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']},
            },
            -- Videoblogueros, en especial youtubers
            {tipo='sección',
                {'Vídeos', argumento['videos']},
                {'Suscriptores', argumento['suscriptores']},
                {'Vistas totales', argumento['vistas totales']},
            },
            -- Ocupación (escritores, artistas, periodistas, diseñadores, etc)
            -- Información artística
            {tipo='sección',
                plural(argumento['movimiento'] or argumento['Movimiento'] or argumento['movimientos'] or 
                    propiedad('P135', {
                        ['valor-módulo'] = 'Wikidata/Formato movimiento', 
                        ['valor-función'] = 'formatoMovimiento', 
                        ['linkback']='sí', 
                        ['calificativo'] = formatoPeriodo,
                        ['rangoMayor'] = 'sí',
                        ordenar='por fecha', ['formatoTexto'] = 'mayúscula',}), 'Movimiento', 'Movimientos'),
                {'Seudónimo', argumento['seudónimo'] or argumento['Seudónimo'] or argumento['alias'] or argumento['Alias'] or propiedad('P742')},
                {'Lengua literaria',  argumento['lengua_literaria'] or argumento['Lengua_literaria']},
                plural(argumento['género'] or argumento['Género'] or propiedad('P136', enMayusculas), 'Género', 'Géneros'),
                plural(argumento['instrumento'] or propiedad('P1303', enMayusculas), 'Instrumento', 'Instrumentos'),
                {'Tipo de voz', argumento['voz'] or argumento['tipo de voz'] or argumento['tesitura'] or propiedad('P412', enMayusculas)},
                plural(argumento['compañía discográfica'] or propiedad('P264', conPeriodo), 'Discográfica', 'Discográficas', 'plainlist'),
            },
            -- 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', 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
            {'Lealtad', argumento['lealtad'] or propiedad('P945', enMayusculas)},
            {'Rama militar', argumento['rama'] or propiedad('P241', enMayusculas)},
            {'Unidad militar', argumento['unidad'] or propiedad('P7779', enMayusculas)},
            {'Mandos', argumento['mandos']},
            {'[[Grado militar|Rango militar]]', argumento['rango'] or propiedad('P410', conPeriodo), clase='plainlist'},
            {'Conflictos', argumento['conflictos'] or argumento['batallas'] or propiedad('P607', enMayusculas)},
            -- Astronautas (un subtipo de militar)
            {'Misiones espaciales', argumento['misiones espaciales'] or propiedad('P450')},
            {'Tiempo en el espacio', argumento['tiempo espacio']},
            -- Toreros
            {'Debut becerrista', argumento['debut becerrista']},
            {'Debut [[picador]]', argumento['debut picador']},
            {'Debut [[novillero]]', argumento['debut novillero']},
            {'Alternativa', argumento['alternativa']},
            {'Confirmación de alternativa', argumento['alternativa confirmación']},
            {'Apoderado', argumento['apoderado']},
            {'Escalafón general', argumento['escalafón']},
            {'Invención', argumento['invención']},
            {'Triunfos', argumento['triunfos']},
            {'Retirada definitiva', argumento['retirada']},
            -- 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í', ['ordenar'] = 'por fecha', ['uno'] = 'último'}) or argumento['elo'] }, -- 
                {'[[Sistema de puntuación Elo|Mejor elo]]',     argumento['mejor elo']},
                {'Escalafón FIDE',     rankingajedrez},
                {'Mejor escalafón',    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']},
                {'Predecesora',         argumento['predecesora']},
                {'Sucesor',             argumento['sucesor']},
                {'Sucesora',            argumento['sucesora']},
            }, 
            {'Partido político',   argumento['partido político'] or argumento['partido'] or propiedad('P102', conPeriodo), clase='plainlist'},
            {'Orden religiosa', argumento['congregación'] or propiedad('P611', enMayusculas)},
            {'Afiliaciones',   argumento['afiliaciones'] or propiedad('P1416')},
            {'Miembro de', argumento['miembro de'] or argumento['sindicato'] or propiedad('P463', conPeriodoDebeExistir), clase='plainlist'},
            {'Central sindical', argumento['central sindical'], clase='plainlist'},
            -- Web
            {'Sitio web', sitioWeb},
        },

        {tipo='sección',
            ['titulo']   = 'Premios artísticos',   -- Ver la ficha de noble o la ficha de diseñador
            estilotitulo = estiloTituloSecciones,
            {'[[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']},
            {'[[TP de Oro]]', argumento['premios tp de oro']},
            {'[[Premios Ondas]]', argumento['premios ondas']},
            {'[[Premios Iris (España)|Premios Iris]]', argumento['premios atv']},
            {'[[Premios Protagonistas]]', argumento['premios protagonistas']},
            {'[[Antena de Oro|Premios Antena de Oro]]', argumento['premios antena de oro']},
            {'[[Premios Micrófono de Oro]]', argumento['premios micrófono de oro']},
            {'[[Premio APM al Mejor Periodista del Año|Premio&nbsp;Víctor de&nbsp;la&nbsp;Serna]]', argumento['premios víctor de la serna']},
            {'Otros premios', argumento['otros premios']},
        },
        {tipo='sección',
            ['titulo']   = 'Carrera deportiva',   -- Ver la ficha de noble o la ficha de diseñador
            estilotitulo = estiloTituloSecciones,
            {'Deporte', argumento['deporte'] or propiedad('P641', enMayusculas)},
            {'Representante de', argumento['representante'] or propiedad('P1532', conPeriodo)},
        },
        {tipo='sección',
            ['titulo']  = 'Perfil de jugador',
            estilotitulo = estiloTituloSecciones,
            {'Juegos', argumento['juegos']  or propiedad('P2416')},
            {'Posición', argumento['posición']  or propiedad('P413')},
            {'Número', argumento['número']  or propiedad('P1618')},
            {'Equipos', argumento['equipos'] or propiedad('P54')},
            {'Ligas',  argumento['ligas']   or propiedad('P118')},
            {'Selección', argumento['selección']},
            {'Medallista', argumento['medallista olímpico']},
            {'Entrenador', argumento['entrenador'] or propiedad('P6087')},
            {'Plataformas de&nbsp;transmisión',  argumento['plataforma']},
        },
        {'',seccionDesplegable('Títulos y <br> reconocimientos',argumento['títulos'], frame,estiloTituloSecciones)},
        -- Los premios pueden ser para varias ocupaciones por lo que se ponen al final
        -- Premios, condecoraciones, distinciones, etc.
        {'Distinciones', argumento['premios'] or argumento['Premios'] or
                         argumento['premio']  or argumento['Premio']  or
                         argumento['premios2'] or
                         obtenerPremios(Entidad)
                       , clase ='plainlist'}, -- Mostrar las listas sin viñetas
		{tipo='sección',
			['titulo'] = 'Medallas',
			estilotitulo = estiloTituloSecciones,
			{'', argumento['medallas'] },
		},
        {tipo='sección',
            ['titulo'] = 'Información criminal',
            estilotitulo = estiloTituloSecciones,
            {'[[Delito|Cargos criminales]]', argumento['cargos criminales']  or propiedad('P1399'), clase='plainlist'},
            -- P2632 puede ser usado en alguno de los dos parámetros de abajo
            {'[[Sentencia (derecho)|Condena]]',               argumento['condena']},
            {'Situación penal',       argumento['situación penal']},
            {'Víctimas',              victimas},
        },

        -- Con etiqueta/datos como en las fichas de escritor y artista en vez de como en la ficha de persona
        {'Firma', firma },

        {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'}
        },
        -- Sección hipotética, las imágenes inferiores no se muestran dentro de una sección
        {'',
            EscudoTitulo or '',
            estilodatos = 'text-align: center; font-weight: bold;' .. (estiloTituloSecciones or ''),
        },
        imageninferior = Escudo,
        ['tamañoimageninferior'] = '110px',
        pieinferior = LemaEscudo,
        --{'Fuente biográfica', argumento['fuentebiográfica']},
        entidad = argumento['id'], -- para el enlace final a wikidata
    }

    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

	local NF = require('Módulo:NF')
	-- table.insert(categorias, NF.catLivingStatus(argumento['fecha de nacimiento'], argumento['fecha de fallecimiento'], true ) )
	table.insert(categorias, NF.catSexGenderIdentity())

    if argumento['títulos secciones'] == '' then -- "no" al llamar a la ficha
        --if true then return require('Módulo:Tablas').tostring(Ficha) end
        eliminarTitulosSecciones(Ficha)
    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 eliminarTitulosSecciones (tabla)
    if tabla.tipo == 'sección' then
        tabla.titulo = nil
    end
    for k, v in pairs( tabla ) do
        if type(v) == 'table' then
            eliminarTitulosSecciones(v)
        end
    end
    --if true then return require('Módulo:Tablas').tostring(tabla) 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('<br /> {{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},
            {'Junto con', argumento['juntoa'..numero] },
            {'Nominado por', argumento['nominado'..numero] },
            {'Nominada por', argumento['nominada'..numero] },
            {'Designado por', argumento['designado'..numero] },            
            {'Designada por', argumento['designada'..numero] },
            {'[[Monarca]]', argumento['monarca'..numero] },
            {'[[Presidente]]', argumento['presidente'..numero] },
            {'[[Primer ministro]]', argumento['primerministro'..numero] },
            {'[[Canciller]]', argumento['canciller'..numero] },
            {'[[Gobernador]]', argumento['gobernador'..numero] },
            {'[[Alcalde]]', argumento['alcalde'..numero] },
            {'[[Alcalde|Alcaldesa]]', argumento['alcaldesa'..numero] },
            {'[[Jefe de Gobierno]]', argumento['jefe'..numero] },
            {'[[Jefe de Gobierno|Jefa de Gobierno]]', argumento['jefa'..numero] },
            {'[[Gabinete (política)|Gabinete]]', argumento['gabinete'..numero] },           
            {'[[Gabinete (política)|Consejo de Ministros]]', argumento['consejo'..numero] },            
            {'Secretario', argumento['secretario'..numero]},
            {'Secretaria', argumento['secretaria'..numero]},
            {'[[Vicepresidente]]', argumento['vicepresidente'..numero] },
            {'[[Vicepresidente|Vicepresidenta]]', argumento['vicepresidenta'..numero] },
            {'[[Vice primer ministro]]', argumento['viceprimerministro'..numero] },
            {'[[Vice primer ministro|Vice primera ministra]]', argumento['viceprimeraministra'..numero] },
            {'Vicecanciller', argumento['vicecanciller'..numero]},
            {'[[Vicegobernador]]', argumento['vicegobernador'..numero] },
            {'[[Vicegobernador|Vicegobernadora]]', argumento['vicegobernadora'..numero] },            
            {'[[Teniente gobernador]]', argumento['teniente'..numero] },
            {'Vicealcalde', argumento['vicealcalde'..numero] },
            {'Vicejefe de gobierno', argumento['vicejefe'..numero]},
            {'Predecesor', argumento['predecesor'..numero]},
            {'Predecesora', argumento['predecesora'..numero]},
            {'Sucesor', argumento['sucesor'..numero]},
            {'Sucesora', argumento['sucesora'..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 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 or '') ..';}}')
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',
        ['Q4379701 '] = 'jugadora profesional',
        ['Q185351'  ] = 'jurista',
        ['Q644687'  ] = 'ilustradora',
        ['Q14467526'] = 'lingüista',
        ['Q1371925' ] = 'locutora',
        ['Q2251335' ] = 'maestra',
        ['Q191633'  ] = 'mangaka',
        ['Q2412523' ] = 'matadora',
        ['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',
        ['Q549322'  ] = 'torera',
        ['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)
    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 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' and k ~= 'wikidata' 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')
	
    if not imagen then
        return
    end

	imagen = require('Módulo:Wikidata').filtrarDeclaracionPorRango(imagen)[1]

    -- 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
    	if piesDeImagen[1].datavalue and piesDeImagen[1].datavalue.value then
			return valorImagen, nombre .. ' en ' .. require('Módulo:Wikidata/Fecha').FormateaFechaHora(piesDeImagen[1].datavalue.value, {['formatoFecha']='año',['enlace']='no'})
		else
			return valorImagen, nombre
		end
    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(1, 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(p_entidad)
    if not p_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 filtrarDeclaracionPorRango = moduloWikidata.filtrarDeclaracionPorRango
    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 declaracionPremios = elementoTabla(p_entidad, 'claims', 'P166')

    if not declaracionPremios then
        return
    end

    -- Quedarnos solo con los premios con mayor rango. Ejemplo Bettina Rheims

    declaracionPremios = filtrarDeclaracionPorRango(declaracionPremios)
    if not declaracionPremios then
        return
    end

    local premios = {}
    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

    -- No obtener los premios de Wikidata si hay muchos.
    if premiosFormateados[10] then
        return
    end

    -- Añadir el lápiz
    if premiosFormateados[1] then
        return lapizWikidata('<ul><li>' .. mw.text.listToText( premiosFormateados, '</li><li>','</li><li>' ),p_entidad.id,'P166') .. '</li></ul>'
    end
end

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

    if not que:match(valor) then
        return que
    end
end

function z.premios(frame)
    local args    = frame.args
    local entidad = mw.wikibase.getEntityObject(args.id)
    
    if not entidad then
        return
    end

    return obtenerPremios(entidad)
end

return z