Mòdulu:Infobox
Apparenza
La ducumintazzioni di stu mòdulu si pò criari nta Mòdulu:Infobox/doc
-- Modulo per implementare le funzionalità di infobox
local p = {} -- per l'esportazione delle funzioni del modulo
local args = {}-- variabile che contiene gli argomenti passati al template
local origArgs
local root -- radice del markup html
local dump = {}
local function checkList(valore)
-- Permette al software Mediawiki di gestire le liste # o *
local c = mw.ustring.sub(valore, 1, 1)
if c == '#' or c == '*' then
valore = '<div>\n' .. valore .. '\n</div>'
end
return valore .. '\n'
end
local function getArgNums(...)
-- Restituisce una lista che contiene il suffisso numerico di tutti gli argomenti
-- che iniziano con il prefisso "prefix"
-- Per esempio se nella lista argomenti sono valorizzati "Valore1, Valore2 e Valore4"
-- retistuirà la lista [1, 2, 4]
local prefixs = {...}
local nums = {}
for k, _ in pairs(args) do
local num = nil
for _, candidate in ipairs(prefixs) do
num = ('' .. k):match('^' .. candidate .. '(%d+)$')
if num ~= nil then break end
end
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function addRow(rowArgs)
-- Aggiunge una riga alla tabella
-- Se rowArgs.gruppo non è nullo la considera come una riga di testata di gruppo
-- e ignora eventuali valorizzazioni di rowArgs.valore
if rowArgs.gruppo then
root
:tag('tr')
:addClass("sinottico_divisione")
:tag('th')
:attr('colspan', 2)
:cssText(rowArgs.stilegruppoN or args.StiliGruppu or nil)
:wikitext(rowArgs.gruppo)
-- Altrimenti se rowArgs.valore non è nullo inserisce una riga dati, verificando
-- se esiste o meno la testata
elseif rowArgs.valore then
local row = root:tag('tr')
local dataCell
if rowArgs.nome then
row
:tag('th')
:cssText(rowArgs.stilenomeN or args.StiliNomu or nil)
:wikitext(rowArgs.nome)
dataCell = row:tag('td')
else
dataCell = row:tag('td')
:addClass('sinottico_testo_centrale')
:attr('colspan', 2)
end
dataCell
:addClass(rowArgs.classe or nil)
:cssText(rowArgs.stilevaloreN or args.StiliValuri or nil)
:wikitext(checkList(rowArgs.valore))
end
end
local function renderTitle()
local suptitle = mw.html.create('')
if args["SupraTìtulu"] then
suptitle
:tag('span')
:addClass('sinottico_sottotitolo')
:cssText(args["StiliSupraTìtulu"] or nil)
:wikitext(args["SupraTìtulu"])
:done()
:tag('br'):done()
end
local subtitle = mw.html.create('')
if args["SuttaTìtulu"] then
subtitle
:tag('br'):done()
:tag('span')
:addClass('sinottico_sottotitolo')
:cssText(args["StiliSuttaTìtulu"] or nil)
:wikitext(args["SuttaTìtulu"])
end
if args["TìtuluFora"] then
root
:tag('caption')
:addClass('sinottico_testata')
:cssText(args["StiliTìtuluFora"] or nil)
:node(suptitle)
:wikitext(args["TìtuluFora"])
:node(subtitle)
elseif args["Tìtulu"] then
root
:tag('tr')
:addClass('sinottico_testata')
:tag('th')
:attr('colspan', '2')
:node(suptitle)
:cssText(args["StiliTìtulu"] or nil)
:wikitext(args["Tìtulu"])
:node(subtitle)
end
end
local function renderImage()
if not args["Mmàggini"] then return end
local cell_immagine = mw.html.create('td')
cell_immagine
:addClass('sinottico_testo_centrale ' .. (args["ClassiMmàggini"] or ''))
:attr('colspan', '2')
:cssText(args["StiliMmàggini"] or nil)
:wikitext(args["Mmàggini"])
if args["Didascalìa"] then
cell_immagine
:tag('br', {selfClosing = true})
:done()
:tag('span')
:cssText(args["StiliDidascalìa"] or nil)
:wikitext(args["Didascalìa"])
end
root:tag('tr'):node(cell_immagine)
end
local function renderRows()
local rownums = getArgNums('Valuri', 'GruppuUpziunali', 'Gruppu', 'Ruppu')
for k, num in ipairs(rownums) do
local skip = false
if args['GruppuUpziunali' .. num] ~= nil then
skip = true
for j = k+1, #rownums do
if args['Gruppu' .. rownums[j]] ~= nil or args['GruppuUpziunali' .. rownums[j]]~=nil then break end
if args['Valuri' .. rownums[j]] ~= nil or args['Ruppu' .. rownums[j]] ~= nil then
skip = false
break
end
end
end
if args['Ruppu' .. num] ~= nil then
root:wikitext(args['Ruppu' .. num])
skip = true
end
if not skip and args['GruppuUpziunali' .. num] ~= '$fini' then
addRow({
gruppo = args['GruppuUpziunali' .. num] or args['Gruppu' .. num],
nome = args['Nomu' .. num],
valore = args['Valuri' .. num],
classe = args['Classi' .. num],
stilegruppoN = args['GruppuStili' .. num],
stilenomeN = args['NomuStili' .. num],
stilevaloreN = args['ValuriStili' .. num]
})
end
end
end
local function renderLastRow()
if not args["Ùrtimu"] then return end
root
:tag('tr')
:tag('td')
:attr('colspan', '2')
:addClass('sinottico_piede')
:cssText(args["StiliÙrtimu"] or nil)
:wikitext(args["Ùrtimu"])
:newline()
end
local function renderNavBar()
if not args["NomuMudeḍḍu"] then return end
root
:tag('tr')
:tag('td')
:addClass('sinottico_piede2 noprint nomobile metadata')
:attr('colspan', '2')
:wikitext(mw.getCurrentFrame():expandTemplate({
title = 'Lijami sinòtticu',
args = args["LijamiWikidata"] and
{ args["NomuMudeḍḍu"] } or
{ args["NomuMudeḍḍu"], nowd = 1 }
}))
end
local function _infobox()
-- Crea l'albero html che rappresenta la tabella del sinottico e restituisce il markup
if args.CreaTabbella == 'no' or args.Pusizzioni == 'corpu' or args.Pusizzioni == 'cuda' then
root = mw.html.create('')
else
root = mw.html.create('table')
root
:addClass('infobox sinottico')
:cssText(args.StiliTabbella or nil)
:attr('summary', args.Suntu or 'Suntu dî dati principali di l\'argumentu')
end
renderTitle()
renderImage()
renderRows()
renderLastRow()
renderNavBar()
local res = tostring(root)
if args.Pusizzioni == 'cuda' then
res = res .. '</table>';
elseif args.Pusizzioni == 'testa' then
res = mw.ustring.gsub( res, '</table>$', '')
end
return res
end
local function preprocessSingleArg(argName)
-- Se l'argomento esiste e non è una stringa vuota lo aggiunge alla tabella degli argomenti
-- Argomenti uguali a stringa vuota sono trattati come nulli come da comportamento
-- precedente del template {{Infobox}}
if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
end
end
local function preprocessArgs(prefixTable, step)
-- Assegna i parametri con i dati prefissi alla tabella args, in ordine e secondo lotti di
-- dimensione specificata. La prefixTable dovrebbe essere un array contenente tabelle, ognuna
-- delle quali con due possibili campi, una stringa "prefisso" e una tabella di "dipendenze". La
-- funsione esamina tutti i parametri contenenti la stringa prefisso, ma esamina quelli della
-- tabella dipendenti solo se il prefisso da cui dipendono è presente e non nullo.
if type(prefixTable) ~= 'table' then
error("Valuri diversu di tabbella truvatu nnâ tabbella prifissi", 2)
end
if type(step) ~= 'number' then
error("Passu nun vàlitu", 2)
end
-- Ottiene gli argmenti senza un suffisso numerico e controlla per input errati.
for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Valuri nun vàliti nnâ tabbella dî prifissi preprocessArgs', 2)
end
preprocessSingleArg(v.prefix)
-- Esamina i parametri dipendenti solo se il parametro prefisso è presente e non nullo.
if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
error('Paràmitru "dipinnenti" nun vàlitu nne preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
if step == 0 then return end
-- Estrae gli argomenti con un suffisso numerico
local a = 1 -- Counter variable.
local moreArgumentsExist = true
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
local prefixArgName = v.prefix .. tostring(i)
if origArgs[prefixArgName] then
moreArgumentsExist = true -- Aggiunge una passata se un parametro è stato trovato, anche se nullo.
preprocessSingleArg(prefixArgName)
end
-- Processa la tavola dei dipendenti se il parametro da cui dipendono esiste e non è nullo
if v.depend and args[prefixArgName] then
for j,dependValue in ipairs(v.depend) do
local dependArgName = dependValue .. tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a = a + step
end
end
function p.infobox(frame)
-- 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.args
end
-- Le funzioni Parser considerano la stringa vuota come falsa, così per preservare il
-- comportamento di {{infobox}} tutti gli argomenti vuoti non vengono memorizzati
-- nella tabella globale args, così da essere considerati falsi
-- Nota: args è una variabile globale per il modulo dichiarata al suo inizio
-- Scandisce i parametri nello stesso ordine in cui lo faceva il vecchio {{infobox}}
-- così che eventuali istruzioni ref compariranno in posizione e ordine corretto. Parametri che dipendono da
-- altri parametri sono processati solo se il parametro è presente, così da evitare
-- la comparsa di riferimenti fantasma in posti inattesi.
preprocessSingleArg('StiliTabbella')
preprocessArgs({
{prefix='SupraTìtulu', depend={'StiliSupraTìtulu'}}
}, 0)
preprocessArgs({
{prefix='TìtuluFora', depend={'StiliTìtuluFora'}}
}, 0)
preprocessArgs({
{prefix='Tìtulu', depend={'StiliTìtulu'}}
}, 0)
preprocessArgs({
{prefix='SuttaTìtulu', depend={'StiliSuttaTìtulu'}}
}, 0)
preprocessArgs({
{prefix='Mmàggini', depend={'ClassiMmàggini', 'StiliMmàggini',
'Didascalìa', 'StiliDidascalìa'}}
}, 0)
preprocessSingleArg('StiliGruppu')
preprocessSingleArg('StiliNomu')
preprocessSingleArg('StiliValuri')
preprocessArgs({
{prefix = 'Ruppu'},
{prefix = 'Gruppu', depend={'GruppuStili'}},
{prefix = 'GruppuUpziunali', depend={'GruppuStili'}},
{prefix = 'Valuri', depend={'Nomu', 'Classi', 'NomuStili', 'ValuriStili'}},
}, 50)
preprocessSingleArg('Ùrtimu')
preprocessSingleArg('StiliÙrtimu')
preprocessSingleArg('NomuMudeḍḍu')
preprocessSingleArg('LijamiWikidata')
preprocessSingleArg('CreaTabella')
preprocessSingleArg('Pusizzioni')
preprocessSingleArg('Suntu')
return _infobox()
end
return p