Info Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Interprogetto/man (modifica · cronologia)
Sandbox: Modulo:Interprogetto/sandbox (modifica · cronologia) · Test: Modulo:Interprogetto/test (modifica · cronologia · Esegui)

Modulo Lua per svolgere le funzioni di {{Interprogetto}}.



-- Modulo per implementare le funzionalità di template:Interprogetto require('strict') local p = {} -- per l'esportazione delle funzioni del modulo  local cfg = {} local root = mw.html.create('') -- radice del markup html local debug = {} -- per debug local categories = {} -- categorie di errore da aggiungere local errors_msg = {} -- messaggi di errore da aggiungere  -- per non usare numeri "magici" nel codice local category_namespace_number = 14  -- ============================================================================================================ -- Ritorna la stringa se è definita e diversa da stringa vuota, altrimenti nil -- ============================================================================================================ local function is_defined(s) 	if s and s ~= '' then 		return s 	else 		return nil 	end end  -- ============================================================================================================ -- Aggiunge uno spazio alla stringa se non termina per "'" (apostrofo) -- ============================================================================================================ local function add_space(s) 	if not is_defined(s) then 		return '' 	elseif mw.ustring.sub(s, -1) == "'" then 		return s 	else 		return s .. ' ' 	end end  -- ============================================================================================================ -- Aggiunge la categoria "category" alla lista di categorie da aggiungere alla voce -- ============================================================================================================ local function add_category(category) 	if category then 		categories[category] = true 	end end  -- ============================================================================================================ -- Aggiunge il messaggio di errore "error_msg" alla lista di messaggi di errore da visualizzare. -- Se viene precisata una categoria di errore la aggiunge alle categorie in cui inserire la voce, -- altrimenti inserisce la categoria di errore standard -- ============================================================================================================ local function add_error(error_msg, category) 	if error_msg then 		errors_msg[#errors_msg+1] = error_msg 		if category then 			add_category(category) 		else 			add_category('Errori di compilazione del template Interprogetto') 		end 	end end  -- ============================================================================================================ -- Ritorna un collegamento di default dato il nome di un progetto, nil in caso di errori -- ============================================================================================================ local function get_default_collegamento(key_progetto, fullpagename) 	if cfg.parameters[key_progetto] then 		if cfg.parameters[key_progetto]['collegamento_non_esistente'] then 			add_error(cfg.parameters[key_progetto]['collegamento_non_esistente']) 			return nil 		elseif cfg.parameters[key_progetto].collegamento_default_minuscolo then 			return mw.ustring.gsub(fullpagename, '^%u', string.lower) 		else 			return fullpagename 		end 	else 		return nil 	end end  -- ============================================================================================================ -- Ordina una tabella in funzione della chiave "ordine" degli elementi della tabella -- ============================================================================================================ local function sort_by_ordine(t1, t2) 	if t1.ordine < t2.ordine or t1.ordine == t2.ordine and t1.lingua < t2.lingua then 		return true 	end end  -- ============================================================================================================ -- Classe per gestire la raccolta di informazioni da Wikidata -- ============================================================================================================ local Wikidata_entity = {}  function Wikidata_entity:new(ignore_wikidata) 	-- Carica i dati da Wikidata se esistono 	local self = {} 	if not ignore_wikidata then 		self.entity = mw.wikibase.getEntityObject() 	end 	setmetatable(self, { __index = Wikidata_entity, 						 __tostring = function(t) return self:__tostring() end }) 	self.collegamenti = {} 	self.badge = {} 	self.from_property_category = {} 	self.article_link = {} 	self.lingua = {} 	if self.entity then 		self.etichetta = self.entity:getLabel('it') 		-- Imposta il corsivo se la pagina su Wikidata ha la proprietà P31 ("Istance of", [[wikidata:Property:P31]]) 		-- con valore corrispondente a un'opera, come definito in cfg.check_opera 		self.corsivo = self:hasPropertyValue('P31', cfg.check_opera) 		-- Considera disambigua se la pagina su Wikidata ha la proprietà P31 ("Istance of", [[wikidata:Property:P31]]) 		-- con valore 4167410 ("Wikimedia disambiguation page", [[wikidata:Q4167410]]) 		self.disambigua = self:hasPropertyValue('P31', '4167410') 		-- Controlla se la voce è relativa a una categoria 		self.is_category = self:hasPropertyValue('P31', '4167836') 		self:loadCollegamenti() 	end 	return self end  function Wikidata_entity:getClaim(property_id) 	if self.entity.claims and 			self.entity.claims[property_id] and 			self.entity.claims[property_id][1].mainsnak.datavalue and 			self.entity.claims[property_id][1].mainsnak.datavalue.type == 'string' then 		return self.entity.claims[property_id][1].mainsnak.datavalue.value 	else 		return nil 	end end  function Wikidata_entity:getInterwiki(project, property_language) 	local interwiki = { project } 	if property_language and self.entity.claims and self.entity.claims[property_language] then 		project = project:sub(3) 		for _, claim in ipairs(self.entity.claims[property_language]) do 			if claim.mainsnak.datavalue.type == 'wikibase-entityid' then 				local entityId = 'Q' .. claim.mainsnak.datavalue.value['numeric-id'] 				if entityId ~= 'Q652' then 					local claims = mw.wikibase.getBestStatements(entityId, 'P424') 					if claims[1] and claims[1].mainsnak.datavalue then 						local language_code = claims[1].mainsnak.datavalue.value 						if language_code then 							if project == 'wikisource' and language_code == 'grc' then 								language_code = 'el' 							end 							table.insert(interwiki, language_code .. project) 							self.lingua[language_code .. project] = language_code 						end 					end 				end 			end 		end 	end 	return interwiki end  -- ============================================================================================================ -- Carica collegamenti e badge da Wikidata controllando i progetti elencati in cfg.automatic_link -- ============================================================================================================ function Wikidata_entity:loadCollegamenti() 	for key_progetto, progetto in pairs(cfg.automatic_link) do 		-- Carica i collegamenti di un progetto solo se non disambigua o tipo di progetto abilitato in disambigua 		if not self.disambigua or cfg.parameters[key_progetto].abilita_in_disambigua then 			for i, interwiki in ipairs(self:getInterwiki(progetto.interwiki, progetto.property_language)) do 				local sitelink = self.entity:getSitelink(interwiki) 				-- Dà sempre precedenza al sitelink se è una categoria 				if sitelink and mw.ustring.find(sitelink, '^Category:') then 					-- 'false' disabilita la consultazione della proprietà 					self.from_property_category[key_progetto] = false 				end 				local claim 				if progetto.property_category and self.from_property_category[key_progetto] ~= false then 					claim = self:getClaim(progetto.property_category) 					if claim then 						self.collegamenti[key_progetto] = 'Category:' .. claim 						self.from_property_category[key_progetto] = true 					end 				end 				if sitelink then 					if self.from_property_category[key_progetto] then 						self.article_link[key_progetto] = sitelink 					elseif i > 1 then 						local lingua = self.lingua[interwiki] 						key_progetto = string.format('%s_%s', key_progetto, lingua) 						self.lingua[key_progetto] = lingua 						self.collegamenti[key_progetto] = string.format('%s:%s', lingua, sitelink) 					else 						self.collegamenti[key_progetto] = sitelink 					end 					if i == 1 and self.entity.sitelinks[interwiki].badges then 						local badge_class = {} 						local badge_title = {} 						for _, badge_quality in ipairs(self.entity.sitelinks[interwiki].badges) do 							if cfg.badges[badge_quality] then 								badge_class[#badge_class+1] = cfg.badges[badge_quality].class 								badge_title[#badge_title+1] = cfg.badges[badge_quality].title 							end 						end 						self.badge[key_progetto] = {} 						self.badge[key_progetto].class = table.concat(badge_class, ' ' ) 						self.badge[key_progetto].title = table.concat(badge_title, ', ' ) 					end 				elseif not self.is_category and progetto.property_gallery and not self.from_property_category[key_progetto] then 					claim = self:getClaim(progetto.property_gallery) 					self.collegamenti[key_progetto] = claim 				end 			end 		end 	end end  -- ============================================================================================================ -- Verifica se una determinata proprietà ha uno dei valori specificati nella lista "values". -- Riadattata da "hasPropertyValue" su [[wikiquote:it:Modulo:Interprogetto]] a sua volta -- riadattata da "instanceof(arg)" su [[wikisource:it:Modulo:Autore]] -- ============================================================================================================ function Wikidata_entity:hasPropertyValue(propertyId, values) 	if self.entity.claims and self.entity.claims[propertyId] then 		for _, claim in ipairs(self.entity.claims[propertyId]) do 			if claim.mainsnak.datavalue and claim.mainsnak.datavalue.value then 				local datavalue = claim.mainsnak.datavalue 				if datavalue.type == 'wikibase-entityid' and 						datavalue.value['entity-type'] == 'item' and 						(type(values) == 'table' and values[tostring(datavalue.value['numeric-id'])]) or 						values == tostring(datavalue.value['numeric-id']) then 					return true 				end 			end 		end 	end 	return false end -- ============================================================================================================ -- Fine definizione della classe Wikidata_entity -- ============================================================================================================  -- ============================================================================================================ -- Classe per gestire i collegamenti interprogetto -- ============================================================================================================ local Collegamento = {}  function Collegamento:new(key_progetto, args, entity, default) 	-- Crea un collegamento a un progetto, riceve il nome del progetto, gli argomenti da usare per determinare 	-- i valori dei vari parametri del collegamento. Si appoggia alla tabella esterna cfg.parameters per i 	-- valori di default del progetto e alla tabella globale default per i valori di default generali  	local self = {} 	setmetatable(self, { __index = Collegamento, 						 __tostring = function(t) return self:__tostring() end }) 	local default_progetto = cfg.parameters[key_progetto:match('^[^_]+')] 	if default_progetto == nil then 		-- Progetto non riconosciuto 		return nil 	end 	self.collegamento = args[key_progetto] 	if not is_defined(self.collegamento) then 		-- Collegamento non definito correttamente 		return nil 	else 		self.default_progetto = default_progetto 		self.ordine = default_progetto.ordine 		self.badge_leftbar = {} 		self.badge_leftbar.class = (entity.badge[key_progetto] and entity.badge[key_progetto].class) or '' 		self.badge_leftbar.title = (entity.badge[key_progetto] and entity.badge[key_progetto].title) or '' 		self.etichetta = is_defined(args[key_progetto .. '_etichetta']) or (default_progetto.etichetta_lower and default.etichetta_lower) or default.etichetta 		-- elabora l'oggetto per i testi completi su wikisource quando il collegamento è ricavato da wikidata e il parametro testo_preposizione è compilato 		local alias_s_oggetto = key_progetto == 's' and args.testo_preposizione and not args.orig_s and not args.s_preposizione and cfg.parameters['testo'].oggetto 		self.oggetto = args[key_progetto .. '_oggetto'] or alias_s_oggetto or default.oggetto or default_progetto.oggetto 		if default.frase_unificata or default_progetto.preposizione then 			-- consulta il parametro testo_preposizione se il collegamento a wikisource non è manuale 			local alias_s_preposizione = key_progetto == 's' and not args.orig_s and args.testo_preposizione 			self.preposizione = args[key_progetto .. '_preposizione'] or alias_s_preposizione or default.preposizione or default_progetto.preposizione 		else 			self.preposizione = '' 		end 		if default.frase_unificata then 			self.testo_prima = '' 			self.testo_dopo = '' 		else 			self.testo_prima = default_progetto.testo_prima 			self.testo_dopo = default_progetto.testo_dopo 		end 		if key_progetto == 'notizia' and is_defined(args.data) then 			self.testo_dopo = ' <small>' .. args.data .. '</small>' 		end 		local lingua = key_progetto == 's_el' and 'lingua greca' or 				entity.lingua[key_progetto] and require('Modulo:Linguaggi').get_voce(entity.lingua[key_progetto]) or 				args[key_progetto .. '_lingua'] and 'lingua ' .. args[key_progetto .. '_lingua'] 		if default_progetto.lingua and lingua then 			self.lingua = ' in ' .. lingua 		else 			self.lingua = '' 		end 		return self 	end end  function Collegamento:Link() 	local default_progetto = self.default_progetto 	if default_progetto.link == 'Link' then 		return self:Link_text() 	elseif default_progetto.link == 'LinkWithLanguage' then 		return self:Link_language() 	elseif default_progetto.link == 'LinkRicette' then 		return self:Link_ricette() 	elseif default_progetto.link == 'LinkIncubator' then 		return self:Link_incubator() 	end 	add_error('Errore interno modulo Interprogetto') 	return '' end  function Collegamento:Link_lb() 	local default_progetto = self.default_progetto 	if default_progetto.link == 'Link' then 		return self:Link_text_lb() 	elseif default_progetto.link == 'LinkWithLanguage' then 		return self:Link_language_lb() 	elseif default_progetto.link == 'LinkRicette' then 		return self:Link_text_lb() 	elseif default_progetto.link == 'LinkIncubator' then 		return self:Link_incubator_lb() 	end 	add_error('Errore interno modulo Interprogetto') 	return '' end  function Collegamento:Link_text() 	local default_progetto = self.default_progetto 	return "* [[File:", default_progetto.icona, "|link=", default_progetto.prefix, "|", default_progetto.dimensione_icona, "|Collabora a ", 			default_progetto.nome_progetto, "]] [[", default_progetto.prefix, "|", default_progetto.nome_progetto, "]] contiene ", 			self.oggetto, self.lingua, " ", add_space(self.preposizione), self.testo_prima, "'''[[", default_progetto.prefix, 			self.collegamento, "|", self.etichetta, "]]'''", self.testo_dopo end  function Collegamento:Link_text_lb() 	local default_progetto = self.default_progetto 	return "[[", default_progetto.prefix, self.collegamento, "|", default_progetto.nome_leftbar or default_progetto.nome_progetto, "]]" end  function Collegamento:Link_ricette() 	local default_progetto = self.default_progetto 	return "* [[File:", default_progetto.icona, "|link=", default_progetto.prefix, "|", default_progetto.dimensione_icona, 			"|Collabora a ", default_progetto.nome_progetto, "]] Il ''[[b:Libro di cucina|Libro di cucina]]'' di [[b:|Wikibooks]] contiene '''[[", 			default_progetto.prefix, self.collegamento, "|ricette]]''' relative a questo argomento" end  function Collegamento:Link_language() 	local default_progetto = self.default_progetto 	local main_page_link = tostring(mw.uri.fullUrl(default_progetto.prefix, {uselang='it'})) 	return "* [[File:", default_progetto.icona, "|link=", main_page_link, "|", default_progetto.dimensione_icona, "|Collabora a ", 			default_progetto.nome_progetto, "]] <span class=\"plainlinks\">[", main_page_link, " ", default_progetto.nome_progetto, 			"]</span> contiene ", self.oggetto, " ", add_space(self.preposizione), self.testo_prima, 			"'''<span class=\"plainlinks\">[", tostring(mw.uri.fullUrl(default_progetto.prefix .. self.collegamento, {uselang='it'})), 			" ", self.etichetta, "]</span>'''", self.testo_dopo end  function Collegamento:Link_language_lb() 	local default_progetto = self.default_progetto 	return "<span class=\"plainlinks\" title=\"", default_progetto.prefix , self.collegamento, "\">[", 			tostring(mw.uri.fullUrl(default_progetto.prefix .. self.collegamento, {uselang='it'})), " ", 			default_progetto.nome_leftbar or default_progetto.nome_progetto, "]</span>" end  function Collegamento:Link_incubator() 	local default_progetto = self.default_progetto 	local oggetto = self.oggetto 	if not cfg.prefix_incubator[oggetto] then 		oggetto = default_progetto.oggetto 	end 	local collegamento = tostring(mw.uri.fullUrl(table.concat({'incubator:', cfg.prefix_incubator[oggetto], 										'/', self.collegamento}), {uselang='it'})) 	local main_page_incubator = tostring(mw.uri.fullUrl('incubator:Incubator:Main Page/it', {uselang='it'})) 	local main_page_progetto = '' 	if oggetto == 'wikipedia' then 		main_page_progetto = '[[Wikipedia]]' 	else 		main_page_progetto = table.concat({'[[', oggetto, ':it:|', oggetto:gsub('^%l', string.upper), ']]'}) 	end 	return "* [[File:", default_progetto.icona, "|link=", main_page_incubator, "|", default_progetto.dimensione_icona, 			"|Collabora a Incubator]] <span class=\"plainlinks\">[", main_page_incubator, " Incubator]</span> contiene un test su ", 			main_page_progetto, self.lingua, " ", add_space(self.preposizione), "'''<span class=\"plainlinks\">[", collegamento, " ", self.etichetta, "]</span>'''" end  function Collegamento:Link_incubator_lb() 	local default_progetto = cfg.parameters[self.key_progetto] 	local oggetto = self.oggetto 	if not cfg.prefix_incubator[oggetto] then 		oggetto = default_progetto.oggetto 	end 	local collegamento = tostring(mw.uri.fullUrl(table.concat({'incubator:', cfg.prefix_incubator[oggetto], 										'/', self.collegamento}), {uselang='it'})) 	return mw.message.newRawMessage("<span class=\"plainlinks\" title=\"$1\">[$2 Incubator]</span>", {self.etichetta, collegamento}):plain() end -- ============================================================================================================ -- Fine definizione della classe Collegamento -- ============================================================================================================  -- ============================================================================================================ -- Scandisce la tabella progetti e produce il codice html per l'elenco dei collegamenti nella barra di sinistra -- Imposta il tag div id="interProject" (vedi [[MediaWiki:InterProject.js]] incluso da [[Mediawiki:Common.js]]) -- ============================================================================================================ local function RenderLeftBar(progetti)  	local leftbar = mw.html.create('ul'):attr('title', 'Collegamenti verso gli altri progetti Wikimedia') 	for _, progetto in ipairs(progetti) do 		leftbar:newline() 		leftbar:wikitext('<li class=\"', progetto.badge_leftbar.class, '\" title=\"', progetto.badge_leftbar.title, '\">') 		leftbar:wikitext(progetto:Link_lb()) 		if progetto.default_progetto.nome_leftbar then 			leftbar:wikitext('<br />(', progetto.default_progetto.nome_progetto, ')') 		end 		leftbar:wikitext('</li>') 	end 	root:tag('div') 		:attr('id', 'interProject') 		:addClass('toccolours') 		:cssText('display: none; clear: both; margin-top: 2em') 		:tag('p') 			:attr('id', 'sisterProjects') 			:cssText('background-color: #efefef; color:black; font-weight: bold; margin: 0') 			:tag('span') 				:wikitext('Altri progetti') 				:done() 			:done() 		:node(leftbar) end  -- ============================================================================================================ -- Scandisce la tabella progetti e produce il codice html per l'elenco puntato dei collegamenti interprogetto -- ============================================================================================================ local function RenderLinksInText(progetti) 	for _, progetto in ipairs(progetti) do 		root:newline() 		root:wikitext(progetto:Link()) 	end end  -- ============================================================================================================ -- Confronta i collegamenti manuali con quelli automatici e genera le categorie di classificazione nei casi di: -- - Presenza di link manuale e assenza di link su wikidata -- - Differenza tra link manuale e link su wikidata -- - Differenza tra link manuale a categoria e e categoria su wikidata -- - Presenza di link manuale a categoria e a catagoria su wikidta -- ============================================================================================================ local function check_with_wikidata(key_progetto, entity, collegamento) 	if collegamento == nil then return end -- se non c'è un collegamento manuale ritorna immediatamente 	local entity_collegamento = entity.collegamenti[key_progetto] 	-- si assicura che il collegamento manuale inizi con la 'C' maiuscola se è una categoria 	local collegamento_normalizzato = mw.ustring.gsub(collegamento, '^category:', 'Category:') 	local collegamento_is_category = mw.ustring.find(collegamento_normalizzato, '^Category:') 	-- Check se il collegamento manuale è una categoria, se il tipo di progetto prevede una proprietà a parte 	-- per le categorie e se la sua consultazione non è stata disabilitata 	if collegamento_is_category and cfg.automatic_link[key_progetto].property_category and entity.from_property_category[key_progetto] ~= false then 		-- se esiste un collegamento su wikidata dalla proprietà per la categoria la confronta con quello manuale 		if entity.from_property_category[key_progetto] then 			if entity_collegamento ~= collegamento_normalizzato then 				add_category(cfg.automatic_link[key_progetto].category_wikidata_category_diff) 			end 		-- se non esiste un collegamento manuale su wikidata lo marca come assente 		else 			add_category(cfg.automatic_link[key_progetto].category_wikidata_category_missing) 		end 	else 		local article_link 		-- recupera il collegamento automatico alla voce (può essere in entity.article_link[key_progetto] o 		-- in entity.collegamento[key_progetto] a seconda del sitelink e della proprietà per le categorie) 		if entity.from_property_category[key_progetto] then 			article_link = entity.article_link[key_progetto] 		else 			article_link = entity_collegamento 		end 		-- Se ha recuperato un valore per article_link lo confronta con quello normalizzato 		-- altrimenti aggiunge il tracking di collegamento mancante in wikidata 		if article_link then 			if article_link ~= collegamento_normalizzato then 				add_category(cfg.automatic_link[key_progetto].category_wikidata_diff) 			end 		else 			add_category(cfg.automatic_link[key_progetto].category_wikidata_missing) 		end 	end end  -- ============================================================================================================ -- Funzione principale richiamata dal template Interprogetto -- ============================================================================================================ function p.interprogetto(frame) 	-- se chiamata da una sandbox carica la configurazione della sandbox 	if nil ~= string.find (mw.getCurrentFrame():getTitle(), 'sandbox', 1, true) then    		cfg = mw.loadData('Module:Interprogetto/Configurazione/sandbox') 	else 		cfg = mw.loadData('Module:Interprogetto/Configurazione') 	end 	local origArgs={} 	-- ======================================================================================================== 	-- Se chiamata mediante #invoke, usa gli argomenti passati al template invocante. 	-- Altrimenti a scopo di test assume che gli argomenti siano passati direttamente 	-- ======================================================================================================== 	if frame == mw.getCurrentFrame() then 	-- filtro a monte i parametri vuoti passati dal template invocante anziché passarli tutti così come sono 		for key, value in pairs(frame:getParent().args) do 			if is_defined(value) then 				origArgs[key] = value 			end 		end 		--origArgs = frame:getParent().args 	else 		origArgs = frame 	end 	-- Tabella con i parametri di default valorizzati 	local default = {} 	-- ======================================================================================================== 	-- Carica il nome della pagina corrente 	-- ======================================================================================================== 	local current_page = mw.title.getCurrentTitle() 	local current_namespace = current_page.namespace 	local current_pagename = current_page.text 	-- Per i namespace usa il nome canonico (inglese) per non avere differenze tra progetti: 	-- esempio: Utente/User, Categoria/Category, ma anche Wikiquote/Wikipedia (Project), ecc. 	if current_namespace ~= 0 then 		default.current_fullpagename = mw.site.namespaces[current_namespace].canonicalName .. ':' .. current_pagename 	else 		default.current_fullpagename = current_pagename 	end 	-- ======================================================================================================== 	-- Carica i dati da Wikidata nell'oggetto "entity" 	-- ======================================================================================================== 	local ignore_wikidata = false 	local nowikidata = origArgs.nowikidata and origArgs.nowikidata:lower() 	if nowikidata == 's' or nowikidata == 'sì' or nowikidata == 'si' then 		ignore_wikidata = true 	end 	local entity = Wikidata_entity:new(ignore_wikidata) 	-- ======================================================================================================== 	-- Calcola l'etichetta di default per i collegamenti, in ordine di priorità: 	-- 1) Se è definita l'etichetta in lingua italiana su Wikidata usa questa (eliminando un eventuale 	--	"Categoria:" di fronte alla voce) 	-- 2) Altrimenti usa il nome della pagina corrente, eliminando un'eventuale disambigua in coda alla voce, 	--	e definisce etichetta_lower come il nome della voce con iniziale minuscola. 	-- Se la voce è segnalata come opera su Wikidata allora l'etichetta è in corsivo (senza iniziale minuscola) 	-- ======================================================================================================== 	if is_defined(origArgs.etichetta) then 		default.etichetta = origArgs.etichetta 	else 		if entity.etichetta then 			-- Elimina un eventuale "Categoria:" in fronte del nome 			default.etichetta = mw.ustring.gsub(entity.etichetta, '^Categoria:', '') 		else 			-- Elimina un'eventuale disambigua dal nome 			default.etichetta = mw.ustring.gsub(current_pagename, ' %(.*%)$', '') 			if current_namespace == 0 then 				default.etichetta_lower = mw.ustring.gsub(default.etichetta, '^%u', string.lower) 			end 		end 		if entity.corsivo then 			default.etichetta = '<span style=\"font-style:italic;\">' .. default.etichetta .. '</span>' 			default.etichetta_lower = default.etichetta 		end 	end 	-- ======================================================================================================== 	-- Calcola preposizione e oggetto di default, modificandoli se il namespace quello delle categorie 	-- ======================================================================================================== 	if current_namespace ~= category_namespace_number then 		default.preposizione = origArgs.preposizione 		default.oggetto = origArgs.oggetto 	else 		default.preposizione = origArgs.preposizione or "sull'argomento" 		default.oggetto = origArgs.oggetto or "una categoria" 		default.frase_unificata = true 	end 	-- ======================================================================================================== 	-- Copia i parametri in una nuova tabella, creando coppie progetto/collegamento per i parametri posizionali 	-- e controllando per parametri duplicati e nomi di progetto non conosciuti 	-- ======================================================================================================== 	local newArgs = {} 	local nolink = false 	newArgs.orig_s = origArgs.s 	for key, value in pairs(origArgs) do 		if tonumber(key) then 			local key_progetto = mw.text.trim(value) 			if cfg.parameters[key_progetto] then 				if origArgs[key_progetto] then 					add_error('Collegamento a \"' .. value .. '\" inserito sia come parametro posizionale che nominale') 				else 					if key_progetto == 's' then newArgs.orig_s = key_progetto end 					newArgs[key_progetto] = get_default_collegamento(key_progetto, default.current_fullpagename) 				end 			else 				if key_progetto == 'nolink' then 					nolink = true 				else 					add_error('Il parametro \"' .. value .. '\" non corrisponde a nessun progetto riconosciuto dal template') 				end 			end 		else 			newArgs[key] = value 		end 	end 	-- ======================================================================================================== 	-- Controlla i collegamenti inseriti manualmente integrandoli eventualmente con quelli presenti in Wikidata. 	-- Salta questo passo se c'è un collegamento a "notizia" dato che in questo caso deve essere unico e quindi 	-- non deve aggiungere i collegamenti da Wikidata. Inoltre, in caso di "disambigua", salta i progetti non 	-- abilitati in disambigua che in ogni caso non devono essere aggiunti 	-- ======================================================================================================== 	if not newArgs.notizia then 		-- ==================================================================================================== 		-- Controlla il collegamento compilato manualmente e quello caricato da Wikidata 		-- ==================================================================================================== 		for key_progetto, collegamento in pairs(newArgs) do 			if cfg.parameters[key_progetto] and cfg.automatic_link[key_progetto] and entity.entity then 				if not entity.disambigua or cfg.parameters[key_progetto].abilita_in_disambigua then 					check_with_wikidata(key_progetto, entity, collegamento) 				end 			end 		end 		-- ==================================================================================================== 		-- Aggiunge il collegamento da Wikidata se non è presente quello compilato manualmente o se rinvia a 		-- un progetto in lingua non italiana che non è registrato nella configurazione e non va sovrascritto 		-- ==================================================================================================== 		for key_progetto, collegamento in pairs(entity.collegamenti) do 			if not cfg.automatic_link[key_progetto] or not (newArgs[key_progetto] or newArgs[cfg.automatic_link[key_progetto].alias]) then 				newArgs[key_progetto] = collegamento 				-- Segnala che il collegamento è stato aggiunto da Wikidata 				add_category(cfg.automatic_link[key_progetto:match('^[^_]+')].category_wikidata) 			end 		end 	end 	-- ======================================================================================================== 	-- Sulla base della lista di argomenti ripulita costruisce la lista dei collegamenti da inserire 	-- ======================================================================================================== 	local progetti = {} 	local collegamento_found = false 	for key_progetto, collegamento in pairs(newArgs) do 		if cfg.parameters[key_progetto] or entity.collegamenti[key_progetto] then 			-- Salta i collegamenti a Wikidata per le voci nel namespace principale eccetto che per la Pagina principale 			if key_progetto ~= 'wikidata' or current_namespace ~= 0 or current_pagename == 'Pagina principale' then 				local progetto = Collegamento:new(key_progetto, newArgs, entity, default) 				if progetto then 					collegamento_found = true 					-- Se è disambigua registra solo i valori per i progetti abilitati in disambigua 					if not entity.disambigua or cfg.parameters[key_progetto] and cfg.parameters[key_progetto].abilita_in_disambigua then 						progetti[#progetti+1] = progetto 					end 				end 			end 		end 	end 	table.sort(progetti, sort_by_ordine) 	-- ======================================================================================================== 	-- Genera il codice html 	-- ======================================================================================================== 	if entity.disambigua and #progetti == 0 and collegamento_found then 		add_error('Collegamenti non visualizzabili perché la voce è una disambigua su Wikidata', 				  'Errori di compilazione del template Interprogetto - collegamenti in disambigua') --[[	elseif #progetti == 0 then 		--add_error('Template interprogetto vuoto e senza dati da recuperare da Wikidata', 'Errori di compilazione del template Interprogetto - template vuoto') 		add_error('', 'Errori di compilazione del template Interprogetto - template vuoto') ]]-- 	else 		local nobarra = origArgs.nobarra and origArgs.nobarra:lower() 		if nobarra ~= 's' and nobarra ~= 'sì' and nobarra ~= 'si' then 			RenderLeftBar(progetti) 		end 		if not nolink then 			RenderLinksInText(progetti) 		end 	end 	-- ================================================================================================================================= 	-- Nei namespace ammessi inserisce le categorie di segnalazione di errori/avvisi 	-- ================================================================================================================================= 	if cfg.whitelist_category[current_namespace] then 		for category, _ in pairs(categories) do 			root:wikitext('[[Categoria:' .. category .. ']]') 		end 	end 	-- ================================================================================================================================= 	-- Aggiunge i messaggi di errore 	-- =================================================================================================================================	 	if #errors_msg > 0 then 		if #progetti > 0 then 			root:wikitext('\n') 		end 		root:wikitext('<strong class=\"error\">' .. table.concat(errors_msg, '; ') .. '</strong>') 	end 	return tostring(root) end  return p