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

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