Utente anonimo
Modulo:Navbox: differenze tra le versioni
m
modulo no globals obsoleto
(remove titlegroup per templatestyles section on talk page) |
m (modulo no globals obsoleto) |
||
Riga 1: | Riga 1: | ||
--[[ | |||
* Modulo che implementa i template Navbox e Navbox_subgroup. | |||
local | ]]-- | ||
local | require('strict') | ||
local | |||
local getArgs = require('Modulo:Arguments').getArgs | |||
-- Numero massimo di liste e gruppi per i template Navbox e Navbox_subgroup | |||
local MAX_LIST_NAVBOX = 30 | |||
local MAX_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} | |||
local function getIds(args, withGroup) | |||
local ret, ids = {}, {} | |||
for key, _ in pairs(args) do | |||
local | if type(key) == 'string' then | ||
if | 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 | end | ||
end | end | ||
for key, _ in pairs(ids) do | |||
table.insert(ret, key) | |||
end | end | ||
return | table.sort(ret) | ||
return ret | |||
end | end | ||
-- | -- Rimuove eventuali spazi/a capo attorno ai {{,}}. | ||
-- | |||
-- @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) | |||
local function | |||
end | end | ||
-- Con il debug ridefinisce il metodo mw.html:css, | |||
-- permettendo di eseguire i test senza controllare anche il CSS. | |||
-- | |||
-- @param {table} tableNode | |||
local function disableCSS(tableNode) | |||
local mt = getmetatable(tableNode) | |||
mt.__index.css = function(t, name, val) return t end | |||
local | |||
end | end | ||
local function | -- Verifica se il template è elaborato nella sua pagina | ||
local | local function isTemplatePage(name) | ||
local title = mw.title.getCurrentTitle().prefixedText | |||
name = 'Template:' .. (name or '') | |||
return | return name == title and true or false | ||
end | end | ||
local function | -- Carica il CSS via TemplateStyles quando opportuno | ||
local function loadCSS(name) | |||
local prefix = isTemplatePage(name) and 'mobile-' or '' | |||
local styles = 'Modulo:Navbox/' .. prefix .. 'styles.css' | |||
return mw.getCurrentFrame():extensionTag{ | |||
name = 'templatestyles', | |||
args = {src = styles} | |||
} | |||
end | end | ||
-- ============================================================================= | |||
-- Classe Navbox | |||
-- ============================================================================= | |||
local Navbox = {} | |||
-- Costruttore della classe Navbox. | |||
local | -- | ||
-- @param {table} args - gli argomenti passati al modulo | |||
-- @return {table} un nuovo oggetto Navbox | |||
function Navbox:new(args) | |||
local self = {} | |||
local thNode | |||
setmetatable(self, { __index = Navbox }) | |||
self.args = args | |||
-- costruzione tabella HTML | |||
self.tableNode = mw.html.create('table') | |||
if self.args.debug then | |||
disableCSS(self.tableNode) | |||
end | end | ||
self:_setupTableNode() | |||
-- prima riga: contiene la navbar e il titolo | |||
thNode = self.tableNode:tag('tr') | |||
:tag('th') | |||
:attr('colspan', self.args.image and '3' or '2') | |||
:cssText(self.args.titlestyle) | |||
if self.args.navbar ~= 'plain' then | |||
self:_addTnavbar(thNode) | |||
: | |||
end | end | ||
if self.args.title then | |||
self:_addTitle(thNode) | |||
if args | |||
end | end | ||
-- eventuale riga per l'above | |||
if | if self.args.above then | ||
self:_addAboveOrBelow(self.args.above, self.args.abovestyle) | |||
end | end | ||
-- altre righe | |||
self:_addLists() | |||
if | -- eventuale riga finale per il below | ||
if self.args.below then | |||
self:_addAboveOrBelow(self.args.below, self.args.belowstyle) | |||
end | end | ||
return self | |||
end | |||
-- Restituisce la tabella HTML. | |||
-- | |||
-- @return {string} | |||
function Navbox:getHTML() | |||
return tostring(self.tableNode) | |||
end | |||
-- Configura gli stili CSS della tabella | |||
function Navbox:_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 | |||
not self.args.state and 'autocollapse' or nil) | |||
:addClass('noprint metadata') | |||
:attr('id', 'navbox-' .. (self.args.name or '')) | |||
:cssText(self.args.style) | |||
:cssText(self.args.bodystyle) | |||
end | end | ||
-- | -- Aggiunge il Tnavbar (collegamenti alla pagina del template, di discussione e modifica). | ||
-- | -- | ||
-- @param {table} node | |||
local | function Navbox:_addTnavbar(node) | ||
local tnavbar = mw.getCurrentFrame():expandTemplate { | |||
title = 'Tnavbar', | |||
args = { | |||
[1] = self.args.name, | |||
['mini'] = 1 | |||
} | |||
} | } | ||
node:tag('div'):addClass('navbox_navbar'):wikitext(tnavbar) | |||
end | end | ||
-- Imposta il titolo del navbox dal parametro "title". | |||
-- | |||
-- @param {table} node | |||
function Navbox:_addTitle(node) | |||
node:tag('span'):addClass('navbox_title'):wikitext(self.args.title) | |||
end | end | ||
-- Aggiunge la riga per i parametri "above" e "below". | |||
-- | |||
-- @param {string} arg | |||
-- @param {string} argStyle | |||
function Navbox:_addAboveOrBelow(arg, argStyle) | |||
self.tableNode | |||
:tag('tr') | |||
:tag('th') | |||
:attr('colspan', self.args.image and '3' or '2') | |||
:addClass('navbox_abovebelow') | |||
:cssText(argStyle) | |||
:wikitext(arg) | |||
end | end | ||
-- Aggiunge una colonna per l'immagine. | |||
-- | |||
-- @param {table} trNode | |||
-- @param {number} rowspan | |||
function Navbox:_addImage(trNode, rowspan) | |||
trNode | |||
:tag('td') | |||
:attr('rowspan', rowspan) | |||
:addClass('navbox_image') | |||
:cssText(self.args.imagestyle) | |||
:wikitext(self.args.image) | |||
end | end | ||
-- Aggiunge una nuova riga per ogni groupN/listN | |||
local | function Navbox:_addLists() | ||
for | local rowIds, altStyle, altBackground | ||
if | -- crea una riga per ogni groupN/listN | ||
rowIds = getIds(self.args, true) | |||
for i, id in ipairs(rowIds) do | |||
local trNode = self.tableNode:tag('tr') | |||
-- groupN | |||
if self.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 | |||
if self.args['list' .. id] then | |||
local list = trimSep(self.args['list' .. id]) | |||
if (i % 2) == 0 then | |||
altStyle = self.args.evenstyle | |||
altBackground = 'navbox_even' | |||
else | |||
altStyle = self.args.oddstyle | |||
altBackground = 'navbox_odd' | |||
end | end | ||
trNode:tag('td') | |||
:attr('colspan', self.args['group' .. id] and '1' or '2') | |||
:addClass('navbox_list') | |||
:addClass(not self.args['group' .. id] and 'navbox_center' or nil) | |||
:addClass(altBackground) | |||
:cssText(self.args.liststyle) | |||
:cssText(altStyle) | |||
:cssText(self.args['list' .. id .. 'style']) | |||
:wikitext(list) | |||
end | |||
if id == 1 and self.args.image then | |||
self:_addImage(trNode, #rowIds) | |||
end | end | ||
end | end | ||
end | end | ||
-- ============================================================================= | |||
-- Classe NavboxSubgroup | |||
-- ============================================================================= | |||
local | 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 | |||
-- costruzione tabella HTML | |||
self.tableNode = mw.html.create('table') | |||
if self.args.debug then | |||
disableCSS(self.tableNode) | |||
end | end | ||
self:_setupTableNode() | |||
self:_addLists() | |||
return self | |||
end | |||
-- Restituisce la tabella HTML. | |||
-- | |||
-- @return {string} | |||
function NavboxSubgroup:getHTML() | |||
return tostring(self.tableNode) | |||
end | |||
-- Configura gli stili CSS della tabella. | |||
function NavboxSubgroup:_setupTableNode() | |||
self.tableNode | |||
:addClass('subnavbox') | |||
:cssText(self.args.bodystyle) | |||
end | end | ||
-- Aggiunge una nuova riga per ogni groupN/listN. | |||
local | function NavboxSubgroup:_addLists() | ||
local listIds, altStyle | |||
-- crea una row per ogni listN | |||
if | listIds = getIds(self.args) | ||
for _, id in ipairs(listIds) do | |||
local trNode = self.tableNode:tag('tr') | |||
local list = trimSep(self.args['list' .. id]) | |||
-- i groupN sono visibili solo se c'è la corrispettiva listN | |||
if self.args['group' .. id] then | |||
trNode:tag('th') | |||
:addClass('subnavbox_group') | |||
:cssText(self.args.groupstyle) | |||
:wikitext(self.args['group' .. id]) | |||
end | |||
if (id % 2) == 0 then | |||
altStyle = self.args.evenstyle | |||
else | |||
altStyle = self.args.oddstyle | |||
end | end | ||
trNode:tag('td') | |||
:attr('colspan', self.args['group' .. id] and '1' or '2') | |||
:addClass(not self.args['group' .. id] and 'navbox_center' or nil) | |||
:cssText(self.args.liststyle) | |||
:cssText(altStyle) | |||
:wikitext(list) | |||
end | end | ||
end | end | ||
-- ============================================================================= | |||
-- Funzioni esportate | |||
-- ============================================================================= | |||
local p = {} | |||
-- Funzione per l'utilizzo da un altro modulo. | |||
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 | end | ||
-- Funzione per il template {{Navbox}}. | |||
function p.navbox(frame) | function p.navbox(frame) | ||
return p._navbox(getArgs(frame, { parentOnly = true })) | |||
end | |||
return p. | -- Funzione per il template {{Navbox subgroup}}. | ||
function p.navbox_subgroup(frame) | |||
return p._navbox_subgroup(getArgs(frame, { parentOnly = true })) | |||
end | end | ||
return p | return p |