Questa pagina è protetta dallo spostamento
Questa pagina è protetta

Modulo:Navbox

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

Il modulo Navbox implementa le funzionalità dei template {{Navbox}} e {{Navbox subgroup}}.

Ha due sottopagine CSS:Modulo:Navbox/styles.csseModulo:Navbox/mobile-styles.css.


--[[
* Modulo che implementa i template Navbox e Navbox_subgroup.
]]--

require('strict')

localgetArgs=require('Modulo:Arguments').getArgs
-- Numero massimo di liste e gruppi per i template Navbox e Navbox_subgroup
localMAX_LIST_NAVBOX=30
localMAX_LIST_NAVBOX_SUBGROUP=20

-- =============================================================================
-- Funzioni di utilità
-- =============================================================================

-- Restituisce una sequence Lua ordinata contenente gli ID dei listN presenti.
-- Se withGroup è true, controlla anche i groupN.
--
-- @param {table} args
-- @param {boolean} withGroup
-- @return {table}
localfunctiongetIds(args,withGroup)
localret,ids={},{}
forkey,_inpairs(args)do
iftype(key)=='string'then
localid=key:match('^list(%d+)$')or(withGroupandkey:match('^group(%d+)$'))
ifidandtonumber(id)<=(withGroupandMAX_LIST_NAVBOXorMAX_LIST_NAVBOX_SUBGROUP)then
ids[tonumber(id)]=true
end
end
end
forkey,_inpairs(ids)do
table.insert(ret,key)
end
table.sort(ret)
returnret
end

-- Rimuove eventuali spazi/a capo attorno ai {{,}}.
--
-- @param {string} list
-- @return {string}
localfunctiontrimSep(list)
localsep=mw.getCurrentFrame():expandTemplate{title=","}
localsepEsc=mw.ustring.gsub(sep,'-','%-')
returnmw.ustring.gsub(list,'%s*'..sepEsc..'%s*',sep)
end

-- Con il debug ridefinisce il metodo mw.html:css,
-- permettendo di eseguire i test senza controllare anche il CSS.
--
-- @param {table} tableNode
localfunctiondisableCSS(tableNode)
localmt=getmetatable(tableNode)
mt.__index.css=function(t,name,val)returntend
end

-- Verifica se il template è elaborato nella sua pagina
localfunctionisTemplatePage(name)
localtitle=mw.title.getCurrentTitle().prefixedText
name='Template:'..(nameor'')
returnname==titleandtrueorfalse
end

-- Carica il CSS via TemplateStyles quando opportuno
localfunctionloadCSS(name)
localprefix=isTemplatePage(name)and'mobile-'or''
localstyles='Modulo:Navbox/'..prefix..'styles.css'
returnmw.getCurrentFrame():extensionTag{
name='templatestyles',
args={src=styles}
}
end

-- =============================================================================
-- Classe Navbox
-- =============================================================================

localNavbox={}

-- Costruttore della classe Navbox.
--
-- @param {table} args - gli argomenti passati al modulo
-- @return {table} un nuovo oggetto Navbox
functionNavbox:new(args)
localself={}
localthNode

setmetatable(self,{__index=Navbox})
self.args=args
-- costruzione tabella HTML
self.tableNode=mw.html.create('table')
ifself.args.debugthen
disableCSS(self.tableNode)
end
self:_setupTableNode()
-- prima riga: contiene la navbar e il titolo
thNode=self.tableNode:tag('tr')
:tag('th')
:attr('colspan',self.args.imageand'3'or'2')
:cssText(self.args.titlestyle)
self:_addTnavbar(thNode)
ifself.args.titlethen
self:_addTitle(thNode)
end
-- eventuale riga per l'above
ifself.args.abovethen
self:_addAboveOrBelow(self.args.above,self.args.abovestyle)
end
-- altre righe
self:_addLists()
-- eventuale riga finale per il below
ifself.args.belowthen
self:_addAboveOrBelow(self.args.below,self.args.belowstyle)
end

returnself
end

-- Restituisce la tabella HTML.
--
-- @return {string}
functionNavbox:getHTML()
returntostring(self.tableNode)
end

-- Configura gli stili CSS della tabella
functionNavbox:_setupTableNode()
self.tableNode
:addClass(isTemplatePage(self.args.name)and'navbox_mobile'or'navbox')
:addClass('mw-collapsible')
:addClass(isTemplatePage(self.args.name)and'autocollapse'or
self.args.state=='collapsed'and'mw-collapsed'or
self.args.state=='autocollapse'and'autocollapse'or
notself.args.stateand'autocollapse'ornil)
:addClass('noprint metadata')
:attr('id','navbox-'..(self.args.nameor''))
:cssText(self.args.style)
:cssText(self.args.bodystyle)
end

-- Aggiunge il Tnavbar (collegamenti alla pagina del template, di discussione e modifica).
--
-- @param {table} node
functionNavbox:_addTnavbar(node)
localtnavbar=mw.getCurrentFrame():expandTemplate{
title='Tnavbar',
args={
[1]=self.args.name,
['mini']=1
}
}
node:tag('div'):addClass('navbox_navbar'):wikitext(tnavbar)
end

-- Imposta il titolo del navbox dal parametro "title".
--
-- @param {table} node
functionNavbox:_addTitle(node)
node:tag('span'):addClass('navbox_title'):wikitext(self.args.title)
end

-- Aggiunge la riga per i parametri "above" e "below".
--
-- @param {string} arg
-- @param {string} argStyle
functionNavbox:_addAboveOrBelow(arg,argStyle)
self.tableNode
:tag('tr')
:tag('th')
:attr('colspan',self.args.imageand'3'or'2')
:addClass('navbox_abovebelow')
:cssText(argStyle)
:wikitext(arg)
end

-- Aggiunge una colonna per l'immagine.
--
-- @param {table} trNode
-- @param {number} rowspan
functionNavbox:_addImage(trNode,rowspan)
trNode
:tag('td')
:attr('rowspan',rowspan)
:addClass('navbox_image')
:cssText(self.args.imagestyle)
:wikitext(self.args.image)
end

-- Aggiunge una nuova riga per ogni groupN/listN
functionNavbox:_addLists()
localrowIds,altStyle,altBackground
-- crea una riga per ogni groupN/listN
rowIds=getIds(self.args,true)
fori,idinipairs(rowIds)do
localtrNode=self.tableNode:tag('tr')
-- groupN
ifself.args['group'..id]then
trNode:tag('th')
:attr('colspan',self.args['list'..id]and'1'or'2')
:addClass('navbox_group')
:cssText(self.args.groupstyle)
:cssText(self.args['group'..id..'style'])
:wikitext(self.args['group'..id])
end
-- listN
ifself.args['list'..id]then
locallist=trimSep(self.args['list'..id])
if(i%2)==0then
altStyle=self.args.evenstyle
altBackground='navbox_even'
else
altStyle=self.args.oddstyle
altBackground='navbox_odd'
end
trNode:tag('td')
:attr('colspan',self.args['group'..id]and'1'or'2')
:addClass('navbox_list')
:addClass(notself.args['group'..id]and'navbox_center'ornil)
:addClass(altBackground)
:cssText(self.args.liststyle)
:cssText(altStyle)
:cssText(self.args['list'..id..'style'])
:wikitext(list)
end
ifid==1andself.args.imagethen
self:_addImage(trNode,#rowIds)
end
end
end

-- =============================================================================
-- Classe NavboxSubgroup
-- =============================================================================

localNavboxSubgroup={}

-- Costruttore della classe NavboxSubgroup.
--
-- @param {table} args - gli argomenti passati al modulo
-- @return {table} un nuovo oggetto NavboxSubgroup
functionNavboxSubgroup:new(args)
localself={}

setmetatable(self,{__index=NavboxSubgroup})
self.args=args
-- costruzione tabella HTML
self.tableNode=mw.html.create('table')
ifself.args.debugthen
disableCSS(self.tableNode)
end
self:_setupTableNode()
self:_addLists()

returnself
end

-- Restituisce la tabella HTML.
--
-- @return {string}
functionNavboxSubgroup:getHTML()
returntostring(self.tableNode)
end

-- Configura gli stili CSS della tabella.
functionNavboxSubgroup:_setupTableNode()
self.tableNode
:addClass('subnavbox')
:cssText(self.args.bodystyle)
end

-- Aggiunge una nuova riga per ogni groupN/listN.
functionNavboxSubgroup:_addLists()
locallistIds,altStyle
-- crea una row per ogni listN
listIds=getIds(self.args)
for_,idinipairs(listIds)do
localtrNode=self.tableNode:tag('tr')
locallist=trimSep(self.args['list'..id])
-- i groupN sono visibili solo se c'è la corrispettiva listN
ifself.args['group'..id]then
trNode:tag('th')
:addClass('subnavbox_group')
:cssText(self.args.groupstyle)
:wikitext(self.args['group'..id])
end
if(id%2)==0then
altStyle=self.args.evenstyle
else
altStyle=self.args.oddstyle
end
trNode:tag('td')
:attr('colspan',self.args['group'..id]and'1'or'2')
:addClass(notself.args['group'..id]and'navbox_center'ornil)
:cssText(self.args.liststyle)
:cssText(altStyle)
:wikitext(list)
end
end

-- =============================================================================
-- Funzioni esportate
-- =============================================================================

localp={}

-- Funzione per l'utilizzo da un altro modulo.
functionp._navbox(args)
returnloadCSS(args.name)..Navbox:new(args):getHTML()
end

-- Funzione per l'utilizzo da un altro modulo.
functionp._navbox_subgroup(args)
returnNavboxSubgroup:new(args):getHTML()
end

-- Funzione per il template {{Navbox}}.
functionp.navbox(frame)
returnp._navbox(getArgs(frame,{parentOnly=true}))
end

-- Funzione per il template {{Navbox subgroup}}.
functionp.navbox_subgroup(frame)
returnp._navbox_subgroup(getArgs(frame,{parentOnly=true}))
end

returnp