Módulo:Wikidata/Formato puesto

De Biquipedia

La documentación para este módulo puede ser creada en Módulo:Wikidata/Formato puesto/doc

local p = {}

local deseparausPorComa           = require('Módulo:Formato texto').deseparausPorComa
local moduloTablas               = require('Módulo:Tablas')
	local elementoTabla          = moduloTablas.elemento
local moduloWikidataFormatos     = require('Módulo:Wikidata/Formatos')
	local enlazar                = moduloWikidataFormatos.enlazar
	local obtenerDatos           = moduloWikidataFormatos.obtenerDatos
local Date                       = require('Módulo:Date')._Date

function p.formatoPuesto(valor, opcions, frame, calificativos)
	-- Función que torna bella cosa d\'a forma puesto, entidat territorial administrativa, país
	
	function obtenerOcurrenciaACalendata(tabla, calendata)
		if not tabla or not calendata then
			return
		end
		
		local calendataInicio, calendataFin
		calendata = Date(calendata)
		
		--if true then return require('Módulo:Tablas').tostring(tabla) end
		--
		for k,v in pairs(tabla) do
			calendataInicio = elementoTabla(v,'qualifiers','P580',1,'datavalue','value','time')
			calendataFin    = elementoTabla(v,'qualifiers','P582',1,'datavalue','value','time')
			calendataInicio = Date(calendataInicio)
			calendataFin    = Date(calendataFin)
			
			if calendataInicio and calendataFin then
				if  calendata >= calendataInicio and
					calendata <= calendataFin then
						return k
				end
			elseif calendataInicio then
				if  calendata >= calendataInicio then
						return k
				end
			elseif calendataFin then
				if  calendata <= calendataFin then
						return k
				end
			end
		end
			
	end
	
	function obtenerOcurrenciaRangoPreferente(tabla)
		if not tabla then
			return
		end
		for k,v in pairs(tabla) do
			if v.rank == 'preferred' then
				return k
			end
		end
	end
	
	local idPuesto, enlacePuesto, etiquetaPuesto, puestoEnlazau
	local entidatTerritorialAdministrativaEnlazada	
	local idPais, enlacePais, etiquetaPais, paisEnlazau
	local calendata
	
	-- Validar que ye informau l'id d\'o puesto.
	if not valor or not valor['numeric-id'] then 
		return
	end
	
	if opcions then
		calendata = opcions.calendata
	end
	
	-- Obtener primero a entidat territorial administrativa y o país d'os calificativos si ye posible
	-- No s'obtiene primero o puesto, que sería lo más lochico, porque s'obtendrá de forma diferent seguntes
	-- sigan u no informaus os calificativos
	
	if calificativos then
		entidatTerritorialAdministrativaEnlazada = enlazar(obtenerDatos(elementoTabla(calificativos,'P131',1,'datavalue','value')))
		enlacePais, etiquetaPais, idPais         = obtenerDatos(elementoTabla(calificativos,'P17',1,'datavalue','value'))
		paisEnlazau                             = enlazar(enlacePais, etiquetaPais, idPais)
	end

	if paisEnlazau then
		enlacePuesto, etiquetaPuesto, idPuesto = obtenerDatos(valor)
		puestoEnlazau = enlazar(enlacePuesto, etiquetaPuesto, idPuesto)
	else
	 -- Si o puesto no tien o calificativo de país obtener-lo d\'a propiedat país d\'a 
	 -- entidat de Wikidata d\'o puesto.
	 
	 -- Por agora no s'obtiene a entidat administrativa
		local entidat
		
		idPuesto = 'Q' .. valor['numeric-id']
		entidat = mw.wikibase.getEntityObject(idPuesto)
		
		if not entidat then
			return
		end
		
		enlacePuesto   = elementoTabla(entidat,'sitelinks','eswiki','title')
		etiquetaPuesto = elementoTabla(entidat,'labels','es','value')
		puestoEnlazau = enlazar(enlacePuesto, etiquetaPuesto, idPuesto, opcions)
		--
		-- Obtener o país d\'o puesto.
		--
		local paisesPuesto = elementoTabla(entidat,'claims','P17')
		
		if paisesPuesto then
			-- Primero s'intenta con o país en a calendata d'as opcions, dimpués
			-- o país con rango maximo (l'actual) y dimpués o primer país.
			local ocurrenciaPais = obtenerOcurrenciaACalendata(paisesPuesto, calendata) or
			obtenerOcurrenciaRangoPreferente(paisesPuesto) or 
			1

			enlacePais, etiquetaPais, idPais = obtenerDatos(elementoTabla(paisesPuesto,ocurrenciaPais,'mainsnak','datavalue','value'))
			paisEnlazau  = enlazar(enlacePais, etiquetaPais, idPais)
		end
	end
	
	if idPuesto == idPais then -- Si o puesto ye un país, por eixemplo, Estaus Unius, en Wikidata tien a propiedat país informada con Estaus Unius.
		return puestoEnlazau
	elseif puestoEnlazau and entidatTerritorialAdministrativaEnlazada and paisEnlazau then
		return puestoEnlazau .. ' (' .. entidatTerritorialAdministrativaEnlazada ..  ', ' .. paisEnlazau .. ')'
	elseif puestoEnlazau and entidatTerritorialAdministrativaEnlazada then
		return puestoEnlazau .. ' (' .. entidatTerritorialAdministrativaEnlazada .. ')'
	elseif puestoEnlazau and paisEnlazau then
		return puestoEnlazau .. ' (' .. paisEnlazau .. ')'		
	elseif entidatTerritorialAdministrativaEnlazada and paisEnlazau then
		return entidatTerritorialAdministrativaEnlazada .. ' (' .. paisEnlazau .. ')'	
	else
		return puestoEnlazau or entidatTerritorialAdministrativaEnlazada or paisEnlazau	
	end
end

--*****************************************************************************
-- Alias de formatos pa utilizar en a plantilla propiedat
--*****************************************************************************
p['puesto']     = p['formatoPuesto']
	
return p