Modulo:Interprogetto

Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Interprogetto/man (modifica · cronologia)
Sandbox: Modulo:Interprogetto/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Interprogetto/test (modifica · cronologia · esegui)
Modulo Lua per svolgere le funzioni di {{Interprogetto}}.
Ha una sottopagina di configurazione: Modulo:Interprogetto/Configurazione.
Errore Lua in package.lua alla linea 80: module 'Module:HtmlBuilder' not found.
--Modulo per implementare le funzionalità di template:Interprogetto
local p = {} -- per l'esportazione delle funzioni del modulo
local HtmlBuilder = require('Module:HtmlBuilder') -- richiesto per la costruzione del markup html
local progetti={} -- dati da usare per la costruzione delle righe dell'elenco di link ai progetti
local root -- radice del markup html
local log= '' -- per debug
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)
local p=progetti
local text=''
if intext then
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] })
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)
local p=progetti
local text=''
if intext then
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 '''[[",
p.prefix[pos], '|', p.nome_progetto[pos], "]]''' contiene ", "[[", p.prefix[pos],
p.collegamento[pos], "|ricette]]", " relative a questo argomento." })
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)
local p=progetti
local text=''
if intext then
text = table.concat({'* [[File:', p.icona[pos], '|link=', p.prefix[pos], '|',
p.dimensione_icona[pos], '|Collabora a ', p.nome_progetto[pos],
"]]", ' ', "'''<span class=\"plainlinks\">[",
tostring(mw.uri.fullUrl(p.prefix[pos] .. 'Pagina principale', {uselang='it'})),
' ', 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 class=\"plainlinks\">'''", p.testo_dopo[pos] })
else
text = table.concat({'* [', tostring(mw.uri.fullUrl(p.prefix[pos] .. p.collegamento[pos], {uselang='it'})),
' ', p.nome_leftbar[pos] or p.nome_progetto[pos], ']'})
end
return text
end
local function LinkNotizia(intext, pos)
local p = progetti
local text=''
if intext then
text = table.concat({'* [[File:', p.icona[pos], '|link=', p.prefix[pos], '|',
p.dimensione_icona[pos],'|Collabora a ', p.nome_progetto[pos],
"]]", " Articolo su '''[[", p.prefix[pos], p.nome_progetto[pos], '|',
p.nome_progetto[pos], "]]''': ", "'''[[", p.prefix[pos],
p.collegamento[pos], '|', p.collegamento[pos], "]]'''" })
else
text = ''
end
return text
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..)
-- 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},
s = {2, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali ', 'di o su', '', '', true},
s2 = {3, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali ', 'di o su', '', '', true},
testo = {4, Link, 's:', 'Wikisource', false, 'Wikisource-logo.svg', '18px', 'opere originali ', 'di o su', '', '', false},
wikiquote = {5, Link, 'wikiquote:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , false},
q = {6, Link, 'q:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , true},
q2= {7, Link, 'q:', 'Wikiquote', false, 'Wikiquote-logo.svg', '18px', '', 'citazioni', 'di o su', '', '' , true},
wikibooks = {8, Link, 'wikibooks:', 'Wikibooks', false, 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', '', '' , false},
b = {9, Link, 'b:', 'Wikibooks', false, 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', '', '' , false},
ricetta = {10, LinkRicette, 'b:Libro di cucina/Ricette/', 'Wikibooks', 'Ricette', 'Wikibooks-logo.svg', '22px', '', '', '', '' , false}, --TODO rivedere
wiktionary = {11, Link, 'wiktionary:', 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', '', '«', '»', false},
wikt = {12, Link, 'wikt:', 'Wikizionario', false, 'Wiktionary small.svg', '18px', 'il lemma di dizionario', '', '«', '»', false},
v = {13, Link, 'v:', 'Wikiversità', false, 'Wikiversity-logo-It.svg', '18px', 'informazioni', 'su', '', '', false},
wikinews = {14, Link, 'wikinews:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', 'notizie di attualità', 'su', '', '', false},
n = {15, Link, 'n:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', 'notizie di attualità', 'su', '', '', false},
notizia = {16, LinkNotizia, 'n:', 'Wikinotizie', false, 'Wikinews-logo.svg', '25px', '', '', ': ', '', false},
commons = {17, LinkWithLanguage, 'commons:', 'Commons', false, 'Commons-logo.svg', '18px', 'immagini o altri file', 'su', '', '', false},
meta = {18, LinkWithLanguage, 'meta:', 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false},
m = {19, LinkWithLanguage, 'm:', 'Meta-Wiki', false, 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false},
wikispecies = {20, LinkWithLanguage, 'wikispecies:', 'Wikispecies', false, 'WikiSpecies notext.svg', '21px', 'informazioni', 'su', '', '', false},
-- incubator = {13, 'incubator:', 'Incubator', 'it', false}, --TODO
voy = {22, Link, 'voy:', 'Wikivoyage', false, 'Wikivoyage-logo.svg', '18px', 'informazioni turistiche', 'su', '', '', false}
}
-- nota oldwikisource rimosso, stando a http://toolserver.org/~kolossos/templatetiger/template-parameter.php?template=interprogetto&lang=itwiki non usato
local function trim(s)
-- ritorna la stringa senza spazi iniziali o finali
-- vedi http://lua-users.org/wiki/StringTrim
-- esempio 6 e commento ai test
return s:match'^()%s*$' and '' or s:match'^%s*(.*%S)'
end
local function sort_by_priority(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 default_value(value, default_value)
-- ritorna default_value se il valore è nil o stringa vuota
if value and value ~= '' then return value end
return default_value
end
local function RenderLeftBar()
-- Crea la barra di sinistra con i link interprogetto
--if args.notizia then return end
-- 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.priority do
local pos = progetti.priority[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()
-- produce il codice html per l'elenco puntato
for i = 1, #progetti.priority do
local pos = progetti.priority[i][2]
root.newline()
local link=progetti.link[pos]
root.wikitext(link(true, pos))
end
root.newline()
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
-- Carico i parametri
local current_page = mw.title.getCurrentTitle()
local current_title = current_page.fullText
local etichetta = default_value(origArgs.etichetta, current_page.text)
local preposizione = default_value(origArgs.preposizione, nil)
local oggetto = default_value(origArgs.oggetto, nil)
progetti ={
priority = {},
link = {},
prefix = {},
nome_progetto = {},
nome_leftbar = {},
collegamento = {},
etichetta = {},
icona = {},
dimensione_icona = {},
oggetto = {},
preposizione = {},
testo_prima = {},
testo_dopo = {},
lingua = {}
}
local pos = 0
for k, collegamento in pairs(origArgs) do
-- controlla se è un parametro posizionale e in questo caso la memorizza come
-- chiave con valore pari al nome della pagina corrente
if tonumber(k) then
k = trim(collegamento) -- elimino eventuali spazi iniziali e finali
collegamento = current_title
end
if default_parameter[k] then
pos = pos+1
progetti.priority[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] = default_value(origArgs[k .. '_etichetta'], etichetta)
progetti.icona[pos] = default_parameter[k][6]
progetti.dimensione_icona[pos] = default_parameter[k][7]
progetti.oggetto[pos] = default_value(origArgs[k .. '_oggetto'], oggetto) or default_parameter[k][8]
progetti.preposizione[pos] = default_value(origArgs[k .. '_preposizione'], preposizione) or default_parameter[k][9]
progetti.testo_prima[pos] = default_parameter[k][10]
progetti.testo_dopo[pos] = default_parameter[k][11]
if default_parameter[k][12] and origArgs[k ..'_lingua'] then
progetti.lingua[pos] = ' in lingua ' .. origArgs[k ..'_lingua'] .. ' '
else
progetti.lingua[pos] = ' '
end
end
end
root = HtmlBuilder.create()
if #progetti.priority > 0 then
table.sort(progetti.priority, sort_by_priority)
RenderLeftBar()
if not(origArgs[1]) or trim(origArgs[1])~= 'nolink' then
RenderLinksInText()
end
end
return tostring(root)
end
return p