Modulo:Navbox

Info Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Navbox/man (modifica · cronologia)
Sandbox: Modulo:Navbox/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Navbox/test (modifica · cronologia · esegui)

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

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



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

require('strict')

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
		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 {{,}}.
--
-- @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,
-- 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
end

-- Verifica se il template è elaborato nella sua pagina
local function isTemplatePage(name)
	local title = mw.title.getCurrentTitle().prefixedText
	name = 'Template:' .. (name or '')
	return name == title and true or false
end

-- 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

-- =============================================================================
--                            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

	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
	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)
	self:_addTnavbar(thNode)
	if self.args.title then
		self:_addTitle(thNode)
	end
	-- eventuale riga per l'above
	if self.args.above then
		self:_addAboveOrBelow(self.args.above, self.args.abovestyle)
	end
	-- altre righe
	self:_addLists()
	-- eventuale riga 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.
--
-- @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

-- Aggiunge il Tnavbar (collegamenti alla pagina del template, di discussione e modifica).
--
-- @param {table} node
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

-- 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

-- 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

-- 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

-- Aggiunge una nuova riga per ogni groupN/listN
function Navbox:_addLists()
	local rowIds, altStyle, altBackground
	-- 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
			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

-- =============================================================================
--                            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
	-- costruzione tabella HTML
	self.tableNode = mw.html.create('table')
	if self.args.debug then
		disableCSS(self.tableNode)
	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

-- Aggiunge una nuova riga per ogni groupN/listN.
function NavboxSubgroup:_addLists()
	local listIds, altStyle
	-- crea una row per ogni listN
	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
		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

-- =============================================================================
--                            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

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

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

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.