模块: Navbox

此模块的文档可以在模块:Navbox/doc创建

local getArgs = require('Module:Arguments').getArgs
local p = {}

function p.main(frame)
    local args = getArgs(frame)
    return p._main(args)
end

local function build_grid(title)
    local grid = mw.html.create('div')
        :addClass('navbox')
        :css('display', 'grid')
        :css('margin-top', '2em')
        :css('font-size', '16px')
        :css('grid-template-columns', 'fit-content(33%) fit-content(33%) 1fr')

    if title then
        grid:tag('div')
            :css('padding', '0 12px')
            :css('grid-column', '1/-1')
            :css('background', '#fff1a3')
            :css('text-align', 'center')
            :css('font-size', '18px')
            :css('font-weight', 'bold')
            :wikitext(title)
    end
    
    return grid
end

local function build_row_header(grid, row, column, text, background)
    grid:tag('div')
        :css('grid-column', column)
        :css('grid-row', row)
        :css('margin', '2px 2px 0 0')
        :css('padding', '0 12px')
        :css('background', background or '#fffad2')
        :css('text-align', 'center')
        :css('display', 'flex')
        :css('justify-content', 'center')
        :css('align-items', 'center')
        :css('font-weight', 'bold')
            :tag('div')
            :wikitext(text)
end

local function build_cell(grid, row, column, text, background)
    grid:tag('div')
        :css('grid-column', column)
        :css('grid-row', row)
        :css('margin', '2px 0 0 0')
        :css('padding', '0 12px')
        :css('text-align', 'left')
        :css('background', background or 'transparent')
            :tag('div')
            :wikitext(text)
end

local function build_back_link(grid, row, name, text)
    grid:tag('div')
        :css('text-align', 'right')
        :css('font-size', '90%')
        :css('grid-row', row)
        :css('grid-column', '1/-1')
        :css('position', 'relative')
        :css('top', '-.3em')
        :wikitext('[​[[模板:' .. name .. '|' .. text .. ']]]')
            -- ZWSP between first and second brackets
end

function p._main(args)
    local grid = build_grid(args['title'])

    local i = 1
    local row = 1

    while args['list' .. i] or args['list' .. i .. '.1'] do
        if args['list' .. i .. '.1'] then
            local j = 1
            while args['list' .. i .. '.' .. (j + 1)] do
                j = j + 1
            end

            build_row_header(
                grid, row + 1 .. '/' .. (row + j + 1), 1,
                args['group' .. i])

            for k = 1, j do
                local column = '2/-1'

                if args['group' .. i .. '.' .. k] then
                    column = '3'
                    build_row_header(
                        grid, row + k, 2,
                        args['group' .. i .. '.' .. k])
                end

                local background = 'transparent'
                if math.fmod(row + k, 2) == 1 then
                    background = '#f8f9fa'
                end

                build_cell(grid, row + k, column,
                    args['list' .. i .. '.' .. k], background)
            end

            row = row + j
        else
            local column = '1/-1'

            if args['group' .. i] then
                column = '2/-1'
                build_row_header(grid, row + 1, 1, args['group' .. i])
            end

            local background = 'transparent'
            if math.fmod(row + 1, 2) == 1 then
                background = '#f8f9fa'
            end

            build_cell(grid, row + 1, column,
                args['list' .. i], background)

            row = row + 1
        end

        i = i + 1
    end

    -- Link to template at bottom
    if args['name'] then
        build_back_link(grid, row + 1, args['name'], '查看模板')
        
        row = row + 1
    end

    return tostring(grid)
end

return p