Info Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Bio/man (modifica · cronologia)
Sandbox: Modulo:Bio/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Bio/test (modifica · cronologia · esegui)

Modulo Lua che implementa le funzionalità del Template:Bio.

Ha le seguenti sottopagine di configurazione:

  • Configurazione: parametri di configurazione principali
  • Link attività: tabella di conversione per il link all'attività
  • Ex attivita: tabella contenente le attività ammesse col prefisso "ex"
  • Link nazionalità: tabella di conversione per il link alla nazionalità
  • Plurale attività: tabella di conversione per il plurale dell'attività
  • Plurale nazionalità: tabella di conversione per il plurale della nazionalità
  • Plurale attività genere: tabella di conversione da singolare maschile e femminile al plurale maschile e femminile
  • Parametri: tabella per configurare i parametri accettati dal modulo e i rispettivi valori validi
  • Cat luoghi: tabella di casi particolari per le categorie "Nati/morti a [luogo]"

Funzionamento interno

Lo schema seguente rappresenta l'ordine in cui vengono chiamate le principali funzioni, facendo riferimento a dei parametri di esempio:

{{Bio
|Nome = Giulia
|Cognome = Rossi
|Sesso = F
|LuogoNascita = Roma
|GiornoMeseNascita = 15 gennaio
|AnnoNascita = 1910
|LuogoMorte = Firenze
|GiornoMeseMorte = 15 febbraio
|AnnoMorte = 1990
|Attività = scienziata
|Nazionalità = italiana
}}



--[[
* Modulo per implementare le funzionalità di Bio
* Traduce in lua:
* Template:Bio
* Template:Bio/categorie_attività
* Template:Bio/cat
* Template:Bio/catnatimorti
* Template:Bio/epoca
* Template:Bio/articolo
* Template:Bio/articolo_F
* Template:Bio/link attività
* Template:Bio/link nazionalità
* Template:Bio/plurale_attività
* Template:Bio/plurale_nazionalità
* Template:Bio/warning_A
* Template:Bio/warning_N
* Template:Primo del mese
*
* utilizza:
* Template:Avviso
]]

local p = {}          -- per l'esportazione delle funzioni del modulo
local args            -- argomenti passati al template
local textTable = {}  -- table per contenere la risposta da ritornare
local SPACE = " " -- HTML Entity Code per lo spazio

-- configurazione
local cfg = mw.loadData("Modulo:Sandbox/Rotpunkt/Bio/Configurazione")
local link_attivita = mw.loadData("Modulo:Sandbox/Rotpunkt/Bio/Link attività")
local link_nazionalita = mw.loadData("Modulo:Sandbox/Rotpunkt/Bio/Link nazionalità")
local plurale_attivita = mw.loadData("Modulo:Sandbox/Rotpunkt/Bio/Plurale attività")
local plurale_nazionalita = mw.loadData("Modulo:Sandbox/Rotpunkt/Bio/Plurale nazionalità")

-------------------------------------------------------------------------------
--                           Funzioni di utilità
-------------------------------------------------------------------------------

-- aggiunge testo alla risposta, svolge anche la funzione di concatenatore
local function dumpText(...)
    local arg = {...}
    for _, val in ipairs(arg) do
        textTable[#textTable + 1] = val
    end
end

-- aggiunge una categoria alla risposta
local function dumpCategory(category)
    dumpText("[[Categoria:", category, "]]")
end

-- aggiunge un wlink alla risposta, label è opzionale per i piped link
local function dumpWlink(page, label)
    -- se page è nil chiudo comunque le parentesi
    page = page or ""
    if label then
       dumpText("[[", page, "|", label, "]]")
    else    
       dumpText("[[", page, "]]")
    end
end

-- aggiunge una immagine alla risposta
local function dumpImage(name, size, caption)
    dumpText("[[File:", name, "|thumb|", size, "px|", caption, "]]")
end

-- aggiunge l'output del [[Template:Avviso]] alla risposta
local function dumpAvviso(tipo, immagine, immagine_a_destra, testo)
    local text

    text = mw.getCurrentFrame():expandTemplate {
    	title = "Avviso",
    	args = {
            ["tipo"] = tipo,
            ["immagine"] = immagine,
            ["immagine a destra"] = immagine_a_destra,
            ["testo"] = testo
        }
    }

    dumpText(text)
end

-- Traduzione in lua del [[Template:Primo del mese]]
-- se date inizia con "1 " o "1°" ritorna una nuova data che inizia per "1º", altrimenti date
local function fixFirstOfMonth(date)
    date = date:gsub("^1%s", "1º ")
    date = date:gsub("^1\194\176", "1º")

    return date
end

-- ritorna "ed" se nextWord inizia con "e", altrimenti "e"
local function getEufonica(nextWord)
    return nextWord:sub(1, 1) == "e" and "ed" or "e"
end

-------------------------------------------------------------------------------
--                           Bio
-------------------------------------------------------------------------------

-- Traduzione in lua del [[Template:Bio/articolo]]
local function getArticleMan(attivita)
    if cfg.articoli_maschili["uno"][attivita] then
        return "uno"
    elseif cfg.articoli_maschili["una"][attivita] then
        return "una"
    end

    return "un"
end

-- Traduzione in lua del [[Template:Bio/articolo_F]]
-- aggiunge anche uno spazio nel caso non usi l'apostrofo
local function getArticleWoman(attivita)
    if attivita and attivita:match("^[aeiou]") then
        return "un'"
    elseif cfg.articoli_femminili["un"][attivita] then
        return "un" .. SPACE
    end

    return "una" .. SPACE
end

-- Traduzione in lua del [[Template:Bio/cat]]
-- A supporto di addAttivitaCategories, aggiunge la categoria (eventualmente con l'epoca)
local function addCat(catname, epoca1, epoca2)
    local added = false

    if epoca1 and mw.title.new("Categoria:" .. catname .. " " .. epoca1).exists then
        dumpCategory(catname .. " " .. epoca1)
        added = true
    end
    if epoca2 and mw.title.new("Categoria:" .. catname .. " " .. epoca2).exists then
        dumpCategory(catname .. " " .. epoca2)
        added = true
    end
    if not added then
        -- se non è stata aggiunta la categoria per epoca1 e epoca2
        -- aggiunge la cat. semplice, e.g. "Scrittori italiani"
        dumpCategory(catname)
    end
end

-- A supporto di addAttivitaCategories, ritorna il plurale dell'attività
-- se non esiste il plurale aggiunge alla risposta un warning e ritorna nil
local function getPluralA(attivita)
    local plural

    plural = plurale_attivita[attivita]
    if not plural then
        dumpAvviso(cfg.warningA.tipo, cfg.warningA.immagine, cfg.warningA.immagine_a_destra,
                   cfg.warningA.testo .. cfg.warningA.testo2a:gsub("$1", attivita) .. cfg.warningA.testo3)
        return nil
    end

    return plural
end

-- A supporto di addAttivitaCategories, ritorna il plurale della nazionalità
-- se non esiste il plurale aggiunge alla risposta un warning e ritorna nil
local function getPluralN(nazionalita)
    local plural

    plural = plurale_nazionalita[nazionalita]
    if not plural then
        dumpAvviso(cfg.warningN.tipo, cfg.warningN.immagine, cfg.warningN.immagine_a_destra,
                   cfg.warningN.testo .. cfg.warningN.testo2a:gsub("$1", nazionalita) .. cfg.warningN.testo3)
        return nil
    end

    return plural
end

-- Traduzione in lua del [[Template:Bio/categorie attività]] con un minimo di refactoring
-- Crea le categorie: Attività nazionalità [del XYZ secolo]
local function addAttivitaCategories()
    local plurals = {} -- contiene la versione plurale dei parametri
    local epoca1, epoca2

    -- controllo argomenti necessari al plurale per le categorie
    -- (nello stesso ordine in cui avvenivano in [[Template:Bio/categorie attività]])
    if args["Nazionalità"] then
        plurals["Nazionalità"] = getPluralN(args["Nazionalità"])
    else
        dumpAvviso(cfg.warningN.tipo, cfg.warningN.immagine, cfg.warningN.immagine_a_destra,
                   cfg.warningN.testo .. cfg.warningN.testo2b .. cfg.warningN.testo3)
    end
    if args["NazionalitàNaturalizzato"] then
        plurals["NazionalitàNaturalizzato"] = getPluralN(args["NazionalitàNaturalizzato"])
    end
    if args["Cittadinanza"] then
        plurals["Cittadinanza"] = getPluralN(args["Cittadinanza"])
    end
    if args["Attività"] then
        plurals["Attività"] = getPluralA(args["Attività"])
    else
        dumpAvviso(cfg.warningA.tipo, cfg.warningA.immagine, cfg.warningA.immagine_a_destra,
                   cfg.warningA.testo .. cfg.warningA.testo2b .. cfg.warningA.testo3)
    end
    if args["Attività2"] then
        plurals["Attività2"] = getPluralA(args["Attività2"])
    end
    if args["Attività3"] then
        plurals["Attività3"] = getPluralA(args["Attività3"])
    end

    -- creazione categorie
    epoca1 = args["Epoca"] and cfg.epoche[args["Epoca"]]
    epoca2 = args["Epoca2"] and cfg.epoche[args["Epoca2"]]
    for _, val in ipairs({ "Attività", "Attività2", "Attività3" }) do
        if plurals[val] then
            if plurals["Nazionalità"] then
                addCat(plurals[val] .. " " .. plurals["Nazionalità"], epoca1, epoca2)
            end
            if plurals["NazionalitàNaturalizzato"] then
                addCat(plurals[val] .. " " .. plurals["NazionalitàNaturalizzato"], epoca1, epoca2)
            end
            if plurals["Cittadinanza"] then
                addCat(plurals[val] .. " " .. plurals["Cittadinanza"], epoca1, epoca2)
            end
        end
    end
end

-- Traduzione in lua del [[Template:Bio/catnatimorti]]
-- Crea le categorie: Nati/Morti nell'anno/giorno/luogo
local function addNatiMortiCategories()
    local cat1, cat2
	
    if args["AnnoNascita"] then
        cat1 = "Nati nel " .. args["AnnoNascita"]
        cat2 = "Nati nell'" .. args["AnnoNascita"]
        if mw.title.new("Categoria:" .. cat1).exists then
            dumpCategory(cat1)
        elseif mw.title.new("Categoria:" .. cat2).exists then
            dumpCategory(cat2)
        end
    end

    if args["AnnoMorte"] then
        cat1 = "Morti nel " .. args["AnnoMorte"]
        cat2 = "Morti nell'" .. args["AnnoMorte"]    
        if mw.title.new("Categoria:" .. cat1).exists then
            dumpCategory(cat1)
        elseif mw.title.new("Categoria:" .. cat2).exists then
            dumpCategory(cat2)
        end
    else
        dumpCategory("Persone viventi")
    end

    if args["GiornoMeseNascita"] then
        cat1 = "Nati il " .. fixFirstOfMonth(args["GiornoMeseNascita"])
        cat2 = "Nati l'" .. args["GiornoMeseNascita"]
        if mw.title.new("Categoria:" .. cat1).exists then
            dumpCategory(cat1)
        elseif mw.title.new("Categoria:" .. cat2).exists then
            dumpCategory(cat2)
        end               
    end
    
    if args["GiornoMeseMorte"] then
        cat1 = "Morti il " .. fixFirstOfMonth(args["GiornoMeseMorte"])
        cat2 = "Morti l'" .. args["GiornoMeseMorte"]
        if mw.title.new("Categoria:" .. cat1).exists then
            dumpCategory(cat1)
        elseif mw.title.new("Categoria:" .. cat2).exists then
            dumpCategory(cat2)
        end               
    end
    
    if args["LuogoNascitaLink"] then
        cat1 = "Nati a " .. args["LuogoNascitaLink"]
        cat2 = "Nati ad " .. args["LuogoNascitaLink"]
        if mw.title.new("Categoria:" .. cat1).exists then
            dumpCategory(cat1)
        elseif mw.title.new("Categoria:" .. cat2).exists then
            dumpCategory(cat2)
        end
    elseif args["LuogoNascita"] then
        cat1 = "Nati a " .. args["LuogoNascita"]
        cat2 = "Nati ad " .. args["LuogoNascita"]
        if mw.title.new("Categoria:" .. cat1).exists then
            dumpCategory(cat1)
        elseif mw.title.new("Categoria:" .. cat2).exists then
            dumpCategory(cat2)
        end
    end

    if args["LuogoMorteLink"] then
        cat1 = "Morti a " .. args["LuogoMorteLink"]
        cat2 = "Morti ad " .. args["LuogoMorteLink"]
        if mw.title.new("Categoria:" .. cat1).exists then
            dumpCategory(cat1)
        elseif mw.title.new("Categoria:" .. cat2).exists then
            dumpCategory(cat2)
        end
    elseif args["LuogoMorte"] then
        cat1 = "Morti a " .. args["LuogoMorte"]
        cat2 = "Morti ad " .. args["LuogoMorte"]
        if mw.title.new("Categoria:" .. cat1).exists then
            dumpCategory(cat1)
        elseif mw.title.new("Categoria:" .. cat2).exists then
            dumpCategory(cat2)
        end
    end
end

-- traduzione in lua di [[Template:Bio]]
local function _bio()
    local size, caption

    if mw.title.getCurrentTitle().namespace == 0 and args["Categorie"] ~= "no" then
        addAttivitaCategories()
        addNatiMortiCategories()
        dumpCategory("BioBot")
    end

    if args["Immagine"] then
        size = args["DimImmagine"] or ""
        if args["Didascalia"] then
            caption = args["Didascalia"]
        else
            caption = args["Nome"] .. " " .. args["Cognome"]
        end
        if args["Didascalia2"] then
            caption = caption .. "<hr/>" .. args["Didascalia2"]
        end
        dumpImage(args["Immagine"], size, caption)
    elseif args["Didascalia2"] then
        -- parentesi () extra per non ritornare anche il gsub.count
        dumpText( (cfg.didascalia2:gsub("$1", args["Didascalia2"])) )
    end

    if args["Titolo"] then
        dumpText(args["Titolo"], SPACE)
    end

    dumpText("'''", args["Nome"])
    if args["Cognome"] then
        dumpText(SPACE, args["Cognome"])
    end
    dumpText("'''")

    if args["PostCognomeVirgola"] then
        dumpText(",", SPACE, args["PostCognomeVirgola"])
    end

    if args["PostCognome"] then
        dumpText(SPACE, args["PostCognome"])
    end

    -- si apre la parentesi
    dumpText(SPACE, "(")

    if args["PreData"] then
         dumpText(args["PreData"], SPACE)
    end

    if args["LuogoNascita"] then
        if args["LuogoNascitaLink"] then
            dumpWlink(args["LuogoNascitaLink"])
        else
            dumpWlink(args["LuogoNascita"])
        end
        if args["LuogoNascitaAlt"] then
            dumpText(SPACE, args["LuogoNascitaAlt"])
        end
        dumpText(",", SPACE)
    end

    if args["GiornoMeseNascita"] then
        if mw.title.new(args["GiornoMeseNascita"]).exists then
            dumpWlink(args["GiornoMeseNascita"])
        else
            dumpText(args["GiornoMeseNascita"])
        end
        dumpText(SPACE)
    end

    if args["AnnoNascita"] then
        if mw.title.new(args["AnnoNascita"]).exists then
            dumpWlink(args["AnnoNascita"])
        else
            dumpText(args["AnnoNascita"])
        end
    else
        dumpText("...")
    end

    if args["NoteNascita"] then
        dumpText(args["NoteNascita"])
    end

    if args["AnnoMorte"] then
        dumpText(SPACE, "–", SPACE)
        if args["LuogoMorte"] then
            if args["LuogoMorteLink"] then
                dumpWlink(args["LuogoMorteLink"], args["LuogoMorte"])
            else
                dumpWlink(args["LuogoMorte"])
            end
            if args["LuogoMorteAlt"] then
                dumpText(SPACE, args["LuogoMorteAlt"])
            end
            dumpText(",", SPACE)
        end

        if args["GiornoMeseMorte"] then
            if mw.title.new(args["GiornoMeseMorte"]).exists then
                dumpWlink(args["GiornoMeseMorte"])
            else
                dumpText(args["GiornoMeseMorte"])
            end
            dumpText(SPACE)
        end

        if args["AnnoMorte"] then
            if args["AnnoMorte"] == "?" then
                dumpText("...")
            else
                if mw.title.new(args["AnnoMorte"]).exists then
                    dumpWlink(args["AnnoMorte"])
                else
                    dumpText(args["AnnoMorte"])
                end
            end
        end
    end

    if args["NoteMorte"] then
        dumpText(args["NoteMorte"])
    end

    -- si chiude la parentesi
    dumpText(")")

    if args["PostCognomeVirgola"] then
        dumpText(",", SPACE)
    end

    if args["FineIncipit"] ~= "," then
        dumpText(SPACE)
    end

    if args["FineIncipit"] and args["FineIncipit"] ~= "," then
        dumpText(args["FineIncipit"])
    else
        if args["PreAttività"] then
            dumpText(args["PreAttività"], SPACE)
        else
            dumpText("è", SPACE)
            if args["AnnoMorte"] then
                if args["Sesso"] == "M" then
                    dumpText("stato", SPACE)
                else
                    dumpText("stata", SPACE)
                end
            end
            if args["Sesso"] == "M" then
                dumpText(getArticleMan(args["Attività"]), SPACE)
            else
                dumpText(getArticleWoman(args["Attività"]))
            end
        end

        dumpWlink(link_attivita[args["Attività"]] or args["Attività"], args["Attività"])

        if args["Attività2"] then
            if args["Attività3"] or args["AttivitàAltre"] then
                dumpText(",")
            else
                dumpText(SPACE, getEufonica(args["Attività2"]))
            end
            dumpText(SPACE)
            dumpWlink(link_attivita[args["Attività2"]] or args["Attività2"], args["Attività2"])
        end

        if args["Attività3"] then
            if args["AttivitàAltre"] then
                dumpText(",")
            else
                dumpText(SPACE, getEufonica(args["Attività3"]))
            end
            dumpText(SPACE)
            dumpWlink(link_attivita[args["Attività3"]] or args["Attività3"], args["Attività3"])
        end

        if args["AttivitàAltre"] then
            dumpText(args["AttivitàAltre"])
        end

        dumpText(SPACE)
        dumpWlink(link_nazionalita[args["Nazionalità"]] or args["Nazionalità"], args["Nazionalità"])

        if args["Cittadinanza"] then
            dumpText(SPACE, "con cittadinanza", SPACE)
            dumpWlink(link_nazionalita[args["Cittadinanza"]] or args["Cittadinanza"], args["Cittadinanza"])
        end

        if args["NazionalitàNaturalizzato"] then
            dumpText(SPACE)
            dumpWlink("Naturalizzazione", (args["Sesso"] == "F" and "naturalizzata" or "naturalizzato"))
            dumpText(SPACE)
            dumpWlink(link_nazionalita[args["NazionalitàNaturalizzato"]] or args["NazionalitàNaturalizzato"], args["NazionalitàNaturalizzato"])
        end

        if args["PostNazionalità"] then
            dumpText(args["PostNazionalità"])
        end
    end

    if args["Punto"] ~= "no" then
        if args["FineIncipit"] ~= "e" and
           args["FineIncipit"] ~= "ed" and
           args["FineIncipit"] ~= ",=&#32;" then
            dumpText(".")
        end
    end

    return table.concat(textTable)
end

function p.bio(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

    args = {}
    for k, v in pairs(origArgs) do
        if v ~= "" then
            args[k] = v
        end
    end

    return _bio()
end

return p