模块:Navbox
来自Blockland Wiki
更多操作
此模块的文档可以在模块:Navbox/doc创建
local p = {}
local navbar = require('Module:Navbar')._navbar
local getArgs = require('Module:Arguments').getArgs
local ODD_EVEN_MARKER = '\127_ODDEVEN_\127'
local REGEX_MARKER = '\127_ODDEVEN(%d?)_\127'
-- 处理奇偶行变色的核心逻辑
local function striped(wikitext, args)
local first, second = 'odd', 'even'
if args.evenodd == 'swap' then first, second = second, first end
local index = 0
local changer = function(code)
if code == '0' then index = 0 return first end
index = index + 1
return index % 2 == 1 and first or second
end
return (wikitext:gsub(REGEX_MARKER, changer))
end
function p.navbox(frame)
local args = getArgs(frame)
local listnums = {}
for k, _ in pairs(args) do
local num = tostring(k):match('^list(%d+)$')
if num then table.insert(listnums, tonumber(num)) end
end
table.sort(listnums)
-- 创建主表格
local tbl = mw.html.create('table')
:addClass('navbox-inner')
:css('border-spacing', '0')
:css('width', '100%')
-- 渲染标题栏 (Title)
if args.title then
tbl:tag('tr'):tag('th')
:attr('colspan', (args.image or args.imageleft) and 3 or 2)
:addClass('navbox-title')
:cssText(args.basestyle or '' .. ';' .. (args.titlestyle or ''))
:wikitext(args.title)
end
-- 渲染列表行 (Groups and Lists)
for i, n in ipairs(listnums) do
local row = tbl:tag('tr')
-- 组名 (Group)
if args['group' .. n] then
row:tag('th')
:addClass('navbox-group')
:cssText(args.basestyle)
:cssText(args.groupstyle)
:wikitext(args['group' .. n])
end
-- 列表内容 (List)
local listCell = row:tag('td')
:addClass('navbox-list')
:addClass('navbox-' .. ODD_EVEN_MARKER) -- 插入标记待后续替换
:cssText(args.liststyle)
:cssText(i % 2 == 1 and args.oddstyle or args.evenstyle)
:wikitext(args['list' .. n])
if not args['group' .. n] then listCell:attr('colspan', 2) end
end
-- 包装容器
local res = mw.html.create('div')
:addClass('navbox')
:cssText(args.style or args.bodystyle)
:node(tbl)
return striped(tostring(res), args)
end
return p