Mòdul:Location

De Viquipèdia
Salta a la navegació Salta a la cerca
Icona de documentació de mòdul Documentació del mòdul [ mostra ] [ modifica el codi ] [ mostra l'historial ] [ refresca ]

Mòdul Location (codi · ús · discussió · 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]


Wikidata Stamp Rec Light.svg

Aquest mòdul afegeix un referent entre parèntesis a l'etiqueta d'una localitat o unitat administrativa d'acord amb Viquipèdia:Localitats.

Sintaxi[modifica]

  • En una pàgina de proves:
    {{#invoke:Location|debug|<Qid>|<Qid2>}}
  • Des d'un altre mòdul:
    require('Module:Location').naming(<etiqueta>, <Qid>, <Qid2>)
  • Amb la sintaxi de la funció claim del Mòdul:Wikidata:
    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 <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:Wikidata, 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.

-- Naming locations with a referent, according with Catalan manual of style: "location (comarca)", ..., "location (state)"

local p = {}

-- locations where any referent is redundant or innecessary
local naming_exceptions =
{
	'Q60', -- Nova York (EUA)
	'Q61', -- Washington DC (EUA)
	'Q84', -- Londres (Anglaterra)
	'Q90', -- París (França)
	'Q220', -- Roma (Itàlia)
	'Q2807', -- Madrid (Espanya)
}

-- 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
	['Q734'] = 1831, -- Guyana and British Guiana
}

---- Fetch from Wikidata, dependency Module:Wikidata

local function fetchAdministrativeEntity(qid)
	local adm_list = require("Module:Wikidata").getParentValues{
		item = qid,
		property = 'P131', -- located in the administrative territorial entity
		label = 'P31', -- instance of
		formatting = 'label',
		separator = '<adm entity>',
		lang = 'ca', -- developed for Catalan, needs to be internationalised
		editicon = 'false'
		}
	local adm = {}
	for adm_e in mw.text.gsplit(adm_list, '<adm entity>', true) do
		table.insert(adm, mw.text.split(adm_e, ' = '))
	end
	--mw.logObject(adm) -- debug
	return adm
end

local function getContextDate(qid)
	local c_date = require("Module:Wikidata").claim{
		item = qid,
		property = 'P570 OR P569 OR P2031', -- biographic dates
		formatting = 'Y',
		list = 'false',
		lang = 'ca',
		}
	if not c_date then
		c_date = require("Module:Wikidata").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',
		lang = 'ca',
		}
	end
	if not c_date then return end
	if string.find(c_date, 'aC') then
		c_date = '0'
	else
		c_date = string.match(c_date, "(%d+)") -- remove preffixes or suffixes
	end
	return tonumber(c_date)
end

local function fetchInception(qid)
	local c_date = require("Module:Wikidata").claim{
		item = qid,
		property = 'P571',
		formatting = 'Y',
		list = 'false',
		lang = 'ca'
		}
	if not c_date then return end
	if string.find(c_date, 'aC') then
		c_date = '0'
	else
		c_date = string.match(c_date, "(%d+)") -- remove preffixes or suffixes
	end
	return tonumber(c_date)
end

---- Local functions

local function namingByAdm(adm_table, adm_entity, label)
	for _, v in ipairs(adm_table) do
		if v[1] == adm_entity then
			if v[2] == label then
				return
			else
				return v[2]
			end
		end
	end
	return
end

local function inBrackets(text1, text2)
	if text2 == nil or #text2 == 0 then
		return text1
	else
		return text1 .. ' (' .. text2 .. ')'
	end
end

---- Cases by state

-- Canada
local function namingLocationCanada(qid, label)
	local adm = fetchAdministrativeEntity(qid)
	local adm_entity = namingByAdm(adm, 'Província', label) -- province of Canada, fixed at Module:Wikidata/labels
	if adm_entity and adm_entity == 'Quebec' and not string.find(label, adm_entity, 1, true) then -- no Ciutat del Quebec (Quebec)
		return inBrackets(label, adm_entity)
	end
	return inBrackets(label, 'Canadà')
end

-- China
local function namingLocationChina(qid, label)
	local adm = fetchAdministrativeEntity(qid)
	local region = namingByAdm(adm, 'Regió autònoma', label) -- autonomous region of the People's Republic of China
	if region == 'Tibet' then
		return inBrackets(label, region)
	end
	return inBrackets(label, 'RP Xina')
end

-- France
local function namingLocationFrance(qid, label, _date)
	local adm = fetchAdministrativeEntity(qid)
	local adm_entity = namingByAdm(adm, 'Departament', label) -- department of France, fixed at Module:Wikidata/labels
	if adm_entity == 'Pirineus Orientals' and _date > 1700 then
		return inBrackets(label, 'Catalunya del Nord')
	end
	adm_entity = namingByAdm(adm, 'Regió', label) -- region of France
	if adm_entity == 'Guadalupe' or adm_entity == 'Martinica' or adm_entity == 'Guaiana Francesa'
		or adm_entity == 'Mayotte' or adm_entity == 'Illa de la Reunió' or adm_entity == 'Còrsega'
		or adm_entity == 'Bretanya' then
			return inBrackets(label, adm_entity)
	end
	adm_entity = namingByAdm(adm, 'Col·lectivitat', label) -- overseas collectivity
	if not adm_entity then namingByAdm(adm, 'Territori dependent', label) end -- dependent territory
	if adm_entity then
		return inBrackets(label, adm_entity)
	elseif _date > 1700 then
		return inBrackets(label, 'França')
	end
	return label
end

-- Italy
local function namingLocationItaly(qid, label)
	local adm = fetchAdministrativeEntity(qid)
	local region = namingByAdm(adm, 'Regió amb Estatut Especial', label) -- autonomous region with special statute
	if region == 'Sardenya' or region == 'Sicília' then
		return inBrackets(label, region)
	end
	return inBrackets(label, 'Itàlia')
end

-- Portugal
local function namingLocationPortugal(qid, label)
	local adm = fetchAdministrativeEntity(qid)
	local adm_entity = namingByAdm(adm, 'Regió autònoma', label) -- autonomous region of Portugal
	return inBrackets(label, adm_entity or 'Portugal')
end

--Spain
local function namingLocationSpain(qid, label, _date)
	local adm = fetchAdministrativeEntity(qid)
	local community = namingByAdm(adm, 'Autonomia', '') -- autonomous community of Spain fixed at Module:Wikidata/labels
	if community == 'Illes Balears' then
		return inBrackets(label, namingByAdm(adm, 'Illa', label) or 'Balears')
	elseif community == 'Catalunya' or community == 'País Valencià' then
		if community == 'Catalunya' and _date < 1700 then
			return label
		elseif community == 'País Valencià' and _date < 1900 then
			return label
		end
		local comarca = namingByAdm(adm, 'Comarca', label)
		if not comarca then
			comarca = namingByAdm(adm, 'Entitat territorial singular', label) -- Val d'Aran
		end
		if comarca and mw.ustring.find(comarca, mw.ustring.sub(label, 1, -2), 1, true) then -- no Barcelona (Barcelonès), Alacantí...
			return label
		end
		return inBrackets(label, comarca or community)
	elseif community == 'Illes Canàries' then
		local adm_entity = namingByAdm(adm, 'Illa', label)
		if adm_entity == nil and _date < 1800 then
			return inBrackets(label, 'Canàries')
		end
		if adm_entity == nil or mw.ustring.find(label, adm_entity or '', 1, true) then -- no Santa Cruz de Tenerife (Tenerife)...
			adm_entity = namingByAdm(adm, 'Província', label)
		end
		if adm_entity and mw.ustring.find(label, adm_entity, 1, true) then -- no Las Palmas de Gran Canaria (Las Palmas)
			adm_entity = nil
		end
		return inBrackets(label, adm_entity or 'Canàries')
	elseif _date < 1800 then
		return label
	else
		local province = namingByAdm(adm, 'Província', label) or community
		if mw.ustring.find(province or '', label, 1, true) then -- no Madrid (Comunidad de Madrid)...
			province = nil
		end
		return inBrackets(label, province or 'Espanya')
	end
end

-- UK
local function namingLocationUK(qid, label, _date)
	if _date < 1000 then
		return label
	end
	local adm = fetchAdministrativeEntity(qid)
	local adm_entity = namingByAdm(adm, 'País', '') -- country within the United Kingdom, fixed at Module:Wikidata/labels
	if adm_entity == nil then
		if _date < 1700 then
			return label
		else
			adm_entity = namingByAdm(adm, 'Territori britànic', label) -- British Overseas Territories
		end
	end
	return inBrackets(label, adm_entity or 'RU')
end

-- USA
local function namingLocationUSA(qid, label)
	local adm = fetchAdministrativeEntity(qid)
	local adm_entity = namingByAdm(adm, 'Estat federat', label) -- state of the United States, fixed at Module:Wikidata/labels
	if adm_entity == nil then
		adm_entity = namingByAdm(adm, 'Territori no incorporat', label) -- unincorporated territory
	end
	return inBrackets(label, adm_entity or 'EUA')
end

-- other states
local function namingLocationByState(qid, label, _date)
	local state_date = anachronic_date[qid] or fetchInception(qid) or 1945
	if _date < state_date then
		return label
	end
	local state = mw.wikibase.getLabel(qid)
	if mw.ustring.find(state, label, 1, true) or mw.ustring.find(label, state, 1, true) then
		state = '' -- no Andorra la Vella (Andorra)...
	end
	return inBrackets(label, state)
end
			
-- on debug console: =p.debug({['args']={'Q385923'}})
function p.debug(frame)
	local id = frame.args[1] or mw.wikibase.getEntityIdForCurrentPage()
	local loc_label = mw.wikibase.getLabel(id) -- require wikidata getLabel?
	local context_id = frame.args[2]
	return p.naming(loc_label, id, context_id)
end

-- main function
function p.naming(loc_label, loc_id, page_id)
	for _, v in ipairs(naming_exceptions) do
		if v == loc_id then
			return loc_label
		end
	end
	local context_date
	if page_id then
		context_date = getContextDate(page_id) or 0
	else
		context_date = os.date('*t').year
	end
	local state_snak = mw.wikibase.getBestStatements(loc_id, 'P17')
	if #state_snak > 0 and state_snak[1].mainsnak.datavalue then -- fix for novalue
		local state_id = state_snak[1].mainsnak.datavalue.value.id
		if state_id == 'Q29' then -- Spain
			return namingLocationSpain(loc_id, loc_label, context_date)
		elseif state_id == 'Q142' then -- France
			return namingLocationFrance(loc_id, loc_label, context_date)
		elseif state_id == 'Q38' then -- Italy
			return namingLocationItaly(loc_id, loc_label, context_date)
		elseif state_id == 'Q45' then -- Portugal
			return namingLocationPortugal(loc_id, loc_label, context_date)
		elseif state_id == 'Q145' then -- United Kingdom
			return namingLocationUK(loc_id, loc_label, context_date)
		elseif state_id == 'Q30' then -- USA
			return namingLocationUSA(loc_id, loc_label, context_date)
		elseif state_id == 'Q16' then -- Canada
			return namingLocationCanada(loc_id, loc_label, context_date)
		elseif state_id == 'Q148' then -- People's Republic of China
			return namingLocationChina(loc_id, loc_label, context_date)
		else
			--fetchAdministrativeEntity(id) -- debug
			return namingLocationByState(state_id, loc_label, context_date)
		end
	end
	return loc_label
end

return p