Info Istruzioni per l'uso
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