Modulo:Interprogetto
Modulo Lua per svolgere le funzioni di {{Interprogetto}}.
-- Modulo per implementare le funzionalità del [[Template:Interprogetto]]
local p = {} -- per l'esportazione delle funzioni del modulo
local progetti = {} -- dati da usare per la costruzione delle righe dell'elenco di link ai progetti
local root = mw.html.create('') -- radice del markup html
local debug = {} -- per debug
local function dump(t, ...)
local args = {...}
for _, s in ipairs(args) do
table.insert(t, s)
end
end
local function sort_by_first(t1, t2)
-- Per ordinare una tabella in base al valore del primo elemento della tabella stessa
if t1[1] < t2[1] then
return true
end
end
local function add_space(s)
-- Ritorna uno spazio se l'ultimo carattere non è un apostrofo
if mw.ustring.sub(s, -1) == "'" then
return ""
else
return " "
end
end
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)
-- Restituisce il link nel caso normale di progetto senza interfaccia in lingua.
-- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
local p = progetti
local text = ""
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_site[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_progetto[pos], "]]", p.prefix_site[pos] })
end
return text
end
local function LinkRicette(intext, pos, in_stampa)
-- Restituisce il link per le ricette su wikibooks.
-- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
local p = progetti
local text = ""
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],
"]] Il ''[[b:Libro di cucina|Libro di cucina]]'' di ",
"'''[[b:|Wikibooks]]''' contiene ", p.oggetto[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({"<span class=\"plainlinks\" title=\"", p.etichetta[pos], "\">[",
tostring(mw.uri.fullUrl( p.prefix[pos] .. p.collegamento[pos] )),
" ", p.nome_progetto[pos], "]</span>" })
end
return text
end
local function LinkWithLanguage(intext, pos, in_stampa)
-- 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 p = progetti
local text = ""
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
local main_page_link = ""
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_progetto[pos], "]</span>" })
end
return text
end
local function LinkIncubator(intext, pos, in_stampa)
-- Restituisce il link verso progetti in incubator.
-- intext vero se è richiesto il link del testo principale, falso per la barra sinistra
local p = progetti
local text = ""
local prefix = {
wikipedia = 'Wp',
wikiquote = 'Wq',
wikibooks = 'Wb',
wiktionary = 'Wt',
wikizionario = 'Wt',
wikinews = 'Wn',
wikinotizie = 'Wn',
wikivoyage = 'Wy'
}
local oggetto = p.oggetto[pos]
if not(prefix[oggetto]) then
oggetto = 'wikipedia'
end
local collegamento = tostring(mw.uri.fullUrl( table.concat({"incubator:", prefix[oggetto],
"/", p.collegamento[pos] }), {uselang='it'} ))
if intext then
if in_stampa then
text = table.concat({"* [[File:", p.icona[pos], "|", p.dimensione_icona[pos], "]] ",
p.messaggio_stampa[pos], "'''", collegamento, "'''" })
else
local main_page_incubator = ""
local main_page_progetto = ""
main_page_incubator = tostring(mw.uri.fullUrl( "incubator:Incubator:Main Page/it", {uselang='it'} ))
if oggetto == 'wikiquote' then
main_page_progetto = '[[Pagina principale|Wikiquote]]'
else
main_page_progetto = table.concat({"[[", oggetto, ":it:|",
oggetto:gsub("^%l", string.upper), "]]" })
end
text = table.concat({"* [[File:", p.icona[pos], "|link=", main_page_incubator, "|",
p.dimensione_icona[pos], "|Collabora a ", p.nome_progetto[pos],
"]]", " ", "'''<span class=\"plainlinks\">[", main_page_incubator, " ",
p.nome_progetto[pos], "]</span>''' contiene un test per ", main_page_progetto,
p.lingua[pos], " ", p.preposizione[pos], add_space(p.preposizione[pos]),
"'''<span class=\"plainlinks\">[", collegamento,
" ", p.etichetta[pos], "]</span>'''" })
end
else
-- Imposta il nome del sottotitolo da usare per il link nella barra di sinistra
progetti.nome_leftbar[pos] = oggetto:gsub("^%l", string.upper)
text = table.concat({"<span class=\"plainlinks\" title=\"", p.etichetta[pos], "\">[",
collegamento, " ", p.nome_progetto[pos], "]</span>" })
end
return text
end
-- default_parameter: contiene i valori di default dei parametri per tutti i progetti disponibili
-- priorità: ordine di priorità in cui visualizzare il link del progetto (un numero intero)
-- funzione da richiamare per inserire il link del progetto
-- prefisso_progetto: prefisso da usare per il link del progetto
-- prefisso_lingua: codice della lingua da usare per il link del progetto (solo per link a progetti in altra lingua)
-- (false se disabilitato, altrimenti una stringa vuota, oppure 'en' come valore predefinito per wikipedia)
-- nome_progetto: nome del progetto
-- nome_leftbar: nome del sottotitolo da usare per il link del progetto nella barra di sinistra
-- (false se disabilitato, altrimenti una stringa, da usare per esempio per wikiricette)
-- logo del progetto: nome del file che contiene il logo del progetto
-- dimensioni del logo: dimensioni da usare per il logo del progetto
-- oggetto standard: complemento oggetto nella frase standard ('opere originali', 'testi o manuali', ecc...)
-- preposizione standard: preposizione da anteporre all'etichetta nella frase standard ('di o su', 'riguardanti', ecc...),
-- (se è false non viene inserita e/o modificata)
-- testo di apertura intorno all'etichetta: stringa vuota o testo da usare immediatamente prima dell'etichetta
-- (usata per esempio dal wikizionario per la virgoletta di apertura)
-- testo di chiusura intorno all'etichetta: stringa vuota o testo di chiusura da usare immediatamente dopo l'etichetta
-- (usata per esempio dal wikizionario per la virgoletta di chiusura)
-- 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 lingua xxxxx'
-- tra il nome del progetto e l'etichetta standard per il tipo di contenuto
-- messaggio da visualizzare in stampa
-- collegamento da visualizzare in stampa
local default_parameter = {
wikipedia = {1, Link, 'wikipedia:', 'en', 'Wikipedia', false, 'Wikipedia-logo-v2.svg', '19px', 'una voce', 'riguardante', '', '' , false, "'''Wikipedia''' contiene la voce in inglese: ", "https://en.wikipedia.org"},
w = {2, Link, 'w:', '', 'Wikipedia', false, 'Wikipedia-logo-v2.svg', '19px', 'una voce', 'riguardante', '', '' , true, "'''Wikipedia''' contiene la voce: ", "https://it.wikipedia.org"},
w2 = {3, Link, 'w:', '', 'Wikipedia', false, 'Wikipedia-logo-v2.svg', '19px', 'inoltre una voce', 'riguardante', '', '' , true, "'''Wikipedia''' contiene la voce: ", "https://it.wikipedia.org"},
wikisource = {4, Link, 'wikisource:', false, 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', false, "'''Wikisource''' contiene opere originali in inglese: ", 'https://en.wikisource.org'},
s = {5, Link, 's:', false, 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', true, "'''Wikisource''' contiene opere originali: ", "https://it.wikisource.org"},
s2 = {6, Link, 's:', false, 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'una pagina', 'dedicata a', '', '', true, "'''Wikisource''' contiene opere originali: ", "https://it.wikisource.org"},
testo = {7, Link, 's:', false, 'Wikisource', 'Testo completo', 'Wikisource-logo.svg', '18px', 'il testo completo', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "https://it.wikisource.org"},
testo2 = {8, Link, 's:', false, 'Wikisource', 'Testo completo', 'Wikisource-logo.svg', '18px', 'inoltre il testo completo', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "https://it.wikisource.org"},
-- disabilitato: siamo già qui!
-- wikiquote = {9, Link, 'wikiquote:', false, 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , false, "'''Wikiquote''' contiene citazioni in inglese: ", "https://en.wikiquote.org"},
-- q = {10, Link, 'q:', false, 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , true, "'''Wikiquote''' contiene citazioni: ", "https://it.wikiquote.org"},
-- q2 = {11, Link, 'q:', false, 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'inoltre citazioni', 'di o su', '', '' , true, "'''Wikiquote''' contiene citazioni: ", "https://it.wikiquote.org"},
wikibooks = {12, Link, 'wikibooks:', false, 'Wikibooks', false, 'Wikibooks-logo.svg', '18px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali in inglese: ", "https://en.wikibooks.org"},
b = {13, Link, 'b:', false, 'Wikibooks', false, 'Wikibooks-logo.svg', '18px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali: ", "https://it.wikibooks.org"},
ricetta = {14, LinkRicette, 'b:Libro di cucina/Ricette/', false, 'Wikibooks', 'Ricette', 'Wikibooks-logo.svg', '18px', 'ricette', 'relative a', '', '' , false, "'''Wikibooks''' contiene la ricetta: ", "https://it.wikibooks.org/Libro di cucina/Ricette"},
wiktionary = {15, Link, 'wiktionary:', false, 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene il lemma di dizionario in inglese: ", "https://en.wiktionary.org"},
wikt = {16, Link, 'wikt:', false, 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene il lemma di dizionario: ","https://it.wiktionary.org"},
wikt2 = {17, Link, 'wikt:', false, 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene il lemma di dizionario: ","https://it.wiktionary.org"},
wikiversity = {18, Link, 'wikiversity:', false, 'Wikiversità', false, 'Wikiversity-logo-It.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikiversità''' contiene informazioni in inglese: ", "https://en.wikiversity.org"},
v = {19, Link, 'v:', false, 'Wikiversità', false, 'Wikiversity-logo-It.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikiversità''' contiene informazioni: ", "https://it.wikiversity.org"},
wikinews = {20, Link, 'wikinews:', false, 'Wikinotizie', false, 'Wikinews favicon.svg', '18px', 'notizie di attualità', 'su', '', '', false, "'''Wikinotizie''' contiene notizie di attualità in inglese: ", "https://en.wikinews.org"},
n = {21, Link, 'n:', false, 'Wikinotizie', false, 'Wikinews favicon.svg', '18px', 'notizie di attualità', 'su', '', '', false, "'''Wikinotizie''' contiene notizie di attualità: ", "https://it.wikinews.org"},
wikivoyage = {22, Link, 'wikivoyage:', false, 'Wikivoyage', false, 'Wikivoyage-Logo-v3-icon.svg', '18px', 'informazioni turistiche', 'su', '', '', false, "'''Wikivoyage''' contiene informazioni turistiche in inglese: ", "https://en.wikiwoyage.org"},
voy = {23, Link, 'voy:', false, 'Wikivoyage', false, 'Wikivoyage-Logo-v3-icon.svg', '18px', 'informazioni turistiche', 'su', '', '', false, "'''Wikivoyage''' contiene informazioni turistiche: ", "https://it.wikiwoyage.org"},
species = {24, LinkWithLanguage, 'species:', false, 'Wikispecies', false, 'Wikispecies-logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikispecies''' contiene informazioni: ", "https://species.wikimedia.org"},
wikispecies = {25, LinkWithLanguage, 'wikispecies:', false, 'Wikispecies', false, 'Wikispecies-logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikispecies''' contiene informazioni: ", "https://species.wikimedia.org"},
wikidata = {26, LinkWithLanguage, 'wikidata:', false, 'Wikidata', false, 'Wikidata-logo.svg', '20px', 'informazioni', 'su', '', '', false, "'''Wikidata''' contiene informazioni: ", 'https://www.wikidata.org'},
d = {27, LinkWithLanguage, 'd:', false, 'Wikidata', false, 'Wikidata-logo.svg', '20px', 'informazioni', 'su', '', '', false, "'''Wikidata''' contiene informazioni: ", 'https://www.wikidata.org'},
commons = {28, LinkWithLanguage, 'commons:', false, 'Commons', false, 'Commons-logo.svg', '18px', 'immagini o altri file', 'su', '', '', false, "'''Wikimedia Commons''' contiene file multimediali: ", "https://commons.wikimedia.org"},
c = {29, LinkWithLanguage, 'c:', false, 'Commons', false, 'Commons-logo.svg', '18px', 'immagini o altri file', 'su', '', '', false, "'''Wikimedia Commons''' contiene file multimediali: ", "https://commons.wikimedia.org"},
meta = {30, LinkWithLanguage, 'meta:', false, 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Meta-Wiki''' contiene informazioni: ", "https://meta.wikimedia.org"},
m = {31, LinkWithLanguage, 'm:', false, 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Meta-Wiki''' contiene informazioni: ", "https://meta.wikimedia.org"},
mw = {32, LinkWithLanguage, 'mw:', false, 'Mediawiki', false, 'MediaWiki-notext.svg', '18px', 'informazioni', 'su', '', '', false, "'''Mediawiki''' contiene informazioni: ", "https://www.mediawiki.org"},
incubator = {33, LinkIncubator, 'incubator:', false, 'Incubator', 'true', 'Incubator-notext.svg', '18px', '', 'su', '', '', true, "'''Wikimedia Incubator''' contiene un test: ", "https://incubator.wikimedia.org"}
}
local automatic_link = {
-- Tabella dei link gestiti in automatico se assenti, basandosi sui dati di wikidata.
-- Formata da coppie "codice progetto" (come compare nella tabella sopra) e nome proprietà
-- su wikidata con il link al progetto, più l'opzione per la categorizzazione (disabilitata)
w = {interwiki = 'itwiki', category = nil },
s = {interwiki = 'itwikisource', category = nil },
-- disabilitato: siamo già qui!
-- q = {interwiki = 'itwikiquote', category = nil },
n = {interwiki = 'itwikinews', category = nil },
voy = {interwiki = 'itwikivoyage', category = nil },
wikidata = {interwiki = 'wikidatawiki', category = nil },
commons = {interwiki = 'commonswiki', category = nil },
v = {interwiki = 'itwikiversity', category = nil },
species = {interwiki = 'specieswiki', category = nil },
b = {interwiki = 'itwikibooks', category = nil }
}
local automatic_link_bis = {
-- Tabella delle corrispondenze tra i "codici progetto" (come compaiono nella tabella sopra).
-- Evita che wikidata aggiunga il link automatico se esiste già un link a uno di questi progetti
testo = 's',
testo2 = 's',
d = 'wikidata',
c = 'commons',
v = 'wikiversity',
wikispecies = 'species',
b = 'wikibooks'
}
-- L'identificatore P31 corrisponde alla proprietà di wikidata "istanza di" [[d:Property:P31]]
local instance_of = 'P31'
local check_property = {
commons = 'P373'
}
local check_opera = {
-- Tabella dei possibili valori per la proprietà "istanza di" nel caso di opere.
-- Formata da coppie nome e identificatore di wikidata
opera = '386724', -- opera (generica)
film = '11424',
cortometraggio = '24862',
film_collettivo = '336144',
film_animazione = '202866',
programma_televisivo = '15416',
programma_radiofonico = '1555508',
film_TV = '506240',
serie_TV_o_radio = '15709880',
serie_televisiva = '5398426',
serie_televisiva_animata = '581714',
anime = '1107',
fumetto = '1004',
manga = '8274',
dramma = '25379',
opera_lirica = '1344', -- opera (lirica)
musical = '2743',
rivista = '41298',
periodico = '1092563',
opera_letteraria = '7725634',
libro = '571',
testi_sacri = '179461',
testo_scritto = '17481121',
videogioco = '7889',
-- Per aggiungere a questa lista un elemento di wikidata del tipo [[d:Qxxxxxx]],
-- inserire qui sopra una nuova riga con la seguente sintassi:
-- nome_valore = 'xxxxxx',
-- NOTA BENE: LA VIRGOLA!!!
}
local namespace_whitelist = {
-- Tabella dei namespace per i quali abilitare l'inserimento nelle
-- categorie di errore/avviso
[0] = true,
[4] = true,
[6] = true,
[8] = true,
[10] = true,
[12] = true,
[14] = true,
[100] = true
}
local function is_wikizionario(rif)
-- Ritorna vero se il riferimento è al wikizionario/wiktionary
return (rif == 'wiktionary' or rif == 'wikt' or rif == 'wikt2')
end
local function is_wikidata(rif)
-- Ritorna vero se il riferimento è a wikidata
return (rif == 'wikidata' or rif == 'd')
end
local function template_lingua(lang_code)
-- Riproduce i template per i link a siti in altra lingua; vedi "Categoria:Template collegamenti esterni"
local text = ""
text = table.concat({" (<span style=\"font-weight: bolder; font-size: smaller; color:#002BD0;\" title=\"{{nomelingua|",
lang_code, "}}\">", string.upper(lang_code), "</span>)" })
return text
end
local function RenderLeftBar()
-- Scandisce la tabella progetti e crea la barra di sinistra con i link interprogetto.
-- Costruisce le righe per la barra di sinistra come un elenco puntato.
local leftbar = mw.html.create('ul'):attr('title', 'Collegamenti verso gli altri progetti Wikimedia')
for i = 1, #progetti.ordine do
local pos = progetti.ordine[i][2]
local link = progetti.link[pos]
leftbar:newline()
leftbar:wikitext('<li class="', progetti.badge_leftbar[pos], '">')
leftbar:wikitext(link(false, pos))
if progetti.nome_leftbar[pos] then
-- Inserisce l'eventuale nome del sottotitolo del progetto (tra parentesi, con caretteri più piccoli)
leftbar:wikitext('<br /><small>(', progetti.nome_leftbar[pos], ')</small>')
end
leftbar:wikitext('</li>')
end
-- Apertura del tag div id="interProject" (vedi [[Commons:MediaWiki:InterProject.js]] incluso da [[Mediawiki:Common.js]])
root
:tag('div')
:attr('id', 'interProject')
:attr('class', 'toccolours')
:cssText('display: none; clear: both; margin-top: 2em')
:tag('p')
:attr('id', 'sisterProjects')
:cssText('background-color: #efefef; font-weight: bold; margin: 0; color:#000')
:tag('span')
:wikitext('Altri progetti')
:done()
:done()
:node(leftbar)
end
local function RenderLinksInText(in_stampa)
-- Scandisce la tabella progetti e produce il codice html per l'elenco puntato dei link interprogetto
for i = 1, #progetti.ordine do
local pos = progetti.ordine[i][2]
local link = progetti.link[pos]
root:newline()
root:wikitext(link(true, pos, in_stampa))
end
end
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
else
origArgs = frame.args
end
local in_stampa = false
if frame.args['stampa'] then
in_stampa = true
end
local pos = 0
local add_categories = {}
local incubator_without_value = false
local notizia_presente = false
-- Carico tutti i dati della pagina corrente
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
current_fullpagename = mw.site.namespaces[current_namespace].canonicalName .. ':' .. current_pagename
else
current_fullpagename = current_pagename
end
-- Carico i dati da wikidata se esistono
local entity = nil
if mw.wikibase then
entity = mw.wikibase.getEntityObject()
end
local function hasPropertyValue(propertyId, value)
-- Verifica se una determinata proprietà ha il valore specificato.
-- Riadattata da "function instanceof(arg)" su [[wikisource:it:Modulo:Autore]]
if entity and entity.claims and entity.claims[propertyId] then
local claims = 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'
and datavalue.value['numeric-id'] == tonumber(value) then
return true
end
elseif datavalue.type == 'string' then
if datavalue.value == value then
return true
end
end
end
end
end
return false
end
-- Cerco su wikidata se la pagina corrente in cui è inserito il template
-- corrisponde alla voce di un'opera (per la gestione dell'etichetta in corsivo)
local is_opera = false
for _, value in pairs(check_opera) do
if hasPropertyValue(instance_of, value) then
is_opera = true
end
end
-- Carico l'etichetta globale se specificata
local etichetta = origArgs.etichetta
local etichetta_lower = nil
-- Se non è stata specificata un'etichetta globale, la cerco su wikidata.
-- Se esiste l'etichetta su wikidata uso questa come etichetta di default dei collegamenti,
-- altrimenti utilizzo il nome della pagina corrente in cui è inserito il template.
if etichetta == nil or etichetta == '' then
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
else
etichetta = mw.ustring.gsub(current_pagename, ' %(.*%)$', '') -- Elimino un'eventuale disambigua dal nome
if current_namespace == 0 then
etichetta_lower = etichetta:gsub("^%u", string.lower) -- Solo nel namespace principale (per il wikizionario)
end -- converto l'iniziale dell'etichetta in minuscolo
end
if is_opera then
etichetta = table.concat({"''", etichetta, "''" }) -- Se è un opera, converto l'etichetta in corsivo
end
end
-- Carico oggetto e preposizione globali, se specificati
local oggetto = origArgs.oggetto
local preposizione = origArgs.preposizione
-- Per le categorie utilizzo una frase standard unificata, se non diversamente specificato
if current_namespace == 14 then
oggetto = oggetto or "una categoria"
preposizione = preposizione or "sull'argomento"
-- Forzo tutti i progetti (in particolare il wikizionario) a visualizzare la frase standard
-- con la preposizione (10) e senza le virgolette (11/12)
for k, _ in pairs(default_parameter) do
for j = 10, 12 do
default_parameter[k][j] = ''
end
end
end
-- Verifico se è una pagina di disambiguazione.
-- L'identificatore 4167410 corrisponde all'elemento di wikidata [[d:Q4167410]]
-- "pagina di disambiguazione di un progetto Wikimedia"
local is_disambigua = hasPropertyValue(instance_of, '4167410')
-- Carico tutti gli argomenti in una nuova tabella.
-- 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 newArgs = {}
local automatic_found = {}
local collegamento_found = false
for key, _ in pairs(automatic_link) do
automatic_found[key] = false
end
for k, value in pairs(origArgs) do
newArgs[k] = value
if automatic_link[k] then
automatic_found[k] = true
elseif automatic_link_bis[k] then
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
end
end
progetti = {
ordine = {},
link = {},
prefix = {},
prefix_site = {},
nome_progetto = {},
nome_leftbar = {},
badge_leftbar = {},
collegamento = {},
etichetta = {},
icona = {},
dimensione_icona = {},
oggetto = {},
preposizione = {},
testo_prima = {},
testo_dopo = {},
lingua = {},
messaggio_stampa = {},
base_url = {}
}
-- Scandisco tutti gli argomenti per costruire una tabella in cui ad ogni riga corrisponde un link interprogetto
-- con le opzioni che sono state settate per quel progetto
for k, collegamento in pairs(newArgs) do
-- Controlla se k è un parametro posizionale e in questo caso usa il suo valore come nome
-- del progetto a cui puntare, con pagina corrispondente a quella della pagina corrente in
-- cui è inserito il template
if tonumber(k) then
k = mw.text.trim(collegamento) -- Elimino eventuali spazi iniziali e finali
if k == 'incubator' then
k = ''
incubator_without_value = true -- Se incubator non è valorizzato loggo l'errore
else
-- Di default il collegamento al wikizionario è con iniziale in minuscolo
if is_wikizionario(k) then
collegamento = current_fullpagename:gsub("^%u", string.lower)
else
collegamento = current_fullpagename
end
end
end
-- PRIMA OPZIONE (come da default su Wikipedia)
-- Se viene specificato un collegamento vuoto, lo valorizzo con il nome della pagina corrente
-- if collegamento == '' then collegamento = current_fullpagename end
-- SECONDA OPZIONE (escamotage per annullare eventuali link automatici da wikidata, per esempio |w=)
-- Se viene specificato un collegamento vuoto, annullo il link al progetto corrispondente
if collegamento == '' then k = '' end
-- Disabilito i link a wikidata per le voci (ns0), escludendo la Pagina principale
if not(is_wikidata(k) or is_wikidata(collegamento))
or current_namespace ~= 0 or current_pagename == 'Pagina principale' then
if default_parameter[k] then
collegamento_found = true
end
-- Se è disambigua registro solo i valori per i link al wikizionario
if is_disambigua
and not is_wikizionario( mw.ustring.gsub( k, '_%w*$', '' ) )
and not is_wikizionario(collegamento) then
k = ''
end
end
-- Se k corrisponde a un progetto inserito nella tabella default_parameter aggiungo una
-- riga alla tabella progetti con le opzioni da usare per visualizzare il link a quel progetto
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]
if default_parameter[k][4] then
progetti.prefix_site[pos] = newArgs[k .. '_site'] or default_parameter[k][4]
end
progetti.nome_progetto[pos] = default_parameter[k][5]
progetti.nome_leftbar[pos] = default_parameter[k][6]
progetti.badge_leftbar[pos] = ''
progetti.collegamento[pos] = collegamento
progetti.etichetta[pos] = is_defined(newArgs[k .. '_etichetta'])
or (is_wikizionario(k) and etichetta_lower) or etichetta
progetti.icona[pos] = default_parameter[k][7]
progetti.dimensione_icona[pos] = default_parameter[k][8]
progetti.oggetto[pos] = newArgs[k .. '_oggetto'] or oggetto or default_parameter[k][9]
if default_parameter[k][10] then
progetti.preposizione[pos] = newArgs[k .. '_preposizione'] or preposizione or default_parameter[k][10]
else
progetti.preposizione[pos] = ''
end
progetti.testo_prima[pos] = default_parameter[k][11]
progetti.testo_dopo[pos] = default_parameter[k][12]
if default_parameter[k][13] 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][14]
progetti.base_url[pos] = default_parameter[k][15]
-- Se è definito il parametro "_site" per i progetti in altra lingua, aggiungo una
-- categoria di servizio, aggiorno il prefisso verso il progetto in altra lingua
-- e predispongo il template corrispondente alla lingua
if is_defined(progetti.prefix_site[pos]) then
add_categories[#add_categories+1] = table.concat({"Voci con interprogetto verso ",
progetti.nome_progetto[pos], " in altra lingua - ", progetti.prefix_site[pos] })
progetti.prefix[pos] = table.concat({progetti.prefix[pos], progetti.prefix_site[pos], ":" })
progetti.prefix_site[pos] = template_lingua(progetti.prefix_site[pos])
else
progetti.prefix_site[pos] = ''
end
-- Se è definito un collegamento al wikizionario, aggiungo una categoria di servizio
if is_wikizionario(k) then
add_categories[#add_categories+1] = "Voci con interprogetto verso Wikizionario"
end
end
if k == 'notizia' then
notizia_presente = true -- Se notizia è presente loggo l'errore
end
end
if #progetti.ordine > 0 then
table.sort(progetti.ordine, sort_by_first)
if not(in_stampa) then
RenderLeftBar()
end
if not(newArgs[1]) or mw.text.trim(newArgs[1]) ~= 'nolink' then
RenderLinksInText(in_stampa)
end
end
-- Aggiungo eventuali categorie di servizio
if #add_categories > 0 then
for _, category in ipairs(add_categories) do
root:wikitext('[[Categoria:' .. category .. ']]')
end
end
-- Segnalo e categorizzo eventuali errori
if incubator_without_value then
root:wikitext('<br /><strong class="error">Errore: il parametro "incubator" deve essere valorizzato</strong>'
.. '[[Categoria:Errori di compilazione del template Interprogetto]]')
end
if notizia_presente then
root:wikitext('<br /><strong class="error">Errore: parametro "notizia" non valido. Vedi: [[Template:Interprogetto/notizia]]</strong>'
.. '[[Categoria:Errori di compilazione del template Interprogetto]]')
end
if is_disambigua and #progetti.ordine == 0 and collegamento_found then
root:wikitext('<br /><strong class="error">Errore: collegamenti non visualizzabili perché la voce è una disambigua su Wikidata</strong>'
.. '[[Categoria:Errori di compilazione del template Interprogetto - collegamenti in disambigua]]')
elseif #progetti.ordine == 0 and namespace_whitelist[current_namespace] then
root:wikitext('[[Categoria:Errori di compilazione del template Interprogetto - template vuoto]]')
end
return tostring(root)
end
return p