Questa pagina è protetta dallo spostamento
Questa pagina è protetta

Modulo:Infobox

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Modulo in Lua per gestire le funzioni di {{Infobox}}


-- Modulo per implementare le funzionalità di infobox
localp={}-- per l'esportazione delle funzioni del modulo

localargs={}-- variabile che contiene gli argomenti passati al template
localorigArgs
localroot-- radice del markup html
localdump={}

localfunctioncheckList(valore)
-- Permette al software Mediawiki di gestire le liste # o *
localc=mw.ustring.sub(valore,1,1)
ifc=='#'orc=='*'then
valore='<div>\n'..valore..'\n</div>'
end
returnvalore..'\n'
end

localfunctiongetArgNums(...)
-- 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]
localprefixs={...}
localnums={}
fork,_inpairs(args)do
localnum=nil
for_,candidateinipairs(prefixs)do
num=(''..k):match('^'..candidate..'(%d+)$')
ifnum~=nilthenbreakend
end
ifnumthentable.insert(nums,tonumber(num))end
end
table.sort(nums)
returnnums
end

localfunctionaddRow(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
ifrowArgs.gruppothen
root
:tag('tr')
:addClass("sinottico_divisione")
:tag('th')
:attr('colspan',2)
:cssText(rowArgs.stilegruppoNorargs.StileGruppoornil)
:wikitext(rowArgs.gruppo)
-- Altrimenti se rowArgs.valore non è nullo inserisce una riga dati, verificando
-- se esiste o meno la testata
elseifrowArgs.valorethen
localrow=root:tag('tr')
localdataCell
ifrowArgs.nomethen
row
:tag('th')
:cssText(rowArgs.stilenomeNorargs.StileNomeornil)
:wikitext(rowArgs.nome)
dataCell=row:tag('td')
else
dataCell=row:tag('td')
:addClass('sinottico_testo_centrale')
:attr('colspan',2)
end
dataCell
:addClass(rowArgs.classeornil)
:cssText(rowArgs.stilevaloreNorargs.StileValoreornil)
:wikitext(checkList(rowArgs.valore))
end
end

localfunctionrenderTitle()
localsuptitle=mw.html.create('')
ifargs.SopraTitolothen
suptitle
:tag('span')
:addClass('sinottico_sottotitolo')
:cssText(args.StileSopraTitoloornil)
:wikitext(args.SopraTitolo)
:done()
:tag('br'):done()
end
localsubtitle=mw.html.create('')
ifargs.SottoTitolothen
subtitle
:tag('br'):done()
:tag('span')
:addClass('sinottico_sottotitolo')
:cssText(args.StileSottoTitoloornil)
:wikitext(args.SottoTitolo)
end
ifargs.TitoloEstthen
root
:tag('caption')
:addClass('sinottico_testata')
:cssText(args.StileTitoloEstornil)
:node(suptitle)
:wikitext(args.TitoloEst)
:node(subtitle)
elseifargs.TitoloIntthen
root
:tag('tr')
:addClass('sinottico_testata')
:tag('th')
:attr('colspan','2')
:node(suptitle)
:cssText(args.StileTitoloIntornil)
:wikitext(args.TitoloInt)
:node(subtitle)
end
end

localfunctionrenderImage()
ifnotargs.Immaginethenreturnend
localcell_immagine=mw.html.create('td')
cell_immagine
:addClass('sinottico_testo_centrale '..(args.ClasseImmagineor''))
:attr('colspan','2')
:cssText(args.StileImmagineornil)
:wikitext(args.Immagine)
ifargs.Didascaliathen
cell_immagine
:tag('br',{selfClosing=true})
:done()
:tag('span')
:cssText(args.StileDidascaliaornil)
:wikitext(args.Didascalia)
end
root:tag('tr'):node(cell_immagine)
end


localfunctionrenderRows()
localrownums=getArgNums('Valore','GruppoOpzionale','Gruppo','Nodo')
fork,numinipairs(rownums)do
localskip=false
ifargs['GruppoOpzionale'..num]~=nilthen
skip=true
forj=k+1,#rownumsdo
ifargs['Gruppo'..rownums[j]]~=nilorargs['GruppoOpzionale'..rownums[j]]~=nilthenbreakend
ifargs['Valore'..rownums[j]]~=nilorargs['Nodo'..rownums[j]]~=nilthen
skip=false
break
end
end
end
ifargs['Nodo'..num]~=nilthen
root:wikitext(args['Nodo'..num])
skip=true
end
ifnotskipandargs['GruppoOpzionale'..num]~='$fine'then
addRow({
gruppo=args['GruppoOpzionale'..num]orargs['Gruppo'..num],
nome=args['Nome'..num],
valore=args['Valore'..num],
classe=args['Classe'..num],
stilegruppoN=args['GruppoStile'..num],
stilenomeN=args['NomeStile'..num],
stilevaloreN=args['ValoreStile'..num]
})
end
end
end

localfunctionrenderLastRow()
ifnotargs.Ultimathenreturnend
root
:tag('tr')
:tag('td')
:attr('colspan','2')
:addClass('sinottico_piede')
:cssText(args.StileUltimaornil)
:wikitext(args.Ultima)
:newline()
end

localfunctionrenderNavBar()
ifnotargs.NomeTemplatethenreturnend
root
:tag('tr')
:tag('td')
:addClass('sinottico_piede2 noprint nomobile metadata')
:attr('colspan','2')
:wikitext(mw.getCurrentFrame():expandTemplate({
title='Link sinottico',
args=args.LinkWikidataand
{args.NomeTemplate}or
{args.NomeTemplate,nowd=1}
}))
end

localfunction_infobox()
-- Crea l'albero html che rappresenta la tabella del sinottico e restituisce il markup
ifargs.CreaTable=='no'orargs.Posizione=='corpo'orargs.Posizione=='coda'then
root=mw.html.create('')
else
root=mw.html.create('table')
root
:addClass('infobox sinottico')
:cssText(args.StileTabellaornil)
:attr('summary',args.Summaryor'Tabella sinottica che riassume i principali dati del soggetto')
end
renderTitle()
renderImage()
renderRows()
renderLastRow()
renderNavBar()

localres=tostring(root)
ifargs.Posizione=='coda'then
res=res..'</table>';
elseifargs.Posizione=='testa'then
res=mw.ustring.gsub(res,'</table>$','')
end
returnres
end

localfunctionpreprocessSingleArg(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}}
iforigArgs[argName]andorigArgs[argName]~=''then
args[argName]=origArgs[argName]
end
end

localfunctionpreprocessArgs(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.
iftype(prefixTable)~='table'then
error("Valore non tabella trovato nella tabella prefissi",2)
end
iftype(step)~='number'then
error("Passo di tipo non valido",2)
end

-- Ottiene gli argmenti senza un suffisso numerico e controlla per input errati.
fori,vinipairs(prefixTable)do
iftype(v)~='table'ortype(v.prefix)~="string"or(v.dependandtype(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.
ifargs[v.prefix]andv.dependthen
forj,dependValueinipairs(v.depend)do
iftype(dependValue)~='string'then
error('Parametro "dipendente" non valido riscontrato in preprocessArgs')
end
preprocessSingleArg(dependValue)
end
end
end
ifstep==0thenreturnend
-- Estrae gli argomenti con un suffisso numerico
locala=1-- Counter variable.
localmoreArgumentsExist=true
whilemoreArgumentsExist==truedo
moreArgumentsExist=false
fori=a,a+step-1do
forj,vinipairs(prefixTable)do
localprefixArgName=v.prefix..tostring(i)
iforigArgs[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
ifv.dependandargs[prefixArgName]then
forj,dependValueinipairs(v.depend)do
localdependArgName=dependValue..tostring(i)
preprocessSingleArg(dependArgName)
end
end
end
end
a=a+step
end
end

functionp.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
ifframe==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('StileTabella')
preprocessArgs({
{prefix='SopraTitolo',depend={'StileSopraTitolo'}}
},0)
preprocessArgs({
{prefix='TitoloEst',depend={'StileTitoloEst'}}
},0)
preprocessArgs({
{prefix='TitoloInt',depend={'StileTitoloInt'}}
},0)
preprocessArgs({
{prefix='SottoTitolo',depend={'StileSottoTitolo'}}
},0)
preprocessArgs({
{prefix='Immagine',depend={'ClasseImmagine','StileImmagine',
'Didascalia','StileDidascalia'}}
},0)
preprocessSingleArg('StileGruppo')
preprocessSingleArg('StileNome')
preprocessSingleArg('StileValore')
preprocessArgs({
{prefix='Nodo'},
{prefix='Gruppo',depend={'GruppoStile'}},
{prefix='GruppoOpzionale',depend={'GruppoStile'}},
{prefix='Valore',depend={'Nome','Classe','NomeStile','ValoreStile'}},
},50)
preprocessSingleArg('Ultima')
preprocessSingleArg('StileUltima')
preprocessSingleArg('NomeTemplate')
preprocessSingleArg('LinkWikidata')
preprocessSingleArg('CreaTable')
preprocessSingleArg('Posizione')
preprocessSingleArg('Summary')
return_infobox()
end

returnp