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
 
-- default_parameter: contiene i valori di default dei parametri
--   priorità: ordine di priorità in cui visualizzare il link (un numero intero)
--   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)
--   lingua del progetto: da usare per i progetti che prevedono la specifica della lingua di interfaccia
--                        per esempio commons. Cambia il modo in cui è costruito il link. Da impostare
--                        a falso se non serve, altrimenti da mettere a true (viene usato automaticamente
--                          l'italiano)
--   etichetta: se diversa da falso significa che l'etichetta del link deve essere una stringa fissa,
--              altrimenti deve essere uguale al nome della pagina o al valore impostato dal parametro
--              (usata da wikiricette che visualizza sempre "ricette" come etichetta per il collegamento)
--   logo del progetto: nome del file che contiene il logo del progetto
--   dimensioni del logo: dimensioni da usare per il logo
--   testo_iniziale: eventuale testo prima del testo standard nel testo. Una stringa vuota, altrimenti
--                   il testo da usare (usato da wikiricette)
--   etichetta contenuto standard: per il contenuto ('opere originali', 'testi o manuali', ecc..). 
--                                 Se invece di essere una stringa è impostato a false non inserisce
--                                 nulla e non viene modificato dai parametri della chiamata.
--   preposizione standard: da mettere prima dell'etichetta ('di o su', 'relative a questo argomento', ecc..)
--                          Se invece di essere una stringa è impostato a false non inserisce
--                          nulla e non viene modificato dai parametri della chiamata.
--   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 (falso se non è possibile impostarla, '' altrimenti,
--                      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, 'wikisource:', 'Wikisource', false, false, false, 'Wikisource-logo.svg', '18px', '', 'opere originali ', 'di o su', '', '', false},
    s =              {1, 's:', 'Wikisource', false, false,  false, 'Wikisource-logo.svg', '18px', '', 'opere originali ', 'di o su', '', '', true},
    s2 =             {1, 's:', 'Wikisource', false, false,  false, 'Wikisource-logo.svg', '18px', '', 'opere originali ', 'di o su', '', '', true},
    testo =          {2, 's:', 'Wikisource', false, false,  false, 'Wikisource-logo.svg', '18px', '', 'opere originali ', 'di o su', '', '', false}, 
    wikiquote =      {3, 'wikiquote:', 'Wikiquote', false, false,  false, 'Wikiquote-logo.svg', '18px', '', 'citazioni', 'di o su', '', '' , false},
    q =              {3, 'q:', 'Wikiquote', false, false,  false, 'Wikiquote-logo.svg', '18px', '', 'citazioni', 'di o su', '', '' , true},
    q2=              {3, 'q:', 'Wikiquote', false, false,  false, 'Wikiquote-logo.svg', '18px', '', 'citazioni', 'di o su', '', '' , true},
    wikibooks =      {4, 'wikibooks:', 'Wikibooks', false, false,  false, 'Wikibooks-logo.svg', '22px', '', 'testi o manuali', 'su', '', '' , false},
    b =              {4, 'b:', 'Wikibooks', false, false,  false, 'Wikibooks-logo.svg', '22px', '', 'testi o manuali', 'su', '', '' , false},
    ricetta =        {5, 'b:Libro di cucina/Ricette/', 'Wikibooks', 'Ricette', false,  'ricette', 'Wikibooks-logo.svg', '22px', "Il ''[[b:Libro di cucina|Libro di cucina]]'' di ", false, false, '', ' relative a questo argomento' , false}, --TODO rivedere
    wiktionary =     {6, 'wiktionary:', 'Wikizionario', false, false,  false, 'Wiktionary small.svg', '18px', '', 'il lemma di dizionario', false, '«', '»', false}, 
    wikt =           {6, 'wikt:', 'Wikizionario', false, false,  false, 'Wiktionary small.svg', '18px', '', 'il lemma di dizionario', false, '«', '»', false}, 
    v =              {7, 'v:', 'Wikiversità', false, false,  false, 'Wikiversity-logo-It.svg', '18px', '', 'informazioni', 'su', '', '', false},
    wikinews =       {8, 'wikinews:', 'Wikinotizie', false, false,  false, 'Wikinews-logo.svg', '25px', '', 'notizie di attualità', 'su', '', '', false},
    commons =        {9, 'commons:', 'Commons', false, true,  false, 'Commons-logo.svg', '18px', '', 'immagini o altri file', 'su', '', '', false},
    meta =           {11, 'meta:', 'Meta-Wiki', false, true,  false, 'Wikimedia Community Logo.svg', '18px', '', 'informazioni', 'su', '', '', false},
    wikispecies =    {12, 'wikispecies:', 'Wikispecies', false, true,  false, 'WikiSpecies notext.svg', '21px', '', 'informazioni', 'su', '', '', false},
--    incubator =      {13, 'incubator:', 'Incubator', 'it', false},
    voy =            {14, 'voy:', 'Wikivoyage', false, 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
            if default_parameter[k][6] then -- se inserire una descrizione standard per l'etichetta piuttosto che il valore impostato nei parametri
                table.insert(progetto, default_parameter[k][6]) 
            else
                table.insert(progetto, default_value(origArgs[k .. '_etichetta'], etichetta))
            end
            table.insert(progetto, default_parameter[k][7]) -- icona
            table.insert(progetto, default_parameter[k][8]) -- dimensione icona
            table.insert(progetto, default_parameter[k][9])
            if default_parameter[k][10] then -- se l'etichetta di contenuto di default ha valore false (piuttosto che essere una stringa non la sostituisco)
                table.insert(progetto, default_value(origArgs[k .. '_oggetto'], oggetto) or default_parameter[k][10])
            else
                table.insert(progetto, '')
            end
            if default_parameter[k][11] 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][11])
            else
                table.insert(progetto, '')
            end
            table.insert(progetto, default_value(origArgs[k .. 'lingua'] or false))
            table.insert(progetto, default_parameter[k][12]) -- testo immediatamente prima del collegamento
            table.insert(progetto, default_parameter[k][13]) -- testo immediatamente dopo il collegamento
            if default_parameter[k][14] 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