打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

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

local p = {}

function p.main(frame)
    local args = frame.args
    local root = mw.html.create('div'):addClass('infobox')

    -- 添加对齐方式
    local align = args.align or 'left'
    root:addClass('infobox-align-' .. align)

    -- 图片处理
    if args.image and mw.text.trim(args.image) ~= '' then
        local tabber = root:tag('div'):addClass('tabber')
        local tab = tabber:tag('div')
           :addClass('tabbertab')
           :attr('title', args['imagedescription'] or '')
        local imageText = string.format('[[File:%s|frameless|600px', args.image)
        if args['imagedescription'] then
            imageText = imageText .. '|' .. args['imagedescription']
        end
        imageText = imageText .. ']]'
        tab:tag('div')
           :addClass('infobox-image')
           :wikitext(imageText)
    end

	-- 图标+标题区
	local titleBlock = root:tag('div'):addClass('infobox-header')
	local titleStyle = args['title-style'] or 'left'
	titleBlock:addClass('title-style-' .. titleStyle)
	local logoSpacing = args['logo-spacing'] or '8px' -- 新增参数,默认间距为 8px
	
	local titleSubtitleWrapper = titleBlock:tag('div'):addClass('infobox-title-and-subtitle')
	if args.logo then
	    titleBlock:tag('div'):addClass('infobox-logo')
	        :wikitext(string.format('[[File:%s|32px|link=]]', args.logo))
	end

    -- 使用普通 div 替代 h2 作为标题
    if args.title then
        titleSubtitleWrapper:tag('div')
            :addClass('infobox-title')
            :wikitext(args.title)
    end
    if args.subtitle then
        titleSubtitleWrapper:tag('div')
            :addClass('infobox-subtitle')
            :wikitext(args.subtitle)
    end

    -- 动态栏位生成器
    local function buildColumns(colType, cols)
        local max = 0
        local validItems = {}

        -- 自动检测最大条目数,并过滤掉 info 为空的项
        for i = 1, 50 do -- 最大支持50个条目
            local label = args[colType..'-label'..i]
            local info = args[colType..'-info'..i]
            if label and info and info ~= '' then
                validItems[#validItems + 1] = {
                    label = label,
                    info = info
                }
                max = #validItems
            end
        end

        -- 生成栏位
        if max > 0 then
            local row = root:tag('div')
                :addClass('infobox-section')
                :tag('div'):addClass('infobox-columns columns-'..cols)

            for i = 1, max do
                row:tag('div'):addClass('column')
                    :tag('div'):addClass('label'):wikitext(validItems[i].label):done()
                    :tag('div'):addClass('value'):wikitext(validItems[i].info)
            end
        end
    end

    -- 生成各类型栏位
    buildColumns('col1', 1)  -- 单栏
    buildColumns('col2', 2)  -- 双栏 
    buildColumns('col3', 3)  -- 三栏

    return tostring(root)
end

return p