Mòdulu:Bio
Aspettu
Istruzzioni pi l'usu
Chistu è un mòdulu scrittu 'n Lua. L'istruzzioni appressu sunnu nnâ suttapàggina Mòdulu:Bio/doc (cancia · crunuluggìa)
Sandbox: Mòdulu:Bio/sandbox (cancia · crunuluggìa) · Suttapàggini: lista · Test: Mòdulu:Bio/test (cancia · crunuluggìa · abbìa)
Chistu è un mòdulu scrittu 'n Lua. L'istruzzioni appressu sunnu nnâ suttapàggina Mòdulu:Bio/doc (cancia · crunuluggìa)
Sandbox: Mòdulu:Bio/sandbox (cancia · crunuluggìa) · Suttapàggini: lista · Test: Mòdulu:Bio/test (cancia · crunuluggìa · abbìa)
Mòdulu Lua pî funziunalità dû Template:Biugrafìa.
Àvi sti suttapàggini di cunfigurazzioni:
- Cunfigurazzioni: paràmitri di cunfigurazzioni principali
- Lijami attività: tabbella pâ lijami di l'attività
- Ex attività: tabbella cu l'attività pirmisi cû prifissu "ex"
- Lijami nazziunalità: tabbella pâ lijami dâ nazziunalità
- Plurali_attività: tabbella pâ virsiuni plurali di l'attività
- Plurali nazziunalità: tabbella pâ virsiuni plurali dâ nazziunalità
- Plurali attività gèniri: tabbella pi passari dû singulari masculinu o fimmininu ô plurali masculinu o fimmininu
- Paràmitri: tabbella pi cunfigurari i paràmitri accittati dû mòdulu e stabbiliri quali valuri sunnu vàliti
- Cat posti: tabbella di casi particulari pî catigurìi "Nati/morti a [locu]"
Funziunamentu
U schema appressu riprisenta comu vennu chiamati i principali funzioni, facennu rifirimentu a paràmitri di scempru:
{{Biugrafìa |Nomu = Giulia |Cugnomu = Rossi |Gèniri = F |LocuNàscita = Roma |JornuMisiNàscita = 15 di jinnaru |AnnuNàscita = 1910 |LocuMorti = Firenzi |JornuMisiMorti = 15 di frivaru |AnnuMorti = 1990 |Attività = scinziata |Nazziunalità = taliana }}
- main()
- ArgsParser:parse()
- CategoryManager:new()
- CategoryManager:_getPluralsAttivitaNazionalita() => pigghia "scinziati" di Mòdulu:Bio/Plurali_attività e "taliani" di Mòdulu:Bio/Plurali_nazziunalità
- CategoryManager:_addAttivita() => Catigurìa:Scinziati taliani
- CategoryManager:_addNatiMorti() => Catigurìa:Nati nnô 1910 Catigurìa:Morti nnô 1990 Catigurìa:Nati u 15 jinnaru Catigurìa:Morti u 15 frivaru Catigurìa:Nati a Roma Catigurìa:Morti a Firenzi
- CategoryManager:_addCategoriesWikidata()
- Incipit:new()
- Incipit:_addImmagine()
- Incipit:_addNomeCognome() => Giulia Rossi
- Incipit:_addNascitaMorte() => (Roma, 15 di jinnaru 1910 – Firenzi, 15 di frivaru 1990)
- Incipit:_addAttivita() => fu na scinziata taliana (pigghia "scinziatu" di Mòdulu:Bio/Lijami attività, e "Italia" di Mòdulu:Bio/Lijami nazziunalità)
--[[
* Modulo che implementa il template Bio.
*
* Nota: non esistendo in Lua una differenziazione tra metodi pubblici e privati,
* per convenzione, quelli privati iniziano con un underscore.
]]
require("strict")
local mString = require("Mòdulu:String")
local mWikidata = require("Mòdulu:Wikidata")
local cfg = mw.loadData("Mòdulu:Bio/Cunfigurazzioni")
local ex_attivita = mw.loadData("Mòdulu:Bio/Ex attività")
-- argomenti passati al template
local args
-- table per contenere gli errori
local errorTable = {}
-- nomi dei parametri per l'attività e la Nazziunalità
local attivitaParams = { "Attività", "Attività2", "Attività3" }
local nazionalitaParams = { "Nazziunalità", "NazziunalitàNaturalizzatu", "Cittadinanza" }
-- =============================================================================
-- Funzioni di utilità
-- =============================================================================
-- Aggiunge l'output del [[Template:Avviso]] e una categoria di warning a errorTable
local function addAvviso(testo, category)
local text
text = mw.getCurrentFrame():expandTemplate {
title = "Abbisu",
args = {
tipu = "stili",
["mmàggini"] = "[[File:Nuvola apps important.svg|40px]]",
["mmàggini a dritta"] = "[[File:Crystal Clear app Login Manager.svg|40px]]",
testu = testo
}
}
table.insert(errorTable, text)
if mw.title.getCurrentTitle().namespace == 0 then
table.insert(errorTable, string.format("[[Catigurìa:%s]]\n", cfg.categorie[category]))
end
end
-- Wrapper di mw.title.exists, verifica sia che name sia valido, sia che esista
local function titleExists(name)
local title = mw.title.new(name)
return title and title.exists
end
local function currentTitleEquals(name)
local title = mw.title.getCurrentTitle().text
title = mw.text.split(title, " %(")[1]
return title == name or mw.getContentLanguage():lcfirst(title) == name
end
-- Se date inizia con "1 " o "1°" restituisce 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
-- Restituisce "ed" se nextWord inizia con "e", altrimenti "e"
local function getEufonica(nextWord)
return nextWord:match("^e[^d]") and "ed" or "e"
end
-- Restituisce true se uno degli argomenti del modulo specificati (params) ha almeno
-- un valore tra quelli indicati (values), altrimenti false
local function argsSearch(params, values)
local ret = false
for _, param in ipairs(params) do
for _, value in ipairs(values) do
if args[param] == value then
return true
end
end
end
return false
end
-- Riconosce le ex attività previste e le restituisce senza "ex"
local function isExAttivita(attivita)
local ret
attivita = attivita:match("^ex (.+)$")
if attivita then
for _, v in ipairs(ex_attivita) do
if v == attivita then
ret = attivita
break
end
end
end
return ret
end
-- =============================================================================
-- classe ArgsParser
-- =============================================================================
local ArgsParser = {}
function ArgsParser:new()
local self = {}
setmetatable(self, { __index = ArgsParser })
return self
end
-- Parsifica i parametri passati al modulo e aggiunge eventuali categorie di errore.
-- Restituisce i parametri conosciuti scartando quelli valorizzati a stringa vuota.
function ArgsParser:parse(origArgs)
local paramcfg = require("Mòdulu:Bio/Paràmitri")
local retArgs = {}
-- controlla i parametri conosciuti e li copia
for k, v in pairs(origArgs) do
if paramcfg.params[k] then
if v ~= "" then
retArgs[k] = v
end
else
addAvviso(cfg.warningParams.testo:gsub("$1", "u paràmitru '" ..
(tonumber(k) and (v == "" and " " or v) or k ) .. "' è scanusciutu"), "unknown-params")
end
end
-- controlla il valore
for i, validator in pairs(paramcfg.validators) do
if retArgs[validator.param] then
if not self:_checkParamValue(retArgs[validator.param], validator.valuetest, retArgs) then
if validator.errmsg then
addAvviso(cfg.warningParams.testo:gsub("$1", validator.errmsg), "wrong-params")
end
end
end
end
-- è ammessa l'iniziale maiuscola per i parametri per attività e Nazziunalità
-- (complicazione inutile. basta eliminare dalle voci le maiuscole esistenti)
local lang = mw.getContentLanguage()
for _, param in ipairs(attivitaParams) do
if retArgs[param] and not cfg.attivita_maiuscolo[retArgs[param]] then
retArgs[param] = lang:lcfirst(retArgs[param])
end
end
for _, param in ipairs(nazionalitaParams) do
retArgs[param] = retArgs[param] and lang:lcfirst(retArgs[param])
end
return retArgs
end
-- Utilizzata da parse per controllare il valore di un parametro.
-- Restituisce true se il valore è valido altrimenti false.
function ArgsParser:_checkParamValue(value, valueTest, otherArgs)
local ret = true
if type(valueTest) == "function" then
ret = valueTest(value, otherArgs)
elseif type(valueTest) == "string" and not value:match(valueTest) then
ret = false
end
return ret
end
-- =============================================================================
-- classe CategoryManager
-- =============================================================================
local CategoryManager = {}
function CategoryManager:new()
local self = {}
setmetatable(self, { __index = CategoryManager })
self.plurale_attivita = nil
self.plurale_nazionalita = nil
self.categories = {}
-- al di fuori del namespace 0 esegue comunque il controllo di attività e Nazziunalità
self.plurals = self:_getPluralsAttivitaNazionalita()
local title = mw.title.getCurrentTitle()
if title.namespace == 0 and title.text ~= 'Pàggina principali' or args.Debug then
-- imposta la magic word defaultsort
local sortkey
if args.FurzaUrdinamentu then
sortkey = args.FurzaUrdinamentu:gsub("(.-)%s*,%s*(.*)", "%1 ,%2")
elseif args.Suprannomu and args.Cugnomu and currentTitleEquals(args.Suprannomu .. " " .. args.Cugnomu) then
sortkey = mString.collate( { args = { args.Cugnomu .. " ," .. args.Suprannomu } } )
elseif args.CanusciutuComu and currentTitleEquals(args.CanusciutuComu) then
local pseudonimo = mString.collate( { args = { args.CanusciutuComu } } )
if pseudonimo ~= args.CanusciutuComu then
sortkey = pseudonimo
end
elseif args.Cugnomu and args.Nomu then
sortkey = mString.collate( { args = { args.Cugnomu .. " ," .. args.Nomu } } )
elseif args.Nomu then
local Nomu = mString.collate( { args = { args.Nomu } } )
if Nomu ~= args.Nomu then
sortkey = Nomu
end
end
if sortkey then
if args.Debug then
-- per i test di DEFAULTSORT in Modulo:Bio/test
table.insert(self.categories, string.format("DEFAULTSORT:%s", sortkey))
else
mw.getCurrentFrame():preprocess("{{DEFAULTSORT:" .. sortkey .. "}}")
end
end
self:_addAttivita(self.plurals)
self:_addNatiMorti()
self:_addCategory(cfg.categorie["bot"])
-- categoria di servizio per AnnuMorti (o anno corrente) - AnnoNascita > 122
local years = {
birth = tonumber(args["AnnuNàscita"]),
death = not args.AnnuMorti and os.date("%Y") or tonumber(args.AnnuMorti)
}
if years.birth and years.death and years.death - years.birth > 122 then
self:_addCategory(cfg.categorie["controllo-età"])
end
-- eventuali categorie di servizio per Wikidata
if not args.Debug then
self:_addCategoriesWikidata()
end
end
return self
end
function CategoryManager:getCategories()
return self.categories
end
function CategoryManager:_addCategory(cat)
table.insert(self.categories, string.format("[[Catigurìa:%s]]", cat))
end
-- Aggiunge la categoria se la pagina non ha un elemento Wikidata collegato,
-- oppure non ha la proprietà indicata.
function CategoryManager:_addCategoryWikidata(propertyId, cat)
if not mWikidata._getProperty({ propertyId }) then
self:_addCategory(cat)
end
end
-- Aggiunge eventuali categorie di servizio per Wikidata, tramite controlli
-- più avanzati di quelli che si effettuano abitualmente con {{Controllo Wikidata}}.
function CategoryManager:_addCategoriesWikidata()
-- Per Speciale:LinkPermanente/80165551#Proposta_categoria_di_servizio_biografie_con_data_di_morte_su_Wikidata
if not args.AnnuMorti and mWikidata._getProperty({ "P570" }) then
self:_addCategory("Vuci cû mudeḍḍu Bio senza AnnuMorti ma câ data di morti nne Wikidata")
end
if mWikidata._instanceOf({ "Q5" }) then
-- Per Speciale:LinkPermanente/66620402#Add_this_text_to_Template:Bio
if args["Nazziunalità"] then
self:_addCategoryWikidata("P27", "Vuci cû mudeḍḍu Bio e Nazziunalità assenti nne Wikidata")
end
-- Per Speciale:LinkPermanente/80165551#Wikidata_d:Property:P21
if not args["Gèniri"] or args["Gèniri"] == "M" then
self:_addCategoryWikidata("P21", "Vuci cû mudeḍḍu Bio e gèniri (M) assenti nne Wikidata")
elseif args["Gèniri"] == "F" then
self:_addCategoryWikidata("P21", "Vuci cû mudeḍḍu Bio e gèniri (F) assenti nne Wikidata")
end
-- Per Speciale:LinkPermanente/80254035#Wikidata_properties_P19.2C_P20.2C_P569.2C_P570
if args["LocuNàscita"] and not args["LocuNàscitaLijami"] then
self:_addCategoryWikidata("P19", "Vuci cû mudeḍḍu Bio e LocuNàscita assenti nne Wikidata")
end
if args["LocuNàscitaLijami"] then
self:_addCategoryWikidata("P19", "Vuci cû mudeḍḍu Bio e LocuNàscitaLijami assenti nne Wikidata")
end
if args.LocuMorti and not args.LocuMortiLijami then
self:_addCategoryWikidata("P20", "Vuci cû mudeḍḍu Bio e LocuMorti assenti nne Wikidata")
end
if args.LocuMortiLijami then
self:_addCategoryWikidata("P20", "Vuci cû mudeḍḍu Bio e LocuMortiLijami assenti nne Wikidata")
end
if args["AnnuNàscita"] then
self:_addCategoryWikidata("P569", "Vuci cû mudeḍḍu Bio e AnnuNàscita assenti nne Wikidata")
end
if args.AnnuMorti and args.AnnuMorti ~= "?" then
self:_addCategoryWikidata("P570", "Vuci cû mudeḍḍu Bio e AnnuMorti assenti nne Wikidata")
end
if args["Mmàggini"] and not titleExists("File:" .. args["Mmàggini"]) then
self:_addCategoryWikidata("P18", "Vuci cû mudeḍḍu Bio e Mmàggini assenti nne Wikidata")
end
-- Per Speciale:LinkPermanente/80336084#Wikidata_properties_P27
-- e Speciale:LinkPermanente/105389666#Year_in_line_278_(for_Wikidata_category)
local annoNascita = tonumber(args["AnnuNàscita"])
local AnnuMorti = tonumber(args.AnnuMorti)
if (args["Nazziunalità"] == "talianu" or args["Nazziunalità"] == "taliana") and
((annoNascita or 0) > 1861 or (AnnuMorti or 0) > 1861) then
-- Le cittadinanze "Italia" e "Regno d'Italia" non si escludono, quindi non va usato "elseif"
local cittadRegno = false
local cittadRepubblica = false
if ((annoNascita ~= nil and annoNascita < 1946) or (AnnuMorti ~= nil and AnnuMorti < 1946)) then
self:_addCategoryWikidata("P27", "Vuci cû mudeḍḍu Bio e cittadinanza Regnu d'Italia assenti nne Wikidata")
cittadRegno = true
end
if ((annoNascita or 0) > 1946 or (AnnuMorti or 0) > 1946) then
self:_addCategoryWikidata("P27", "Vuci cû mudeḍḍu Bio e cittadinanza taliana assenti nne Wikidata")
cittadRepubblica = true
end
if not (cittadRegno or cittadRepubblica) then
self:_addCategoryWikidata("P27", "Vuci cû mudeḍḍu Bio e Nazziunalità taliana assenti nne Wikidata")
end
elseif (args["Nazziunalità"] == "miricanu" or args["Nazziunalità"] == "miricana") and
((annoNascita or 0) > 1776 or (AnnuMorti or 0) > 1776) then
self:_addCategoryWikidata("P27", "Vuci cû mudeḍḍu Bio e Nazziunalità miricana assenti nne Wikidata")
elseif args["Nazziunalità"] == "francisi" and
((annoNascita or 0) > 1799 or (AnnuMorti or 0) > 1799) then
self:_addCategoryWikidata("P27", "Vuci cû mudeḍḍu Bio e Nazziunalità francisi assenti nne Wikidata")
end
-- Per Speciale:LinkPermanente/80431600#Wikidata_properties_P106
if argsSearch(attivitaParams, { "jucaturi di palluni", "ex jucaturi di palluni", "jucatrici di palluni", "ex jucatrici di palluni" }) then
self:_addCategoryWikidata("P106", "Vuci cû mudeḍḍu Bio e Attività assenti nne Wikidata (jucaturi di palluni)")
end
if argsSearch(attivitaParams, { "atturi", "attrici" }) then
self:_addCategoryWikidata("P106", "Vuci cû mudeḍḍu Bio e Attività assenti nne Wikidata (atturi)")
end
if argsSearch(attivitaParams, { "pulìticu", "pulìtica" }) then
self:_addCategoryWikidata("P106", "Vuci cû mudeḍḍu Bio e Attività assenti nne Wikidata (pulìticu)")
end
end
end
-- Restituisce il plurale dell'attività o nil se non trovato (con eventuale warning)
function CategoryManager:_getPluralAttivita(attivita)
local plural
self.plurale_attivita = self.plurale_attivita or mw.loadData("Mòdulu:Bio/Plurali attività")
plural = self.plurale_attivita[isExAttivita(attivita) or attivita]
if not plural then
addAvviso(cfg.warningA.testo .. cfg.warningA.testo2a:gsub("$1", attivita) .. cfg.warningA.testo3, "warning")
end
return plural
end
-- Restituisce il plurale della Nazziunalità o nil se non trovato (con eventuale warning)
function CategoryManager:_getPluralNazionalita(nazionalita)
local plural
self.plurale_nazionalita = self.plurale_nazionalita or mw.loadData("Mòdulu:Bio/Plurali nazziunalità")
plural = self.plurale_nazionalita[nazionalita]
if not plural then
addAvviso(cfg.warningN.testo .. cfg.warningN.testo2a:gsub("$1", nazionalita) .. cfg.warningN.testo3, "warning")
end
return plural
end
-- Restituisce il plurale dei parametri necessari per le categorie
function CategoryManager:_getPluralsAttivitaNazionalita()
local plurals = {}
local attnaznecessarie = not (args["Catigurìi"] == "no" and args["FiniÌncipit"])
-- Nazziunalità può essere vuota solo quando c'è Categorie=no e FineIncipit
if not args["Nazziunalità"] and attnaznecessarie then
addAvviso(cfg.warningN.testo .. cfg.warningN.testo2b .. cfg.warningN.testo3, "warning")
end
for _, nazionalita in ipairs(nazionalitaParams) do
if args[nazionalita] then
plurals[nazionalita] = self:_getPluralNazionalita(args[nazionalita])
end
end
-- Attività può essere vuota solo quando c'è Categorie=no e FineIncipit
if not args["Attività"] and attnaznecessarie then
addAvviso(cfg.warningA.testo .. cfg.warningA.testo2b .. cfg.warningA.testo3, "warning")
end
for _, attivita in ipairs(attivitaParams) do
if args[attivita] then
plurals[attivita] = self:_getPluralAttivita(args[attivita])
end
end
return plurals
end
-- Calcola il valore di Epoca se non inserito dall'utente.
function CategoryManager:_getEpoca()
local ret
local annoNascita = tonumber(args["AnnuNàscita"])
local AnnuMorti = tonumber(args.AnnuMorti)
if not annoNascita then
annoNascita = args["AnnuNàscita"]:match('^(%d+) a%.C%.$')
annoNascita = annoNascita and tonumber(annoNascita) * -1
end
if annoNascita and annoNascita >= 2000 then
return "2000"
end
if not AnnuMorti and args.AnnuMorti then
AnnuMorti = args.AnnuMorti:match('^(%d+) a%.C%.$')
AnnuMorti = AnnuMorti and tonumber(AnnuMorti) * -1
end
if annoNascita and AnnuMorti and
annoNascita >= -500 and annoNascita <= 2100 and
AnnuMorti >= -500 and AnnuMorti <= 2100 and
((annoNascita >= 0 and AnnuMorti >= 0) or (annoNascita < 0 and AnnuMorti < 0)) then
local sign = ''
if annoNascita < 0 then
annoNascita, AnnuMorti = -annoNascita, -AnnuMorti
sign = '-'
end
local secoloNascita = math.floor((annoNascita - 1) / 100) * 100
local secoloMorte = math.floor((AnnuMorti - 1) / 100) * 100
ret = secoloNascita == secoloMorte and (sign .. secoloNascita) or nil
end
return ret
end
-- Aggiunge Categoria:X dei secoli, se esistono
function CategoryManager:_addCatSecolo(catname, epoca1, epoca2)
local ok = false
for _, epoca in ipairs({ epoca1, epoca2 }) do
if epoca and titleExists("Catigurìa:" .. catname .. " " .. epoca) then
self:_addCategory(catname .. " " .. epoca)
ok = true
end
end
return ok
end
-- Aggiunge le categorie: Attività Nazziunalità [del XYZ secolo]
function CategoryManager:_addAttivita(plurals)
local catname, epoca1, epoca2, added, addatt, addnaz, add1
addatt = {}
addnaz = {}
-- se Epoca e Epoca2 non sono stati inseriti dall'utente
-- e AnnoNascita e AnnuMorti cadono nello stesso secolo
-- calcola epoca1 automaticamente
if not args["Èbbica"] and not args["Èbbica2"] and args["AnnuNàscita"] then
epoca1 = self:_getEpoca()
epoca1 = epoca1 and cfg.epoche[epoca1]
else
epoca1 = args["Èbbica"] and cfg.epoche[args["Èbbica"]]
epoca2 = args["Èbbica2"] and cfg.epoche[args["Èbbica2"]]
end
if not epoca1 and not epoca2 then
self:_addCategory(cfg.categorie["no-epoca"])
end
if args["Catigurìi"] ~= "no" then
for _, attivita in ipairs(attivitaParams) do
if plurals[attivita] then
for _, nazionalita in ipairs(nazionalitaParams) do
if plurals[nazionalita] then
catname = plurals[attivita] .. " " .. plurals[nazionalita]
added = self:_addCatSecolo(catname, epoca1, epoca2)
-- se non è stata aggiunta la categoria per epoca1 e epoca2
-- aggiunge la cat. semplice, es. "Scrittori italiani"
if added then
add1 = true
addatt[attivita] = true
addnaz[nazionalita] = true
else
self:_addCategory(catname)
end
end
end
end
end
end
-- in mancanza di "A N del S" prova "A del S" e "N del S"
for _, attivita in ipairs(attivitaParams) do
if plurals[attivita] and not addatt[attivita] then
add1 = self:_addCatSecolo(plurals[attivita], epoca1, epoca2) or add1
end
end
for _, nazionalita in ipairs(nazionalitaParams) do
if plurals[nazionalita] and not addnaz[nazionalita] then
add1 = self:_addCatSecolo(plurals[nazionalita], epoca1, epoca2) or add1
end
end
if not add1 then
self:_addCatSecolo("Genti", epoca1, epoca2)
end
end
-- Utilizzata da addNatiMorti, restituisce il Nomu della categoria
-- se titleLink o title sono nella lista di eccezioni Cat luoghi, altrimenti nil
function CategoryManager:_getCatLuoghi(titleLink, title, catPrefix)
local cat
self.catLuoghi = self.catLuoghi or mw.loadData("Mòdulu:Bio/Cat posti")
if titleLink and title then
cat = self.catLuoghi[titleLink]
elseif title then
cat = self.catLuoghi[title]
end
return cat and (catPrefix .. " " .. cat) or nil
end
-- Aggiunge le categorie: Nati/Morti nell'anno/giorno/luogo
function CategoryManager:_addNatiMorti()
local cat1, cat2
if args["AnnuNàscita"] then
cat1 = "Nati nnô " .. args["AnnuNàscita"]
cat2 = "Nati nna l'" .. args["AnnuNàscita"]
if titleExists("Catigurìa:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Catigurìa:" .. cat2) then
self:_addCategory(cat2)
end
end
if args.AnnuMorti then
if args.AnnuMorti == "?" then
self:_addCategory(cfg.categorie["annomorte-punto-interrogativo"])
else
cat1 = "Morti nnô " .. args.AnnuMorti
cat2 = "Morti nna l'" .. args.AnnuMorti
if titleExists("Catigurìa:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Catigurìa:" .. cat2) then
self:_addCategory(cat2)
end
end
else
self:_addCategory(cfg.categorie["annomorte-assente"])
end
if args["JornuMisiNàscita"] then
cat1 = "Nati u " .. fixFirstOfMonth(args["JornuMisiNàscita"])
cat2 = "Nati l'" .. args["JornuMisiNàscita"]
if titleExists("Catigurìa:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Catigurìa:" .. cat2) then
self:_addCategory(cat2)
end
end
if args.JornuMisiMorti then
cat1 = "Morti u " .. fixFirstOfMonth(args.JornuMisiMorti)
cat2 = "Morti l'" .. args.JornuMisiMorti
if titleExists("Catigurìa:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Catigurìa:" .. cat2) then
self:_addCategory(cat2)
end
end
-- prima di verificare le categorie per LuogoNascitaLink e LuogoNascita
-- viene controllata una lista di eccezioni
cat1 = self:_getCatLuoghi(args["LocuNàscitaLijami"], args["LocuNàscita"], "Nati")
if cat1 then
self:_addCategory(cat1)
elseif args["LocuNàscitaLijami"] then
cat1 = "Nati a " .. args["LocuNàscitaLijami"]
cat2 = "Nati ad " .. args["LocuNàscitaLijami"]
if titleExists("Catigurìa:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Catigurìa:" .. cat2) then
self:_addCategory(cat2)
end
elseif args["LocuNàscita"] then
cat1 = "Nati a " .. args["LocuNàscita"]
cat2 = "Nati ad " .. args["LocuNàscita"]
if titleExists("Catigurìa:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Catigurìa:" .. cat2) then
self:_addCategory(cat2)
end
end
-- prima di verificare le categorie per LocuMortiLijami e LocuMorti
-- viene controllata una lista di eccezioni
cat1 = self:_getCatLuoghi(args.LocuMortiLijami, args.LocuMorti, "Morti")
if cat1 then
self:_addCategory(cat1)
elseif args.LocuMortiLijami then
cat1 = "Morti a " .. args.LocuMortiLijami
cat2 = "Morti ad " .. args.LocuMortiLijami
if titleExists("Catigurìa:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Catigurìa:" .. cat2) then
self:_addCategory(cat2)
end
elseif args.LocuMorti then
cat1 = "Morti a " .. args.LocuMorti
cat2 = "Morti ad " .. args.LocuMorti
if titleExists("Catigurìa:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Catigurìa:" .. cat2) then
self:_addCategory(cat2)
end
end
end
-- =============================================================================
-- classe Incipit
-- =============================================================================
local Incipit = {}
function Incipit:new()
local self = {}
setmetatable(self, { __index = Incipit })
self.textTable = {}
self:_addImmagine()
self:_addNomeCognome()
self:_addNascitaMorte()
if args.Suprannomu or args.CanusciutuComu or args["DoppuCugnomuVìrgula"] then
self:_addText(",")
end
if args["FiniÌncipit"] then
if self:_needSpace(args["FiniÌncipit"]) then
self:_addText(' ')
end
self:_addText(args["FiniÌncipit"])
else
self:_addAttivita()
end
if args.Puntu ~= "no" then
self:_addText((args["FiniÌncipit"] == "e" or
args["FiniÌncipit"] == "ed" or
args["FiniÌncipit"] == ",") and
" " or ".")
end
return self
end
function Incipit:getIncipit()
return table.concat(self.textTable)
end
-- Aggiunge testo alla risposta, svolge anche la funzione di concatenatore
function Incipit:_addText(...)
local arg = {...}
for _, val in ipairs(arg) do
table.insert(self.textTable, val)
end
end
-- Aggiunge un wlink alla risposta, se target è nil utilizza label come target.
-- labelPrefix, se presente, viene rimosso dalla label e anteposto al wlink.
function Incipit:_addWlink(target, label, labelPrefix)
if target and label and labelPrefix then
local count
label, count = label:gsub("^" .. labelPrefix .. " ", "")
if count == 1 then
self:_addText(labelPrefix, " ")
end
end
if target and label then
self:_addText("[[", target, "|", label, "]]")
else
self:_addText("[[", target or label, "]]")
end
end
-- Aggiunge una immagine alla risposta, size e caption sono opzionali
function Incipit:_addImage(name, size, caption)
self:_addText("[[File:", name, "|thumb")
if size then
self:_addText("|", size, "px")
end
if caption then
self:_addText("|", caption)
end
self:_addText("]]", "\n")
end
-- Restituisce true se text necessita di uno spazio iniziale (PostCugnomu, PostSuprannomu, PostPseudonimo, LuogoNascitaAlt, NoteNascita, LocuMortiAlt, NoteMorte, AttivitàAltre, PostNazziunalità, FineIncipit)
function Incipit:_needSpace(text)
return mw.ustring.match(mw.ustring.sub(text, 1, 1), "%w") ~= nil or
text:sub(1, 2) == "[[" or
text:sub(1, 1) == "(" or
text:sub(1, 1) == "'" or
mw.ustring.sub(text, 1, 1) == "–" or
text:sub(1, 5) == "<span"
end
-- FIXME
function Incipit:_getArticleMan(attivita)
local article
if cfg.articoli_maschili["nu"][attivita] then
article = "nu"
elseif cfg.articoli_maschili["na"][attivita] then
article = "na"
else
article = "un"
end
return article
end
function Incipit:_getArticleWoman(attivita)
local article
-- aggiunge anche uno spazio nel caso non usi l'apostrofo
if cfg.articoli_femminili["un"][attivita] then
article = "un "
elseif attivita and attivita:match("^[aeiou]") then
article = "n'"
else
article = "na "
end
return article
end
function Incipit:_addImmagine()
local caption
if args["Mmàggini"] then
if args["Didascalìa"] then
caption = args["Didascalìa"]
elseif args.CanusciutuComu and currentTitleEquals(args.CanusciutuComu) then
caption = args.CanusciutuComu
elseif args.Suprannomu and args.Cugnomu and currentTitleEquals(args.Suprannomu .. " " .. args.Cugnomu) then
caption = args.Suprannomu .. " " .. args.Cugnomu
elseif args.Suprannomu and currentTitleEquals(args.Suprannomu) then
caption = args.Suprannomu
else
if args.CugnomuPrima and args.Nomu and args.Cugnomu then
caption = args.Cugnomu .. " " .. args.Nomu
else
if args.Nomu then
caption = args.Nomu
end
if args.Cugnomu then
caption = (caption or "") .. " " .. args.Cugnomu
end
end
end
if args["Didascalìa2"] then
caption = (caption or "") .. "<hr />" .. args["Didascalìa2"]
end
self:_addImage(args["Mmàggini"], args["GrannizzaMmàggini"], caption)
elseif args["Didascalìa2"] then
-- parentesi () extra per non restituire anche il gsub.count
self:_addText( (cfg.didascalia2:gsub("$1", args["Didascalìa2"])) )
end
end
function Incipit:_addNomeCognome()
if args["Tìtulu"] then
self:_addText(args["Tìtulu"], " ")
end
if args.CanusciutuComu and currentTitleEquals(args.CanusciutuComu) then
self:_addText("'''", args.CanusciutuComu, "'''")
if args.DoppuCanusciutuComu then
if self:_needSpace(args.DoppuCanusciutuComu) then
self:_addText(" ")
end
self:_addText(args.DoppuCanusciutuComu)
end
self:_addText(", autru nomu di ")
end
local SuprannomuCugnomu = args.Suprannomu
if args.Suprannomu and args.Cugnomu then
SuprannomuCugnomu = args.Suprannomu .. " " .. args.Cugnomu
end
if SuprannomuCugnomu and currentTitleEquals(SuprannomuCugnomu) then
self:_addText("'''", SuprannomuCugnomu, "'''")
if args.DoppuSuprannomu then
if self:_needSpace(args.DoppuSuprannomu) then
self:_addText(" ")
end
self:_addText(args.DoppuSuprannomu)
end
self:_addText(", nomu veru ")
end
-- inizio grassetto
self:_addText("'''")
if args.CugnomuPrima and args.Nomu and args.Cugnomu then
self:_addText(args.Cugnomu, " ", args.Nomu, mw.getCurrentFrame():expandTemplate{
title = "Nota nomu",
args = { [1] = args.CugnomuPrima, [2] = args.Cugnomu }
})
else
local no_space
if args.Nomu then
self:_addText(args.Nomu)
-- niente spazio prima di Cugnomu se Nomu termina con «d'»
no_space = mw.ustring.match(args.Nomu, " d'$") and ''
end
if args.Cugnomu then
self:_addText(no_space or " ", args.Cugnomu)
end
end
-- fine grassetto
self:_addText("'''")
if args["DoppuCugnomuVìrgula"] then
self:_addText(", ", args["DoppuCugnomuVìrgula"])
elseif args.DoppuCugnomu then
if self:_needSpace(args.DoppuCugnomu) then
self:_addText(" ")
end
self:_addText(args.DoppuCugnomu)
end
if SuprannomuCugnomu and not currentTitleEquals(SuprannomuCugnomu) then
self:_addText(", ", (not args["Gèniri"] or args["Gèniri"] == "M") and "dittu" or "ditta",
" ", "'''", args.Suprannomu, "'''")
if args.DoppuSuprannomu then
if self:_needSpace(args.DoppuSuprannomu) then
self:_addText(" ")
end
self:_addText(args.DoppuSuprannomu)
end
end
if args.CanusciutuComu and not currentTitleEquals(args.CanusciutuComu) then
self:_addText(", ", (not args["Gèniri"] or args["Gèniri"] == "M") and "canusciutu" or "canusciuta",
" macari cû nomu ", "'''", args.CanusciutuComu, "'''")
if args.DoppuCanusciutuComu then
if self:_needSpace(args.DoppuCanusciutuComu) then
self:_addText(" ")
end
self:_addText(args.DoppuCanusciutuComu)
end
end
end
function Incipit:_addNascitaMorte()
-- si apre la parentesi
self:_addText(" (")
if args.PreData then
self:_addText(args.PreData, "; ")
end
local datimancanti = not (args["LocuNàscita"] or args["JornuMisiNàscita"] or args["NotiNàscita"] or args.LocuMorti or args.JornuMisiMorti)
local floruit = args.AnnuMorti == "?" and (args.Floruit or cfg.epoche[args["Èbbica"]])
if args["LocuNàscita"] then
self:_addWlink(args["LocuNàscitaLijami"], args["LocuNàscita"])
if args["LocuNàscitaAutru"] then
if self:_needSpace(args["LocuNàscitaAutru"]) then
self:_addText(" ")
end
self:_addText(args["LocuNàscitaAutru"])
end
self:_addText(", ")
end
if args["JornuMisiNàscita"] then
if titleExists(args["JornuMisiNàscita"]) then
self:_addWlink(args["JornuMisiNàscita"])
else
self:_addText(args["JornuMisiNàscita"])
end
self:_addText(" ")
end
if args["AnnuNàscita"] then
if titleExists(args["AnnuNàscita"]) then
self:_addWlink(args["AnnuNàscita"])
else
self:_addText(args["AnnuNàscita"])
end
elseif not floruit or not datimancanti then
self:_addText("...")
end
if args["NotiNàscita"] then
if self:_needSpace(args["NotiNàscita"]) then
self:_addText(" ")
end
self:_addText(args["NotiNàscita"])
end
if args.AnnuMorti and (not floruit or not datimancanti) then
self:_addText(" – ")
if args.LocuMorti then
self:_addWlink(args.LocuMortiLijami, args.LocuMorti)
if args.LocuMortiAutru then
if self:_needSpace(args.LocuMortiAutru) then
self:_addText(" ")
end
self:_addText(args.LocuMortiAutru)
end
self:_addText(", ")
end
if args.JornuMisiMorti then
if titleExists(args.JornuMisiMorti) then
self:_addWlink(args.JornuMisiMorti)
else
self:_addText(args.JornuMisiMorti)
end
self:_addText(" ")
end
if args.AnnuMorti then
if args.AnnuMorti == "?" then
self:_addText("...")
else
if titleExists(args.AnnuMorti) then
self:_addWlink(args.AnnuMorti)
else
self:_addText(args.AnnuMorti)
end
end
end
end
-- se date ignote, usa Floruit o lo ricava da Epoca
if not args["AnnuNàscita"] and args.AnnuMorti == "?" then
local fl = args.Floruit
if not fl and cfg.epoche[args["Èbbica"]] then
fl = mw.ustring.gsub(cfg.epoche[args["Èbbica"]], "^(?:dû|di l')", "")
-- se due epoche, le mette entrambe senza ripetere la parola "secolo"
if cfg.epoche[args["Èbbica2"]] then
if fl ~= "I sèculu p.C." then
fl = fl .. "|" .. mw.ustring.gsub(fl, " sèculu.*$", "")
end
fl = "[[" .. fl .. "]]-[[" .. mw.ustring.gsub(cfg.epoche[args["Èbbica2"]], "^(?:dû|di l')", "") .. "]]"
end
end
if fl then
if titleExists(fl) then
fl = "[[" .. fl .. "]]"
end
if not datimancanti then
self:_addText("; ")
end
self:_addText("[[floruit|fl.]] ", fl)
end
end
if args.NotiMorti then
if self:_needSpace(args.NotiMorti) then
self:_addText(" ")
end
self:_addText(args.NotiMorti)
end
-- si chiude la parentesi
self:_addText(")")
end
function Incipit:_addAttivita()
local link_attivita = mw.loadData("Mòdulu:Bio/Lijami attività")
local link_nazionalita = mw.loadData("Mòdulu:Bio/Lijami nazziunalità")
self:_addText(" ")
if args["PreAttività"] then
self:_addText(args["PreAttività"], " ")
else
if args.AnnuMorti then
self:_addText("fu ")
else
self:_addText("è ")
end
if not args["Gèniri"] or args["Gèniri"] == "M" then
self:_addText(self:_getArticleMan(args["Attività"]), " ")
else
self:_addText(self:_getArticleWoman(args["Attività"]))
end
end
local getLinkAttivita = function(attivita)
if not attivita then return end
local ex_attivita = isExAttivita(attivita)
return link_attivita[ex_attivita or attivita] or ex_attivita
end
self:_addWlink(getLinkAttivita(args["Attività"]), args["Attività"] or "", "ex")
if args["Attività2"] then
if args["Attività3"] or args["AttivitàAutri"] then
self:_addText(",")
else
self:_addText(" ", getEufonica(args["Attività2"]))
end
self:_addText(" ")
self:_addWlink(getLinkAttivita(args["Attività2"]), args["Attività2"], "ex")
end
if args["Attività3"] then
if args["AttivitàAutri"] then
self:_addText(",")
else
self:_addText(" ", getEufonica(args["Attività3"]))
end
self:_addText(" ")
self:_addWlink(getLinkAttivita(args["Attività3"]), args["Attività3"], "ex")
end
if args["AttivitàAutri"] then
if self:_needSpace(args["AttivitàAutri"]) then
self:_addText(" ")
end
self:_addText(args["AttivitàAutri"])
end
self:_addText(" ")
self:_addWlink(link_nazionalita[args["Nazziunalità"]], args["Nazziunalità"] or "")
if args.Cittadinanza then
self:_addText(" cu cittadinanza ")
self:_addWlink(link_nazionalita[args.Cittadinanza], args.Cittadinanza)
end
if args["NazziunalitàNaturalizzatu"] then
self:_addText(" ")
self:_addWlink("Naturalizzazioni",
(not args["Gèniri"] or args["Gèniri"] == "M" or
(args["Gèniri"] == "F" and self:_getArticleWoman(args["Attività"]) == "un ")) and
"naturalizzatu" or "naturalizzata")
self:_addText(" ")
self:_addWlink(link_nazionalita[args["NazziunalitàNaturalizzatu"]], args["NazziunalitàNaturalizzatu"])
end
if args["DoppuNazziunalità"] then
if self:_needSpace(args["DoppuNazziunalità"]) then
self:_addText(" ")
end
self:_addText(args["DoppuNazziunalità"])
end
end
-- =============================================================================
-- Funzioni esportate
-- =============================================================================
local p = {}
-- Funzione per {{#invoke:Bio|categorie}} utilizzato da Modulo:Bio/test
function p.categorie(frame)
args = ArgsParser:new():parse(frame.args)
local categories = CategoryManager:new():getCategories()
return table.concat(errorTable) ..
(args.Debug and ( table.concat(categories, '<br />'):gsub('%[%[', '[[:') ) .. '<br />' or
table.concat(categories))
end
-- Funzione per il template per {{Bio}}
function p.main(frame)
-- gli errori generano avvisi, ma non interrompono l'esecuzione,
-- come avveniva nel vecchio template.
args = ArgsParser:new():parse(frame:getParent().args)
local catTable = CategoryManager:new():getCategories()
return table.concat(errorTable) ..
Incipit:new():getIncipit() ..
table.concat(catTable)
end
return p