La documentazione per questo modulo può essere creata in Modulo:Diocesi/man

--[[
* Modulo a supporto del template Edificio religioso per generare
* la riga riguardante le diocesi.
]]--

require('strict')

local getArgs = require('Modulo:Arguments').getArgs
local mWikidata = require('Modulo:Wikidata')
local error_category = '[[Categoria:Errori di compilazione del template Edificio religioso]]'
-- La proprietà P708 verrà letta solo se il suo valore (di tipo elemento) è "istanza di" uno di questi elementi.
-- Il formato di ogni riga è:
-- qID = { 'Nome da visualizzare nel sinottico', 'Eventuale titolo pagina se diverso dal nome' }
local cfg = {
	Q285181   = { 'Eparchia' },
	Q350509   = { 'Ordinariato' },
	Q384003   = { 'Prefettura apostolica' },
	Q427961   = { 'Provincia ecclesiastica' },
	Q565744   = { 'Chiesa regionale', 'Chiesa evangelica in Germania' },
	Q620225   = { 'Vicariato apostolico' },
	Q644930   = { 'Missione sui iuris' },
	Q665487   = { 'Diocesi' },
	Q866196   = { 'Diocesi' },
	Q1184788  = { 'Sede suburbicaria' },
	Q1282276  = { 'Patriarcato', 'Patriarcato (cristianesimo)' },
	Q1385389  = { 'Diocesi extra-provinciale', 'Chiesa anglicana' },
	Q1431554  = { 'Amministrazione apostolica' },
	Q1455927  = { 'Prelatura personale' },
	Q1531518  = { 'Ordinariato militare' },
	Q1778235  = { 'Abbazia territoriale' },
	Q2072238  = { 'Arcidiocesi' },
	Q2288631  = { 'Arcieparchia' },
	Q2445047  = { 'Diocesi' },
	Q2633744  = { 'Prelatura territoriale' },
	Q3146899  = { 'Diocesi' },
	Q3732788  = { 'Esarcato apostolico' },
	Q3732792  = { 'Esarcato arcivescovile' },
	Q3732793  = { 'Esarcato patriarcale' },
	Q15150553 = { 'Ordinariato personale' },
	Q12593969 = { 'Patriarcato', 'Patriarcato (cristianesimo)' },
	Q18917976 = { 'Diocesi' },
	Q20060955 = { 'Diocesi' },
	Q60176300 = { 'Diocesi' },
	Q66818387 = { 'Diocesi' },
	Q105388829 = { 'Diocesi' },
	Q105390172 = { 'Arcidiocesi' },
	Q105419665 = { 'Arcidiocesi' },
}

-- Restituisce la categoria Wikidata appropriata in base al valore utente e a quello su Wikidata.
--
-- @param {string} userval
-- @param {string} wdval
-- @return {string}
local function getWikidataCategory(userval, wdval)
	local pattern = '^%[?%[?([^|%]]*).*$'
	local cat
	-- rimuove i wikilink per il confronto
	userval = userval and userval:match(pattern)
	wdval = wdval and wdval:match(pattern)

	if userval then
		if not wdval then
			cat = 'P708 assente su Wikidata'
		elseif wdval == mw.language.getContentLanguage():ucfirst(userval) then
			cat = 'P708 uguale su Wikidata'
		else
			cat = 'P708 differente su Wikidata'
		end
	elseif wdval then
		cat = 'P708 letta da Wikidata'
	end
	return string.format('[[Categoria:%s]]', cat)
end

-- Restituisce l'ID dell'elemento Wikidata dell'"istanza di" del valore in P708.
--
-- @return {string}
local function getIstanzaId(anno_sconsacr)
	local diocesiId, ret
	diocesiId = mWikidata._getProperty({ 'P708', n = 1, formatting = 'raw' })
	-- in futuro il modulo:Wikidata restituirà nil per "nessun valore" e "valore sconosciuto"
	if diocesiId and mw.wikibase.isValidEntityId(diocesiId) then
		local claims = {}
		for _, claim in ipairs(mw.wikibase.getAllStatements(diocesiId, 'P31')) do
			if claim.rank ~= 'deprecated' then
				table.insert(claims, claim)
			end
		end
		ret = claims[1] and mWikidata._formatStatement(claims[1], { formatting = 'raw' })
		-- Sede titolare è sovrascritto se ci sono altre dichiarazioni e se la diocesi è diventata
		-- tale dopo l'anno di sconsacrazione della chiesa, altrimenti genera una categoria di errore
		if ret == 'Q15217609' and claims[2] then
			anno_sconsacr = anno_sconsacr and tonumber(anno_sconsacr:match('%d%d%d%d?'))
			local anno_inizio_st = mWikidata._formatQualifiers(claims[1], 'P580') or ''
			anno_inizio_st = tonumber(anno_inizio_st:match('%d%d%d%d?'))
			if anno_sconsacr and anno_inizio_st and anno_sconsacr <= anno_inizio_st then
				ret = mWikidata._formatStatement(claims[2], { formatting = 'raw' })
			end
		end
	end
	return ret
end

-- Costruisce il wikilink della diocesi a partire da sitelink e label (rimuovendo prefix con preposizioni).
--
-- @param {string} prefix
-- @return {string}
local function getDiocesiWlink(prefix)
	local ret
	local pattern = ' d[ei][il]?l?[ae\']?'
	local diocesiId = mWikidata._getProperty({ 'P708', n = 1, formatting = 'raw' })
	local sitelink = mw.wikibase.getSitelink(diocesiId)
	-- deve esistere il sitelink in itwiki, non genera wikilink rossi
	if sitelink then
		local label = mw.wikibase.getLabel(diocesiId) or sitelink
		label = label:gsub('^' .. prefix .. pattern, '')
		label = label:gsub('^' .. mw.ustring.lower(prefix) .. pattern, '')
		ret = string.format('[[%s|%s]]', sitelink, label)
	end
	return ret
end

-- =============================================================================
--                            Funzioni esportate
-- =============================================================================

local p = {}

-- Funzione per {{#invoke:Diocesi|nome}}.
function p.nome(frame)
	local args = getArgs(frame, { parentOnly = true })
	local ret

	if args.Diocesi then
		ret = '[[Diocesi]]'
	else
		local istanzaId = getIstanzaId(args.AnnoSconsacr)
		if istanzaId and cfg[istanzaId] then
			ret = cfg[istanzaId][2] and
				  string.format('[[%s|%s]]', cfg[istanzaId][2], cfg[istanzaId][1]) or
				  string.format('[[%s]]', cfg[istanzaId][1])
		end
	end

	return ret
end

-- Funzione per {{#invoke:Diocesi|valore}}.
function p.valore(frame)
	local userval, wdval, istanzaId, cat
	local args = getArgs(frame, { parentOnly = true })

	userval = args.Diocesi
	istanzaId = getIstanzaId(args.AnnoSconsacr)
	if istanzaId and cfg[istanzaId] then
		wdval = getDiocesiWlink(cfg[istanzaId][1])
	end

	if mw.title.getCurrentTitle().namespace == 0 then
		if userval or wdval then
			cat = getWikidataCategory(userval, wdval)
		elseif istanzaId == 'Q15217609' then
			cat = error_category
		end
	end

	return (userval or wdval or '') .. (cat or '')
end

return p