Vés al contingut

Mòdul:Location

De la Viquipèdia, l'enciclopèdia lliure
Icona de documentació de mòdul Documentació del mòdul [ mostra ] [ modifica el codi ] [ mostra l'historial ] [ refresca ]

Mòdul Location (codi · ús · discussió · proves · tests · casos prova | subpàgines · enllaços)

A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]


Aquest mòdul afegeix un referent entre parèntesis a l'etiqueta d'una localitat o unitat administrativa obtinguda de Wikidata, d'acord amb Viquipèdia:Localitats. Per exemple: "Mataró (Maresme)" o "Berlín (Alemanya)".

Sintaxi

[modifica]
  • En una pàgina de proves:
    {{#invoke:Location|debug|<Qid>|<Qid2>|lang=<codi>}}
  • Des d'un altre mòdul:
    require('Module:Location').naming(<etiqueta>, _, <lang>, <Qid>, <Qid2>)
  • Amb la sintaxi de la funció claim del Mòdul:Wikidades:
    case=location
    case=locationcontext

Paràmetres:

  • El paràmetre <Qid>, necessari, és l'id de l'element de Wikidata de la localitat. Amb case=location només s'usa aquest paràmetre considerant que el referent és atemporal, vàlid amb l'estructura administrativa actual.
  • El paràmetre <Qid2>, opcional, és l'id de la pàgina on s'obtindrà una data de context per a evitar referents anacrònics. Amb case=locationcontext s'obté aquest segon paràmetre de la pàgina actual.
  • El paràmetre lang és el codi de llengua, per defecte la llengua local del wiki.
  • El paràmetre <etiqueta>, usat des d'un altre mòdul, s'utilitza per a evitar referents redundants.

Usat amb el paràmetre case de la funció claim del Mòdul:Wikidades, aquests tres paràmetres ja són obtinguts per aquell mòdul.

No està previst l'ús des d'una plantilla. Comenteu-ho a la discussió si fos necessari.

Dades

[modifica]

Les dades s'obtenen de Wikidata a partir de la definició de Estat (P17), i en casos amb més detall amb el Mòdul:Wikidades funció getParentValues a partir de la definició de Localitzat a l'entitat territorial administrativa (P131) de forma recursiva. Vegeu la documentació a Mòdul:Wikidades#Funció getParentValues. En casos suposadament incoherents comproveu a Wikidata com estan definides aquestes propietats.

Si es condiciona el referent a una data de context, per exemple en dades biogràfiques amb case=locationcontext, aquesta data s'obté de la pàgina actual:

Aquesta data es compara amb la data del referent que indica a partir de quan és vàlid. La data del referent es pot definir en els criteris per llengua, per exemple les províncies d'Espanya és 1800. Altrament:

  • De la taula anachronic_date amb casos particulars.
  • De la propietat Creació (P571).
  • Per defecte 1945.

Criteris

[modifica]

El referent general és per estat. En cada llengua hi poden haver criteris específics segons les normes d'estil local. Actualment estan definits en català i en anglès. Vegeu els submòduls corresponents per la documentació dels criteris usats. Per a definir criteris en altres llengües ho podeu demanar a la pàgina de discussió.

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

local module_data = "Module:Wikidades" -- 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