--Modulo per implementare le funzionalità di 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 -- 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 add_space(s)
--ritorna uno spazio se l'ultimo carattere non è un accento
if mw.ustring.sub(s, -1) == "'" then
return ''
else
return ' '
end
end
local function Link(intext, pos, in_stampa)
-- 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 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[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)
-- Restituisce il link per le ricette su wikibook
-- 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.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)
-- 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
main_page_link=tostring(mw.uri.fullUrl(p.prefix[pos] .. 'Pagina principale', {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\">[', 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)
-- Restituisce il link verso progetti per incubator
local p=progetti
local text=''
local prefix = {
wikipedia = 'Wp',
wiktionary = 'Wt',
wikizionario= 'Wt',
wikibooks= 'Wb',
wikinews= 'Wn',
wikinotizie= 'Wn',
wikiquote= 'Wq',
}
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=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
text = table.concat({'* [[File:', p.icona[pos], '|link=', main_page_incubator, '|',
p.dimensione_icona[pos], "|Collabora a Incubator]] '''<span class=\"plainlinks\">[",
main_page_incubator, " Incubator]</span>''' contiene un test su ",
main_page_progetto, ' ',
p.preposizione[pos], add_space(p.preposizione[pos]),
'<span class="plainlinks">[', collegamento, ' ', p.etichetta[pos], ']</span>' })
end
else
text = table.concat({'* [', collegamento, ' Incubator]'})
end
return text
end
function Link_vuoto(intext, pos)
-- per il parametro notizia, non dovrebbe mai essere chiamato, ma giusto in caso restituisce
-- una stringa vuota
return ''
end
-- default_parameter: contiene i valori di default dei parametri
-- priorità: ordine di priorità in cui visualizzare il link (un numero intero)
-- funzione da richiamare per inserire i link
-- prefisso_progetto: prefisso da usare per i link del progetto
-- nome_progetto: nome del progetto
-- nome_leftbar: nome da usare per il collegamento nella barra di sinistra (falso se coincide con
-- il nome del progetto, 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
-- 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)
local default_parameter ={
wikisource = {1, Link, 'wikisource:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali', 'di o su', '', '', false, "'''Wikisource''' contiene opere originali in inglese: ", 'http://en.wikisource.org'},
s = {2, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
s2 = {3, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
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"},
oldwikisource = {5, Link, 'oldwikisource:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
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: ", "http://it.wikibooks.org"},
b = {10, Link, 'b:', 'Wikibooks', false, 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali in inglese:", "http://en.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:", "http://it.wiktionary.org"},
wikt = {13, Link, 'wikt:', 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene la voce di dizionario in inglese: ", "http://en.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"},
notizia = {0, Link_vuoto, 'n:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', '', '', ': ', '', false, "'''Wikinotizie''' contiene notizie di attualità: ", 'http://it.wikinews.org'},
}
-- nota oldwikisource rimosso, stando a http://toolserver.org/~kolossos/templatetiger/template-parameter.php?template=interprogetto&lang=itwiki non usato
--tabella link gestiti in automatico se assenti, basandosi su wikidata
--formata da coppie 'nome progetto' (come compare nella tabella sopra) e nome proprietà su wikidata con il link al progetto
local automatic_link = {
voy = {interwiki='itwikivoyage', category=nil },
commons= {interwiki='commonswiki', category=nil },
s= {interwiki='itwikisource', category='Pagine con collegamento automatico a wikisource' }
}
local check_property = {
commons = 'P373'
}
local function sort_by_first(t1, t2)
-- per ordinare una tabella in base al valore del primo elemento della tabella
if t1[1] < t2[1] 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
-- Apertura del tag div id="interProject" (vedi [[Mediawiki:Monobook.js]] o [[Mediawiki:Vector.js]])
local leftbar = HtmlBuilder.create('div').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().wikitext(link(false, pos))
if progetti.nome_leftbar[pos] then
leftbar.wikitext(table.concat({'<br />(', progetti.nome_progetto[pos], ')'}))
end
end
root
.tag('div')
.attr('id', 'interProject')
.cssText('display: none; clear: both; border-top: 2px dotted #AAAAAA; margin-top: 2em')
.node(leftbar)
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 = progetti.ordine[i][2]
root.newline()
local link=progetti.link[pos]
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
end
local in_stampa = false
if frame.args['stampa'] then
in_stampa = true
end
-- Carico i parametri
local current_page = mw.title.getCurrentTitle()
local current_title = current_page.fullText
local etichetta = origArgs.etichetta
-- carico i dati da wikidata se esistono
local entity = nil
if mw.wikibase then
entity = mw.wikibase.getEntity()
end
-- se esiste l'etichetta su wikidata uso questa come etichetta di default dei collegamenti
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 = current_page.text
end
end
local preposizione = origArgs.preposizione
local oggetto = origArgs.oggetto
progetti ={
ordine = {},
link = {},
prefix = {},
nome_progetto = {},
nome_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][0]
and entity.claims[istance_of][0].mainsnak
and entity.claims[istance_of][0].mainsnak.datavalue
and entity.claims[istance_of][0].mainsnak.datavalue.type == 'wikibase-entityid'
and entity.claims[istance_of][0].mainsnak.datavalue.value
and entity.claims[istance_of][0].mainsnak.datavalue.value['entity-type'] == 'item'
and entity.claims[istance_of][0].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 = {}
for k, value in pairs(origArgs) do
if automatic_link[k] then
automatic_found[k] = true
elseif (tonumber(k) and automatic_link[mw.text.trim(value)]) then
automatic_found[mw.text.trim(value)] = true
end
-- Se è disambigua registro solo i valori i link al wikizionario
if k == 'wikt' or value=='wikt' or not(is_disambigua) then
newArgs[k] = value
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]][0]
and entity.claims[check_property[key]][0].mainsnak
and entity.claims[check_property[key]][0].mainsnak.datavalue
and entity.claims[check_property[key]][0].mainsnak.datavalue.type == 'string' then
newArgs[key] = 'Category:' .. entity.claims[check_property[key]][0].mainsnak.datavalue.value
end
end
end
end
-- Scandisco tutti gli argomenti per costruire una tabella in cui ad ogni riga corrisponde un link
-- a un altro progetto con le opzioni che sono state settate per quel progetto
for k, collegamento in pairs(newArgs) do
-- controlla se è 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
collegamento = current_title
end
end
if collegamento == '' then collegamento = current_title 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.collegamento[pos] = collegamento
progetti.etichetta[pos] = newArgs[k .. '_etichetta'] 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
root = HtmlBuilder.create()
if notizia_presente then -- gestisco il parametro "notizia" a parte
if #progetti.ordine>1 then
root.wikitext('<strong class="error">Errore: il parametro "notizia" se presente deve essere unico</strong>[[categoria:Errori del template Interprogetto]]')
else
if in_stampa then
root.wikitext(table.concat({'* [[File:', progetti.icona[1], '|', progetti.dimensione_icona[1],
"]] ", progetti.messaggio_stampa[1], "'''", progetti.base_url[1],
tostring(mw.uri.localUrl(progetti.collegamento[1] )), "'''" }))
else
root.wikitext(table.concat({'* [[File:', progetti.icona[1], '|link=', progetti.prefix[1], '|',
progetti.dimensione_icona[1],'|Collabora a ', progetti.nome_progetto[1],
"]]", " 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
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
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
root.wikitext('<strong class="error">Errore: il parametro "incubator" deve essere valorizzato</strong>[[categoria:Errori del template Interprogetto]]')
end
return tostring(root)
end
return p