Modulo:Bio/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m fine test
aggiorno
 
(130 versioni intermedie di 7 utenti non mostrate)
Riga 1:
--[[
* Modulo perche implementareimplementa leil funzionalità ditemplate 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
*
* Nota: non esistendo in Lua una differenziazione tra metodi pubblici e privati,
* utilizza:
* per convenzione, quelli privati iniziano con un underscore.
* Template:Avviso
]]
 
require("strict")
-- Variabili globali
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
 
local mString = require("Modulo:String")
-- Configurazione
local mWikidata = require("Modulo:Wikidata")
local cfg
local cfg = mw.loadData("Modulo:Bio/Configurazione")
local link_attivita
local ex_attivita = mw.loadData("Modulo:Bio/Ex attività")
local link_nazionalita
-- argomenti passati al template
local plurale_attivita
local plurale_nazionalitaargs
-- table per contenere gli errori
local errorTable = {}
-- nomi dei parametri per l'attività e la nazionalità
local attivitaParams = { "Attività", "Attività2", "Attività3" }
local nazionalitaParams = { "Nazionalità", "NazionalitàNaturalizzato", "Cittadinanza" }
 
-- =============================================================================
-------------------------------------------------------------------------------
-- Funzioni di utilità
-- =============================================================================
-------------------------------------------------------------------------------
 
-- Aggiunge testol'output alladel risposta,[[Template:Avviso]] svolgee ancheuna la funzionecategoria di concatenatorewarning a errorTable
local function dumpTextaddAvviso(...testo, category)
local arg = {...}text
 
text = mw.getCurrentFrame():expandTemplate {
for _, val in ipairs(arg) do
title = "Avviso",
table.insert(textTable, val)
args = {
end
tipo = "stile",
immagine = "[[File:Nuvola apps important.svg|40px]]",
["immagine a destra"] = "[[File:Crystal Clear app Login Manager.svg|40px]]",
testo = testo
}
}
 
table.insert(errorTable, text)
if mw.title.getCurrentTitle().namespace == 0 then
table.insert(errorTable, string.format("[[Categoria:%s]]\n", cfg.categorie[category]))
end
end
 
-- Wrapper di mw.title.exists, verifica sia che name sia valido, sia che esista
-- Aggiunge una categoria alla risposta
local function dumpCategorytitleExists(categoryname)
local title = mw.title.new(name)
dumpText("[[Categoria:", category, "]]", "\n")
return title and title.exists
end
 
local function currentTitleEquals(name)
-- Aggiunge un wlink alla risposta, se target è nil utilizza label come target
local title = mw.title.getCurrentTitle().text
local function dumpWlink(target, label)
title = mw.text.split(title, " %(")[1]
if target and label then
return title == name or mw.getContentLanguage():lcfirst(title) == name
dumpText("[[", target, "|", label, "]]")
else
dumpText("[[", target or label, "]]")
end
end
 
-- Se date inizia con "1 " o "1°" restituisce una nuova data che inizia per "1º", altrimenti date
-- Aggiunge una immagine alla risposta, size e caption sono opzionali
local function dumpImagefixFirstOfMonth(name, size, captiondate)
date = dumpTextdate:gsub("[[File:^1%s", name,"1º "|thumb")
date = date:gsub("^1\194\176", "1º")
return date
end
 
-- Restituisce "ed" se nextWord inizia con "e", altrimenti "e"
if size then
local function getEufonica(nextWord)
dumpText("|", size, "px")
return nextWord:match("^e[^d]") and "ed" or "e"
end
end
if caption then
 
dumpText("|", caption)
-- Restituisce true se uno degli argomenti del modulo specificati (params) ha almeno
end
-- 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"
dumpText("]]", "\n")
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
 
-- =============================================================================
-- Aggiunge l'output del [[Template:Avviso]] e una categoria di warning alla risposta
-- classe ArgsParser
local function dumpAvviso(tipo, immagine, immagine_a_destra, testo)
-- =============================================================================
local text
 
local ArgsParser = {}
text = mw.getCurrentFrame():expandTemplate {
title = "Avviso",
args = {
["tipo"] = tipo,
["immagine"] = immagine,
["immagine a destra"] = immagine_a_destra,
["testo"] = testo
}
}
 
function ArgsParser:new()
dumpText(text)
local self = {}
dumpCategory(cfg.categorie["warning"])
setmetatable(self, { __index = ArgsParser })
return self
end
 
-- Parsifica i parametri passati al modulo e aggiunge eventuali categorie di errore.
-- Wrapper di mw.title.exists, verifica sia che name sia valido, sia che esista
-- Restituisce i parametri conosciuti scartando quelli valorizzati a stringa vuota.
local function titleExists(name)
function ArgsParser:parse(origArgs)
local title = mw.title.new(name)
local paramcfg = require("Modulo:Bio/Parametri")
local retArgs = {}
 
-- controlla i parametri conosciuti e li copia
return title and title.exists
for k, v in pairs(origArgs) do
end
if paramcfg.params[k] then
if v ~= "" then
retArgs[k] = v
end
else
addAvviso(cfg.warningParams.testo:gsub("$1", "il parametro '" ..
(tonumber(k) and (v == "" and " " or v) or k ) .. "' è sconosciuto"), "unknown-params")
end
end
 
-- controlla il valore
-- Traduzione in lua del [[Template:Primo del mese]]
for i, validator in pairs(paramcfg.validators) do
-- Se date inizia con "1 " o "1°" ritorna una nuova data che inizia per "1º", altrimenti date
if retArgs[validator.param] then
local function fixFirstOfMonth(date)
if not self:_checkParamValue(retArgs[validator.param], validator.valuetest, retArgs) then
date = date:gsub("^1%s", "1º ")
if validator.errmsg then
date = date:gsub("^1\194\176", "1º")
addAvviso(cfg.warningParams.testo:gsub("$1", validator.errmsg), "wrong-params")
end
end
end
end
-- è ammessa l'iniziale maiuscola per i parametri per attività e nazionalità
-- (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 dateretArgs
end
 
-- Utilizzata da parse per controllare il valore di un parametro.
-- Ritorna "ed" se nextWord inizia con "e", altrimenti "e"
-- Restituisce true se il valore è valido altrimenti false.
local function getEufonica(nextWord)
function ArgsParser:_checkParamValue(value, valueTest, otherArgs)
return nextWord:sub(1, 1) == "e" and "ed" or "e"
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
 
-- =============================================================================
-- Parsifica un TimeValue di Wikidata e ne ritorna "giornomese, anno"
-- classe CategoryManager
local function parseWikidataTimeValue(property)
-- =============================================================================
local entity, value, year, month, day, daymonth
 
local CategoryManager = {}
entity = mw.wikibase.getEntityObject()
if entity and entity.claims and
entity.claims[property] and #entity.claims[property] > 0 and
entity.claims[property][1].mainsnak.snaktype == "value" then
value = entity.claims[property][1].mainsnak.datavalue.value
year, month, day = value.time:match(".+(%d%d%d%d%d)%-(%d%d)%-(%d%d).+")
if value.precision == 11 then
month = mw.getLanguage("it"):formatDate("F", tonumber(year) .. "-" .. month .. "-" .. day)
daymonth = tonumber(day) .. " " .. month
end
if value.precision == 9 or value.precision == 11 then
year = tonumber(year) .. (value.time:sub(1, 1) == "-" and " a.C." or "")
end
end
 
function CategoryManager:new()
return daymonth, year
local self = {}
end
 
setmetatable(self, { __index = CategoryManager })
-------------------------------------------------------------------------------
self.plurale_attivita = nil
-- Parsing parametri
self.plurale_nazionalita = nil
-------------------------------------------------------------------------------
self.categories = {}
-- al di fuori del namespace 0 esegue comunque il controllo di attività e nazionalità
self.plurals = self:_getPluralsAttivitaNazionalita()
 
local title = mw.title.getCurrentTitle()
-- Utilizzata da parseParams per controllare il valore di un parametro.
if title.namespace == 0 and title.text ~= 'Pagina principale' or args.Debug then
-- Ritorna true se il valore è valido altrimenti false.
-- imposta la magic word defaultsort
local function checkParamValue(value, paramType, origArgs)
local ret = truesortkey
if args.ForzaOrdinamento then
sortkey = args.ForzaOrdinamento:gsub("(.-)%s*,%s*(.*)", "%1 ,%2")
elseif args.Soprannome and args.Cognome and currentTitleEquals(args.Soprannome .. " " .. args.Cognome) then
sortkey = mString.collate( { args = { args.Cognome .. " ," .. args.Soprannome } } )
elseif args.Pseudonimo and currentTitleEquals(args.Pseudonimo) then
local pseudonimo = mString.collate( { args = { args.Pseudonimo } } )
if pseudonimo ~= args.Pseudonimo then
sortkey = pseudonimo
end
elseif args.Cognome and args.Nome then
sortkey = mString.collate( { args = { args.Cognome .. " ," .. args.Nome } } )
elseif args.Nome then
local nome = mString.collate( { args = { args.Nome } } )
if nome ~= args.Nome then
sortkey = nome
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 AnnoMorte (o anno corrente) - AnnoNascita > 122
local years = {
birth = tonumber(args.AnnoNascita),
death = not args.AnnoMorte and os.date("%Y") or tonumber(args.AnnoMorte)
}
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
if type(paramType) == "function" then
end
ret = paramType(value, origArgs)
elseif type(paramType) == "string" then
if paramType == "string" then
-- "string" accetta qualunque valore
elseif paramType == "number" then
if not tonumber(value) then
ret = false
end
elseif not value:match(paramType) then
ret = false
end
end
 
function CategoryManager:getCategories()
return ret
return self.categories
end
 
function CategoryManager:_addCategory(cat)
-- Parsifica i parametri passati al modulo e aggiunge eventuali categorie di errore.
table.insert(self.categories, string.format("[[Categoria:%s]]", cat))
-- Ritorna i parametri conosciuti scartando quelli valorizzati a stringa vuota.
end
local function parseParams(origArgs)
local params = require("Modulo:Bio/Parametri")
local allowedValue, paramKnown = true, true
local ret = {}
 
-- Aggiunge la categoria se la pagina non ha un elemento Wikidata collegato,
-- controlla i parametri conosciuti, il loro valore e li copia
-- oppure non ha la proprietà indicata.
for k, v in pairs(origArgs) do
function CategoryManager:_addCategoryWikidata(propertyId, cat)
if params[k] then
if not mWikidata._getProperty({ propertyId }) then
if v ~= "" then
self:_addCategory(cat)
if allowedValue then
end
allowedValue = checkParamValue(v, params[k][2], origArgs)
end
ret[k] = v
end
else
paramKnown = false
end
end
-- aggiunge eventuali categorie di errore
if mw.title.getCurrentTitle().namespace == 0 then
if not paramKnown then
dumpCategory(cfg.categorie["unknown-params"])
end
if not allowedValue then
dumpCategory(cfg.categorie["wrong-params"])
end
end
 
return ret
end
 
-- Aggiunge eventuali categorie di servizio per Wikidata, tramite controlli
-------------------------------------------------------------------------------
-- più avanzati di quelli che si effettuano abitualmente con {{Controllo Wikidata}}.
-- Gestione categorie
function CategoryManager:_addCategoriesWikidata()
-------------------------------------------------------------------------------
-- Per Speciale:LinkPermanente/80165551#Proposta_categoria_di_servizio_biografie_con_data_di_morte_su_Wikidata
if not args.AnnoMorte and mWikidata._getProperty({ "P570" }) then
self:_addCategory("Voci con template Bio senza AnnoMorte ma con data di morte su Wikidata")
end
if mWikidata._instanceOf({ "Q5" }) then
-- Per Speciale:LinkPermanente/66620402#Add_this_text_to_Template:Bio
if args["Nazionalità"] then
self:_addCategoryWikidata("P27", "Voci con template Bio e nazionalità assente su Wikidata")
end
-- Per Speciale:LinkPermanente/80165551#Wikidata_d:Property:P21
if not args.Sesso or args.Sesso == "M" then
self:_addCategoryWikidata("P21", "Voci con template Bio e sesso (M) assente su Wikidata")
elseif args.Sesso == "F" then
self:_addCategoryWikidata("P21", "Voci con template Bio e sesso (F) assente su Wikidata")
end
-- Per Speciale:LinkPermanente/80254035#Wikidata_properties_P19.2C_P20.2C_P569.2C_P570
if args.LuogoNascita and not args.LuogoNascitaLink then
self:_addCategoryWikidata("P19", "Voci con template Bio e LuogoNascita assente su Wikidata")
end
if args.LuogoNascitaLink then
self:_addCategoryWikidata("P19", "Voci con template Bio e LuogoNascitaLink assente su Wikidata")
end
if args.LuogoMorte and not args.LuogoMorteLink then
self:_addCategoryWikidata("P20", "Voci con template Bio e LuogoMorte assente su Wikidata")
end
if args.LuogoMorteLink then
self:_addCategoryWikidata("P20", "Voci con template Bio e LuogoMorteLink assente su Wikidata")
end
if args.AnnoNascita then
self:_addCategoryWikidata("P569", "Voci con template Bio e AnnoNascita assente su Wikidata")
end
if args.AnnoMorte and args.AnnoMorte ~= "?" then
self:_addCategoryWikidata("P570", "Voci con template Bio e AnnoMorte assente su Wikidata")
end
if args.Immagine and not titleExists("File:" .. args.Immagine) then
self:_addCategoryWikidata("P18", "Voci con template Bio e Immagine assente su Wikidata")
end
-- Per Speciale:LinkPermanente/80336084#Wikidata_properties_P27
-- e Speciale:LinkPermanente/105389666#Year_in_line_278_(for_Wikidata_category)
local annoNascita = tonumber(args.AnnoNascita)
local annoMorte = tonumber(args.AnnoNascita)
if (args["Nazionalità"] == "italiano" or args["Nazionalità"] == "italiana") and
((annoNascita or 0) > 1861 or (annoMorte 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 (annoMorte ~= nil and annoMorte < 1946)) then
self:_addCategoryWikidata("P27", "Voci con template Bio e cittadinanza Regno d'Italia assente su Wikidata")
cittadRegno = true
end
if ((annoNascita or 0) > 1946 or (annoMorte or 0) > 1946) then
self:_addCategoryWikidata("P27", "Voci con template Bio e cittadinanza Italia assente su Wikidata")
cittadRepubblica = true
end
if not (cittadRegno or cittadRepubblica) then
self:_addCategoryWikidata("P27", "Voci con template Bio e Nazionalità italiana assente su Wikidata")
end
elseif args["Nazionalità"] == "statunitense" and
((annoNascita or 0) > 1776 or (annoMorte or 0) > 1776) then
self:_addCategoryWikidata("P27", "Voci con template Bio e Nazionalità statunitense assente su Wikidata")
elseif args["Nazionalità"] == "francese" and
((annoNascita or 0) > 1799 or (annoMorte or 0) > 1799) then
self:_addCategoryWikidata("P27", "Voci con template Bio e Nazionalità francese assente su Wikidata")
end
-- Per Speciale:LinkPermanente/80431600#Wikidata_properties_P106
if argsSearch(attivitaParams, { "calciatore", "ex calciatore", "calciatrice" }) then
self:_addCategoryWikidata("P106", "Voci con template Bio e Attività assente su Wikidata (calciatore)")
end
if argsSearch(attivitaParams, { "attore", "attrice" }) then
self:_addCategoryWikidata("P106", "Voci con template Bio e Attività assente su Wikidata (attore)")
end
if argsSearch(attivitaParams, { "politico", "politica" }) then
self:_addCategoryWikidata("P106", "Voci con template Bio e Attività assente su Wikidata (politico)")
end
end
end
 
-- RitornaRestituisce il plurale dell'attività o nil se non trovato (con eventuale warning)
local function getPluralAttivitaCategoryManager:_getPluralAttivita(attivita, warning)
local plural
 
self.plurale_attivita = self.plurale_attivita or mw.loadData("Modulo:Bio/Plurale attività")
plural = self.plurale_attivita[isExAttivita(attivita) or attivita]
if not plural and warning then
dumpAvviso addAvviso(cfg.warningA.tipo,testo .. cfg.warningA.immaginetesto2a:gsub("$1", attivita) .. cfg.warningA.immagine_a_destratesto3, "warning")
end
cfg.warningA.testo .. cfg.warningA.testo2a:gsub("$1", attivita) .. cfg.warningA.testo3)
end
 
return plural
end
 
-- RitornaRestituisce il plurale della nazionalità o nil se non trovato (con eventuale warning)
local function getPluralNazionalitaCategoryManager:_getPluralNazionalita(nazionalita, warning)
local plural
 
self.plurale_nazionalita = self.plurale_nazionalita or mw.loadData("Modulo:Bio/Plurale nazionalità")
plural = self.plurale_nazionalita[nazionalita]
if not plural and warning then
dumpAvviso addAvviso(cfg.warningN.tipo,testo .. cfg.warningN.immaginetesto2a:gsub("$1", nazionalita) .. cfg.warningN.immagine_a_destratesto3, "warning")
end
cfg.warningN.testo .. cfg.warningN.testo2a:gsub("$1", nazionalita) .. cfg.warningN.testo3)
end
 
return plural
end
 
-- Restituisce il plurale dei parametri necessari per le categorie
-- Traduzione in lua del [[Template:Bio/cat]]
function CategoryManager:_getPluralsAttivitaNazionalita()
-- Utilizzata da addAttivitaCategories, aggiunge la categoria (eventualmente con l'epoca)
local plurals = {}
local function addCat(catname, epoca1, epoca2)
local attnaznecessarie = not (args.Categorie == "no" and args.FineIncipit)
local added = false
 
-- Nazionalità può essere vuota solo quando c'è Categorie=no e FineIncipit
if epoca1 and titleExists("Categoria:" .. catname .. " " .. epoca1) then
if not args["Nazionalità"] and attnaznecessarie then
dumpCategory(catname .. " " .. epoca1)
addAvviso(cfg.warningN.testo .. cfg.warningN.testo2b .. cfg.warningN.testo3, "warning")
added = true
end
for _, nazionalita in ipairs(nazionalitaParams) do
if epoca2 and titleExists("Categoria:" .. catname .. " " .. epoca2) then
if args[nazionalita] then
dumpCategory(catname .. " " .. epoca2)
plurals[nazionalita] = self:_getPluralNazionalita(args[nazionalita])
added = true
end
end
if not added then
-- Attività può essere vuota solo quando c'è Categorie=no e FineIncipit
-- se non è stata aggiunta la categoria per epoca1 e epoca2
if not args["Attività"] and attnaznecessarie then
-- aggiunge la cat. semplice, e.g. "Scrittori italiani"
addAvviso(cfg.warningA.testo .. cfg.warningA.testo2b .. cfg.warningA.testo3, "warning")
dumpCategory(catname)
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.
-- Traduzione in lua del [[Template:Bio/categorie attività]] con un minimo di refactoring
function CategoryManager:_getEpoca()
-- Aggiunge le categorie: Attività nazionalità [del XYZ secolo]
local ret
local function addAttivitaCategories()
local annoNascita = tonumber(args.AnnoNascita)
local plurals = {} -- contiene la versione plurale dei parametri
local annoMorte = tonumber(args.AnnoMorte)
local epoca1, epoca2
if not annoNascita then
annoNascita = args.AnnoNascita:match('^(%d+) a%.C%.$')
annoNascita = annoNascita and tonumber(annoNascita) * -1
end
if annoNascita and annoNascita >= 2000 then
return "2000"
end
if not annoMorte and args.AnnoMorte then
annoMorte = args.AnnoMorte:match('^(%d+) a%.C%.$')
annoMorte = annoMorte and tonumber(annoMorte) * -1
end
 
if annoNascita and annoMorte and
-- controllo argomenti necessari al plurale per le categorie
annoNascita >= -500 and annoNascita <= 2100 and
-- (nello stesso ordine in cui avvenivano in [[Template:Bio/categorie attività]])
annoMorte >= -500 and annoMorte <= 2100 and
if args["Nazionalità"] then
((annoNascita >= 0 and annoMorte >= 0) or (annoNascita < 0 and annoMorte < 0)) then
plurals["Nazionalità"] = getPluralNazionalita(args["Nazionalità"], true)
local sign = ''
else
if annoNascita < 0 then
dumpAvviso(cfg.warningN.tipo, cfg.warningN.immagine, cfg.warningN.immagine_a_destra,
annoNascita, annoMorte = -annoNascita, -annoMorte
cfg.warningN.testo .. cfg.warningN.testo2b .. cfg.warningN.testo3)
end sign = '-'
end
if args["NazionalitàNaturalizzato"] then
local secoloNascita = math.floor((annoNascita - 1) / 100) * 100
plurals["NazionalitàNaturalizzato"] = getPluralNazionalita(args["NazionalitàNaturalizzato"], true)
local secoloMorte = math.floor((annoMorte - 1) / 100) * 100
end
ret = secoloNascita == secoloMorte and (sign .. secoloNascita) or nil
if args["Cittadinanza"] then
end
plurals["Cittadinanza"] = getPluralNazionalita(args["Cittadinanza"], true)
end
if args["Attività"] then
plurals["Attività"] = getPluralAttivita(args["Attività"], true)
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"] = getPluralAttivita(args["Attività2"], true)
end
if args["Attività3"] then
plurals["Attività3"] = getPluralAttivita(args["Attività3"], true)
end
 
return ret
-- aggiunta 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
 
-- Aggiunge Categoria:X dei secoli, se esistono
-- Traduzione in lua del [[Template:Bio/catnatimorti]]
function CategoryManager:_addCatSecolo(catname, epoca1, epoca2)
-- Aggiunge le categorie: Nati/Morti nell'anno/giorno/luogo
local ok = false
local function addNatiMortiCategories()
for _, epoca in ipairs({ epoca1, epoca2 }) do
local cat1, cat2
if epoca and titleExists("Categoria:" .. catname .. " " .. epoca) then
self:_addCategory(catname .. " " .. epoca)
ok = true
end
end
return ok
end
 
-- Aggiunge le categorie: Attività nazionalità [del XYZ secolo]
if args["AnnoNascita"] then
function CategoryManager:_addAttivita(plurals)
cat1 = "Nati nel " .. args["AnnoNascita"]
local catname, epoca1, epoca2, added, addatt, addnaz, add1, addbase
cat2 = "Nati nell'" .. args["AnnoNascita"]
addatt = {}
if titleExists("Categoria:" .. cat1) then
addnaz = {}
dumpCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
dumpCategory(cat2)
end
end
 
if args["AnnoMorte"] then
cat1 = "Morti nel " .. args["AnnoMorte"]
cat2 = "Morti nell'" .. args["AnnoMorte"]
if titleExists("Categoria:" .. cat1) then
dumpCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
dumpCategory(cat2)
end
else
dumpCategory("Persone viventi")
end
 
-- se Epoca e Epoca2 non sono stati inseriti dall'utente
if args["GiornoMeseNascita"] then
-- e AnnoNascita e AnnoMorte cadono nello stesso secolo
cat1 = "Nati il " .. fixFirstOfMonth(args["GiornoMeseNascita"])
-- calcola epoca1 automaticamente
cat2 = "Nati l'" .. args["GiornoMeseNascita"]
if not args.Epoca and not args.Epoca2 and args.AnnoNascita then
if titleExists("Categoria:" .. cat1) then
epoca1 = self:_getEpoca()
dumpCategory(cat1)
epoca1 = epoca1 and cfg.epoche[epoca1]
elseif titleExists("Categoria:" .. cat2) then
else
dumpCategory(cat2)
epoca1 = args.Epoca and cfg.epoche[args.Epoca]
end
epoca2 = args.Epoca2 and cfg.epoche[args.Epoca2]
end
end
if not epoca1 and not epoca2 then
if args["GiornoMeseMorte"] then
self:_addCategory(cfg.categorie["no-epoca"])
cat1 = "Morti il " .. fixFirstOfMonth(args["GiornoMeseMorte"])
end
cat2 = "Morti l'" .. args["GiornoMeseMorte"]
if titleExists("Categoria:" .. cat1) then
dumpCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
dumpCategory(cat2)
end
end
if args["LuogoNascitaLink"] then
cat1 = "Nati a " .. args["LuogoNascitaLink"]
cat2 = "Nati ad " .. args["LuogoNascitaLink"]
if titleExists("Categoria:" .. cat1) then
dumpCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
dumpCategory(cat2)
end
elseif args["LuogoNascita"] then
cat1 = "Nati a " .. args["LuogoNascita"]
cat2 = "Nati ad " .. args["LuogoNascita"]
if titleExists("Categoria:" .. cat1) then
dumpCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
dumpCategory(cat2)
end
end
 
if args.Categorie ~= "no" then
if args["LuogoMorteLink"] then
for _, attivita in ipairs(attivitaParams) do
cat1 = "Morti a " .. args["LuogoMorteLink"]
if plurals[attivita] then
cat2 = "Morti ad " .. args["LuogoMorteLink"]
for _, nazionalita in ipairs(nazionalitaParams) do
if titleExists("Categoria:" .. cat1) then
if plurals[nazionalita] then
dumpCategory(cat1)
catname = plurals[attivita] .. " " .. plurals[nazionalita]
elseif titleExists("Categoria:" .. cat2) then
added = self:_addCatSecolo(catname, epoca1, epoca2)
dumpCategory(cat2)
-- se non è stata aggiunta la categoria per epoca1 e epoca2
end
-- aggiunge la cat. semplice, es. "Scrittori italiani"
elseif args["LuogoMorte"] then
if added then
cat1 = "Morti a " .. args["LuogoMorte"]
add1 = true
cat2 = "Morti ad " .. args["LuogoMorte"]
addatt[attivita] = true
if titleExists("Categoria:" .. cat1) then
addnaz[nazionalita] = true
dumpCategory(cat1)
else
elseif titleExists("Categoria:" .. cat2) then
self:_addCategory(catname)
dumpCategory(cat2)
addbase = true
end
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
for k, v in ipairs({"cecoslovacchi", "jugoslavi", "sovietici"}) do
if plurals[nazionalita] == v and not add1 and not addbase then
self:_addCategory(plurals[nazionalita])
add1 = true
end
end
end
end
if not add1 and not addbase then
self:_addCatSecolo("Persone", epoca1, epoca2)
end
end
 
-- Utilizzata da addNatiMorti, restituisce il nome della categoria
-------------------------------------------------------------------------------
-- se titleLink o title sono nella lista di eccezioni Cat luoghi, altrimenti nil
-- Creazione incipit
function CategoryManager:_getCatLuoghi(titleLink, title, catPrefix)
-------------------------------------------------------------------------------
local cat
 
self.catLuoghi = self.catLuoghi or mw.loadData("Modulo:Bio/Cat luoghi")
-- Ritorna il link dell'attività o nil se non trovato
if titleLink and title then
local function getLinkAttivita(attivita)
cat = self.catLuoghi[titleLink]
link_attivita = link_attivita or mw.loadData("Modulo:Bio/Link attività")
elseif title then
return link_attivita[attivita]
cat = self.catLuoghi[title]
end
end
 
return cat and (catPrefix .. " " .. cat) or nil
-- Ritorna il link della nazionalità o nil se non trovato.
local function getLinkNazionalita(nazionalita)
link_nazionalita = link_nazionalita or mw.loadData("Modulo:Bio/Link nazionalità")
return link_nazionalita[nazionalita]
end
 
-- Aggiunge le categorie: Nati/Morti nell'anno/giorno/luogo
-- Prova a ottenere alcuni parametri mancanti da Wikidata
local function checkWikidataCategoryManager:_addNatiMorti()
local daymonthcat1, yearcat2
 
if args.AnnoNascita then
-- GiornoMeseNascita e AnnoNascita
cat1 = "Nati nel if not args["GiornoMeseNascita"] or not.. args[".AnnoNascita"] then
cat2 = "Nati nell'" .. args.AnnoNascita
daymonth, year = parseWikidataTimeValue("P569")
if titleExists("Categoria:" .. cat1) then
args["GiornoMeseNascita"] = args["GiornoMeseNascita"] or daymonth
self:_addCategory(cat1)
args["AnnoNascita"] = args["AnnoNascita"] or year
elseif titleExists("Categoria:" .. cat2) then
end
self:_addCategory(cat2)
-- GiornoMeseMorte e AnnoMorte
end
if not args["GiornoMeseMorte"] or not args["AnnoMorte"] then
end
daymonth, year = parseWikidataTimeValue("P570")
args["GiornoMeseMorte"] = args["GiornoMeseMorte"] or daymonth
args["AnnoMorte"] = args["AnnoMorte"] or year
end
end
 
if args.AnnoMorte then
-- Traduzione in lua del [[Template:Bio/articolo]]
if args.AnnoMorte == "?" then
local function getArticleMan(attivita)
self:_addCategory(cfg.categorie["annomorte-punto-interrogativo"])
local article
else
cat1 = "Morti nel " .. args.AnnoMorte
cat2 = "Morti nell'" .. args.AnnoMorte
if titleExists("Categoria:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
self:_addCategory(cat2)
end
end
else
self:_addCategory(cfg.categorie["annomorte-assente"])
end
 
if args.GiornoMeseNascita then
if cfg.articoli_maschili["uno"][attivita] then
cat1 = "Nati il " .. fixFirstOfMonth(args.GiornoMeseNascita)
article = "uno"
cat2 = "Nati l'" .. args.GiornoMeseNascita
elseif cfg.articoli_maschili["una"][attivita] then
if titleExists("Categoria:" .. cat1) then
article = "una"
self:_addCategory(cat1)
else
elseif titleExists("Categoria:" .. cat2) then
article = "un"
self:_addCategory(cat2)
end
end
end
if args.GiornoMeseMorte then
cat1 = "Morti il " .. fixFirstOfMonth(args.GiornoMeseMorte)
cat2 = "Morti l'" .. args.GiornoMeseMorte
if titleExists("Categoria:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
self:_addCategory(cat2)
end
end
 
-- prima di verificare le categorie per LuogoNascitaLink e LuogoNascita
return article
-- viene controllata una lista di eccezioni
cat1 = self:_getCatLuoghi(args.LuogoNascitaLink, args.LuogoNascita, "Nati")
if cat1 then
self:_addCategory(cat1)
elseif args.LuogoNascitaLink then
cat1 = "Nati a " .. args.LuogoNascitaLink
cat2 = "Nati ad " .. args.LuogoNascitaLink
if titleExists("Categoria:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
self:_addCategory(cat2)
end
elseif args.LuogoNascita then
cat1 = "Nati a " .. args.LuogoNascita
cat2 = "Nati ad " .. args.LuogoNascita
if titleExists("Categoria:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
self:_addCategory(cat2)
end
end
 
-- prima di verificare le categorie per LuogoMorteLink e LuogoMorte
-- viene controllata una lista di eccezioni
cat1 = self:_getCatLuoghi(args.LuogoMorteLink, args.LuogoMorte, "Morti")
if cat1 then
self:_addCategory(cat1)
elseif args.LuogoMorteLink then
cat1 = "Morti a " .. args.LuogoMorteLink
cat2 = "Morti ad " .. args.LuogoMorteLink
if titleExists("Categoria:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
self:_addCategory(cat2)
end
elseif args.LuogoMorte then
cat1 = "Morti a " .. args.LuogoMorte
cat2 = "Morti ad " .. args.LuogoMorte
if titleExists("Categoria:" .. cat1) then
self:_addCategory(cat1)
elseif titleExists("Categoria:" .. cat2) then
self:_addCategory(cat2)
end
end
end
 
-- =============================================================================
-- Traduzione in lua del [[Template:Bio/articolo_F]]
-- classe Incipit
-- aggiunge anche uno spazio nel caso non usi l'apostrofo
-- =============================================================================
local function getArticleWoman(attivita)
local article
 
local Incipit = {}
if cfg.articoli_femminili["un"][attivita] then
article = "un" .. SPACE
elseif attivita and attivita:match("^[aeiou]") then
article = "un'"
else
article = "una" .. SPACE
end
 
function Incipit:new()
return article
local self = {}
 
setmetatable(self, { __index = Incipit })
self.textTable = {}
self:_addImmagine()
self:_addNomeCognome()
self:_addNascitaMorte()
if args.Soprannome or args.Pseudonimo or args.PostCognomeVirgola then
self:_addText(",")
end
if args.FineIncipit then
if self:_needSpace(args.FineIncipit) then
self:_addText(' ')
end
self:_addText(args.FineIncipit)
else
self:_addAttivita()
end
if args.Punto ~= "no" then
self:_addText((args.FineIncipit == "e" or
args.FineIncipit == "ed" or
args.FineIncipit == ",") and
" " or ".")
end
 
return self
end
 
local function addImmagineIncipit:getIncipit()
return table.concat(self.textTable)
local caption
end
 
-- Aggiunge testo alla risposta, svolge anche la funzione di concatenatore
if args["Immagine"] then
function Incipit:_addText(...)
if args["Didascalia"] then
local arg = {...}
caption = args["Didascalia"]
for _, val in ipairs(arg) do
else
table.insert(self.textTable, val)
if args["Nome"] then
end
caption = args["Nome"]
end
if args["Cognome"] then
caption = (caption or "") .. " " .. args["Cognome"]
end
end
if args["Didascalia2"] then
caption = (caption or "") .. "<hr />" .. args["Didascalia2"]
end
dumpImage(args["Immagine"], args["DimImmagine"], caption)
elseif args["Didascalia2"] then
-- parentesi () extra per non ritornare anche il gsub.count
dumpText( (cfg.didascalia2:gsub("$1", args["Didascalia2"])) )
end
end
 
-- Aggiunge un wlink alla risposta, se target è nil utilizza label come target.
local function addNomeCognome()
-- labelPrefix, se presente, viene rimosso dalla label e anteposto al wlink.
if args["Titolo"] then
function Incipit:_addWlink(target, label, labelPrefix)
dumpText(args["Titolo"], SPACE)
if target and label and labelPrefix then
end
local count
label, count = label:gsub("^" .. labelPrefix .. " ", "")
if count == 1 then
self:_addText(labelPrefix, " ")
end
end
 
if target and label then
-- inizio grassetto
self:_addText("[[", target, "|", label, "]]")
dumpText("'''")
else
self:_addText("[[", target or label, "]]")
end
end
 
-- Aggiunge una immagine alla risposta, size e caption sono opzionali
if args["Nome"] then
function Incipit:_addImage(name, size, caption)
dumpText(args["Nome"])
self:_addText("[[File:", name, "|thumb")
end
 
if args["Cognome"]size then
self:_addText("|", size, "px")
dumpText(SPACE, args["Cognome"])
end
if caption then
self:_addText("|", caption)
end
 
self:_addText("]]", "\n")
-- fine grassetto
end
dumpText("'''")
 
if args["PostCognomeVirgola"] then
dumpText(",", SPACE, args["PostCognomeVirgola"])
end
 
-- Restituisce true se text necessita di uno spazio iniziale (PostCognome, PostSoprannome, PostPseudonimo, LuogoNascitaAlt, NoteNascita, LuogoMorteAlt, NoteMorte, AttivitàAltre, PostNazionalità, FineIncipit)
if args["PostCognome"] then
function Incipit:_needSpace(text)
dumpText(SPACE, args["PostCognome"])
return mw.ustring.match(mw.ustring.sub(text, 1, 1), "%w") ~= nil or
end
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
 
local function addNascitaMorteIncipit:_getArticleMan(attivita)
local article
-- si apre la parentesi
if cfg.articoli_maschili["uno"][attivita] then
dumpText(SPACE, "(")
article = "uno"
elseif cfg.articoli_maschili["una"][attivita] then
article = "una"
else
article = "un"
end
return article
end
 
function Incipit:_getArticleWoman(attivita)
if args["PreData"] then
local article
dumpText(args["PreData"], ";", SPACE)
-- aggiunge anche uno spazio nel caso non usi l'apostrofo
end
if cfg.articoli_femminili["un"][attivita] then
article = "un "
elseif attivita and attivita:match("^[aeiou]") then
article = "un'"
else
article = "una "
end
return article
end
 
function Incipit:_addImmagine()
if args["LuogoNascita"] then
local caption
dumpWlink(args["LuogoNascitaLink"], args["LuogoNascita"])
if args["LuogoNascitaAlt"].Immagine then
if args.Didascalia then
dumpText(SPACE, args["LuogoNascitaAlt"])
caption = args.Didascalia
end
elseif args.Pseudonimo and currentTitleEquals(args.Pseudonimo) then
dumpText(",", SPACE)
caption = args.Pseudonimo
end
elseif args.Soprannome and args.Cognome and currentTitleEquals(args.Soprannome .. " " .. args.Cognome) then
caption = args.Soprannome .. " " .. args.Cognome
elseif args.Soprannome and currentTitleEquals(args.Soprannome) then
caption = args.Soprannome
else
if args.CognomePrima and args.Nome and args.Cognome then
caption = args.Cognome .. " " .. args.Nome
else
if args.Nome then
caption = args.Nome
end
if args.Cognome then
caption = (caption or "") .. " " .. args.Cognome
end
end
end
if args.Didascalia2 then
caption = (caption or "") .. "<hr />" .. args.Didascalia2
end
self:_addImage(args.Immagine, args.DimImmagine, caption)
elseif args.Didascalia2 then
-- parentesi () extra per non restituire anche il gsub.count
self:_addText( (cfg.didascalia2:gsub("$1", args.Didascalia2)) )
end
end
 
function Incipit:_addNomeCognome()
if args["GiornoMeseNascita"] then
if titleExists(args["GiornoMeseNascita"]).Titolo then
self:_addText(args.Titolo, " ")
dumpWlink(args["GiornoMeseNascita"])
end
else
dumpText(args["GiornoMeseNascita"])
end
dumpText(SPACE)
end
 
if args.Pseudonimo and currentTitleEquals(args.Pseudonimo) then
if args["AnnoNascita"] then
self:_addText("'''", args.Pseudonimo, "'''")
if titleExists(args["AnnoNascita"]) then
if args.PostPseudonimo then
dumpWlink(args["AnnoNascita"])
if self:_needSpace(args.PostPseudonimo) then
else
self:_addText(" ")
dumpText(args["AnnoNascita"])
end
self:_addText(args.PostPseudonimo)
else
end
dumpText("...")
self:_addText(", pseudonimo di ")
end
end
 
-- inizio grassetto
if args["NoteNascita"] then
self:_addText("'''")
dumpText(args["NoteNascita"])
end
 
if args.CognomePrima and args.Nome ifand args["AnnoMorte"].Cognome then
self:_addText(args.Cognome, " ", args.Nome, mw.getCurrentFrame():expandTemplate{
dumpText(SPACE, "–", SPACE)
title = "Nota nome",
if args["LuogoMorte"] then
args = { [1] = args.CognomePrima, [2] = args.Cognome }
dumpWlink(args["LuogoMorteLink"], args["LuogoMorte"])
})
if args["LuogoMorteAlt"] then
else
dumpText(SPACE, args["LuogoMorteAlt"])
local no_space
end
if args.Nome then
dumpText(",", SPACE)
self:_addText(args.Nome)
end
-- niente spazio prima di Cognome se Nome termina con «d'»
no_space = mw.ustring.match(args.Nome, " d'$") and ''
end
if args.Cognome then
self:_addText(no_space or " ", args.Cognome)
end
end
 
-- fine grassetto
if args["GiornoMeseMorte"] then
self:_addText("'''")
if titleExists(args["GiornoMeseMorte"]) then
dumpWlink(args["GiornoMeseMorte"])
else
dumpText(args["GiornoMeseMorte"])
end
dumpText(SPACE)
end
 
if args["AnnoMorte"].PostCognomeVirgola then
self:_addText(", ", args.PostCognomeVirgola)
if args["AnnoMorte"] == "?" then
elseif args.PostCognome then
dumpText("...")
if self:_needSpace(args.PostCognome) then
else
self:_addText(" ")
if titleExists(args["AnnoMorte"]) then
end
dumpWlink(args["AnnoMorte"])
self:_addText(args.PostCognome)
else
end
dumpText(args["AnnoMorte"])
end
end
end
end
 
if args["NoteMorte"].Soprannome then
self:_addText(", ", (not args.Sesso or args.Sesso == "M") and "detto" or "detta",
dumpText(args["NoteMorte"])
" ", "'''", args.Soprannome, "'''")
end
if args.PostSoprannome then
if self:_needSpace(args.PostSoprannome) then
self:_addText(" ")
end
self:_addText(args.PostSoprannome)
end
end
 
if args.Pseudonimo and not currentTitleEquals(args.Pseudonimo) then
-- si chiude la parentesi
self:_addText(", ", (not args.Sesso or args.Sesso == "M") and "noto" or "nota",
dumpText(")")
" anche con lo pseudonimo di ", "'''", args.Pseudonimo, "'''")
if args.PostPseudonimo then
if self:_needSpace(args.PostPseudonimo) then
self:_addText(" ")
end
self:_addText(args.PostPseudonimo)
end
end
end
 
local function addAttivitaIncipit:_addNascitaMorte()
-- si apre la parentesi
if args["PreAttività"] then
self:_addText(" (")
dumpText(args["PreAttività"], SPACE)
else
if args.PreData then
dumpText("è", SPACE)
self:_addText(args.PreData, "; ")
if args["AnnoMorte"] then
end
dumpText((not args["Sesso"] or args["Sesso"] == "M")
and "stato" or "stata", SPACE)
local datimancanti = not (args.LuogoNascita or args.GiornoMeseNascita or args.NoteNascita or args.LuogoMorte or args.GiornoMeseMorte)
end
local floruit = args.AnnoMorte == "?" and (args.Floruit or cfg.epoche[args.Epoca])
if not args["Sesso"] or args["Sesso"] == "M" then
dumpText(getArticleMan(args["Attività"]), SPACE)
else
dumpText(getArticleWoman(args["Attività"]))
end
end
 
if args.LuogoNascita then
dumpWlink(getLinkAttivita(args["Attività"]), args["Attività"] or "")
self:_addWlink(args.LuogoNascitaLink, args.LuogoNascita)
if args.LuogoNascitaAlt then
if self:_needSpace(args.LuogoNascitaAlt) then
self:_addText(" ")
end
self:_addText(args.LuogoNascitaAlt)
end
self:_addText(", ")
end
 
if args["Attività2"].GiornoMeseNascita then
if titleExists(args.GiornoMeseNascita) then
if args["Attività3"] or args["AttivitàAltre"] then
self:_addWlink(args.GiornoMeseNascita)
dumpText(",")
else
self:_addText(args.GiornoMeseNascita)
dumpText(SPACE, getEufonica(args["Attività2"]))
end
self:_addText(" ")
dumpText(SPACE)
end
dumpWlink(getLinkAttivita(args["Attività2"]), args["Attività2"])
end
 
if args["Attività3"].AnnoNascita then
if titleExists(args["AttivitàAltre"].AnnoNascita) then
self:_addWlink(args.AnnoNascita)
dumpText(",")
else
self:_addText(args.AnnoNascita)
dumpText(SPACE, getEufonica(args["Attività3"]))
end
elseif not floruit or not datimancanti then
dumpText(SPACE)
self:_addText("...")
dumpWlink(getLinkAttivita(args["Attività3"]), args["Attività3"])
end
if args.NoteNascita then
if self:_needSpace(args.NoteNascita) then
self:_addText(" ")
end
self:_addText(args.NoteNascita)
end
 
if args.AnnoMorte and (not floruit or not datimancanti) then
if args["AttivitàAltre"] then
self:_addText(" – ")
dumpText(args["AttivitàAltre"])
if args.LuogoMorte then
end
self:_addWlink(args.LuogoMorteLink, args.LuogoMorte)
if args.LuogoMorteAlt then
if self:_needSpace(args.LuogoMorteAlt) then
self:_addText(" ")
end
self:_addText(args.LuogoMorteAlt)
end
self:_addText(", ")
end
 
if args.GiornoMeseMorte then
dumpText(SPACE)
if titleExists(args.GiornoMeseMorte) then
dumpWlink(getLinkNazionalita(args["Nazionalità"]), args["Nazionalità"] or "")
self:_addWlink(args.GiornoMeseMorte)
else
self:_addText(args.GiornoMeseMorte)
end
self:_addText(" ")
end
 
if args["Cittadinanza"].AnnoMorte then
if args.AnnoMorte == "?" then
dumpText(SPACE, "con cittadinanza", SPACE)
self:_addText("...")
dumpWlink(getLinkNazionalita(args["Cittadinanza"]), args["Cittadinanza"])
else
end
if titleExists(args.AnnoMorte) then
self:_addWlink(args.AnnoMorte)
else
self:_addText(args.AnnoMorte)
end
end
end
end
 
-- se date ignote, usa Floruit o lo ricava da Epoca
if args["NazionalitàNaturalizzato"] then
if not args.AnnoNascita and args.AnnoMorte == "?" then
dumpText(SPACE)
local fl = args.Floruit
dumpWlink("Naturalizzazione",
if not fl and cfg.epoche[args.Epoca] then
(not args["Sesso"] or args["Sesso"] == "M" or
fl = mw.ustring.gsub(cfg.epoche[args.Epoca], "^del ?l?'?", "")
(args["Sesso"] == "F" and getArticleWoman(args["Attività"]) == "un&#32;")) and
-- se due epoche, le mette entrambe senza ripetere la parola "secolo"
"naturalizzato" or "naturalizzata")
if cfg.epoche[args.Epoca2] then
dumpText(SPACE)
if fl ~= "I secolo a.C." then
dumpWlink(getLinkNazionalita(args["NazionalitàNaturalizzato"]), args["NazionalitàNaturalizzato"])
fl = fl .. "|" .. mw.ustring.gsub(fl, " secolo.*$", "")
end
end
fl = "[[" .. fl .. "]]-[[" .. mw.ustring.gsub(cfg.epoche[args.Epoca2], "^del ?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["PostNazionalità"].NoteMorte then
dumpText(args["PostNazionalità"])
if self:_needSpace(args.NoteMorte) then
end
self:_addText(" ")
end
self:_addText(args.NoteMorte)
end
-- si chiude la parentesi
self:_addText(")")
end
 
function Incipit:_addAttivita()
-- Traduzione in lua di [[Template:Bio]]
local link_attivita = mw.loadData("Modulo:Bio/Link attività")
local function bio()
local link_nazionalita = mw.loadData("Modulo:Bio/Link nazionalità")
local sortkey
 
self:_addText(" ")
-- lettura configurazione
if args["PreAttività"] then
cfg = mw.loadData("Modulo:Bio/Configurazione")
self:_addText(args["PreAttività"], " ")
else
-- parsifica i parametri e aggiunge eventuali categorie di errore
self:_addText("è ")
args = parseParams(mw.getCurrentFrame():getParent().args)
if args.AnnoMorte then
self:_addText((not args.Sesso or args.Sesso == "M")
and "stato " or "stata ")
end
if not args.Sesso or args.Sesso == "M" then
self:_addText(self:_getArticleMan(args["Attività"]), " ")
else
self:_addText(self:_getArticleWoman(args["Attività"]))
end
end
 
local getLinkAttivita = function(attivita)
-- prova a ottenere alcuni parametri mancanti da Wikidata
if not attivita then return end
if cfg.wikidata then
local ex_attivita = isExAttivita(attivita)
checkWikidata()
return link_attivita[ex_attivita or attivita] or ex_attivita
end
end
 
self:_addWlink(getLinkAttivita(args["Attività"]), args["Attività"] or "", "ex")
-- le categorie sono aggiunte solo se la pagina è nel namespace principale (0)
if mw.title.getCurrentTitle().namespace == 0 then
-- imposta la magic word defaultsort
if args["ForzaOrdinamento"] then
sortkey = args["ForzaOrdinamento"]
elseif args["Cognome"] and args["Nome"] then
sortkey = args["Cognome"] .. "&#32;," .. args["Nome"]
end
if sortkey then
mw.getCurrentFrame():preprocess("{{DEFAULTSORT:" .. sortkey .. "}}")
end
-- Categorie impostato a "no" disabilita la categorizzazione per attività
if args["Categorie"] ~= "no" then
addAttivitaCategories()
end
addNatiMortiCategories()
dumpCategory(cfg.categorie["bot"])
end
 
if args["Attività2"] then
addImmagine()
if args["Attività3"] or args["AttivitàAltre"] then
addNomeCognome()
self:_addText(",")
addNascitaMorte()
else
self:_addText(" ", getEufonica(args["Attività2"]))
end
self:_addText(" ")
self:_addWlink(getLinkAttivita(args["Attività2"]), args["Attività2"], "ex")
end
 
if args["PostCognomeVirgolaAttività3"] then
if args["AttivitàAltre"] then
dumpText(",")
self:_addText(",")
end
else
self:_addText(" ", getEufonica(args["Attività3"]))
end
self:_addText(" ")
self:_addWlink(getLinkAttivita(args["Attività3"]), args["Attività3"], "ex")
end
 
if args["FineIncipitAttivitàAltre"] ~= "," then
if self:_needSpace(args["AttivitàAltre"]) then
dumpText(SPACE)
self:_addText(" ")
end
end
self:_addText(args["AttivitàAltre"])
end
 
self:_addText(" ")
if args["FineIncipit"] and args["FineIncipit"] ~= "," then
self:_addWlink(link_nazionalita[args["Nazionalità"]], args["Nazionalità"] or "")
dumpText(args["FineIncipit"])
else
addAttivita()
end
 
if args["Punto"] ~= "no".Cittadinanza then
self:_addText(" con cittadinanza ")
if args["FineIncipit"] ~= "e" and
self:_addWlink(link_nazionalita[args.Cittadinanza], args.Cittadinanza)
args["FineIncipit"] ~= "ed" and
end
args["FineIncipit"] ~= ",=&#32;" then
dumpText(".")
end
end
 
if args["NazionalitàNaturalizzato"] then
return table.concat(textTable)
self:_addText(" ")
end
self:_addWlink("Naturalizzazione",
(not args.Sesso or args.Sesso == "M" or
(args.Sesso == "F" and self:_getArticleWoman(args["Attività"]) == "un ")) and
"naturalizzato" or "naturalizzata")
self:_addText(" ")
self:_addWlink(link_nazionalita[args["NazionalitàNaturalizzato"]], args["NazionalitàNaturalizzato"])
end
 
if args["PostNazionalità"] then
-- Entry-point per {{Bio/link attività}}
if self:_needSpace(args["PostNazionalità"]) then
function p.linkAttivita(frame)
self:_addText(" ")
return getLinkAttivita(frame:getParent().args[1])
end
self:_addText(args["PostNazionalità"])
end
end
 
-- =============================================================================
-- Entry-point per {{Bio/link nazionalità}}
-- Funzioni esportate
function p.linkNazionalita(frame)
-- =============================================================================
return getLinkNazionalita(frame:getParent().args[1])
end
 
local p = {}
-- Entry-point per {{Bio/plurale attività}}
 
function p.pluraleAttivita(frame)
-- Funzione per {{#invoke:Bio|categorie}} utilizzato da Modulo:Bio/test
return getPluralAttivita(frame:getParent().args[1])
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
 
-- Entry-pointFunzione per il template per {{Bio/plurale nazionalità}}
function p.pluraleNazionalitamain(frame)
-- gli errori generano avvisi, ma non interrompono l'esecuzione,
return getPluralNazionalita(frame:getParent().args[1])
-- come avveniva nel vecchio template.
end
args = ArgsParser:new():parse(frame:getParent().args)
local catTable = CategoryManager:new():getCategories()
 
return table.concat(errorTable) ..
-- Entry-point per {{Bio}}
Incipit:new():getIncipit() ..
function p.bio(frame)
table.concat(catTable)
return bio()
end