跳转到内容
打开/关闭菜单
  • 450 条目
  • 804 文件
  • 22 用户
  • 9052 编辑
Blockland Wiki
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
KK​(留言 | 贡献)2026年1月29日 (四) 16:05的版本

此模块的文档可以在模块: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