Modulo:Infobox/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Moroboshi (discussione | contributi)
sottotitolo/sovratitolo
aggiornato alla versione corrente
Riga 2:
local p = {} -- per l'esportazione delle funzioni del modulo
 
--local HtmlBuilder = require('Module:HtmlBuilder') -- richiesto per la costruzione del markup html
local function getArgNums(args)
 
local args = {}-- variabile che contiene gli argomenti passati al template
local origArgs
local root -- radice del markup html
local dump = {}
 
local function getArgNums(...)
-- Restituisce una lista che contiene il suffisso numerico di tutti gli argomenti
-- che iniziano con unoil deiprefisso prefissi passati per argomento"prefix"
-- Per esempio lasese nella lista argomenti sono valorizzati "Valore1, Valore2 e Valore4"
-- retistuirà la lista [1, 2, 4]
local prefixs = {'Valore', 'GruppoOpzionale', 'Gruppo'...}
local nums = {}
for k, _ in pairs(args) do
local num = nil
for _, candidate in ipairs(prefixs) do
num = tostring('' .. k):match('^' .. candidate .. '(%d+)$')
if num ~= nil then break end
end
Riga 21 ⟶ 28:
end
 
local function addRow(root, args, rowArgs)
-- Aggiunge una riga alla tabella
-- Se rowArgs.gruppo non è nullo la considera come una riga di testata di gruppo
Riga 31 ⟶ 38:
:tag('th')
:attr('colspan', 2)
:cssText(args['StileGruppo' .. rowArgs.rownum] or args.StileGruppo or '')
:wikitext(rowArgs.gruppo)
-- Altrimenti se rowArgs.valore non è nullo inserisce una riga dati, verificando
Riga 41 ⟶ 48:
row
:tag('th')
:cssText(args['StileNome' .. rowArgs.rownum] or args.StileNome or '')
:wikitext(rowArgs.nome)
dataCell = row:tag('td')
Riga 51 ⟶ 58:
dataCell
:addClass(rowArgs.classe or '')
:cssText(args['StileValore' .. rowArgs.rownum] or args.StileValore or '')
:wikitext(rowArgs.valore)
end
end
 
local function renderTitle(root, args)
local sopratitolo
if args.Sopratitolo then
sopratitolo = mw.html.create('div')
sopratitolo:tag('div')
.cssText(args.StileSopratitolo)
:wikitext(args.SopraTitolo or 'font-size:small;')
end
local sottotitolo
if args.Sottotitolo then
sottotitolo = mw.html.create('div')
sottotitolo:tag('div')
.cssText(args.StileSottotitolo)
:wikitext(args.Sottotitolo or 'font-size:small;')
end
if args.TitoloEst then
root
:tag('caption')
:addClass('sinottico_testata')
:cssTextcss(args.StileTitoloEst or '"font-weight:", "bold;'")
:nodecssText(sopratitoloargs.StileTitoloEst or '')
:wikitext(args.TitoloEst)
:node(sottotitolo)
elseif args.TitoloInt then
root
Riga 86 ⟶ 78:
:attr('colspan', '2')
:cssText(args.StileTitoloInt or '')
:node(sopratitolo)
:wikitext(args.TitoloInt)
:node(sottotitolo)
end
end
 
local function renderImage(root, args)
if not args.Immagine then return end
local cell_immagine = mw.html.create('td')
root:tag('tr')
local cell_immagine = root:tag('td')
cell_immagine
:addClass(args.ClasseImmagine or '')
Riga 110 ⟶ 99:
:wikitext(args.Didascalia)
end
root:tag('tr'):node(cell_immagine)
end
 
 
local function renderRows(root, args)
local rownums = getArgNums(args'Valore', 'GruppoOpzionale', 'Gruppo')
for k, num in ipairs(rownums) do
local skip = false
Riga 128 ⟶ 118:
end
if not skip and args['GruppoOpzionale' .. num] ~= '$fine' then
addRow(root, args, {
gruppo = args['GruppoOpzionale' .. num] or args['Gruppo' .. num],
nome = args['Nome' .. num],
valore = args['Valore' .. num],
classe = args['Classe' .. num],
rownum = num
})
end
Riga 139 ⟶ 128:
end
 
local function renderLastRow(root, args)
if not args.Ultima then return end
root
Riga 151 ⟶ 140:
end
 
local function renderNavBar(root, args)
if not args.NomeTemplate then return end
root
Riga 164 ⟶ 153:
end
 
local function p._infobox(args)
 
-- Crea l'albero html che rappresenta la tabella del sinottico e restituisce il markup
if args.InserisciTestata == 'no' then
Riga 174 ⟶ 162:
:addClass('sinottico')
:cssText(args.StileTabella or '')
:attr('summary', args.Summary or 'Tabella sinottica che riassume i principali dati del soggetto')
renderTitle(root, args)
renderImagerenderTitle(root, args)
renderImage()
end
renderRows(root, args)
if args.InserisciCoda ~= 'no' then
renderLastRow(root, args)
renderNavBar(root, args)
end
 
return tostring(root)
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("Valore non tabella trovato nella tabella prefissi", 2)
end
if type(step) ~= 'number' then
error("Passo di tipo non valido", 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('Valori non validi riscontrati per la tabella di prefissi 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('Parametro "dipendente" non valido riscontrato in 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.
local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Infobox' })
-- 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
return p._infobox(args)
-- 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 evemntuali 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('StileTabella')
preprocessArgs({
{prefix='TitoloEst', depend={'StileTitoloEst'}}
}, 0)
preprocessArgs({
{prefix='TitoloInt', depend={'StileTitoloInt'}}
}, 0)
preprocessArgs({
{prefix='Immagine', depend={'ClasseImmagine', 'StileImmagine',
'Didascalia', 'StileDidascalia'}}
}, 0)
preprocessSingleArg('StileGruppo')
preprocessSingleArg('StileNome')
preprocessSingleArg('StileValore')
preprocessArgs({
{prefix = 'Gruppo'},
{prefix = 'GruppoOpzionale'},
{prefix = 'Valore', depend={'Nome', 'Classe'}},
}, 50)
preprocessSingleArg('Ultima')
preprocessSingleArg('StileUltima')
preprocessSingleArg('NomeTemplate')
preprocessSingleArg('InserisciTestata')
preprocessSingleArg('InserisciCoda')
preprocessSingleArg('Summary')
return _infobox()
end