Modulo:Nota disambigua

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Questo modulo implementa il template {{nota disambigua}}. Richiamarlo nel template con

<includeonly>{{#invoke:Nota disambigua|main}}</includeonly>

--[[
* Modulo che implementa le funzionalità del template {{Nota disambigua}}.
]]

require('strict')

local p = {}

-- Parsifica un argomento del template (rappresenta il titolo di una pagina)
-- e ne ritorna il wikilink.
-- (Adattato da [[Modulo:Vedi anche]])
local function parseArg(arg)
    
    -- trim e rimuove eventuali parentesi preesistenti
    arg = arg:match('^%s*%[%[(.-)%]%]%s*$') or arg    
    -- rimuove eventuali pipe inserite tramite {{!}}
    arg = arg:match('(.*)|') or arg
    -- sostituisce le HTML entity
    arg = mw.text.decode(arg)
        
    return "'''[[" .. arg .. "]]'''"
end

-- Restituisce true se una stringa è nil o contiene solo whitespace
local function isEmpty(s)
    return s == nil or s:find('^%s*$')
end

-- Costruisce l'HTML per contenere i wikilink alle pagine.
-- (Adattato da [[Modulo:Vedi anche]])
local function buildHTML(wikitext, with_noprint)
    local tableStyle = {
        ['margin-bottom'] = '.5em',
        border = '1px solid #CCC',
        ['text-align'] = 'left',
        ['font-size'] = '95%',
        background = 'transparent'
    }
    local tableNode = mw.html.create('table')
    tableNode
        :addClass(with_noprint and 'noprint' or nil)
        :css(tableStyle)
        :tag('tr')
            :tag('td')
                :css('padding', '0 .5em')
                :wikitext('[[Immagine:Nota disambigua.svg|18px|link=|alt=bussola]]')
                :done()
            :tag('td')
                :css('width', '100%')
                :css('font-style', 'italic')
                :wikitext("[[Aiuto:Disambiguazione|Disambiguazione]] &ndash; " .. wikitext)
                :done()

    return tostring(tableNode)    
end

-- Entry-point per {{Nota disambigua}}
function p.main(frame)
    
    local pargs = frame:getParent().args
    
    local argDescrizione = pargs["descrizione"] or pargs[1]
    local argTitolo      = pargs["titolo"]      or pargs[2]
    local argRedirect    = pargs["redirect"]    or pargs[3]
        
    local wikitext
    local descrizione  = ""
    local redirect     = ""
    local titolo       = ""
    local errorCat     = ""
    local pagename     = mw.title.getCurrentTitle().text -- titolo pagina corrente
    
    -- il template non va inserito nelle pagine che contengono un disambiguante
    if pagename:find(' %(') and not pargs["nocat"] then
        errorCat = "[[Categoria:Errori di compilazione del template Nota disambigua]]"
    end
    
    -- controlla parametro redirect
    if not isEmpty(argRedirect) then
        redirect = "\"" .. argRedirect .. "\" rimanda qui. "
        -- segnala errore se il redirect è uguale al titolo della pagina corrente
        if argRedirect:lower() == pagename:lower() and not pargs["nocat"] then
            errorCat = "[[Categoria:Errori di compilazione del template Nota disambigua]]"
        end
    end
    
    -- descrizione
    if isEmpty(argDescrizione) then
        descrizione = "altri significati" -- default
    else
        descrizione = argDescrizione
    end
    
    local titoli = {}  -- elenco di link da inserire
    local lastTitolo    -- ultimo link (serve l'iniziale per la congiunzione)
    local congiunzione -- congiunzione alla fine della lista di link
    
    -- titolo
    if not isEmpty(argTitolo) then
        titoli[1] = parseArg(argTitolo)
    else
        -- default
        titoli[1] = "'''[[" .. pagename .." (disambigua)]]'''"
    end
    
    -- altri link eventuali
    local index = 2
    local label = "titolo2"
    while not isEmpty(pargs[label]) do
        titoli[#titoli + 1] = parseArg(pargs[label])
        lastTitolo = titoli[#titoli]
        index = index + 1
        label = "titolo" .. index
    end

    -- determina congiunzione
    if #titoli > 1 and lastTitolo then
        -- sub(6, 6) è la prima lettera dopo tripli apici e parentesi quadre
        congiunzione = mw.ustring.lower(lastTitolo:sub(6, 6)) == 'e' and 'ed' or 'e'
        congiunzione = '&#32;' .. congiunzione .. '&#32;'
    end
    
    -- costruisci lista di link
    titolo = mw.text.listToText(titoli, ',&#32;', congiunzione)
    
    wikitext = redirect .. "Se stai cercando " .. descrizione .. ", vedi " .. titolo .. "."

    return errorCat .. buildHTML(wikitext, true)
end

return p