Módulo:Wikidata/Formato lugar
La documentación para este módulo puede ser creada en Módulo:Wikidata/Formato lugar/doc
local p = {}
local separadosPorComa = require('Módulo:Formato texto').separadosPorComa
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.formatoLugar(valor, opciones, frame, calificativos)
-- Función que devuelve algo de la forma Lugar, entidad territorial administrativa, país
function obtenerOcurrenciaAFecha(tabla, fecha)
if not tabla or not fecha then
return
end
local fechaInicio, fechaFin
fecha = Date(fecha)
--if true then return require('Módulo:Tablas').tostring(tabla) end
--
for k,v in pairs(tabla) do
fechaInicio = elementoTabla(v,'qualifiers','P580',1,'datavalue','value','time')
fechaFin = elementoTabla(v,'qualifiers','P582',1,'datavalue','value','time')
fechaInicio = Date(fechaInicio)
fechaFin = Date(fechaFin)
if fechaInicio and fechaFin then
if fecha >= fechaInicio and
fecha <= fechaFin then
return k
end
elseif fechaInicio then
if fecha >= fechaInicio then
return k
end
elseif fechaFin then
if fecha <= fechaFin 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 idLugar, enlaceLugar, etiquetaLugar, lugarEnlazado
local entidadTerritorialAdministrativaEnlazada
local idPais, enlacePais, etiquetaPais, paisEnlazado
local fecha
-- Validar que está informado el id del lugar.
if not valor or not valor['numeric-id'] then
return
end
if opciones then
fecha = opciones.fecha
end
-- Obtener primero la entidad territorial administrativa y el país de los calificativos si es posible
-- No se obtiene primero el lugar, que sería lo más lógico, porque se obtendrá de forma diferente según
-- estén o no informados los calificativos
if calificativos then
entidadTerritorialAdministrativaEnlazada = enlazar(obtenerDatos(elementoTabla(calificativos,'P131',1,'datavalue','value')))
enlacePais, etiquetaPais, idPais = obtenerDatos(elementoTabla(calificativos,'P17',1,'datavalue','value'))
paisEnlazado = enlazar(enlacePais, etiquetaPais, idPais)
end
if paisEnlazado then
enlaceLugar, etiquetaLugar, idLugar = obtenerDatos(valor)
lugarEnlazado = enlazar(enlaceLugar, etiquetaLugar, idLugar)
else
-- Si el lugar no tiene el calificativo de país obtenerlo de la propiedad país de la
-- entidad de Wikidata del lugar.
-- De momento no se obtiene la entidad administrativa (tiene unas barbaridades...)
local entidad
idLugar = 'Q' .. valor['numeric-id']
entidad = mw.wikibase.getEntityObject(idLugar)
if not entidad then
return
end
enlaceLugar = elementoTabla(entidad,'sitelinks','eswiki','title')
etiquetaLugar = elementoTabla(entidad,'labels','es','value')
lugarEnlazado = enlazar(enlaceLugar, etiquetaLugar, idLugar, opciones)
--
-- Obtener el país del lugar.
--
local paisesLugar = elementoTabla(entidad,'claims','P17')
if paisesLugar then
-- Primero se intenta con el país en la fecha de las opciones, luego
-- el país con rango máximo (el actual) y luego el primer país.
local ocurrenciaPais = obtenerOcurrenciaAFecha(paisesLugar, fecha) or
obtenerOcurrenciaRangoPreferente(paisesLugar) or
1
enlacePais, etiquetaPais, idPais = obtenerDatos(elementoTabla(paisesLugar,ocurrenciaPais,'mainsnak','datavalue','value'))
paisEnlazado = enlazar(enlacePais, etiquetaPais, idPais)
end
end
if idLugar == idPais then -- Si el lugar es un país, por ejemplo, estados Unidos, en Wikidata tiene la propiedad país informada con Estados Unidos.
return lugarEnlazado
elseif lugarEnlazado and entidadTerritorialAdministrativaEnlazada and paisEnlazado then
return lugarEnlazado .. ' (' .. entidadTerritorialAdministrativaEnlazada .. ', ' .. paisEnlazado .. ')'
elseif lugarEnlazado and entidadTerritorialAdministrativaEnlazada then
return lugarEnlazado .. ' (' .. entidadTerritorialAdministrativaEnlazada .. ')'
elseif lugarEnlazado and paisEnlazado then
return lugarEnlazado .. ' (' .. paisEnlazado .. ')'
elseif entidadTerritorialAdministrativaEnlazada and paisEnlazado then
return entidadTerritorialAdministrativaEnlazada .. ' (' .. paisEnlazado .. ')'
else
return lugarEnlazado or entidadTerritorialAdministrativaEnlazada or paisEnlazado
end
end
--*****************************************************************************
-- Alias de formatos para utilizar en la plantilla propiedad
--*****************************************************************************
p['lugar'] = p['formatoLugar']
return p