Modulo:Interprogetto

Da Wikivoyage.
Jump to navigation Jump to search

La documentazione per questo modulo può essere creata in Modulo:Interprogetto/man

--Modulo per implementare le funzionalità di template:Interprogetto

local p = {} -- per l'esportazione delle funzioni del modulo

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(pos)
    -- Restituisce il link nel caso normale di collegamento (progetto senza interfaccia in lingua)
    local p=progetti
    local text=''
    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] })
    return text
end

local function LinkRicette(pos)
    -- Restituisce il link per le ricette su wikibook
    local p=progetti
    local text=''
    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 '''[[b:|Wikibooks]]''' contiene [[",  p.prefix[pos],
                    p.collegamento[pos], "|ricette]]", " relative a questo argomento." })
    return text
end


local function LinkWithLanguage(pos)
    -- Restituisce il link verso progetti con interfaccia in lingua (seleziona automaticamente quella italiana)
    local p=progetti
    local text=''
    main_page_link=tostring(mw.uri.fullUrl(p.prefix[pos] .. 'Pagina principale', {uselang='it'}))
    text = table.concat({'* [[File:', p.icona[pos], '|link=', main_page_link, '|',
                     p.dimensione_icona[pos], '|Collabora a ', p.nome_progetto[pos],
                    "]]", ' ',  "'''<span class=\"plainlinks\">[",
                    main_page_link, ' ', 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>'''", p.testo_dopo[pos] })
    return text
end

local function LinkIncubator(pos)
    -- Restituisce il link verso progetti per incubator
    local p=progetti
    local text=''
    local prefix = {
        wikipedia = 'Wp',
        wiktionary = 'Wt',
        wikizionario= 'Wt',
        wikibooks= 'Wb',
        wikinews= 'Wn',
        wikinotizie= 'Wn',
        wikiquote= 'Wq',
    }

    local oggetto = p.oggetto[pos]
    if not prefix[oggetto] then oggetto='wiktionary' end
    local collegamento = tostring(mw.uri.fullUrl(table.concat({'incubator:', prefix[oggetto],
                                        '/', p.collegamento[pos]}), {uselang='it'}))
    local main_page_incubator=tostring(mw.uri.fullUrl(':incubator:Main_Page/it', {uselang='it'}))
    local main_page_progetto = ''
    if oggetto == 'wiktionary' then
        main_page_progetto = '[[w:Wiktionary|Wikizionario]]'
    else
        main_page_progetto = table.concat({'[[', oggetto, ':|', oggetto:gsub("^%l", string.upper), ']]'})
    end
    text = table.concat({'* [[File:', p.icona[pos], '|link=', main_page_incubator, '|',
                         p.dimensione_icona[pos], "|Collabora a Incubator]] '''<span class=\"plainlinks\">[",
                        main_page_incubator, " Incubator]</span>''' contiene un test su ",
                        main_page_progetto, ' ',
                        p.preposizione[pos], add_space(p.preposizione[pos]),
                        '<span class="plainlinks">[', collegamento, ' ', p.etichetta[pos], ']</span>' })
    return text
end

function Link_vuoto(pos)
    -- per il parametro notizia, non dovrebbe mai essere chiamato, ma giusto in caso restituisce
    -- una stringa vuota
    return ''
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
--   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..),
--                          se è false non viene sostituita
--   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 ={
    w =              {1, Link, 'w:', 'Wikipedia', 'Wikipedia-logo-v2.svg', '18px', 'una voce', 'riguardante', '', '', false, "'''Wikipedia''' contiene una voce riguardante", "http://it.wikipedia.org"},
    wikisource =     {2, Link, 'wikisource:', 'Wikisource', 'Wikisource-logo.svg', '18px', 'opere originali', 'di o su', '', '', false, "'''Wikisource''' contiene opere originali in inglese: ", 'http://en.wikisource.org'},
    s =              {3, Link, 's:', 'Wikisource', 'Wikisource-logo.svg', '18px', 'opere originali', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
    testo =          {4, Link, 's:', 'Wikisource', 'Wikisource-logo.svg', '18px', 'il testo completo', 'di o su', '', '', true, "'''Wikisource''' contiene opere originali: ", "http://it.wikisource.org"},
    wikiquote =      {5, Link, 'wikiquote:', 'Wikiquote', 'Wikiquote-logo.svg', '18px', 'citazioni', 'di o su', '', '' , false, "'''Wikiquote''' contiene citazioni in inglese: ", "http://en.wikiquote.org"},
    q =              {6, Link, 'q:', 'Wikiquote', 'Wikiquote-logo.svg', '18px',  'citazioni', 'di o su', '', '' , true, "'''Wikiquote''' contiene citazioni: ", "http://it.wikiquote.org"},
    wikibooks =      {8, Link, 'wikibooks:', 'Wikibooks', 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali: ", "http://en.wikibooks.org"},
    b =              {29, Link, 'b:', 'Wikibooks', 'Wikibooks-logo.svg', '22px', 'testi o manuali', 'su', '', '' , false, "'''Wikibooks''' contiene testi o manuali in inglese:", "http://it.wikibooks.org"},
    ricetta =        {10, LinkRicette, 'b:Libro di cucina/Ricette/', 'Wikibooks', 'Wikibooks-logo.svg', '22px', '', '', '', '' , false, "'''Wikibooks''' contiene la ricetta: ", "http://it.wikibooks.org"},
    wiktionary =     {11, Link, 'wiktionary:', 'Wikizionario', 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene la voce di dizionario:", "http://it.wiktionary.org"},
    wikt =           {12, Link, 'wikt:', 'Wikizionario', 'Wiktionary small.svg', '18px', 'il lemma di dizionario', false, '«', '»', false, "'''Wikizionario''' contiene la voce di dizionario in inglese: ", "http://en.wiktionary.org"},
    v =              {17, Link, 'v:', 'Wikiversità', 'Wikiversity-logo-It.svg', '18px', 'informazioni', 'su', '', '', false, "'''Wikiversità''' contiene informazioni: ", "http://it.wikiversity.org"},
    wikinews =       {18, Link, 'wikinews:', 'Wikinotizie', 'Wikinews-logo.svg', '25px', 'notizie di attualità', 'su', '', '', false, "'''Wikinotizie''' contiene notizie di attualità in inglese: ", "http://en.wikinews.org"},
    n =              {19, Link, 'n:', 'Wikinotizie', 'Wikinews-logo.svg', '25px', 'notizie di attualità', 'su', '', '', false, "'''Wikinotizie''' contiene notizie di attualità: ", "http://it.wikinews.org"},
    commons =        {20, LinkWithLanguage, 'commons:', 'Commons', 'Commons-logo.svg', '18px', 'immagini o altri file', 'su', '', '', false, "'''Wikimedia Commons''' contiene file multimediali: ", "http://commons.wikimedia.org"},
    meta =           {22, LinkWithLanguage, 'meta:', 'Meta-Wiki', 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Meta-Wiki''' contiene informazioni: ", "http://meta.wikimedia.org"},
    m =              {23, LinkWithLanguage, 'm:', 'Meta-Wiki', 'Wikimedia Community Logo.svg', '18px', 'informazioni', 'su', '', '', false, "'''Meta-Wiki''' contiene informazioni: ", "http://meta.wikimedia.org"},
    wikispecies =    {24, LinkWithLanguage, 'wikispecies:', 'Wikispecies', 'WikiSpecies notext.svg', '21px', 'informazioni', 'su', '', '', false, "'''Wikispecies''' contiene informazioni: ", "http://species.wikimedia.org"},
    incubator =      {30, LinkIncubator, 'incubator:', 'Incubator', 'Incubator-notext.svg', '18px', '[[wikipedia]]', 'in', '', '', false, " '''Wikimedia''' Incubator contiene un test: ", "http://incubator.wikimedia.org"},
    notizia =        {0,  Link_vuoto, 'n:', 'Wikinotizie', 'Wikinews-logo.svg', '25px', '', '', ': ', '', false, "'''Wikinotizie''' contiene notizie di attualità: ", 'http://it.wikinews.org'},
}

local serial_parameter = {
    w = 'w',
    wiktionary = 'wiktionary',
    commons = 'commons',
    s = 's',
    q = 'wikiquote',
}
-- nota oldwikisource rimosso, stando a http://toolserver.org/~kolossos/templatetiger/template-parameter.php?template=interprogetto&lang=itwiki non usato

local function sort_by_first(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 RenderLinksInText()
    -- Scandisce la tabella progetti e produce il codice html per l'elenco puntato
    for i = 1, #progetti.ordine  do
        local pos = progetti.ordine[i][2]
        root:newline()
        local link=progetti.link[pos]
        root:wikitext(link(pos))
    end
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 = origArgs.etichetta or current_page.text
    local preposizione = origArgs.preposizione
    local oggetto = origArgs.oggetto

    progetti ={
        ordine = {},
        link     = {},
        prefix   = {},
        nome_progetto = {},
        nome_leftbar = {},
        collegamento = {},
        etichetta = {},
        icona = {},
        dimensione_icona = {},
        oggetto = {},
        preposizione = {},
        testo_prima = {},
        testo_dopo = {},
        lingua = {},
        messaggio_stampa = {},
        base_url = {}

    }
    local pos = 0
    local notizia_presente = false
    local incubator_without_value = false
    -- Scandisco tutti gli argomenti per costruire una tabella in cui ad ogni riga corrisponde un link
    -- a un altro progetto con le opzioni che sono state settate per quel progetto
    for k, collegamento in pairs(origArgs) do
        -- controlla se è un parametro posizionale e in questo caso usa il suo valore come nome del
        -- progetto a cui puntare, con pagina corrispondente a quella  della pagina corrente
        -- in cui è inserito il template
        if collegamento == nil then collegamento = "" end
        if tonumber(k) then
            k = mw.text.trim(collegamento) -- elimino eventuali spazi iniziali e finali
            collegamento = ''
            if k == 'incubator' then
                k = ''
                incubator_without_value = true -- se incubator non è valorizzato loggo l'errore
            end
        end
        -- testo se è un parametro seriale e in questo caso loggo il numero di indice
        local parameter_index = string.match(k, '%d')
        local offset_ordine = 0
        if parameter_index then
            local base_k = string.gsub(k, '%d', '')
            if serial_parameter[base_k] then
                k = serial_parameter[base_k]
                offset_ordine = tonumber(parameter_index) * 100
                if collegamento == "" then
                    collegamento = origArgs['collegamento' .. parameter_index] or current_title
                end
            else
                parameter_index = ""
            end
        else
            parameter_index = ""
        end
        if collegamento == '' then collegamento = current_title end
        -- se k corrisponde a un progetto inserito in default_parameter aggiungo una riga alla tabella
        -- progetti con i parametri da usare per visualizzare i collegamenti
        if default_parameter[k] then
            pos = pos+1
            progetti.ordine[pos] = {default_parameter[k][1]+offset_ordine, pos}
            progetti.link[pos] = default_parameter[k][2]
            progetti.prefix[pos] =  default_parameter[k][3]
            progetti.nome_progetto[pos] = default_parameter[k][4]
            progetti.collegamento[pos] = collegamento
            progetti.etichetta[pos] =  origArgs[k .. parameter_index .. '_etichetta'] or
                                       origArgs['etichetta' .. parameter_index] or etichetta
            progetti.icona[pos] = default_parameter[k][5]
            progetti.dimensione_icona[pos] = default_parameter[k][6]
            progetti.oggetto[pos]  = origArgs[k .. parameter_index .. '_oggetto'] or
                                     origArgs['oggetto' .. parameter_index] or oggetto or
                                     default_parameter[k][7]
            if default_parameter[k][8] then
                progetti.preposizione[pos] = origArgs[k .. parameter_index .. '_preposizione'] or
                                             origArgs['preposizione' .. parameter_index] or
                                             preposizione or default_parameter[k][8]
            else
                progetti.preposizione[pos] = ''
            end
            progetti.testo_prima[pos] = default_parameter[k][9]
            progetti.testo_dopo[pos] = default_parameter[k][10]
            if k=='notizia' then
                notizia_presente = true
                if origArgs.data then
                    progetti.testo_dopo[pos] = table.concat({' <small>', origArgs.data, '</small>'})
                end
            end
            if default_parameter[k][11] and origArgs[k .. parameter_index .. '_lingua'] then
                progetti.lingua[pos] = table.concat({' in lingua ', origArgs[k ..'_lingua'], ' '})
            else
                progetti.lingua[pos] = ' '
            end
            progetti.messaggio_stampa[pos] = default_parameter[k][12]
            progetti.base_url[pos] = default_parameter[k][13]
        end
    end
    root = mw.html.create()
    if notizia_presente then -- gestisco il parametro "notizia" a parte
        if #progetti.ordine>1 then
            root:wikitext('<strong class="error">Errore: il parametro "notizia" se presente deve essere unico</strong>[[categoria:Errori del template Interprogetto]]')
        else
            root:wikitext(table.concat({'* [[File:', progetti.icona[1], '|link=', progetti.prefix[1], '|',
                         progetti.dimensione_icona[1],'|Collabora a ', progetti.nome_progetto[1],
                        "]]", " Articolo su '''[[", progetti.prefix[1], progetti.nome_progetto[1], '|',
                        progetti.nome_progetto[1], "]]''': ", "'''[[",  progetti.prefix[1],
                        progetti.collegamento[1], '|', progetti.collegamento[1], "]]'''", progetti.testo_dopo[1] }))

        end
    else
        if #progetti.ordine > 0 then
            table.sort(progetti.ordine, sort_by_first)
            if not(origArgs[1]) or mw.text.trim(origArgs[1])~= 'nolink'  then
                RenderLinksInText()
            end
        end
    end
    if incubator_without_value  then
        root:wikitext('<strong class="error">Errore: il parametro "incubator" deve essere valorizzato</strong>[[categoria:Errori del template Interprogetto]]')
    end
    return tostring(root)
end

return p