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
--TODO gestione speciale per notizia
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
-- Valori di default dei parametri
-- priorità, un numero intero (più basso è prima compare il link al progetto)
-- prefisso_progetto, prefisso del progetto
-- nome_progetto,
-- nome_leftbar, nome da usare per il collegamento nella barra di sinistra (falso o quello da premettere al nome progetto)
-- lingua del progetto, vero se si deve impostare la lingua dell'interfaccia a 'it'
-- logo del progetto
-- dimensioni del logo
-- testo_iniziale, eventuale testo prima del link al progetto (per ricette)
-- etichetta standard per il contenuto ('opere originali', 'testi o manuali', ecc..)
-- testo standard che identifica il contenuto ('opere originali', 'ricette', ecc..)
-- virgolette di apertura intorno all'etichetta
-- virgolette di chiusura intorno all'etichetta
-- lingua originale, lingua di un testo linkato (falso se non è possibile impostarla, '' altrimenti)
local default_parameter ={
wikisource = {1, 'wikisource:', 'Wikisource', false, false, 'Wikisource-logo.svg', '18px', ' ', 'opere originali ', 'di o su', '', '', false},
s = {1, 'wikisource:', 'Wikisource', false, false, 'Wikisource-logo.svg', '18px', ' ', 'opere originali ', 'di o su', '', '', true},
testo = {2, 's:', 'Wikisource', false, false, 'Wikisource-logo.svg', '18px', ' ', 'opere originali ', 'di o su', '', '', false},
wikiquote = {3, 'q:', 'Wikiquote', false, false, 'Wikiquote-logo.svg', '18px', ' ', 'citazioni', 'di o su', '', '' , false},
wikibooks = {4, 'wikibooks:', 'Wikibooks', false, false, 'Wikibooks-logo.svg', '22px', ' ', 'testi o manuali', 'su', '', '' , false},
ricetta = {5, 'b:Libro di cucina/Ricette/', 'Wikibooks', 'Ricette', false, 'Wikibooks-logo.svg', '22px', " Il ''[[b:Libro di cucina|Libro di cucina]]'' di ", 'ricette', 'relative a questo argomento', '', '' , false}, --TODO rivedere
wiktionary = {6, 'wiktionary:', 'Wikizionario', false, false, 'Wiktionary small.svg', '18px', ' ', 'il lemma di dizionario', false, '«', '»', false},
v = {7, 'v:', 'Wikiversità', false, false, 'Wikiversity-logo-It.svg', '18px', ' ', 'informazioni', 'su', '', '', false},
wikinews = {8, 'wikinews:', 'Wikinotizie', false, false, 'Wikinews-logo.svg', '25px', ' ', 'notizie di attualità', 'su', '', '', false},
commons = {9, 'commons:', 'Commons', false, true, 'Commons-logo.svg', '18px', ' ', 'immagini o altri file', 'su', '', '', false},
meta = {11, 'meta:', 'Meta-Wiki', false, true, 'Wikimedia Community Logo.svg', '18px', ' ', 'informazioni', 'su', '', '', false},
wikispecies = {12, 'wikispecies:', 'Wikispecies', false, true, 'WikiSpecies notext.svg', '21px', ' ', 'informazioni', 'su', '', '', false},
-- incubator = {13, 'incubator:', 'Incubator', 'it', false},
voy = {14, 'voy:', 'Wikivoyage', false, false, 'Wikivoyage-logo.svg', '18px', ' ', 'informazioni turistiche', 'su', '', '', false}
, 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 add_space(s)
--ritorna uno spazio se l'ultimo carattere non è un accento o un "«"
if mw.ustring.sub(s, -1) == "'" or mw.ustring.sub(s, -1)=='«' then
return ''
else
return ' '
end
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
local leftbar = HtmlBuilder.create()
for k, progetto in pairs(progetti) do
priority, prefix, nome_progetto, nome_leftbar, lang, etichetta = unpack(progetto)
if lang then
leftbar.wikitext(table.concat({'* [', tostring(mw.uri.fullUrl(prefix .. etichetta, {uselang='it'})),
' ', nome_leftbar or nome_progetto, ']'}))
else
leftbar.wikitext(table.concat({'* [[', prefix, etichetta, '|', nome_leftbar or nome_progetto, ']]'}))
end
if nome_leftbar then
leftbar.wikitext(table.concat({'<br />(', nome_progetto, ')'}))
end
leftbar.newline()
end
-- Apertura del tag div id="interProject" (vedi [[Mediawiki:Monobook.js]] o [[Mediawiki:Vector.js]])
root
.tag('div')
.attr('id', 'interProject')
.cssText('display: none; clear: both; border-top: 2px dotted #AAAAAA; margin-top: 2em')
.tag('div')
.attr('title', 'Collegamenti verso gli altri progetti Wikimedia')
.node(leftbar)
end
local function RenderLinkInText()
-- produce il codice html per l'elenco puntato
for k, progetto in pairs(progetti) do
_, prefix, nome_progetto, _, lingua_interfaccia, etichetta, icona, dimensione_icona, testo_iniziale, opere, preposizione,
vapri, vchiudi, lingua = unpack(progetto)
root.newline()
if lingua_interfaccia then
root.wikitext(table.concat({'* [[File:', icona, '|link=', prefix, '|', dimensione_icona, '|Collabora a ', nome_progetto,
"]]", testo_iniziale, "'''<span class=\"plainlinks\">[", tostring(mw.uri.fullUrl(prefix .. 'Pagina principale',
{uselang='it'})), ' ', nome_progetto, "]</span>''' contiene ", opere, ' ', preposizione,
add_space(preposizione), vapri, "'''<span class=\"plainlinks\">[",
tostring(mw.uri.fullUrl(prefix .. etichetta, {uselang='it'})), ' ',
etichetta, "]<span class=\"plainlinks\">'''", vchiudi }))
else
root.wikitext(table.concat({'* [[File:', icona, '|link=', prefix, '|', dimensione_icona,'|Collabora a ', nome_progetto,
"]]", testo_iniziale, "'''[[", prefix, nome_progetto, '|', nome_progetto, "]]''' contiene ", opere, ' ', lingua,
preposizione, add_space(preposizione), vapri, "'''[[", prefix, etichetta, '|',
etichetta, "]]'''", vchiudi }))
end
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 etichetta = default_value(origArgs.etichetta, mw.title.getCurrentTitle().text)
local preposizione = default_value(origArgs.preposizione, nil)
local oggetto = default_value(origArgs.oggetto, nil)
for k, v 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
local progetto = {}
if tonumber(k) then
k = trim(v) -- elimino eventuali spazi iniziali e finali
v = etichetta
end
if default_parameter[k] then
table.insert(progetto, default_parameter[k][1]) --priority
table.insert(progetto, default_parameter[k][2]) -- prefix
table.insert(progetto, default_parameter[k][3]) -- nome progetto
table.insert(progetto, default_parameter[k][4]) -- nome leftbar
table.insert(progetto, default_parameter[k][5]) -- si deve impostare o meno la lingua dell'interfaccia
table.insert(progetto, default_value(origArgs[k .. '_etichetta'], etichetta))
table.insert(progetto, default_parameter[k][6]) -- icona
table.insert(progetto, default_parameter[k][7]) -- dimensione icona
table.insert(progetto, default_parameter[k][8])
table.insert(progetto, default_value(origArgs[k .. '_oggetto'], oggetto) or default_parameter[k][9])
if default_parameter[k][10] then -- se la preposizione di default ha valore false (piuttosto che essere una stringa non la sostituisco)
table.insert(progetto, default_value(origArgs[k .. '_preposizione'], preposizione) or default_parameter[k][10])
else
table.insert(progetto, '')
end
table.insert(progetto, default_value(origArgs[k .. 'lingua'] or falso))
table.insert(progetto, default_parameter[k][11]) -- virgolette di apertura intorno all'etichetta
table.insert(progetto, default_parameter[k][12]) -- virgolette di chiusura intorno all'etichetta
if default_parameter[k][13] and origArgs[k ..'_lingua']then
table.insert(progetto, ' in lingua ' .. origArgs[k ..'_lingua'] .. ' ')
else
table.insert(progetto, '')
end
table.insert(progetti, progetto)
end
end
table.sort(progetti, sort_by_priority)
root = HtmlBuilder.create()
RenderLeftBar()
if not origArgs.nolink then
RenderLinkInText()
end
return tostring(root)
end
return p