Módulo:Ficha de persona

De la Enciclopedia Colchagüina

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

local z = {}

local argumentos    -- Tabla de argumentos con los que se llama a la función 
local argumento={}  -- Argumentos eliminando los argumentos sin datos
local Entidad       -- Tabla con los datos en Wikidata del libro.
--                         Ver Wikidata:WikiProject Books para las propicedades posibles
local algunaPropiedadEnlazaWikidata -- Para alguna propiedad no existe la etiqueta ni el enlace mostrándose algo de la forma d:...

-- Módulos utilizados
local ModuloFicha            = require('Módulo:Ficha')
local ModuloIdentificadores  = require('Módulo:Identificadores')
local ModuloPaginas          = require('Módulo:Páginas')	
local ModuloWikidataFormatos = require('Módulo:Wikidata/Formatos')	
local ModuloWikidata         = require('Módulo:Wikidata')
local ModuloTablas           = require('Módulo:Tablas')
local ModuloURL              = require('Módulo:URL')

-- Constantes
local enMayusculas    = {['formatoTexto'] = 'mayúscula'}
local enMayusculasO   = {['formatoTexto'] = 'mayúscula', ['conjunción']=' o '}
local listaNoOrdenada = {['lista'] = 'no ordenada'} --, ['debeExistir'] = 'sí'
local lugar           = {['conjunción']=' o ', ['valor-función'] = ModuloWikidataFormatos.formatoLugar}
local debeExistir     = {['debeExistir'] = 'sí'}
local conPeriodo      = {['lista'] = 'no ordenada', ['formatoTexto'] = 'mayúscula', ['calificativo'] = ModuloWikidataFormatos.formatoPeriodo}
	
function z.Ficha(frame)
--  Hacer que funcione la función formatBandera	 y formatoGentilicio
    ModuloWikidata:setFrame(frame)  -- No funciona si se pone ModuloWikidata.setFrame(marco)    
    
    -- Obtener los argumentos con los que se llama a la función
    argumentos = frame and frame.args or {};
 
    if not argumentos[1] then
        local parent  = frame:getParent();
        argumentos    = parent.args;
    end    
    
    -- Eliminar los parámetros vacíos.
    for k,v in pairs(argumentos) do
        if v~='' then
            argumento[k] = argumentos[k]
        end
    end
    
    -- Obtener datos complejos
    
    -- Obtener los datos de la página donde se inserta la ficha de Wikidata.
    Entidad = mw.wikibase.getEntityObject() or {}
    
    --if true then
    --	return ModuloTablas.tostring(Entidad)
    --end
    
    educacion = argumento['educación'] or -- ¿No es lo mismo que alma máter??? No, es el título
        	    argumento['educacion']
    almamater = argumento['alma máter'] or argumento['alma_mater'] or argumento['alma mater'] or
            	propiedad('P69', {['enlace']='sí', ['lista'] = 'no ordenada'})

    if propiedad('P21') == 'femenino' then
    	etiquetaAnyosActivo = 'Años activa'
    	etiquetaConocidoPor = 'Conocida por'
    	etiquetaInfluencias = 'Influida por'
    	funcionOcupacion    = formatoOcupacionFemenino
    else
    	etiquetaAnyosActivo = 'Años activo'
    	etiquetaConocidoPor = 'Conocido por'    	
    	etiquetaInfluencias = 'Influido por'
    	funcionOcupacion    = formatoOcupacionMasculino
    end

    area = argumento['área'] or argumento['area'] or argumento['especialidad']

    -- La ocupación solo se obtiene 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 "puntura y escultura".

    -- Pendiente averiguar si en algún artículo se informan los campos de área y de ocupación a la vez.
    -- Si es así mostrar solo uno de los dos.
    
    ocupacion      = argumento['ocupación'] or argumento['Ocupación'] or (not area and propiedad('P106', {['formatoTexto'] = 'mayúscula', ['valor-función']=funcionOcupacion}))
    ocupacionOArea = ocupacion or area
    
    nombre = argumento['nombre'] or argumento['Nombre'] or
             obtenerEtiquetaWikidata() or 
             ModuloPaginas.nombrePagina({desambiguar='sí'})
             
    -- Informar los datos de nacimiento y de fallecimiento
    fechaNacimiento = argumento['fecha de nacimiento'] or argumento['fechadenacimiento'] or
                      argumento['fecha_nacimiento']    or argumento['Fecha_nacimiento']  or 
                      argumento['fecha nacimiento']    or argumento['fechadenacimiento'] or
                      propiedad('P569', enMayusculasO)
    lugarNacimiento = argumento['lugar de nacimiento'] or argumento['lugardenacimiento'] or
                      argumento['lugar']               or 
                      argumento['lugar_nacimiento']    or argumento['Lugar_nacimiento'] or 
                      argumento['lugar nacimiento']    or
                      propiedad('P19', lugar)
    
    if fechaNacimiento and lugarNacimiento then
        nacimiento = fechaNacimiento .. '<br />' .. lugarNacimiento
    else
    	nacimiento = fechaNacimiento or lugarNacimiento
    end
    
    fechaFallecimiento = argumento['fecha de fallecimiento'] or argumento['fechadefallecimiento'] or 
                         argumento['fecha fallecimiento']    or argumento['fecha_fallecimiento']  or argumento['Fecha_fallecimiento']  or
                         argumento['fecha de defunción']     or
                         argumento['fecha_muerte']           or
                         propiedad('P570', enMayusculasO)
    lugarFallecimiento = argumento['lugar de fallecimiento'] or argumento['lugardefallecimiento'] or
                         argumento['lugar fallecimiento']    or argumento['lugar_fallecimiento']  or argumento['Lugar_fallecimiento']  or
                         argumento['lugar de defunción']     or
                         argumento['lugar_muerte']           or
                         propiedad('P20', lugar)
    
    if fechaFallecimiento and lugarFallecimiento then
        fallecimiento = fechaFallecimiento .. '<br />' .. lugarFallecimiento
    else
    	fallecimiento = fechaFallecimiento or lugarFallecimiento
    end
    
    if argumento['padres'] then
    	padres = estaEnlazado(argumento['padres'])
    else
    	padre = propiedad('P22') --, debeExistir)
    	madre = propiedad('P25') --, debeExistir)
    	
    	if padre and madre then
    		padres = padre .. '<br/>' .. madre
    	else
    		padres = padre or madre
    	end
    end
    
    firma = argumento['firma'] or argumento['Firma'] or
        	propiedad('P109')
    
    web = propiedad('P856') or 
          argumento['web'] or argumento['página web'] or argumento['website'] or argumento['sitio web']
          
    twitter  = argumento['twitter'] or argumento['Twitter'] or obtenerTwitter()
    facebook = argumento['facebook'] or argumento['Facebook'] or obtenerFacebook()
    
   
    -- Título según la ocupación y si la persona ha muerto      
    -- No mostrar para los artistas ningún icono en la cabecera de la ficha
    
    if ocupacionOArea and (ocupacionOArea:find('[Aa]rtista') or ocupacionOArea:find('[Pp]intor') or 
    	ocupacionOArea:find('[Ee]scultor') or ocupacionOArea:find('[Pp]intura') or ocupacionOArea:find('[Ee]scultura')
    	or ocupacionOArea:find('[Ff]otograf')
    	or ocupacionOArea:find('[Aa]rtes visuales')
    	) then
        tipocabecera = ''
        estilotitulo = 'background-color:#8DB1C3;color:#FFF'
    elseif ocupacionOArea and (ocupacionOArea:find('[Ee]scritor') or ocupacionOArea:find('[Nn]ovelista') or 
    	ocupacionOArea:find('[Pp]oeta') or ocupacionOArea:find('[Dd]ramaturgo')) then
        tipocabecera = 'libro'
        estilotitulo = 'background-color:#4c6099;color:#FFF'
    elseif ocupacionOArea and ocupacionOArea:find('[Pp]eriodista') then
    	if fechaFallecimiento or lugarFallecimiento then
    		colorfondo = '#c0c0c0'
    	else
    		colorfondo = '#ed8'
    	end
    	tipocabecera   = 'revista'
    	estilotitulo   = 'color:#FFF'
    elseif ocupacionOArea and ocupacionOArea:find('[Dd]iseñador') then
    	estilotitulo     = 'background-color:#ccccff' 
    	mostrarSecciones = true
 	else
        tipocabecera = 'humano fn'
        estilotitulo = 'background-color:#8DB1C3;color:#FFF'
    end          
    
    local Ficha = {
        clase           = 'biography vcard',

        -- Título
        tipocabecera    = tipocabecera,                   
        titulo          = nombre,
        colorfondo      = colorfondo,        
        estilotitulo    = estilotitulo,
        --Imagen
        --De momento no se pone una raya como en la ficha de escritor tras la imagen
        imagen          = argumento['imagen']  or argumento['Imagen'] or 
                          argumento['foto']    or 
                          propiedad('P18', {uno='sí'}),
        ['tamañoimagen']= 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             = argumento['descripción'] or 
                          argumento['pie de foto'] or argumento['piedefoto'] or
                          argumento['textoimagen'] or argumento['TextoImagen'] or argumento['texto_imagen'] or
                          argumento['pie de foto']
                          ,
        -- Pendiente: en la ficha de escritor el texto se pone entre <small> y en la de artista se usa el estilo font-size:smaller
        --Etiquetas y datos                  
        estiloetiqueta  = 'width:33%', -- 25% en la ficha de escritor. Sin especificar en la de persona
                          --'padding:0.2em 1.0em 0.2em 0.2em; background-color:transparent; line-height:1.2em;', -- En la ficha de persona original
        estilodatos     = 'padding:0.2em; line-height:1.3em; vertical-align:middle;',
        
        {tipo='sección',
        	['titulo']   = mostrarSecciones and 'Información personal',   -- Ver la ficha de noble o la ficha de diseñador
            estilotitulo = estilotitulo,
            {'Nombre de nacimiento', propiedad('P1477') or 
        	            propiedad('P513')  or
        	            argumento['nombre completo']   or argumento['nombre_completo'] or argumento['Nombre_completo'] or
        	            argumento['nombre nacimiento'] or argumento['nombredenacimiento'] or argumento['nombre de nacimiento'] or
        	            argumento['nombre_real']
    	    },
            {'Nombre nativo',      argumento['nombre nativo']}, --????????????
            {'Apodo',              argumento['apodo']},
            {'Otros&nbsp;nombres', argumento['otros nombres'], -- ¿No es lo mismo que el apodo?????
        	                       clase='nickname'},        	                   
            {'Nacimiento',         nacimiento},
            {'Fallecimiento',      fallecimiento},
            {'Causa de muerte',    argumento['causa muerte'] or
        	                       propiedad('P509', enMayusculas) or 
        	                       propiedad('P1196', enMayusculas)}, -- circunstancias de la muerte

            {'Residencia',     argumento['residencia'] or propiedad('P551'),
        	                   clase='etiqueta'},        	
            {'Nacionalidad',   argumento['nacionalidad'] or argumento['Nacionalidad'] or --Pendiente hacer que salga el gentilicio
        	                   propiedad('P27', {['valor-función'] = ModuloWikidataFormatos.formatoGentilicio, ['formatoTexto'] = 'mayúscula'}), 
        	                   clase='category'},        
            {'Etnia',          propiedad('P172') or 
        	                   argumento['etnia'],
        	                   clase='category'},           	                   
            {'Ciudadanía',     argumento['ciudadanía'] or -- ¿No es lo mismo que la nacionalidad?
        	                   argumento['ciudadania'],
        	                  clase='category'},
        },
        {tipo='sección',
        	-- Educación
        	
            {'Educación',  educacion},  
            {'Alma máter', almamater, clase='plainlist'},
            {'Posgrado',   argumento['posgrado']}
        },


        {tipo='sección',
        	['titulo'] = mostrarSecciones and 'Información profesional',
            estilotitulo = estilotitulo,            
            
            {'Ocupación',      ocupacion, clase='role'},
            {etiquetaAnyosActivo,  argumento['años activo'] or 
        	                   argumento['periodo'] or argumento['período'] or argumento['Periodo'] or
        	                   argumento['tiempo'] or argumento['Tiempo']}, -- Periodistas
            {'Área',           area},
            {'Empleador',      argumento['empleador'] or
        	                   argumento['institución_de_trabajo'] or
        	                   argumento['nombre_estudio'] or
        	                   propiedad('P108', {['lista'] = 'no ordenada', ['formatoTexto'] = 'mayúscula'}),
                               clase       ='plainlist'},
            {'Medio',          argumento['medio de comunicación']}, -- Para periodistas. Unas veces informados con el significado de área y otras con el empleador
            {'Programas',      argumento['programas']}, -- Para periodistas            

            -- Ocupación (escritores, artistas, periodistas, diseñadores, etc)            
            {'[[Seudónimo]]', argumento['seudónimo'] or argumento['Seudónimo'] or propiedad('P742')},
            {'Lengua de producción literaria',  argumento['lengua_literaria'] or argumento['Lengua_literaria']},
            {'Lengua materna',  argumento['lengua_materna'] or argumento['Lengua_materna'] or propiedad('P103', enMayusculas)},
            {'Género',          argumento['género'] or argumento['Género'] or propiedad('P136', enMayusculas)},
            {'[[Movimiento artístico|Movimientos]]', argumento['movimiento'] or 
        	                                     argumento['Movimiento'] or
        	                                     argumento['movimientos'] or 
        	                                     propiedad('P135', enMayusculas)},
            {'Obras notables', argumento['obras'] or
        	                   argumento['obras notables'] or argumento['obras_notables'] or argumento['Obras notables'] or
        	                   argumento['obras destacadas'] or
        	                   argumento['proyectos_representativos']
        	                       },
            {'Artistas relacionados', argumento['relacionados']},
            
            --{'', listaDesplegable(etiquetaInfluencias, argumento['influenciado por'] or argumento['influido por'] or 
            --	                  argumento['influencias'] or argumento['Influencias'], frame)},
            --{'',         listaDesplegable('Influyó a', argumento['influyó'] or argumento['Influyó'], frame)},
        },

        {'Empresa',            argumento['empresa']},
        {'Salario',            argumento['salario']},
        {'Patrimonio',         argumento['patrimonio']},
        {'Altura',             argumento['altura']},
        {'Peso',               argumento['peso']},
        {etiquetaConocidoPor,  argumento['conocido'] or
        	                   argumento['conocido por']},
        {'Título',             argumento['título'] or -- <!-- Su majestad, primera dama, etc -->
        	                   argumento['titulo']},
        {'Término',            argumento['término'] or -- <!--Años bajo los cuales la persona tuvo el título (el de arriba xD) -->
        	                   argumento['termino']},
        {'Predecesor',         argumento['predecesor']},
        {'Sucesor',            argumento['sucesor']},
        {'Partido político',   argumento['partido político'] or propiedad('P102')},
        {'Cargos políticos',   propiedad('P39', conPeriodo), clase='plainlist'},
        {'Creencias religiosas', propiedad('P140', enMayusculas) or 
        	                 argumento['religión'] or
        	                 argumento['creencias']},
        {tipo='sección',
            -- Familia. 
            estilotitulo  = estilotitulo,
            ['titulo']    = mostrarSecciones and 'Familia', -- Ver la ficha de noble
            
        -- En el caso del cónyuge tiene preferencia el argumento hasta que se muestre los calficativos.
            clase       ='plainlist', -- Mostrar las listas sin viñetas
            {'Familia nobiliaria', propiedad('P53')},
            {'Padres',     estaEnlazado(padres)},
            {'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í'})},
            {'Familiares', estaEnlazado(argumento['familiares'])}, --- ¿¿¿¿¿¿¿¿¿??????????? -- Hermano: P7, padastro: p43, pariente: p1038
        },

        -- Los premios pueden ser para varias ocupaciones por lo que se ponen al final
        {'Premios',            argumento['premios'] or argumento['Premios'] or
                               argumento['premio']  or argumento['Premio']  or
                               argumento['premios2'] or
                               propiedad('P166', {['lista'] = 'no ordenada', ['formatoTexto'] = 'mayúscula'}),
                               clase       ='plainlist'}, -- Mostrar las listas sin viñetas
        	                   
        -- Con etiqueta/datos como en las fichas de escritor y artista en vez de como en la ficha de persona
        {'Firma', (firma and ('[[Archivo:' .. firma .. '|150px]]'))}, -- 150 px como en la ficha de escritor en vez de 128

        {tipo='sección', -- Web
            clase       ='plainlinks',
            {'Sitio web', ModuloURL.enlazar(web)}, 
            {'Facebook', facebook and ('[http://www.facebook.com/' .. facebook .. ' ' .. facebook .. ']')}, -- Ver la plantilla facebook
            {'Twitter',  twitter  and ('[http://www.twitter.com/'  .. twitter  .. ' ' .. twitter .. ']')} -- Ver la plantilla twitter
        },
        {tipo='sección',
            titulo      ='Notas',
            estilotitulo='border-top:1px solid #c0c0c0;text-align:left',
            {'', argumento['notas'], estilodatos='text-align:left;font-size:90%; line-height:1.2em'}
        },        
        {'Fuente biográfica', argumento['fuentebiográfica']},
    }
    
    categorias = ''
    
    if algunaPropiedadEnlazaWikidata then
    	categorias = '[[Categoría:Wikipedia:Páginas con propiedades de Wikidata sin etiqueta]]'
    end
    
    --if educacion and almamater then
    -- 	categorias = categorias .. '[[Categoría:Wikipedia:Páginas que tienen informado el campo educación]]'
    --end
    
    return ModuloFicha.infobox(Ficha) .. categorias
end

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

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

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

    	return valorPropiedad
    end
end

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

function listaDesplegable(titulo, lista, frame)
	if not lista then
		return
	end
	
	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:transparent; text-align:left|lista_estilo=padding-left:33%;text-align:left; display:none|1='
		.. lista .. '}}')
end

function estaEnlazado(que)
	if not que then 
		return
	end
	
	for contenido in que:gmatch("%[%[(.+)]]") do
		if not contenido:match('^:d:') then
			return que
		end
	end
end

function formatoOcupacionMasculino(valor, opciones, frame)
	local enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion = ModuloWikidataFormatos.obtenerDatos(valor)
 
    -- Corregir la ocupación eliminando el femenino 
	
	if etiquetaOcupacion then
		etiquetaOcupacion = etiquetaOcupacion:match('^(.+)%s*/%s*.+$') or etiquetaOcupacion
	end
 
	return ModuloWikidataFormatos.enlazar(enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion, opciones)
end

function corregirOcupacion(etiquetaOcupacion)
	if not etiquetaOcupacion then
		return
	end
	
	cadena1 = etiquetaOcupacion:match('^(.+)o%s*/a$') or -- científico/a
		      etiquetaOcupacion:match('^(.+)%s*/a$')     -- escritor/a
	if cadena1 then
		return cadena1 .. 'a'
	end

	cadena1, cadena2, cadena3 = etiquetaOcupacion:match('^(.+)o(%s*)/a%s+(.+)$') -- 
	
	if cadena1 and cadena2 and cadena3 then
		return cadena1 .. 'a' .. cadena2 .. cadena3
	end
	
	cadena1, cadena2, cadena3 = etiquetaOcupacion:match('^(.+)%s*/a(%s+)(.+)$') -- escritor/a de literatura infantil
	
	if cadena1 and cadena2 and cadena3 then
		return cadena1 .. 'a' .. cadena2 .. cadena3
	end
	
	return etiquetaOcupacion:match('^.+%s*/%s*(.+)$') or -- actor/actriz
	       etiquetaOcupacion
end

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

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

function obtenerFacebook()
	return obtenerValorCalificativo('P553' -- cuenta en red social
                      , 'P554' --dirección en red social
                      , 355)   -- Facebook
            or propiedad('P2013'); -- Ejemplo: Gillian Flynn
end

function obtenerTwitter()
	return obtenerValorCalificativo('P553' -- cuenta en red social
                      , 'P554' --dirección en red social
                      , 918)   -- Twitter
end

return z