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

模块:GFInfobox

来自OGAS数据中枢
弃权者留言 | 贡献2026年5月8日 (五) 21:52的版本

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

local p = {}

function p.main(frame)
    local args = frame.args
    local html = mw.html.create('div')
        :addClass('moe-infobox gf-infobox')
    
    -- 标题
    html:tag('div')
        :addClass('gf-title')
        :wikitext(args['标题'] or args['名字'] or mw.title.getCurrentTitle().subpageText)
    
    -- 图片
    local image = args['image']
    if image and image ~= '' then
        local imgContainer = html:tag('div')
            :addClass('gf-image-container')
        imgContainer:wikitext(string.format('[[File:%s|280px|class=infobox-image]]', image))
        if args['图片说明'] and args['图片说明'] ~= '' then
            imgContainer:wikitext('<br/>')
            imgContainer:wikitext(args['图片说明'])
        end
    else
        html:tag('div')
            :addClass('gf-image-container')
            :wikitext('啊嘞?!<br/>怎么回事<br/>这个妹子怎么没有头的样子……')
    end
    
    -- 基础资料
    html:tag('div')
        :addClass('gf-section')
        :wikitext('基础资料')
    
    -- 信息字段列表
    local fields = {
        {'本名', args['本名']},
        {'别名', args['别名']},
        {'发色', formatHairColor(args, frame)},
        {'瞳色', formatEyeColor(args, frame)},
        {'声优', formatVoiceActor(args)},
        {'萌点', args['萌点']},
        {'类型', formatWeaponType(args['类型'])},
        {'稀有度', formatRarity(args['稀有度'])},
        {'原产国', args['原产国']},
        {'研发者', args['研发者']},
        {'研发商', args['研发商']},
        {'研发日期', args['研发日期']},
        {'生产商', args['生产商']},
        {'生产日期', args['生产日期']},
        {'服役期间', args['服役期间']},
        {'出身地区', args['出身地区']},
        {'活动范围', args['活动范围']},
        {'所属团体', args['所属团体']},
        {'个人状态', args['个人状态']}
    }
    
    for _, field in ipairs(fields) do
        local label, value = field[1], field[2]
        if value and value ~= '' then
            local row = html:tag('div'):addClass('gf-row')
            row:tag('div')
                :addClass('gf-label')
                :wikitext(label)
            row:tag('div')
                :addClass('gf-value')
                :wikitext(value)
        end
    end
    
    -- 亲属或相关人
    local related = args['相关人士']
    if related and related ~= '' then
        html:tag('div')
            :addClass('gf-section')
            :wikitext('亲属或相关人')
        html:tag('div')
            :addClass('gf-related')
            :wikitext(related)
    end
    
    -- 返回时去除首尾空白
    return tostring(html):gsub('^%s+', ''):gsub('%s+$', '')
end

-- 格式化发色
function formatHairColor(args, frame)
    local multiColor = args['多种发色']
    if multiColor and multiColor ~= '' then
        return multiColor
    end
    
    local hairColor = args['发色']
    if hairColor and hairColor ~= '' then
        return frame:preprocess('{{Hair_color|' .. hairColor .. '}}')
    end
    
    return nil
end

-- 格式化瞳色
function formatEyeColor(args, frame)
    local multiColor = args['多种瞳色']
    if multiColor and multiColor ~= '' then
        return multiColor
    end
    
    local eyeColor = args['瞳色']
    if eyeColor and eyeColor ~= '' then
        return frame:preprocess('{{Eye_color|' .. eyeColor .. '}}')
    end
    
    return nil
end

-- 格式化声优
function formatVoiceActor(args)
    local multiVA = args['多位声优']
    if multiVA and multiVA ~= '' then
        return multiVA
    end
    
    local voiceActor = args['声优']
    if voiceActor and voiceActor ~= '' then
        return string.format('[[%s]]', voiceActor)
    end
    
    return nil
end

-- 格式化武器类型
function formatWeaponType(weaponType)
    local weaponTypes = {
        ['手枪'] = '手枪',
        ['冲锋枪'] = '冲锋枪', 
        ['步枪'] = '步枪',
        ['突击步枪'] = '突击步枪',
        ['机枪'] = '机枪',
        ['霰弹枪'] = '霰弹枪'
    }
    
    if weaponType and weaponTypes[weaponType] then
        return weaponTypes[weaponType]
    end
    
    return weaponType
end

-- 格式化稀有度
function formatRarity(rarity)
    if not rarity or rarity == '' then
        return nil
    end
    
    local rarityColors = {
        [2] = '#777777',
        [3] = '#33566f',
        [4] = '#7b813f', 
        [5] = '#a7753b',
        [6] = '#ad4229'
    }
    
    -- 处理数字
    local num = tonumber(rarity)
    if num then
        local color = rarityColors[num]
        if color then
            return string.format('<span style="color:%s">%s</span>', color, string.rep('★', num))
        end
        return rarity
    end
    
    -- 处理星星
    local starCount = 0
    rarity:gsub('★', function() starCount = starCount + 1 end)
    if starCount > 0 then
        local color = rarityColors[starCount]
        if color then
            return string.format('<span style="color:%s">%s</span>', color, rarity)
        end
        return rarity
    end
    
    -- 处理箭头
    return rarity:gsub('%s*→%s*', ' → '):gsub('%s*->%s*', ' → ')
end

return p