Modulo:Interprogetto: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Moroboshi (discussione | contributi)
fix categoria errori
Moroboshi (discussione | contributi)
revisione generale del codice (maggiori commenti, modularità, categorie di errore, separazione codice/configurazione) e implementazione ultime richieste in discussione
Riga 1:
--Modulo per implementare le funzionalità di template:Interprogetto
require('Module:No globals')
local p = {} -- per l'esportazione delle funzioni del modulo
 
local cfg = mw.loadData( 'Modulo:Interprogetto/Configurazione' );
local progetti={} -- dati da usare per la costruzione delle righe dell'elenco di link ai progetti
local root -- radice del markup html
local debug= {} -- per debug
local categories = {} -- categorie di errore da aggiungere
local errors_msg = {} -- messaggi di errore da aggiungere
 
local function dump(t, ...)
Riga 13 ⟶ 16:
end
 
-- ============================================================================================================
-- Aggiunge uno spazio alla stringa se non termina per "'"
-- ============================================================================================================
local function add_space(s)
--ritorna uno spazio se l'ultimo carattere non è un accento
if s == nil then return '' end
if mw.ustring.sub(s, -1) == "'" then
return ''s
else
return s .. ' '
end
end
 
-- ============================================================================================================
-- ritorna la stringa se è definita e diversa da stringa nulla, altrimenti nil
-- ============================================================================================================
local function is_defined(s)
-- ritorna la stringa se è definita e diversa da stringa nulla, altrimenti nil
if s and s ~= '' then return s end
return nil
end
 
-- ============================================================================================================
local function Link(intext, pos, in_stampa)
-- Aggiunge category alla lista di categorie da aggiungere alla voce
-- Restituisce il link nel caso normale di collegamento (progetto senza interfaccia in lingua)
-- ============================================================================================================
-- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
local function add_category(category)
local p=progetti
if category ~= nil then
local text=''
categories[category] = true
if intext then
if in_stampa then
text = table.concat({'* [[File:', p.icona[pos], '|', p.dimensione_icona[pos], "]] ",
p.messaggio_stampa[pos], "'''", p.base_url[pos],
tostring(mw.uri.localUrl( p.collegamento[pos] )), "'''" })
else
text = table.concat({'* [[File:', p.icona[pos], '|link=', p.prefix[pos], '|',
p.dimensione_icona[pos],'|Collabora a ', p.nome_progetto[pos],
"]]", ' ', "'''[[", p.prefix[pos], '|', p.nome_progetto[pos],
"]]''' contiene ", p.oggetto[pos], ' ', p.lingua[pos],
p.preposizione[pos], add_space(p.preposizione[pos]), p.testo_prima[pos],
"'''[[", p.prefix[pos], p.collegamento[pos], '|',
p.etichetta[pos], "]]'''", p.testo_dopo[pos] })
end
else
text = table.concat({'[[', p.prefix[pos], p.collegamento[pos], '|', p.nome_leftbar[pos] or p.nome_progetto[pos], ']]'})
end
return text
end
 
-- ============================================================================================================
local function LinkRicette(intext, pos, in_stampa)
-- Aggiunge un messaggio di errore alla lista di messaggi di errore
-- Restituisce il link per le ricette su wikibook
-- ============================================================================================================
-- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
local function add_error(error_msg)
local p=progetti
if errors_msg ~= nil then
local text=''
errors_msg[#errors_msg+1] = error_msg
if intext then
add_category('Errori di compilazione del template Interprogetto')
if in_stampa then
text = table.concat({'* [[File:', p.icona[pos], '|', p.dimensione_icona[pos], "]] ",
p.messaggio_stampa[pos], "'''", p.base_url[pos],
tostring(mw.uri.localUrl( p.prefix[pos] .. p.collegamento[pos] )), "'''" })
else
text = table.concat({'* [[File:', p.icona[pos], '|link=', p.prefix[pos], '|', p.dimensione_icona[pos],
'|Collabora a ', p.nome_progetto[pos],
"]] Il ''[[b:Libro di cucina|Libro di cucina]]'' di '''[[b:|Wikibooks]]''' contiene [[", p.prefix[pos],
p.collegamento[pos], "|ricette]]", " relative a questo argomento." })
end
else
text = table.concat({'[[', p.prefix[pos], p.collegamento[pos], '|', p.nome_leftbar[pos] or p.nome_progetto[pos], ']]'})
end
return text
end
 
 
-- ============================================================================================================
local function LinkWithLanguage(intext, pos, in_stampa)
-- Ritorna un collegamento di default dato il nome progetto
-- Restituisce il link verso progetti con interfaccia in lingua (seleziona automaticamente quella italiana)
-- ============================================================================================================
-- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
local function get_default_collegamento(key_progetto, fullpagename)
local p=progetti
if cfg.parameters[key_progetto] then
local text=''
if cfg.parameters[key_progetto]['collegamento_non_esistente'] then
if intext then
add_error(cfg.parameters[key_progetto]['collegamento_non_esistente'])
if in_stampa then
return ''
text = table.concat({'* [[File:', p.icona[pos], '|', p.dimensione_icona[pos], "]] ",
elseif cfg.parameters[key_progetto].collegamento_default_minuscolo then
p.messaggio_stampa[pos], "'''", p.base_url[pos],
return tostring(mw.uriustring.localUrlgsub( p.collegamento[pos] ))fullpagename, "'''^%u", }string.lower)
else
return fullpagename
main_page_link=tostring(mw.uri.fullUrl(p.prefix[pos] , {uselang='it'}))
text = table.concat({'* [[File:', p.icona[pos], '|link=', main_page_link, '|',
p.dimensione_icona[pos], '|Collabora a ', p.nome_progetto[pos],
"]]", ' ', "'''<span class=\"plainlinks\">[",
main_page_link, ' ', p.nome_progetto[pos], "]</span>''' contiene ",
p.oggetto[pos], ' ', p.preposizione[pos], add_space(p.preposizione[pos]),
p.testo_prima[pos], "'''<span class=\"plainlinks\">[",
tostring(mw.uri.fullUrl(p.prefix[pos] .. p.collegamento[pos], {uselang='it'})), ' ',
p.etichetta[pos], "]</span>'''", p.testo_dopo[pos] })
end
else
text = table.concat({'<span class=\"plainlinks\" title=\"', p.etichetta[pos], '\">[',
tostring(mw.uri.fullUrl(p.prefix[pos] .. p.collegamento[pos], {uselang='it'})),
' ', p.nome_leftbar[pos] or p.nome_progetto[pos], ']</span>'})
end
return text''
end
 
-- ===============================================================================================
local function LinkIncubator(intext, pos, in_stampa)
-- Classe per gestire la raccolta di informazioni da wikidata
-- Restituisce il link verso progetti per incubator
-- ===============================================================================================
local p=progetti
local Wikidata_entity = {}
local text=''
local prefix = {
wikipedia = 'Wp',
wiktionary = 'Wt',
wikizionario= 'Wt',
wikibooks= 'Wb',
wikinews= 'Wn',
wikinotizie= 'Wn',
wikiquote= 'Wq',
}
 
function Wikidata_entity:new()
local oggetto = p.oggetto[pos]
-- carico i dati da wikidata se esistono
if not prefix[oggetto] then oggetto='wikipedia' end
local self = {}
local collegamento = tostring(mw.uri.fullUrl(table.concat({'incubator:', prefix[oggetto],
self.entity = nil
'/', p.collegamento[pos]}), {uselang='it'}))
if intextmw.wikibase then
self.entity = mw.wikibase.getEntityObject()
if in_stampa then
end
text = table.concat({'* [[File:', p.icona[pos], '|', p.dimensione_icona[pos], "]] ",
setmetatable(self, { __index = Wikidata_entity,
p.messaggio_stampa[pos], "'''", collegamento, "'''" })
__tostring = function(t) return self:__tostring() end })
else
self.collegamenti = {}
local main_page_incubator=tostring(mw.uri.fullUrl(':incubator:Main_Page/it', {uselang='it'}))
self.badge = {}
local main_page_progetto = ''
self:loadCollegamenti()
if oggetto == 'wikipedia' then
self.corsivo = self:hasPropertyValues('P31', cfg.check_opera)
main_page_progetto = '[[Wikipedia]]'
-- Considera disambigua se la pagina su wikidata ha la proprietà P31 ("Istance of", https://www.wikidata.org/wiki/Property:P31)
else
---con valore 4167410 (wikidata item 'Wikimedia disambiguation page': https://www.wikidata.org/wiki/Q4167410)
main_page_progetto = table.concat({'[[', oggetto, ':|', oggetto:gsub("^%l", string.upper), ']]'})
self.disambigua = self:hasPropertyValue('P31', '4167410')
return self
end
 
function Wikidata_entity:getLabel(label)
if self.entity then
return self.entity:getLabel(label)
end
return nil
end
 
-- ============================================================================================================
-- Carica collegamenti e badge da wikidata controllando i progetti elencati in cfg.automatic_link
-- ============================================================================================================
function Wikidata_entity:loadCollegamenti()
if self.entity == nil then return end
for key_progetto, progetto in pairs(cfg.automatic_link) do
-- carico i link di un progetto solo se non disambigua o tipo di collegamento abilitato in disambigua
if not self.disambigua or cfg.progetti[key_progetto].abilita_in_disambigua then
if self.entity:getSitelink(progetto.interwiki) then
self.collegamenti[key_progetto] = self.entity:getSitelink(progetto.interwiki)
if self.entity.sitelinks[progetto.interwiki].badges then
local badge_list = {}
for _, badge_quality in ipairs(self.entity.sitelinks[progetto.interwiki].badges) do
if cfg.badges[badge_quality] then
badge_list[#badge_list+1] = cfg.badges[badge_quality]
end
end
if #badge_list > 0 then
table.sort(badge_list, sort_by_ordine)
self.badge[key_progetto] = table.concat(badge_list, ' ')
end
end
elseif progetto.property_category and self.entity.claims then
local property_id = progetto.property_category
if self.entity.claims[property_id]
and self.entity.claims[property_id][1]
and self.entity.claims[property_id][1].mainsnak
and self.entity.claims[property_id][1].mainsnak.datavalue
and self.entity.claims[property_id][1].mainsnak.datavalue.type == 'string' then
self.collegamenti[key_progetto] = 'Category:' .. self.entity.claims[property_id][1].mainsnak.datavalue.value
end
end
end
end
end
 
-- ============================================================================================================
text = table.concat({'* [[File:', p.icona[pos], '|link=', main_page_incubator, '|',
-- Verifica se una determinata proprietà ha il valore specificato.
p.dimensione_icona[pos], "|Collabora a Incubator]] '''<span class=\"plainlinks\">[",
-- Riadattata da "hasPropertyValue" su [[wikiquote:it:Modulo:Interprogetto]] a sua volta
main_page_incubator, " Incubator]</span>''' contiene un test su ",
-- riadattata da function instanceof(arg)" su [[wikisource:it:Modulo:Autore]]
main_page_progetto, ' ',
-- ============================================================================================================
p.preposizione[pos], add_space(p.preposizione[pos]),
function Wikidata_entity:hasPropertyValue(propertyId, value)
'<span class="plainlinks">[', collegamento, ' ', p.etichetta[pos], ']</span>' })
if self.entity and self.entity.claims and self.entity.claims[propertyId] then
local claims = self.entity.claims[propertyId]
for _, claim in pairs(claims) do
if claim and claim.mainsnak and claim.mainsnak.datavalue and claim.mainsnak.datavalue.value then
local datavalue = claim.mainsnak.datavalue
if datavalue.type == 'wikibase-entityid' then
if datavalue.value['entity-type'] == 'item' then
if datavalue.value['numeric-id'] == tonumber(value) then return true end
end
elseif datavalue.type == 'string' then
if datavalue.value == value then return true end
end
end
end
end
return false
end
 
-- ============================================================================================================
-- Verifica se una determinata proprietà ha uno dei valori specificato nella lista values.
-- Riadattata da "hasPropertyValue" su [[wikiquote:it:Modulo:Interprogetto]] a sua volta
-- riadattata da function instanceof(arg)" su [[wikisource:it:Modulo:Autore]]
-- ============================================================================================================
function Wikidata_entity:hasPropertyValues(propertyId, values)
if self.entity and self.entity.claims and self.entity.claims[propertyId] then
local claims = self.entity.claims[propertyId]
for _, claim in pairs(claims) do
if claim and claim.mainsnak and claim.mainsnak.datavalue and claim.mainsnak.datavalue.value then
local datavalue = claim.mainsnak.datavalue
if datavalue.type == 'wikibase-entityid' then
if datavalue.value['entity-type'] == 'item' then
if values[tostring(datavalue.value['numeric-id'])] then return true end
end
elseif datavalue.type == 'string' then
if values[datavalue.value['numeric-id']] then return true end
end
end
end
end
return false
end
 
-- ===============================================================================================
-- Fine 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 collegamento e all'array globale defaults per i valor di default generali
 
local self = {}
setmetatable(self, { __index = Collegamento,
__tostring = function(t) return self:__tostring() end })
local default_progetto = cfg.parameters[key_progetto]
if default_progetto == nil then return nil end
self.ordine = default_progetto.ordine
self.key_progetto = key_progetto
self.badge_leftbar = entity.badge[key_progetto] or ''
self.collegamento = args[key_progetto]
self.etichetta = is_defined(args[key_progetto .. '_etichetta']) or (default_progetto.etichetta_lower and default.etichetta_lower) or default.etichetta
self.oggetto = args[key_progetto .. '_oggetto'] or default.oggetto or default_progetto.oggetto
if default_progetto.preposizione then
self.preposizione = args[key_progetto .. '_preposizione'] or default.preposizione or default_progetto.preposizione
else
self.preposizione = ''
text = table.concat({'<span class=\"plainlinks\" title=\"', p.etichetta[pos], '\">[',
collegamento, ' Incubator]<span>'})
end
if key_progetto=='notizia' and is_defined(args.data) then
return text
self.testo_dopo = table.concat({' <small>', args.data, '</small>'})
else
self.testo_dopo = default_progetto.testo_dopo
end
if default_progetto.lingua and args[key_progetto ..'_lingua'] then
self.lingua = ' in lingua ' .. args[key_progetto ..'_lingua']
else
self.lingua = ''
end
return self
end
 
function Link_vuotoCollegamento:Link(intext, pos)
if cfg.parameters[self.key_progetto].link == 'Link' then return self:Link_text() end
-- per il parametro notizia, non dovrebbe mai essere chiamato, ma giusto in caso restituisce
if cfg.parameters[self.key_progetto].link == 'LinkWithLanguage' then return self:Link_language() end
-- una stringa vuota
if cfg.parameters[self.key_progetto].link == 'LinkRicette' then return self:Link_ricette() end
if cfg.parameters[self.key_progetto].link == 'LinkIncubator' then return self:Link_incubator() end
add_error('Errore interno modulo Interprogetto:'.. self.key_progetto)
return ''
end
 
function Collegamento:Link_lb()
-- default_parameter: contiene i valori di default dei parametri
if cfg.parameters[self.key_progetto].link == 'Link' then return self:Link_text_lb() end
-- priorità: ordine di priorità in cui visualizzare il link (un numero intero)
if cfg.parameters[self.key_progetto].link == 'LinkWithLanguage' then return self:Link_language_lb() end
-- funzione da richiamare per inserire i link
if cfg.parameters[self.key_progetto].link == 'LinkRicette' then return self:Link_ricette_lb() end
-- prefisso_progetto: prefisso da usare per i link del progetto
if cfg.parameters[self.key_progetto].link == 'LinkIncubator' then return self:Link_incubator_lb() end
-- nome_progetto: nome del progetto
add_error('Errore interno modulo Interprogetto:' .. self.key_progetto)
-- nome_leftbar: nome da usare per il collegamento nella barra di sinistra (falso se coincide con
return ''
-- il nome del progetto, altrimenti una stringa, da usare per esempio per wikiricette)
end
-- logo del progetto: nome del file che contiene il logo del progetto
-- dimensioni del logo: dimensioni da usare per il logo
-- oggetto standard: per il contenuto ('opere originali', 'testi o manuali', ecc..).
-- preposizione standard: da mettere prima dell'etichetta ('di o su', 'relative a questo argomento', ecc..),
-- se è false non viene sostituita
-- testo di apertura intorno all'etichetta: stringa vuota o testo da usare immediatamente prima del
-- collegamento (usate dal wikizionario per la virgoletta di
-- apertura e da wikiricette per non inserire niente)
-- testo di chiusura intorno all'etichetta: stringa vuota o testo di chiusura da usare immediatamente
-- dopo il collegamento (usate dal wikizionario per la virgoletta
-- di chiusura e da wikiricette per scrivere " relative a questo argomento")
-- lingua originale: lingua di un testo linkato (false se non è possibile impostarla, true per
-- i progetti per cui si può impostare.
-- da usare per i progetti che prevedono l'inserimento di "in xxxxx" tra il nome
-- del progetto e l'etichetta standard per il tipo di contenuto)
 
function Collegamento:Link_text()
local default_parameter ={
local default_progetto = cfg.parameters[self.key_progetto]
wikisource = {1, Link, 'wikisource:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', false, "'''Wikisource''' contiene opere originali in inglese: ", 'http://en.wikisource.org'},
return "* [[File:", default_progetto.icona, "|link=", default_progetto.prefix, "|", default_progetto.dimensione_icona, "|Collabora a ",
s = {2, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
default_progetto.nome_progetto, "]] '''[[", default_progetto.prefix, "|", default_progetto.nome_progetto, "]]''' contiene ",
s2 = {3, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
self.oggetto, " ", self.lingua, " ", add_space(self.preposizione), default_progetto.testo_prima, "'''[[", default_progetto.prefix,
testo = {4, Link, 's:', 'Wikisource', 'Testo completo', 'Wikisource-logo.svg', '18px', 'il testo completo', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
"", self.collegamento, "|", self.etichetta, "]]'''", self.testo_dopo
oldwikisource = {5, Link, 'oldwikisource:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
end
wikiquote = {6, Link, 'wikiquote:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , false, "'''Wikiquote''' contiene citazioni in inglese: ", "http://en.wikiquote.org"},
q = {7, Link, 'q:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , true, "'''Wikiquote''' contiene citazioni: ", "http://it.wikiquote.org"},
q2= {8, Link, 'q:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , true, "'''Wikiquote''' contiene citazioni: ", "http://it.wikiquote.org"},
wikibooks = {9, Link, 'wikibooks:', 'Wikibooks', false, 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali in inglese: ", "http://en.wikibooks.org"},
b = {10, Link, 'b:', 'Wikibooks', false, 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali:", "http://it.wikibooks.org"},
ricetta = {11, LinkRicette, 'b:Libro di cucina/Ricette/', 'Wikibooks', 'Ricette', 'Wikibooks-logo.svg', '22px', '', '', '', '' , false, "'''Wikibooks''' contiene la ricetta: ", "http://it.wikibooks.org"},
wiktionary = {12, Link, 'wiktionary:', 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene la voce di dizionario in inglese:", "http://en.wiktionary.org"},
wikt = {13, Link, 'wikt:', 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene la voce di dizionario: ","http://it.wiktionary.org" },
v = {14, Link, 'v:', 'Wikiversità', false, 'Wikiversity-logo-It.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikiversità''' contiene informazioni: ", "http://it.wikiversity.org"},
wikinews = {15, Link, 'wikinews:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', 'notizie di attualità', 'su', '', '', false, "'''Wikinotizie''' contiene notizie di attualità in inglese: ", "http://en.wikinews.org"},
n = {16, Link, 'n:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', 'notizie di attualità', 'su', '', '', false, "'''Wikinotizie''' contiene notizie di attualità: ", "http://it.wikinews.org"},
commons = {17, LinkWithLanguage, 'commons:', 'Commons', false, 'Commons-logo.svg', '18px', 'immagini o altri file', 'su', '', '', false, "'''Wikimedia Commons''' contiene file multimediali: ", "http://commons.wikimedia.org"},
meta = {18, LinkWithLanguage, 'meta:', 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Meta-Wiki''' contiene informazioni: ", "http://meta.wikimedia.org"},
m = {19, LinkWithLanguage, 'm:', 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Meta-Wiki''' contiene informazioni: ", "http://meta.wikimedia.org"},
wikispecies = {20, LinkWithLanguage, 'wikispecies:', 'Wikispecies', false, 'WikiSpecies notext.svg', '21px', 'informazioni', 'su', '', '', false, "'''Wikispecies''' contiene informazioni: ", "http://species.wikimedia.org"},
voy = {21, Link, 'voy:', 'Wikivoyage', false, 'Wikivoyage-Logo-v3-icon.svg', '18px', 'informazioni turistiche', 'su', '', '', false, "'''Wikivoyage''' contiene informazioni turistiche: ", "http://it.wikiwoyage.org"},
mw = {22, LinkWithLanguage, 'mw:', 'Mediawiki', false, 'MediaWiki-notext.svg', '21px', 'informazioni', 'su', '', '', false, "'''Mediawiki''' contiene informazioni: ", "http://www.mediawiki.org"},
incubator = {23, LinkIncubator, 'incubator:', 'Incubator', false, 'Incubator-notext.svg', '18px', '[[wikipedia]]', 'in', '', '', false, " '''Wikimedia''' Incubator contiene un test: ", "http://incubator.wikimedia.org"},
wikidata = {24, Link, 'wikidata:', 'Wikidata', false, 'Wikidata-logo.svg', '18px', 'dati', 'su', '', '', false, "'''Wikidata''' contiene dati su:", 'https://www.wikidata.org'},
notizia = {0, Link_vuoto, 'n:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', '', '', ': ', '', false, "'''Wikinotizie''' contiene notizie di attualità: ", 'http://it.wikinews.org'},
}
 
function Collegamento:Link_text_lb()
--tabella link gestiti in automatico se assenti, basandosi su wikidata
local default_progetto = cfg.parameters[self.key_progetto]
--formata da coppie 'nome progetto' (come compare nella tabella sopra) e nome proprietà su wikidata con il link al progetto
return "[[", default_progetto.prefix, self.collegamento, "|", default_progetto.nome_leftbar or default_progetto.nome_progetto, "]]"
local automatic_link = {
end
voy = {interwiki='itwikivoyage', category=nil },
commons= {interwiki='commonswiki', category=nil },
s= {interwiki='itwikisource', category=nil },
q= {interwiki='itwikiquote', category=nil },
n= {interwiki='itwikinews', category=nil }
}
 
function Collegamento:Link_ricette()
local automatic_link_bis = {
local default_progetto = cfg.parameters[self.key_progetto]
-- Tabella delle corrispondenze tra i "codici progetto" (come compaiono nella tabella sopra).
return "* [[File:", default_progetto.icona, "|link=", default_progetto.prefix, "|", default_progetto.dimensione_icona,
-- Evita che wikidata aggiunga il link automatico se esiste già un link a uno di questi progetti
"|Collabora a ", default_progetto.nome_progetto, "]] Il ''[[b:Libro di cucina|Libro di cucina]]'' di '''[[b:|Wikibooks]]''' contiene [[",
testo = 's'
default_progetto.prefix, self.collegamento, "|ricette]] relative a questo argomento."
}
end
 
function Collegamento:Link_language()
local check_property = {
local default_progetto = cfg.parameters[self.key_progetto]
commons = 'P373'
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), default_progetto.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 = cfg.parameters[self.key_progetto]
return '<span class="plainlinks" title="', self.etichetta, ">[", 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 = cfg.parameters[self.key_progetto]
local oggetto = self.oggetto
if not cfg.prefix_incubator[oggetto] then oggetto='wikipedia' end
local collegamento = tostring(mw.uri.fullUrl(table.concat({'incubator:', prefix_incubator[oggetto],
'/', self.collegamento}), {uselang='it'}))
local main_page_incubator=tostring(mw.uri.fullUrl(':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, ':|', 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, " ", add_space(self.preposizione), "<span class=\"plainlinks\">[", collegamento, " ", self.etichetta, "]</span>"
end
 
function Collegamento:Link_incubator_lb()
local oggetto = self.oggetto
if not cfg.prefix_incubator[oggetto] then oggetto='wikipedia' end
local collegamento = tostring(mw.uri.fullUrl(table.concat({'incubator:', 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
-- ===============================================================================================
 
-- ============================================================================================================
local function sort_by_first(t1, t2)
-- Funzione per ordinare una tabella in basefunzione aldella valorechiave del"ordine" primodegli elementoelementi della tabella
-- ============================================================================================================
if t1[1] < t2[1] then
local function sort_by_ordine(t1, t2)
if t1.ordine < t2.ordine then
return true
end
end
 
-- ============================================================================================================
local function RenderLeftBar()
-- Crea la barra di sinistra con i link interprogetto, costruisce le righe per la barra di sinistra come un elenco puntato
-- Apertura del tag div id="interProject" (vedi [[Commons:MediaWiki:InterProject.js]] incluso da [[Mediawiki:Common.js]])
-- costruisce le righe per la barra di sinistra come un elenco puntato
-- ============================================================================================================
-- Apertura del tag div id="interProject" (vedi [[Commons:MediaWiki:InterProject.js]] incluso da [[Mediawiki:Common.js]])
local function RenderLeftBar(progetti)
 
local leftbar = mw.html.create('div'):attr('title', 'Collegamenti verso gli altri progetti Wikimedia')
for i_,progetto = 1,in #ipairs(progetti.ordine) do
local pos = progetti.ordine[i][2]
local link =progetti.link[pos]
leftbar:newline()
leftbar:wikitext('<li class=\"', progettiprogetto.badge_leftbar[pos], '\">')
leftbar:wikitext(linkprogetto:Link_lb(false, pos))
if progetticfg.nome_leftbarparameters[posprogetto.key_progetto].nome_leftbar then
leftbar:wikitext('<br />(', progetticfg.nome_progettoparameters[posprogetto.key_progetto].nome_leftbar, ')')
end
leftbar:wikitext('</li>')
end
root:tag('div')
:tag('div')
:attr('id', 'interProject')
:cssText('display: none; clear: both; border-width: 2px 0; border-style: dotted; border-color: #AAAAAA; margin-top: 2em')
Riga 265 ⟶ 353:
end
 
-- ============================================================================================================
local function RenderLinksInText(in_stampa)
-- Scandisce la tabella progetti e produce il codice html per l'elenco puntato
-- ============================================================================================================
for i = 1, #progetti.ordine do
local pos =function RenderLinksInText(progetti.ordine[i][2])
for _,progetto in ipairs(progetti) do
root:newline()
local link=progetti.link[pos]root:wikitext(progetto:Link())
root:wikitext(link(true, pos, in_stampa))
end
end
 
-- ============================================================================================================
-- Funzione principale richiamata dal template Interprogetto
-- ============================================================================================================
function p.interprogetto(frame)
 
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
origArgs = frame:getParent().args
Riga 285 ⟶ 378:
origArgs = frame.args
end
-- tabella con i parametri di default valorizzati
 
local in_stampadefault = false{}
-- =================================================================================================================================
if frame.args['stampa'] then
-- Carico il nome in_stampadella =pagina truecorrente
-- =================================================================================================================================
end
 
-- Carico i parametri
local current_page = mw.title.getCurrentTitle()
local current_namespace = current_page.namespace
local current_pagename = current_page.text
local current_fullpagename = ''
-- Per i namespace uso 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
-- =================================================================================================================================
local etichetta = origArgs.etichetta
-- carico i dati da wikidata senell'oggetto esistonoentity
-- =================================================================================================================================
local entity = nil
local entity = Wikidata_entity:new()
if mw.wikibase then
-- =================================================================================================================================
entity = mw.wikibase.getEntityObject()
-- Calcolo l'etichetta di default per i collegamenti, in ordine di priorità:
end
-- se1) esisteSe è definita l'etichetta in lingua italiana su wikidata uso questa come(elimiando etichettaun eventuale 'Categoria:' di defaultfronte deialla collegamentivoce)
-- 2) Altrimenti uso il nome della pagina corrente, eliminando eventuale disambigue in coda alla voce e definisco etichetta_lower
local etichetta_lower
-- come il nome della voce con iniziale minuscola. Se la voce è segnalata come un'opera (fumetto, film, romanzo, ecc..) su
if (etichetta == nil or etichetta == '') then
-- wikidata allora l'etichetta è in corsivo.
if entity and entity.labels and entity.labels.it and entity.labels.it.value ~= '' then
-- =================================================================================================================================
etichetta = mw.ustring.gsub(entity.labels.it.value, '^Categoria:', '') -- Elimino un eventuale "Categoria:" in fronte del nome
if is_defined(origArgs.etichetta) then
default.etichetta = origArgs.etichetta
else
local wikidata_label = entity:getLabel('it')
if is_defined(wikidata_label) then
default.etichetta = mw.ustring.gsub(wikidata_label, '^Categoria:', '') -- Elimino un eventuale "Categoria:" in fronte del nome
default.etichetta_lower = default.etichetta
else
default.etichetta = mw.ustring.gsub(current_pagename, ' %(.*%)$', '') -- Elimino un'eventuale disambigua dal nome
if current_namespace == 0 then
default.etichetta_lower = etichetta:mw.ustring.gsub(default.etichetta, "^%l", string.lower)
else
end -- converto l'iniziale dell'etichetta in minuscolo
default.etichetta_lower = default.etichetta
end
end
if entity.corsivo then
default.etichetta = '<span style="font-style:italic;">' .. default.etichetta .. '</span>'
default.etichetta_lower = '<span style="font-style:italic;">' .. default.etichetta_lower .. '</span>'
end
end
-- =================================================================================================================================
 
-- Calcolo preposizione e oggetto di default, modificandoli se il namespace è 14 (categoria)
local preposizione = origArgs.preposizione
-- =================================================================================================================================
local oggetto = origArgs.oggetto
if current_namespace ~= 14 then
-- se preposizione e oggetto non sono definiti cambio il valore di default
default.preposizione = origArgs.preposizione
default.oggetto = origArgs.oggetto
if current_namespace == 14 then
else
preposizione = preposizione or "sull'argomento"
oggettodefault.preposizione = oggettopreposizione or "una categoriasull'argomento"
default.oggetto = oggetto or "una categoria"
end
-- =================================================================================================================================
 
-- Copio i parametri in una nuova tabella, creando una coppia progetto/collegamento per i parametri posizionali
progetti = {
-- e controllando per parametri duplicati e nomi di progetto non conosciuti
ordine = {},
-- =================================================================================================================================
link = {},
prefix = {},
nome_progetto = {},
nome_leftbar = {},
badge_leftbar = {},
collegamento = {},
etichetta = {},
icona = {},
dimensione_icona = {},
oggetto = {},
preposizione = {},
testo_prima = {},
testo_dopo = {},
lingua = {},
messaggio_stampa = {},
base_url = {}
}
 
local pos = 0
local notizia_presente = false
local incubator_without_value = false
local add_categories = {}
 
local is_disambigua = false
 
-- Check if the page is a disambiguation page
-- The costant 4167410 is the wikidata item 'Wikimedia disambiguation page': https://www.wikidata.org/wiki/Q4167410
local istance_of = 'P31' -- wikidata property "Istance of", https://www.wikidata.org/wiki/Property:P31
if entity and entity.claims and entity.claims[istance_of]
and entity.claims[istance_of][1]
and entity.claims[istance_of][1].mainsnak
and entity.claims[istance_of][1].mainsnak.datavalue
and entity.claims[istance_of][1].mainsnak.datavalue.type == 'wikibase-entityid'
and entity.claims[istance_of][1].mainsnak.datavalue.value
and entity.claims[istance_of][1].mainsnak.datavalue.value['entity-type'] == 'item'
and entity.claims[istance_of][1].mainsnak.datavalue.value['numeric-id'] == 4167410 then
is_disambigua = true
end
 
-- carico tutti i dati in una nuova tabella e controllo se i valori per i link presenti nella
-- tabella automatic_link sono definiti, in caso contrario provo a leggere il link da wikidata
local automatic_found = {}
for key, _ in pairs(automatic_link) do automatic_found[key] = false end
local newArgs = {}
local nolink = false
for k, value in pairs(origArgs) do
for key, value in pairs(origArgs) do
-- Disabilito i link a wikidata per le voci (ns0), escludendo la Pagina principale
if nottonumber(kkey) == 'wikidata' or value == 'wikidata')then
local key_progetto = mw.text.trim(value)
or current_namespace ~= 0 or current_pagename == 'Pagina principale' then
if cfg.parameters[key_progetto] then
-- Se è disambigua registro solo i valori per i link al wikizionario
if k == 'wikt' or value == 'wikt' or not(is_disambigua)origArgs[key_progetto] then
add_error('Collegamento newArgs[k]a "' .. = value .. '" inserito sia come parametro posizionale che nominale')
else
newArgs[key_progetto] = get_default_collegamento(key_progetto, default.current_fullpagename)
end
end else
if automatic_link[k]key == 1 and key_progetto == 'nolink' then
automatic_found[k] nolink = true
elseif automatic_link_bis[k] then else
add_error('Il parametro "' .. value .. '" non corrisponde a nessun progetto riconosciuto dal template')
automatic_found[automatic_link_bis[k]] = true
elseif (tonumber(k) and automatic_link[mw.text.trim(value)]) then
automatic_found[mw.text.trim(value)] = true
elseif tonumber(k) and automatic_link_bis[mw.text.trim(value)] then
automatic_found[automatic_link_bis[mw.text.trim(value)]] = true
end
end
for key, found in pairs(automatic_found) do
if not (found) then
if not (is_disambigua) and entity then
if entity.sitelinks and entity.sitelinks[automatic_link[key].interwiki] then
newArgs[key] = entity.sitelinks[automatic_link[key].interwiki].title
if automatic_link[key].category then
add_categories[#add_categories+1] = automatic_link[key].category
end
elseif check_property[key] and entity.claims and entity.claims[check_property[key]]
and entity.claims[check_property[key]][1]
and entity.claims[check_property[key]][1].mainsnak
and entity.claims[check_property[key]][1].mainsnak.datavalue
and entity.claims[check_property[key]][1].mainsnak.datavalue.type == 'string' then
newArgs[key] = 'Category:' .. entity.claims[check_property[key]][1].mainsnak.datavalue.value
end
end
else
newArgs[key] = value
end
end
-- =================================================================================================================================
-- Per i link gestiti in automatico da wikidata, verifico i badge per la segnalazione delle voci in vetrina e di qualità
-- Controllo se i collegamenti inseriti manualmente sono presenti in wikidata e in caso contrario li aggiungo
local badge_link = {}
-- salto questo passo se c'è un collegamento a 'notizia' dato che in questo caso deve essere unico e quindi non devo aggiungere i
if entity and entity.sitelinks then
-- link da wikidata
for key, _ in pairs(automatic_link) do
-- =================================================================================================================================
if entity.sitelinks[automatic_link[key].interwiki] and entity.sitelinks[automatic_link[key].interwiki].badges then
if not newArgs.notizia then
badge_link[key] = ''
-- controllo se è presente il collegamento compilato manualmente ma non quello in wikidata
for i = 1, #entity.sitelinks[automatic_link[key].interwiki].badges do
for key_progetto, collegamento in pairs(newArgs) do
if entity.sitelinks[automatic_link[key].interwiki].badges[i] == 'Q17437796' then
if cfg.parameters[key_progetto] and cfg.automatic_link[key_progetto] and not entity.collegamenti[key_progetto] then
badge_link[key] = 'badge-Q17437796 badge-featuredarticle ' .. badge_link[key]
elseif entityadd_category(cfg.sitelinks[automatic_link[keykey_progetto].interwiki].badges[i] == 'Q17437798' thencategory_wikidata_missing)
badge_link[key] = badge_link[key] .. ' badge-Q17437798 badge-goodarticle'
end
end
end
end
-- aggiungo il collegamento da wikidata se non presente compilato manualmente
for key_progetto, collegamento in pairs(entity.collegamenti) do
if not newArgs[key_progetto] and not (cfg.automatic_link[key_progetto].alias and newArgs[cfg.automatic_link[key_progetto].alias]) then
newArgs[key_progetto] = collegamento
end
end
end
-- =================================================================================================================================
-- Scandisco tutti gli argomenti per costruire una tabella in cui ad ogni riga corrisponde un link
-- Sulla base della lista di argomenti ripulita costruisco la lista dei collegamenti da inserire
-- a un altro progetto con le opzioni che sono state settate per quel progetto
-- =================================================================================================================================
for k, collegamento in pairs(newArgs) do
local progetti = {}
-- controlla se è un parametro posizionale e in questo caso usa il suo valore come nome del
for key_progetto, collegamento in pairs(newArgs) do
-- progetto a cui puntare, con pagina corrispondente a quella della pagina corrente
if cfg.parameters[key_progetto] then
-- in cui è inserito il template
-- Salto i link a wikidata per le voci in ns0 eccetto che per la Pagina principale
if tonumber(k) then
if not(key_progetto == 'wikidata') or current_namespace ~= 0 or current_pagename == 'Pagina principale' then
k = mw.text.trim(collegamento) -- elimino eventuali spazi iniziali e finali
-- Se è disambigua registro solo i valori per i link al wikizionario
if k == 'incubator' then
if not(entity.disambigua) or cfg.parameters[key_progetto].abilita_in_disambigua then
k = ''
progetti[#progetti+1] = Collegamento:new(key_progetto, newArgs, entity, default)
incubator_without_value = true -- se incubator non è valorizzato loggo l'errore
else
if k == 'wikt' or k =='wiktionary' then -- di default il collegamento a wikizionario è in minuscolo
collegamento = current_fullpagename:gsub("^%u", string.lower)
else
collegamento = current_fullpagename
end
end
end
if collegamento == '' then collegamento = current_fullpagename end
-- se k corrisponde a un progetto inserito in default_parameter aggiungo una riga alla tabella
-- progetti con i parametri da usare per visualizzare i collegamenti
if default_parameter[k] then
pos = pos+1
progetti.ordine[pos] = {default_parameter[k][1], pos}
progetti.link[pos] = default_parameter[k][2]
progetti.prefix[pos] = default_parameter[k][3]
progetti.nome_progetto[pos] = default_parameter[k][4]
progetti.nome_leftbar[pos] = default_parameter[k][5]
progetti.badge_leftbar[pos] = is_defined(badge_link[k]) or ''
progetti.collegamento[pos] = collegamento
progetti.etichetta[pos] = is_defined(newArgs[k .. '_etichetta']) or (k == 'wikt' and etichetta_lower) or etichetta
progetti.icona[pos] = default_parameter[k][6]
progetti.dimensione_icona[pos] = default_parameter[k][7]
progetti.oggetto[pos] = newArgs[k .. '_oggetto'] or oggetto or default_parameter[k][8]
if default_parameter[k][9] then
progetti.preposizione[pos] = newArgs[k .. '_preposizione'] or preposizione or default_parameter[k][9]
else
progetti.preposizione[pos] = ''
end
progetti.testo_prima[pos] = default_parameter[k][10]
progetti.testo_dopo[pos] = default_parameter[k][11]
if k=='notizia' then
notizia_presente = true
if newArgs.data then
progetti.testo_dopo[pos] = table.concat({' <small>', newArgs.data, '</small>'})
end
end
if default_parameter[k][12] and newArgs[k ..'_lingua'] then
progetti.lingua[pos] = table.concat({' in lingua ', newArgs[k ..'_lingua'], ' '})
else
progetti.lingua[pos] = ' '
end
progetti.messaggio_stampa[pos] = default_parameter[k][13]
progetti.base_url[pos] = default_parameter[k][14]
end
end
table.sort(progetti, sort_by_ordine)
-- =================================================================================================================================
-- genero il codice html
-- =================================================================================================================================
root = mw.html.create('')
if notizia_presentenewArgs.notizia then -- gestisco il parametro "notizia" a parte
if #progetti.ordine>1 then
root:wikitextadd_error('<strong class="error">Errore: il parametro "notizia" se presente deve essere unico</strong>[[Categoria:Errori di compilazione del template Interprogetto]]')
else
iflocal in_stampanewsprogetto then= progetti[1]
local news_default = cfg.parameters.notizia
root:wikitext('* [[File:', progetti.icona[1], '|', progetti.dimensione_icona[1],
root:wikitext('* [[File:', news_default.icona, '|link=', news_default.prefix, '|',
"]] ", progetti.messaggio_stampa[1], "'''", progetti.base_url[1],
tostring(mwnews_default.uri.localUrl(progetti.collegamento[1] ))dimensione_icona,'|Collabora a "'''", )news_default.nome_progetto,
"]]", " Articolo su '''[[", news_default.prefix, news_default.nome_progetto, '|',
else
root:wikitext('* [[File:', progetti news_default.icona[1]nome_progetto, "]]'|link=',': progetti.prefix[1]", "'|''[[", news_default.prefix,
progettinewsprogetto.dimensione_icona[1]collegamento, '|Collabora a ', progettinewsprogetto.nome_progetto[1collegamento, "]]'''", newsprogetto.testo_dopo )
add_category('Template interprogetto - parametro notizia')
"]]", " Articolo su '''[[", progetti.prefix[1], progetti.nome_progetto[1], '|',
progetti.nome_progetto[1], "]]''': ", "'''[[", progetti.prefix[1],
progetti.collegamento[1], '|', progetti.collegamento[1], "]]'''", progetti.testo_dopo[1] )
end
end
else
if #progetti.ordine >== 0 then
add_error('Template interprogetto vuoto e senza dati da recuperare da wikidata')
table.sort(progetti.ordine, sort_by_first)
else
if not(in_stampa) then RenderLeftBar() end
RenderLeftBar(progetti)
if not(newArgs[1]) or mw.text.trim(newArgs[1])~= 'nolink' then
if not nolink RenderLinksInText(in_stampa)then
RenderLinksInText(progetti)
 
end
if #add_categories > 0 then
for _,category in ipairs(add_categories) do
root:wikitext('[[Categoria:' .. category .. ']]')
end
end
end
end
-- =================================================================================================================================
if incubator_without_value then
-- Se sono in un namespace ammesso inserisco le categorie di segnalazione di errori/avvisi
root:wikitext('<strong class="error">Errore: il parametro "incubator" deve essere valorizzato</strong>[[Categoria:Errori di compilazione del template Interprogetto]]')
-- =================================================================================================================================
if cfg.whitelist_category[current_namespace] then
for category,_ in pairs(categories) do
root:wikitext('[[Categoria:' .. category .. ']]')
end
end
-- =================================================================================================================================
-- Aggiungo 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