Modulo:Navbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m refuso
navbar obbligatorio, v. Discussioni_template:Navbox#Barra_navigazione_Template. è disabilitato senza valido motivo in oltre 700 template, mentre gli usi in portali/progetti sono 7 e risolvibili in altri modi
 
(24 versioni intermedie di 3 utenti non mostrate)
Riga 1:
--[[
* Modulo perche implementareimplementa le funzionalità deii template Navbox e Navbox_subgroup.
]]--
* Costruisce un template di navigazione basato su una table HTML.
]]
 
require('strict')
-- Configurazione
local cfg = mw.loadData("Modulo:Navbox/Configurazione")
 
local getArgs = require('Modulo:Arguments').getArgs
-------------------------------------------------------------------------------
-- Numero massimo di liste e gruppi per i template Navbox e Navbox_subgroup
-- Funzioni di utilità
local MAX_LIST_NAVBOX = 30
-------------------------------------------------------------------------------
local MAX_LIST_NAVBOX_SUBGROUP = 20
 
-- =============================================================================
-- Ritorna true se il nome dell'argomento è valido
-- Funzioni di utilità
local function isValidArg(name, validArgs, maxList)
-- =============================================================================
local ret = validArgs[name] ~= nil
 
-- Restituisce una sequence Lua ordinata contenente gli ID dei listN presenti.
if not ret then
-- Se withGroup è true, controlla anche i groupN.
local id = name:match("^list(%d+)$") or name:match("^group(%d+)$") or
--
name:match("^list(%d+)style$") or name:match("^group(%d+)style$")
-- @param {table} args
if id then
-- @param {boolean} withGroup
ret = tonumber(id) <= maxList
-- @return {table}
end
local function getIds(args, withGroup)
end
local ret, ids = {}, {}
for key, _ in pairs(args) do
if type(key) == 'string' then
local id = key:match('^list(%d+)$') or (withGroup and key:match('^group(%d+)$'))
if id and tonumber(id) <= (withGroup and MAX_LIST_NAVBOX or MAX_LIST_NAVBOX_SUBGROUP) then
ids[tonumber(id)] = true
end
end
end
for key, _ in pairs(ids) do
table.insert(ret, key)
end
table.sort(ret)
return ret
end
 
-- Rimuove eventuali spazi/a capo attorno ai {{,}}.
return ret
--
-- @param {string} list
-- @return {string}
local function trimSep(list)
local sep = mw.getCurrentFrame():expandTemplate{ title = "," }
local sepEsc = mw.ustring.gsub(sep, '-', '%-')
return mw.ustring.gsub(list, '%s*' .. sepEsc .. '%s*', sep)
end
 
-- Con il debug ridefinisce il metodo mw.html:css,
-- Ritorna gli argomenti passati al modulo, scartando quelli senza nome,
-- permettendo di eseguire i test senza controllare anche il CSS.
-- quelli contenenti stringhe vuote e i non riconosciuti.
--
local function getArgs(frame, isSubgroup)
-- @param {table} tableNode
local ret = {}
local function disableCSS(tableNode)
local validArgs = isSubgroup and cfg.subgroupArgs or cfg.navboxArgs
local mt = getmetatable(tableNode)
local maxList = isSubgroup and cfg.subgroupMaxList or cfg.navboxMaxList
mt.__index.css = function(t, name, val) return t end
 
for k, v in pairs(frame:getParent().args) do
if type(k) == "string" and v ~= "" and isValidArg(k, validArgs, maxList) then
ret[k] = v
end
end
 
return ret
end
 
-- Verifica se il template è elaborato nella sua pagina
-- Ritorna gli ID degli argomenti listN presenti
local function getListIdsisTemplatePage(argsname)
local title = mw.title.getCurrentTitle().prefixedText
local ret = {}
name = 'Template:' .. (name or '')
 
return name == title and true or false
for k, v in pairs(args) do
local id = k:match("^list(%d+)$")
if id then
table.insert(ret, tonumber(id))
end
end
table.sort(ret)
 
return ret
end
 
-- Carica il CSS via TemplateStyles quando opportuno
-- Con il debug ridefinisce il metodo mw.html:css,
local function loadCSS(name)
-- permettendo di eseguire i test senza controllare anche i css.
local prefix = isTemplatePage(name) and 'mobile-' or ''
local function disableCSS(tableNode)
local styles = 'Modulo:Navbox/' .. prefix .. 'styles.css'
local mt = getmetatable(tableNode)
return mw.getCurrentFrame():extensionTag{
mt.__index.css = function(t, name, val) return t end
name = 'templatestyles',
args = {src = styles}
}
end
 
-- =============================================================================
-------------------------------------------------------------------------------
-- classe Classe Navbox
-- =============================================================================
-------------------------------------------------------------------------------
 
local Navbox = {}
 
-- Costruttore della classe Navbox.
--
-- @param {table} args - gli argomenti passati al modulo
-- @return {table} un nuovo oggetto Navbox
function Navbox:new(args)
local self = {}
local thNode
local thStyle = {
["text-align"] = "center",
width = "100%",
background = "#ccf",
["font-size"] = "90%"
}
 
setmetatable(self, { __index = Navbox, })
self.args = args
__tostring = function(t) return self:__tostring() end })
-- costruzione tabella HTML
self.args = args
self.tableNode = mw.html.create('table')
-- costruzione table
if self.args.debug then
self.tableNode = mw.html.create("table")
disableCSS(self.tableNode)
if self.args.debug then
end
disableCSS(self.tableNode)
self:_setupTableNode()
end
-- prima riga: contiene la navbar e il titolo
self:__setupTableNode()
thNode = self.tableNode:tag('tr')
-- prima row: contiene la navbar e il titolo
:tag('th')
thNode = self.tableNode:tag("tr")
:attr('colspan', self.args.image and '3' or '2')
:tag("th")
:attrcssText("colspan", self.args.image and "3" or "2"titlestyle)
self:_addTnavbar(thNode)
:css(thStyle)
if :cssText(self.args.titlestyle)title then
self:_addTitle(thNode)
if self.args.navbar ~= "plain" then
end
self:__addTnavbar(thNode)
-- eventuale riga per l'above
end
if self.args.titleabove then
self:_addAboveOrBelow(self.args.above, self.args.abovestyle)
self:__addTitle(thNode)
end
-- altre righe
-- eventuale row per l'above
self:_addLists()
if self.args.above then
-- eventuale riga finale per il below
self:__addAboveOrBelow(self.args.above, self.args.abovestyle)
if self.args.below then
end
self:_addAboveOrBelow(self.args.below, self.args.belowstyle)
-- altre row
end
self:__addLists()
-- eventuale row finale per il below
if self.args.below then
self:__addAboveOrBelow(self.args.below, self.args.belowstyle)
end
 
return self
end
 
-- Restituisce la tabella HTML.
function Navbox:__tostring()
--
return tostring(self.tableNode)
-- @return {string}
function Navbox:getHTML()
return tostring(self.tableNode)
end
 
-- Configura gli stili CSS della tabella
function Navbox:__setupTableNode()
function Navbox:_setupTableNode()
local tableStyle = {
self.tableNode
margin = "auto",
:addClass(isTemplatePage(self.args.name) and 'navbox_mobile' or 'navbox')
width = "100%",
:addClass('mw-collapsible')
clear = "both",
:addClass(isTemplatePage(self.args.name) and 'autocollapse' or
border = "1px solid #aaa",
self.args.state == 'collapsed' and 'mw-collapsed' or
padding = "2px"
self.args.state == 'autocollapse' and 'autocollapse' or
}
not self.args.state and 'autocollapse' or nil)
self.tableNode
:addClass("navbox"'noprint metadata')
:attr('id', 'navbox-' .. (self.args.name or ''))
:addClass("collapsible")
:cssText(self.args.style)
:addClass(self.args.state == "collapsed" and "collapsed" or
:cssText(self.args.bodystyle)
(not self.args.state and "autocollapse" or nil))
:addClass("nowraplinks")
:addClass("noprint")
:css(tableStyle)
:cssText(self.args.style)
:cssText(self.args.bodystyle)
end
 
-- Aggiunge il Tnavbar (collegamenti alla pagina del template, di discussione e modifica).
function Navbox:__addTnavbar(node)
--
local divStyle = {
-- @param {table} node
float = "left",
function Navbox:_addTnavbar(node)
width = "6em",
local tnavbar = mw.getCurrentFrame():expandTemplate {
["text-align"] = "left",
title = 'Tnavbar',
padding = "0 10px 0 0",
args = {
margin = "0px"
[1] = self.args.name,
}
['mini'] = 1
local tnavbar = mw.getCurrentFrame():expandTemplate {
}
title = "Tnavbar",
}
args = {
node:tag('div'):addClass('navbox_navbar'):wikitext(tnavbar)
[1] = self.args.name,
["mini"] = 1
}
}
node:tag("div"):css(divStyle):wikitext(tnavbar)
end
 
-- Imposta il titolo del navbox dal parametro "title".
function Navbox:__addTitle(node)
--
node:tag("span"):css("font-size", "110%"):wikitext(self.args.title)
-- @param {table} node
function Navbox:_addTitle(node)
node:tag('span'):addClass('navbox_title'):wikitext(self.args.title)
end
 
-- Aggiunge la riga per i parametri "above" e "below".
function Navbox:__addAboveOrBelow(arg, argStyle)
--
local tdStyle = {
-- @param {string} arg
background = "#ddf",
-- @param {string} argStyle
["text-align"] = "center",
function Navbox:_addAboveOrBelow(arg, argStyle)
["font-size"] = "90%"
self.tableNode
}
:tag('tr')
self.tableNode
:tag("tr"'th')
:attr('colspan', self.args.image and '3' or '2')
:tag("td")
:addClass('navbox_abovebelow')
:attr("colspan", self.args.image and "3" or "2")
:cssText(argStyle)
:css(tdStyle)
:wikitext(arg)
:cssText(argStyle)
:wikitext(arg)
end
 
-- Aggiunge una colonna per l'immagine.
function Navbox:__addImage(trNode, rowspan)
--
local tdStyle = {
-- @param {table} trNode
["vertical-align"] = "middle",
-- @param {number} rowspan
["padding-left"] = "7px",
function Navbox:_addImage(trNode, rowspan)
width = "0%"
trNode
}
:tag('td')
trNode
:attr('rowspan', rowspan)
:tag("td")
:addClass('navbox_image')
:attr("rowspan", rowspan)
:cssText(self.args.imagestyle)
:css(tdStyle)
:cssTextwikitext(self.args.imagestyleimage)
:wikitext(self.args.image)
end
 
-- Aggiunge una nuova riga per ogni groupN/listN
function Navbox:__addLists()
function Navbox:_addLists()
local listIds, altStyle, altBackground
local rowIds, altStyle, altBackground
local thStyle = {
-- crea una riga per ogni groupN/listN
background = "#ddf",
rowIds = getIds(self.args, true)
["white-space"] = "nowrap",
for i, id in ipairs(rowIds) do
padding = "0 10px",
local trNode = self.tableNode:tag('tr')
["font-size"] = "90%"
-- groupN
}
if self.args['group' .. id] then
-- crea una row per ogni listN
trNode:tag('th')
listIds = getListIds(self.args)
:attr('colspan', self.args['list' .. id] and '1' or '2')
for _, id in ipairs(listIds) do
:addClass('navbox_group')
local trNode = self.tableNode:tag("tr")
:cssText(self.args.groupstyle)
-- i groupN sono visibili solo se c'è la corrispettiva listN
if :cssText(self.args["'group"' .. id .. 'style'] then)
:wikitext(self.args['group' .. id])
trNode:tag("th")
end
:css(thStyle)
-- listN
:cssText(self.args.groupstyle)
if :cssText(self.args["group"'list' .. id] .. "style"])then
local list = :wikitexttrimSep(self.args["group"'list' .. id])
if (i % 2) == 0 endthen
altStyle = self.args.evenstyle
if (id % 2) == 0 then
altBackground = 'navbox_even'
altStyle = self.args.evenstyle
else
altBackground = "#f7f7f7"
altStyle = self.args.oddstyle
else
altBackground = 'navbox_odd'
altStyle = self.args.oddstyle
end
altBackground = nil
trNode:tag('td')
end
:attr('colspan', self.args['group' .. id] and '1' or '2')
trNode:tag("td")
:addClass('navbox_list')
:attr("colspan", self.args["group" .. id] and "1" or "2")
:addClass(not self.args['group' .. id] and 'navbox_center' or nil)
:css("width", "100%")
:addClass(altBackground)
:css("font-size", "90%")
:cssText(self.args.liststyle)
:css("text-align", self.args["group" .. id] and "left" or "center")
:cssText(altStyle)
:css("background", altBackground)
:cssText(self.args['list' .liststyle. id .. 'style'])
:wikitext(list)
:cssText(altStyle)
end
:cssText(self.args["list" .. id .. "style"])
if id == 1 and :wikitext(self.args["list" ..image id])then
self:_addImage(trNode, #rowIds)
if id == 1 and self.args.image then
end
self:__addImage(trNode, #listIds)
end
end
end
 
-- =============================================================================
-------------------------------------------------------------------------------
-- classe Classe NavboxSubgroup
-- =============================================================================
-------------------------------------------------------------------------------
 
local NavboxSubgroup = {}
 
-- Costruttore della classe NavboxSubgroup.
--
-- @param {table} args - gli argomenti passati al modulo
-- @return {table} un nuovo oggetto NavboxSubgroup
function NavboxSubgroup:new(args)
local self = {}
 
setmetatable(self, { __index = NavboxSubgroup, })
self.args = args
__tostring = function(t) return self:__tostring() end })
-- costruzione tabella HTML
self.args = args
self.tableNode = mw.html.create('table')
-- costruzione table
if self.args.debug then
self.tableNode = mw.html.create("table")
disableCSS(self.tableNode)
if self.args.debug then
end
disableCSS(self.tableNode)
self:_setupTableNode()
end
self:__setupTableNode_addLists()
self:__addLists()
 
return self
end
 
-- Restituisce la tabella HTML.
function NavboxSubgroup:__tostring()
--
return tostring(self.tableNode)
-- @return {string}
function NavboxSubgroup:getHTML()
return tostring(self.tableNode)
end
 
-- Configura gli stili CSS della tabella.
function NavboxSubgroup:__setupTableNode()
function NavboxSubgroup:_setupTableNode()
local tableStyle = {
self.tableNode
backgroupnd = "transparent",
:addClass('subnavbox')
["font-size"] = "100%",
:cssText(self.args.bodystyle)
padding = "0",
border = "0",
margin = "-3px",
width = "100%"
}
self.tableNode
:addClass("navbox")
:addClass("nowraplinks")
:css(tableStyle)
:cssText(self.args.bodystyle)
end
 
-- Aggiunge una nuova riga per ogni groupN/listN.
function NavboxSubgroup:__addLists()
function NavboxSubgroup:_addLists()
local listIds, altStyle
local thStyle =listIds, {altStyle
-- crea una row per ogni listN
background = "#ddf",
listIds = getIds(self.args)
padding = "0 10px",
for _, id in ipairs(listIds) do
}
local trNode = self.tableNode:tag('tr')
-- crea una row per ogni listN
local listIdslist = getListIdstrimSep(self.args['list' .. id])
-- i groupN sono visibili solo se c'è la corrispettiva listN
for _, id in ipairs(listIds) do
if self.args['group' .. id] then
local trNode = self.tableNode:tag("tr")
trNode:tag('th')
-- i groupN sono visibili solo se c'è la corrispettiva listN
:addClass('subnavbox_group')
if self.args["group" .. id] then
:cssText(self.args.groupstyle)
trNode:tag("th")
:wikitext(self.args['group' .. id])
:css(thStyle)
end
:cssText(self.args.groupstyle)
if (id % 2) == 0 then
:wikitext(self.args["group" .. id])
altStyle = self.args.evenstyle
end
else
if (id % 2) == 0 then
altStyle = self.args.evenstyleoddstyle
end
else
trNode:tag('td')
altStyle = self.args.oddstyle
:attr('colspan', self.args['group' .. id] and '1' or '2')
end
:addClass(not self.args['group' .. id] and 'navbox_center' or nil)
trNode:tag("td")
:cssText(self.args.liststyle)
:attr("colspan", self.args["group" .. id] and "1" or "2")
:cssText(altStyle)
:css("text-align", self.args["group" .. id] and "left" or "center")
:wikitext(list)
:cssText(self.args.liststyle)
end
:cssText(altStyle)
:wikitext(self.args["list" .. id])
end
end
 
-- =============================================================================
-------------------------------------------------------------------------------
-- Funzioni APIesportate
-- =============================================================================
-------------------------------------------------------------------------------
 
local p = {}
 
-- Funzione per l'utilizzo da un altro modulo.
-- Entry-point per {{Navbox}}
function p._navbox(args)
return loadCSS(args.name) .. Navbox:new(args):getHTML()
end
 
-- Funzione per l'utilizzo da un altro modulo.
function p._navbox_subgroup(args)
return NavboxSubgroup:new(args):getHTML()
end
 
-- Funzione per il template {{Navbox}}.
function p.navbox(frame)
return Navbox:newp._navbox(getArgs(frame, { parentOnly = true }))
end
 
-- Entry-pointFunzione per il template {{Navbox subgroup}}.
function p.navbox_subgroup(frame)
return NavboxSubgroup:newp._navbox_subgroup(getArgs(frame, { parentOnly = true }))
end