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:DateEng')._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