Mòdul:Localizacion

  • En una pagina de pròvas:
    {{#invoke:Localizacion|debug|<Qid>|<Qid2>|lang=<codi>}}
  • Per l'intermediari d'un autre modul:
    require('Module:Localizacion').naming(<etiqueta>, _, <lang>, <Qid>, <Qid2>)
  • Amb la sintaxi de la foncion claim del Module:Wikidadas:
    maridi=location
    maridi=locationcontext

Paramètres:

  • Lo paramètre <Qid>, necessari, es lo id de l'element de Wikidata de la localitat. Amb maridatz=location s'usa solament aquel paramètre en considerant que lo referent es atemporal, valid amb l'estructura administrativa actuala.
  • Lo paramètre <Qid2>, opcional, es lo id de la pagina #ont s'obtendrà una data de contèxt per evitar de referents anacrònics. Amb maridatz=locationcontext s'obten aquel segond paramètre de la pagina actuala.
  • Lo paramètre lang es lo còdi de lenga, per defècte la lenga locala del wiki.
  • Lo paramètre <etiqueta>, usat dempuèi un #autre modul, s'utiliza per evitar de referents redundants.

Utilizat amb lo paramètre maridi de la foncion claim del Module:Wikidadas, aqueles tres paramètres son ja obtenguts per aquel modul.

Es pas previst l'usatge dempuèi un patron. Comentatz-o a la discussion se foguèsse necessari.


-- version 20220121 from master @ocwiki
local p = {}

local module_data = "Module:Wikidadas" -- change to local name if needed

-- year threshold by state, if no specific function, if no P571 (inception) or not convenient inception date
-- previous dates are anachronic referents, 0 = no date, default = 1945
local anachronic_date =
{
	['Q159'] = 1547, -- Russia, Russian SFSR, Russian Empire, Tsardom of Russia
	['Q212'] = 1945, -- Ukraine from II WW
	['Q262'] = 1515, -- Algeria, Ottoman Algeria
	['Q734'] = 1831, -- Guyana and British Guiana
}

---- Fetch from Wikidata, support fuctions for cases by language

function p.fetchAdministrativeEntity(qid, lang)
	local adm_list = require(module_data).getParentValues{
		item = qid,
		property = 'P131', -- located in the administrative territorial entity
		label = 'P31', -- instance of
		formatting = 'label',
		labelformat = 'raw',
		separator = '<adm entity>',
		lang = lang,
		editicon = 'false'
		}
	local adm = {}
	for adm_e in mw.text.gsplit(adm_list or '', '<adm entity>', true) do
		table.insert(adm, mw.text.split(adm_e, ' = '))
	end
	
	return adm
end

function p.getReferencedEntity(qid, entities)
	local adm_statements = mw.wikibase.getAllStatements(qid, 'P131')
	for _, snak in ipairs(adm_statements) do
		local id = snak.mainsnak.datavalue.value.id
		if entities[id] then
			return entities[id]
		end
	end
	return
end

function p.getAdmByID(adm_table, adm_id, loc_label)
	for _, v in ipairs(adm_table) do
		if v[1] == adm_id then
			if v[2] == loc_label then
				return
			else
				return v[2]
			end
		end
	end
	return
end

function p.addReferent(text1, text2, ref_format)
	if text2 == nil or #text2 == 0 then
		return text1
	elseif ref_format == 'brackets' then
		return text1 .. ' (' .. text2 .. ')'
	end
	return text1 .. ', ' .. text2
end

---- Local functions

local function getContextDate(qid)
	local c_date = require(module_data).claim{
		item = qid,
		property = 'P570 or P569 or P2031', -- biographic dates
		formatting = 'Y',
		list = 'false',
		editicon = 'false'
		}
	if not c_date then
		c_date = require(module_data).claim{
		item = qid,
		property = 'P26 or P166 or P1411 or P39 or P551',
		qualifier = 'P580 or P585',
		formatting = 'table',
		rowformat = '$1',
		colformat1 = 'Y',
		list = 'false',
		editicon = 'false'
		}
	end
	if not c_date then return 0 end
	local raw_date = string.match(c_date, "(%d+)") -- remove preffixes or suffixes
	if raw_date ~= c_date then
		raw_date = '0'
	end
	return tonumber(raw_date)
end

local function fetchInception(qid)
	local c_date = require(module_data).claim{
		item = qid,
		property = 'P571',
		formatting = 'Y',
		list = 'false',
		editicon = 'false'
		}
	if not c_date then return end
	local raw_date = string.match(c_date, "(%d+)") -- remove preffixes or suffixes
	if raw_date ~= c_date then
		raw_date = '0'
	end
	return tonumber(raw_date)
end

local function namingLocationByState(qid, label, _date, lang, ref_format)
	local state_date = anachronic_date[qid] or fetchInception(qid) or 1945
	if _date < state_date then
		return label
	end
	local state = require(module_data).getLabel{qid, lang=lang, editicon='false'}
	if mw.ustring.find(state, label, 1, true) or mw.ustring.find(label, state, 1, true) then
		return label
	end
	return p.addReferent(label, state, ref_format)
end

-- on debug console: =p.debug{['args']={'Q385923'}}
function p.debug(frame)
	local id = frame.args[1] or mw.wikibase.getEntityIdForCurrentPage()
	local lang = frame.args.lang
	local loc_label = require(module_data).getLabel{id, lang=lang}
	local context_id = frame.args[2]
	return p.naming(loc_label, lang, id, context_id)
end

-- main function
function p.naming(loc_label, ...)
	local lang = arg[1]
	local loc_id = arg[2]
	local page_id = arg[3]
	
	local module_lang = 'Module:Location/' .. (lang or mw.language.getContentLanguage().code)
	if not pcall(require, module_lang) then
		module_lang = nil
	end
	if module_lang then
		local ret = require(module_lang).namingExceptions(loc_id)
		if ret then
			return loc_label
		end
	end
	
	local context_date, ref_format
	if page_id then
		context_date = getContextDate(page_id)
	else
		context_date = os.date('*t').year
	end
	local state_snak = mw.wikibase.getBestStatements(loc_id, 'P17')
	if #state_snak == 1 and state_snak[1].mainsnak.datavalue then
		-- more than one best statement of state is potencially conflictive,
		-- and skip novalue
		local state_id = state_snak[1].mainsnak.datavalue.value.id
		if module_lang then
			local ret = require(module_lang).namingLocation(state_id, loc_id, loc_label, context_date, p)
			if ret then return ret end
			ref_format = require(module_lang).referentFormat
		end
		return namingLocationByState(state_id, loc_label, context_date, lang, ref_format)
	end
	return loc_label
end

return p