Saltar ao contido

Módulo:Wikidata/Formatos

Na Galipedia, a Wikipedia en galego.
Esta documentación está transcluída desde Módulo:Wikidata/Formatos/uso. Os editores poden probar cambios no mesmo en Módulo:Wikidata/Formatos/probas.
Por favor, engade as categorías na subpáxina de documentación e os interwikis no Wikidata. Ver as subpáxinas deste módulo.

local p = {}
local es = mw.language.new('gl')

-- Funcións para a Galipedia
-- Función para formatar unha imaxe sen caixa
function p.formatoImaxe( value, options )
    local str = '[[Ficheiro:' .. value .. '|250px'
    if options.legend then
        str = str .. '|' .. options.legend
    end
    return str .. ']]'
end

-- Funcións copiadas de es.wiki
function p.formatImage( value, options )
    local str = '[[Ficheiro:' .. value .. '|miniatura'
    if options.legend then
        str = str .. '|' .. options.legend
    end
    return str .. ']]'
end
function p.formatBandera(value, options, frame)
	local coincidenciafor
	if frame == nil then
	    frame = marco
	end
    local label = mw.wikibase.label( 'q' .. value['numeric-id'] )
    
    if not label then 
    	return
    end
    
    local link  = mw.wikibase.sitelink('q' .. value['numeric-id'] )
    local nombre 
    local tipo = mw.ustring.gsub(label,'(%D+)%sde%s%D+','%1')
    if options.cortar and options.cortar ~= '' then
        coincidencia = mw.ustring.find( es:lc(options.cortar), es:lc(tipo), plain )
    end
    if coincidencia then
    	nombre = mw.ustring.gsub(label,'%D+%sde%s(%D+)','%1')
    else
    	nombre = label
    end	
    local str2
    if mw.title.new('Modelo:Country data '.. label ).exists  then
        str2 = frame:preprocess('{{bandeira|' .. label ..'|name='.. nombre .. '}}')
    elseif link and label then
        str2 = '[[' .. link .. '|' .. nombre .. ']]'
    elseif label then
        str2 = nombre
    else
        str2 = ''
    end
    return str2 
end
function p.formatCoor(value)
    local cadenacoor = value
    return marco:preprocess('{{Coordenadas|' .. cadenacoor[tostring('latitude')] ..'|'.. cadenacoor[tostring('longitude')] .. '|format=dms}}')
end

-- Funcións para entidades de Wikidata

function p.formatoPremio(valor)
	local enlace, etiqueta, idEntidad = p.obtenerDatos(valor)
	
    -- Eliminar da etiqueta a categoría do premio
        
    if etiqueta then
      	etiqueta = etiqueta:match('^(.*)%s+á%s.*$')  or  -- Exemplo: Premio Nébula á mellor novela curta  --> Premio Nébula
    	           etiqueta:match('^(.*)%s+ó%s.*$') or  -- Exemplo: Premio Hugo ó mellor relato --> Premio Hugo
    	           etiqueta:match('^(.*) na categoría') or  -- Exemplo: Premio Prometheus na categoría Hall of Fame --> Premio Prometheus
       	           etiqueta
    end

    return p.enlazar(enlace, etiqueta, idEntidad)
end

function p.formatoGentilicio(valor, opciones, frame)
	local enlacePais, etiquetaPais, idEntidadPais = p.obtenerDatos(valor)
	
	local gentilicio 
	
	if etiquetaPais then 
		gentilicio = frame:preprocess('{{xentilicio|'.. etiquetaPais .. '|fs}}')
		
		if not gentilicio or gentilicio == '' then
			gentilicio = etiquetaPais
		end
	end
	
	return p.enlazar(enlacePais, gentilicio, idEntidadPais, opciones)
end

function p.formatoLugar(valor, opciones, frame, calificativos)
	-- Función que devolve algo da forma Lugar, entidade territorial administrativa, país
	
	local lugarEnlazado, entidadTerritorialAdministrativaEnlazada, paisEnlazado
	
	-- Validar que está informado o id do lugar.
	if not valor or not valor['numeric-id'] then 
		return
	end	
	
	-- Obter primeiro a entidade territorial administrativa e o país dos cualificativos se é posible
	-- Non se obtén primeiro o lugar, que sería o máis lóxico, porque obterase de forma diferente segundo
	-- estean ou non informados os cualificativos
	
	if calificativos then
		if calificativos['P131'] and calificativos['P131'][1] and 
		   calificativos['P131'][1].datavalue and calificativos['P131'][1].datavalue.value then
		   	
		   	entidadTerritorialAdministrativaEnlazada = p.enlazar(p.obtenerDatos(calificativos['P131'][1].datavalue.value))
		end

		if calificativos['P17'] and calificativos['P17'][1] and 
		   calificativos['P17'][1].datavalue and calificativos['P17'][1].datavalue.value then
		   	
		   	paisEnlazado = p.enlazar(p.obtenerDatos(calificativos['P17'][1].datavalue.value))
		end
	end

	if paisEnlazado then
		lugarEnlazado = p.enlazar(p.obtenerDatos(valor))
	else
	 -- Se o lugar non ten o cualificativo de país obtelo da propiedade país da 
	 -- entidade de Wikidata do lugar.
	 
	 -- De momento non se obtén a entidade administrativa (ten barbaridades...)
		local idLugar, enlaceLugar, etiquetaLugar
		local entidad
		
		idLugar = 'Q' .. valor['numeric-id']
		entidad = mw.wikibase.getEntityObject(idLugar)
		
		if not entidad then
			return
		end
		
		if entidad.sitelinks and entidad.sitelinks.eswiki then
	    	enlaceLugar   = entidad.sitelinks.eswiki.title
		end
	
		if entidad.labels and entidad.labels.es then
			etiquetaLugar = entidad.labels.es.value
		end
	
		lugarEnlazado = p.enlazar(enlaceLugar, etiquetaLugar, idLugar, opciones)
	
		if entidad.claims and entidad.claims.P17 and entidad.claims.P17[1] and
	   	entidad.claims.P17[1].mainsnak and entidad.claims.P17[1].mainsnak.datavalue then
	    	paisEnlazado = p.enlazar(p.obtenerDatos(entidad.claims.P17[1].mainsnak.datavalue.value))
		end		
	end
	
	if lugarEnlazado == paisEnlazado then -- A Cidade do Vaticano ten en Wikidata como país a si mesma
		paisEnlazado = nil
	end
	
    return require('Módulo:Formato texto').separadosPorComa({lugarEnlazado, entidadTerritorialAdministrativaEnlazada, paisEnlazado})
end

function p.formatoUnidad(valor, opciones)
	cantidad = mw.ustring.gsub(valor.value['amount'], '+','')
	unidad = mw.wikibase.label(mw.ustring.gsub(valor.value['unit'], '^.-/(Q%d+)$', '%1'))
	if unidad and tonumber(cantidad) > 1 then	
		textoUnidad = unidad..'s'
	end
	
	if not unidad or (opciones['formatoUnidad'] and opciones['formatoUnidad'] == 'número') then
		return tonumber(cantidad)
	elseif unidad and opciones['formatoUnidad'] and opciones['formatoUnidad'] == 'minutos' and unidad == 'segundo' then
		return math.floor(tonumber(cantidad)/60) .. ':' .. (tonumber(cantidad)%60) .. ' ' .. 'minutos'
	else
		return cantidad .. ((textoUnidad and ' ' .. textoUnidad) or '')
	end
end

-- Formatos de cualificativos

function p.formatoPeriodo(valor, opciones)
	local anyoInicio, anyoFin
	local fechaInicio, fechaFin
	local opcionesFecha= {['formatoTexto']='mayúscula', ['formatoFecha'] = 'año', ['enlace']='no'}

    local fechasInicio = valor['P580']
    local fechasFin    = valor['P582']
    local iFechaInicio = 1
    local iFechaFin    = 1
    
    if not fechasInicio and not fechasFin then
    	return
    end
    
    local periodos    = {}

	if fechasInicio and fechasInicio[1] then
		--if true then return require('Módulo:Táboas').tostring(fechasInicio[1]) end
	    anyoInicio = require('Módulo:Wikidata').formatoDato(fechasInicio[1],opcionesFecha , {})
	    fechaInicio= anyoInicio -- de momento
	end
	
	if fechasFin and fechasFin[1] then
	    anyoFin  = require('Módulo:Wikidata').formatoDato(fechasFin[1], opcionesFecha, {})
	    fechaFin = anyoFin -- de momento
	end
	
    while fechaInicio or fechaFin do -- Por cada período
    	if fechaInicio and fechaFin and tonumber(fechaInicio) and tonumber(fechaFin) and (tonumber(fechaInicio) <= tonumber(fechaFin)) then
    		if anyoInicio == anyoFin then
    			table.insert(periodos, anyoInicio)
    		else
    			table.insert(periodos, anyoInicio .. '–' .. anyoFin)
    		end
		    iFechaInicio = iFechaInicio + 1
		    iFechaFin    = iFechaFin    + 1
		    
		    if fechasInicio[iFechaInicio] then
		    	anyoInicio = require('Módulo:Wikidata').formatoDato(fechasInicio[iFechaInicio],opcionesFecha , {})
		    	fechaInicio= anyoInicio -- de momento
		    else
		    	anyoInicio	= nil
		    	fechaInicio= nil
		    end
		    
		    if fechasFin[iFechaFin] then
		    	anyoFin = require('Módulo:Wikidata').formatoDato(fechasFin[iFechaFin],opcionesFecha , {})
		    	fechaFin= anyoFin -- de momento
		    else
		    	anyoFin	= nil
		    	fechaFin= nil
		    end		    
		elseif anyoInicio then
			table.insert(periodos, 'desde ' .. anyoInicio)
			
			iFechaInicio = iFechaInicio + 1
		    if fechasInicio[iFechaInicio] then
		    	anyoInicio = require('Módulo:Wikidata').formatoDato(fechasInicio[iFechaInicio],opcionesFecha , {})
		    	fechaInicio= anyoInicio -- de momento
		    else
		    	anyoInicio	= nil
		    	fechaInicio= nil
		    end			
		elseif anyoFin then
			table.insert(periodos, 'ata ' .. anyoFin)
		    iFechaFin    = iFechaFin    + 1			
			
		    if fechasFin[iFechaFin] then
		    	anyoFin = require('Módulo:Wikidata').formatoDato(fechasFin[iFechaFin],opcionesFecha , {})
		    	fechaFin= anyoFin -- de momento
		    else
		    	anyoFin	= nil
		    	fechaFin= nil
		    end				
		end
    end
	
	return table.concat(periodos, ', ')
end

-- Funcións internas

-- As seguintes funcións fan practicamente o mesmo que a función
-- formatoIdEntidad do módulo Wikidata.
-- p.obtenerDatos obtén os datos da entidade e p.enlazar os formatea.

function p.obtenerDatos(valor)
	if valor and valor['numeric-id'] then
	    local idEntidad = 'q' .. valor['numeric-id']

        local etiqueta  = mw.wikibase.label( idEntidad )
        local enlace    = mw.wikibase.sitelink( idEntidad )	
        
        return enlace, etiqueta, idEntidad 
    end
end

function p.enlazarEnOtroIdioma(enlace, etiqueta, idioma)
	local categoria = '[[Categoría:Wikipedia:Páxinas con propiedades de Wikidata con etiqueta noutra lingua]]'
	
	if enlace and etiqueta then
		return etiqueta .. ' <small>([[:en:' .. enlace .. '|en]])</small>' .. categoria
	elseif etiqueta then
		return etiqueta .. ' <small>(en)</small>' .. categoria
	elseif enlace then
		return enlace .. ' <small>([[:en:' .. enlace .. '|en]])</small>' .. categoria
	end
end

function p.enlazar(enlace, etiqueta, idEntidad, opciones)
	if opciones then
		-- Opcións das etiquetas
		
		if opciones.etiqueta and opciones.etiqueta ~= 'null' then		-- Por averiguar onde se usa.
			etiqueta = opciones.etiqueta
		end
		
		--  Converter o primeiro carácter a maiúscula no seu caso    
		if etiqueta and opciones['mayúscula'] == 'sí' then
			etiqueta = es:ucfirst(etiqueta)
		end
		
		-- Opcións da ligazón
		if opciones['enlace'] ==  'no' then
			-- No p.enlazar
			enlace = nil
		elseif opciones['debeExistir'] == 'sí' then
			-- Non devolver nada se non está informado o artigo de Wikipedia
			if not enlace then
				return
			end
		elseif opciones['enlace'] ==  'sí' then
			if not enlace and etiqueta and not require('Módulo:Páxinas').existe(etiqueta) then
				-- Tomar como ligazón a etiqueta se non existe o correspondente artigo
				enlace   = etiqueta
				etiqueta = nil				
			end			
		end
	end
	
	-- Segundo estea informada a etiqueta ou a ligazón
	local resultado
	
    if etiqueta and enlace and etiqueta ~= enlace then --Ambos se non son iguais
       resultado = '[[' .. enlace .. '|' .. etiqueta .. ']]'
    elseif enlace then    -- Só a ligazón ou ambos e son iguais
        resultado = '[[' .. enlace .. ']]'
    elseif etiqueta then  -- Só a etiqueta
        resultado = etiqueta
    elseif idEntidad then -- Só a entidade
       -- Obter a etiqueta a ligazón de Wikidata da Wikipedia inglesa.
       local entidad=mw.wikibase.getEntityObject(idEntidad)
       
       --if true then return require('Módulo:Táboas').tostring(entidad) end
       
       if entidad then
       	  if entidad.labels and
       	     entidad.labels.en then
       	     etiqueta = entidad.labels.en.value
       	  end
       	  
       	  if entidad.sitelinks and entidad.sitelinks.enwiki then
       	     enlace   = entidad.sitelinks.enwiki.title
       	  end
       	  
       	  if etiqueta or enlace then
       	     resultado = p.enlazarEnOtroIdioma(enlace, etiqueta, 'en')
       	  end
       end
       
        if not resultado then
        	return '[[:d:'.. idEntidad .. '|sen etiquetar]]' .. 
              '[[Categoría:Wikipedia:Páxinas con propiedades de Wikidata sen etiqueta]]'
        end
    end
    
    -- Engadir cursivas
    
    if opciones and opciones.cursivas == 'sí' then
    	resultado = "''" .. resultado .. "''"
    end
    
    return resultado
end

function p.formatId( value, options )
	local wikidata = require('Módulo:Wikidata')
    local id =  'Q'.. value['numeric-id']
    local opciones = {separador = '<br>',propiedad = options.propiedadValor, uno = 'sí', entityId = id, formatoTexto = 'mayúscula'}
    return wikidata.getPropiedad(opciones)
end

function p.formatBandera2( value, options )
	local bandera = require('Módulo:Bandeira')
	local id =  'Q'.. value['numeric-id']
	local label = mw.wikibase.label( 'Q' .. value['numeric-id'] ) or ''
	local tipo = mw.ustring.gsub(label,'(%D+)%sde%s%D+','%1')
	
	 if options.cortar and options.cortar ~= '' then
        coincidencia = mw.ustring.find( es:lc(options.cortar), es:lc(tipo), plain )
    end
    if coincidencia then
    	nombre = mw.ustring.gsub(label,'%D+%sde%s(%D+)','%1')
    elseif label and label ~= '' then
    	nombre = label
    end
    return bandera.banderaLua(id, '20px', '', nombre)
end
function p.formatFicha( value, options )
	local ficha = require('Módulo:Infobox')
	local opciones = {propiedadValor='P31'} 
	local etiqueta  = p.formatId( value, opciones)
	options.cortar = etiqueta
	local parametros = {
		child = 'si',
		estiloetiqueta1 = 'border:0;font-weight:100;padding:0px 7px',
		estilodatos1 = 'border:0;font-weight:100;padding:0px 7px 0px 2px', 
		etiqueta1='&bull;&nbsp;'.. es:ucfirst(etiqueta),
		datos1 = p.formatBandera2(value, options)}
    return ficha.infobox(parametros)
end

function p.formatoId ( value, options )
	return value['numeric-id'] and 'Q' .. value['numeric-id']
end

--Función achegada polo usuario Juan Mayordomo de es.wiki para devolver os nomes de profesions en feminino
function p.traballoFemenino_wikidata(valor, opciones, frame, calificativos)
   local elementoTabla = require('Módulo:Táboas').elemento
   local function getPropiedadEnGalego(idEntidad, idPropiedad)
	  local entidad =  mw.wikibase.getEntityObject(idEntidad)
	
	  if not entidad then
		return
	  end
	
	  local declaracion   = elementoTabla(entidad,'claims', idPropiedad)
	
	  if not declaracion then
	  	  return
	  end
	
	  local valor
	
	  for k,v in pairs(declaracion) do
		  valor = elementoTabla(v,'mainsnak', 'datavalue', 'value')
		
		  if valor.language == 'gl' then
			  return valor.text
		  end
	  end
   end
   local enlaceOcupacion, etiquetaOcupacion, idEntidadOcupacion = p.obtenerDatos(valor)
   etiquetaOcupacionCorregida = getPropiedadEnGalego(idEntidadOcupacion, 'P2521') or etiquetaOcupacion
		return p.enlazar(enlaceOcupacion, etiquetaOcupacionCorregida, idEntidadOcupacion, opciones)
end

return p