Ir al contenido

Módulo:Ficha de persona

De Wikipedia, la enciclopedia libre

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í'}
local enMayusculasO   = {['formatoTexto'] = 'mayúscula', ['conjunción']=' o ', ['linkback']='sí'}
local enMayusculasSinEnlazar = {['formatoTexto'] = 'mayúscula', ['linkback']='sí', ['enlace']='no'}
local enMayusculasOSinEnlazar = {['formatoTexto'] = 'mayúscula', ['conjunción']=' o ', ['linkback']='sí', ['enlace']='no'}
local listaNoOrdenada = {['lista'] = 'no ordenada', ['linkback']='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í'}
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í'}

-- Formatos según el tipo de cabecera

local formatos={
    ['por defecto'] = {['estiloTituloFicha'] = 'background-color:#8DB1C3;color:#000'}, 
    ['inherit']     = {['estiloTituloFicha'] = 'background-color:#E6E6FA;color:#000'},    
    --['actor']       = {['estiloTituloFicha'] = ''},
    ['ajedrecista'] = {['estiloTituloFicha'] = 'background-color:#d38d47;color:#FFF'},
    ['artista']     = {['estiloTituloFicha'] = 'background-color:#8DB1C3;color:#000'},
    ['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 and ( mw.ustring.match(gender, 'femenino') or mw.ustring.match(gender, 'mujer') ) 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})

    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})

    fallecimiento = enVariasLineas({
        argumento['fecha de fallecimiento'] or (obtenerDatosWikidata and entreParentesis(propiedad('P570', enMayusculasOSinEnlazar), obtenerEdadWikidata('P570'))), 
        lugarFallecimiento
    })

    if fallecimiento then
        desaparicion = enVariasLineas({
            argumento['fecha de desaparición'] or propiedad('P746', enMayusculasOSinEnlazar), 
            lugarDesaparicion
        })
    else
        desaparicion = enVariasLineas({
            argumento['fecha de desaparición'] or (obtenerDatosWikidata and entreParentesis(propiedad('P746', enMayusculasOSinEnlazar), obtenerEdadWikidata('P746'))), 
            argumento['lugar de desaparición']
        })
    end

    if fallecimiento or desaparicion then
        nacimiento = enVariasLineas({
            argumento['fecha de nacimiento'] or propiedad('P569', enMayusculasOSinEnlazar), 
            lugarNacimiento
        })
    else
        nacimiento = enVariasLineas({
            argumento['fecha de nacimiento'] or (obtenerDatosWikidata and entreParentesis(propiedad('P569', enMayusculasOSinEnlazar), 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, ['uno'] = 'sí'}) or ''
    if firma and firma ~= '' then
    	firma = '[[Archivo:' .. firma .. '|175x80px|class=skin-invert]]'
    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

    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í'})
	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í', ['formatoTexto'] = 'mayúscula'}),
                               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', argumento['familia'] or 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']},
            {'Festividad', argumento['festividad'] or propiedad('P841', {['enlace'] = 'no'})},
            {'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,
                    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')},

        --{'', 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í', ['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'] },
		},
	}

	if filterByOccupation( {
		'Q931260', -- asesino
		'Q484188', -- asesino en serie
		'Q1154323', -- asesino relámpago
		'Q2159907', -- criminal
		'Q14886050', -- terrorista
		'Q22962951', -- violador
		'Q26267537', -- violador en serie
	}, {
		argumento['cargos criminales'],
		argumento['condena'],
		argumento['situación penal'],
		argumento['víctimas'],
	} ) then
		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
		table_merge(Ficha, {
			{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},
			}
		})
	end
	table_merge(Ficha, {
		{tipo='sección',
			titulo      ='Firma',
			estilotitulo = estiloTituloSecciones,
			{'', 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'}
        },
        entidad = argumento['id'], -- para el enlace final a wikidata
	})

    categorias = {}

	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 table_merge(t1, t2)
	for k,v in ipairs(t2) do
		if type(k) == 'string' then
			t1[k] = v
		else
			table.insert(t1, v)
		end
	end
	return t1
end

function filterByOccupation( wikidataOccupations, localArguments )
	if argumento['wikidata'] ~= 'no' then
		local id = argumento['id'] or mw.wikibase.getEntityIdForCurrentPage()
		if mw.wikibase.isValidEntityId( tostring( id ) ) then
			local wd = mw.wikibase.getAllStatements(id, 'P106') -- Occupation
			for k,v in pairs(wd) do
				local oc = elementoTabla(v, 'mainsnak', 'datavalue', 'value', 'id')
				for i,j in pairs( wikidataOccupations ) do
					if i == ec then
						return true
					end
				end
			end
		end
	end
	for k,v in pairs(localArguments) do
		if v and v ~= 'no' then
			return true
		end
	end
	return false
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
		opciones.rangoMayor = 'sí' -- evitar tomar valores deprecados
		
        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:#000; 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',
        ['Q2286351' ] = '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',
        ['Q11950058'] = 'exploradora',
        ['Q13472585'] = 'filántropa',
        ['Q4964182' ] = 'filósofa',
        ['Q169470'  ] = 'física',
        ['Q33231'   ] = 'fotógrafa',
        ['Q28389'   ] = 'guionista',
        ['Q201788'  ] = 'historiadora',
        ['Q715301'  ] = 'historietista',
        ['Q82863'   ] = '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'   ] = 'poetisa',
        ['Q82955'   ] = 'política',
        ['Q270389'  ] = 'presentadora de noticias',
        ['Q947873'  ] = 'presentadora de televisión',
        ['Q3282637' ] = 'productora de cine',
        ['Q37226'   ] = 'profesora',
        ['Q121863'  ] = '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 and pieDeImagen.datavalue and pieDeImagen.datavalue.value and 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