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

Module:GFInfobox:修订间差异

来自OGAS数据中枢
弃权者留言 | 贡献
创建页面,内容为“local p = {} -- 武器类型映射 local weaponTypes = { ['手枪'] = '手枪', ['冲锋枪'] = '冲锋枪', ['步枪'] = '步枪', ['突击步枪'] = '突击步枪', ['机枪'] = '机枪', ['霰弹枪'] = '霰弹枪' } -- 稀有度颜色 local rarityColors = { [2] = '#777', [3] = '#33566f', [4] = '#7b813f', [5] = '#a7753b', [6] = '#ad4229' } function p.main(frame) local args = frame.args local html = mw.…”
 
弃权者留言 | 贡献
无编辑摘要
 
(未显示同一用户的12个中间版本)
第1行: 第1行:
local p = {}
local p = {}


-- 武器类型映射
local function cleanParam(s)
local weaponTypes = {
    if not s then return nil end
     ['手枪'] = '手枪',
     s = s:gsub('^[%s\n\r\t]+', ''):gsub('[%s\n\r\t]+$', '')
    ['冲锋枪'] = '冲锋枪',
     if s == '' then return nil end
    ['步枪'] = '步枪',
     s = s:gsub('^%s*<p[^>]*>', ''):gsub('</p>%s*$', '')
    ['突击步枪'] = '突击步枪',
     return s
     ['机枪'] = '机枪',
end
     ['霰弹枪'] = '霰弹枪'
}
 
-- 稀有度颜色
local rarityColors = {
    [2] = '#777',
    [3] = '#33566f',
    [4] = '#7b813f',  
    [5] = '#a7753b',
     [6] = '#ad4229'
}


function p.main(frame)
function p.main(frame)
     local args = frame.args
     local args = frame:getParent().args
     local html = mw.html.create('div')
     local html = mw.html.create('div'):addClass('gf-infobox')
        :addClass('gf-infobox')
      
      
    -- 标题
     local name = cleanParam(args['标题']) or cleanParam(args['名字']) or mw.title.getCurrentTitle().subpageText
     local title = args['名字'] or args['标题'] or mw.title.getCurrentTitle().text
     html:tag('div'):addClass('gf-title'):wikitext(name)
     html:tag('div')
        :addClass('gf-title')
        :wikitext(title)
      
      
    -- 图片
     local image = cleanParam(args['image'])
     local image = args['image'] or args['图片']
     local imgContainer = html:tag('div'):addClass('gf-image-container')
     if image and image ~= '' then
    if image then
        local imageDiv = html:tag('div')
         imgContainer:wikitext(string.format('[[File:%s|280px]]', image))
            :addClass('gf-image-container')
         local caption = cleanParam(args['图片说明'])
       
         if caption then
         imageDiv:wikitext(string.format('[[File:%s|280px|class=gf-image]]', image))
             imgContainer:tag('div'):css('font-size', '0.9em'):wikitext(caption)
       
         local imgDesc = args['图片说明']
         if imgDesc and imgDesc ~= '' then
             imageDiv:tag('br'):done()
            imageDiv:wikitext(imgDesc)
         end
         end
    else
        html:tag('div')
            :addClass('gf-image-container')
            :wikitext('啊嘞?!<br />怎么回事<br />这个妹子怎么没有头的样子……')
     end
     end
      
      
    -- 基础资料
     html:tag('div'):addClass('gf-section'):wikitext('基础资料')
     html:tag('div')
    local tableDom = html:tag('div'):addClass('gf-table')
        :addClass('gf-section')
        :wikitext('基础资料')
      
      
    -- 信息行
     local fields = {
     local fields = {
         {'本名', args['本名']},
         {'本名', cleanParam(args['本名'])},
         {'别名', args['别名']},
         {'别名', cleanParam(args['别名'])},
         {'发色', formatHairColor(args)},
         {'发色', p.formatColor(args['多种发色'] or args['发色'], 'Hair', frame)},
        {'瞳色', formatEyeColor(args)},
         {'瞳色', p.formatColor(args['多种瞳色'] or args['瞳色'], 'Eye', frame)},
        {'声优', formatVoiceActor(args)},
         {'声优', cleanParam(args['多位声优'] or args['声优'])},
        {'萌点', args['萌点']},
         {'萌点', cleanParam(args['萌点'])},
        {'类型', formatWeaponType(args['类型'])},
         {'类型', cleanParam(args['类型'])},
        {'稀有度', formatRarity(args['稀有度'])},
         {'稀有度', p.formatRarity(cleanParam(args['稀有度']))},
         {'原产国', args['原产国']},
         {'团体', cleanParam(args['所属团体'])},
        {'研发者', args['研发者']},
         {'状态', cleanParam(args['个人状态'])}
        {'研发商', args['研发商']},
         {'研发日期', args['研发日期']},
        {'生产商', args['生产商']},
         {'生产日期', args['生产日期']},
         {'服役期间', args['服役期间']},
         {'出身地区', args['出身地区']},
         {'活动范围', args['活动范围']},
        {'所属团体', args['所属团体']},
         {'个人状态', args['个人状态']}
     }
     }
      
      
     for _, field in ipairs(fields) do
     for _, field in ipairs(fields) do
         local label, value = field[1], field[2]
         if field[2] then
        if value and value ~= '' then
             local row = tableDom:tag('div'):addClass('gf-row')
             local row = html:tag('div'):addClass('gf-row')
             row:tag('div'):addClass('gf-label'):wikitext(field[1])
             row:tag('div')
             local val = row:tag('div'):addClass('gf-value')
                :addClass('gf-label')
            if field[1] == '声优' then
                :wikitext(label)
                val:wikitext('[[' .. field[2] .. ']]')
             row:tag('div')
            else
                :addClass('gf-value')
                 val:wikitext(field[2])  
                 :wikitext(value)
            end
         end
         end
     end
     end
      
      
    -- 亲属或相关人
     local related = cleanParam(args['相关人士'])
     local related = args['相关人士']
     if related then
     if related and related ~= '' then
         html:tag('div'):addClass('gf-section'):wikitext('亲属或相关人')
         html:tag('div')
         html:tag('div'):addClass('gf-related'):wikitext(related)
            :addClass('gf-section')
            :wikitext('亲属或相关人')
       
         html:tag('div')
            :addClass('gf-single')
            :wikitext(related)
    end
   
    -- 分类
    local categories = {}
    if not image or image == '' then
        table.insert(categories, '[[Category:无设定图]]')
    end
   
    local voiceActor = args['声优']
    if voiceActor then
        table.insert(categories, string.format('[[Category:%s配音角色]]', voiceActor))
    end
   
    local weaponType = args['类型']
    if weaponType and weaponTypes[weaponType] then
        table.insert(categories, string.format('[[Category:少女前线:%s]]', weaponType))
    end
   
    if #categories > 0 then
        html:wikitext(table.concat(categories))
     end
     end
      
      
第126行: 第64行:
end
end


-- 格式化发色
function p.formatColor(v, cType, frame)
function formatHairColor(args)
     v = cleanParam(v)
     local multiColor = args['多种发色']
     if not v then return nil end
     if multiColor and multiColor ~= '' then
     return frame:preprocess('{{' .. cType .. '_color|' .. v .. '}}')
        return multiColor
    end
      
    local hairColor = args['发色']
    if hairColor then
        return string.format('{{Hair_color|%s}}', hairColor)
    end
   
    return nil
end
end


-- 格式化瞳色
function p.formatRarity(rarity)
function formatEyeColor(args)
    if not rarity then return nil end
     local multiColor = args['多种瞳色']
     local colors = {[2]='#777', [3]='#33566f', [4]='#7b813f', [5]='#a7753b', [6]='#ad4229'}
     if multiColor and multiColor ~= '' then
     local num = tonumber(rarity) or (rarity:find('') and #rarity/3)
         return multiColor
    if num and colors[math.floor(num)] then
         return string.format('<span style="color:%s">%s</span>', colors[math.floor(num)], string.rep('★', math.floor(num)))
     end
     end
   
     return rarity
    local eyeColor = args['瞳色']
    if eyeColor then
        return string.format('{{Eye_color|%s}}', 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)
    if weaponType and weaponTypes[weaponType] then
        return weaponTypes[weaponType]
    end
   
    return weaponType
end
 
-- 格式化稀有度
function formatRarity(rarity)
    if not rarity then
        return nil
    end
   
    -- 处理数字
    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 = select(2, rarity:gsub('★', ''))
    if starCount > 0 then
        local color = rarityColors[starCount]
        if color then
            return string.format('<span style="color:%s">%s</span>', color, rarity)
        end
    end
   
    -- 处理箭头
     return rarity:gsub('%s*→%s*', ' → '):gsub('%s*->%s*', ' → ')
end
end


return p
return p

2026年5月8日 (五) 23:16的最新版本

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

local p = {}

local function cleanParam(s)
    if not s then return nil end
    s = s:gsub('^[%s\n\r\t]+', ''):gsub('[%s\n\r\t]+$', '')
    if s == '' then return nil end
    s = s:gsub('^%s*<p[^>]*>', ''):gsub('</p>%s*$', '')
    return s
end

function p.main(frame)
    local args = frame:getParent().args
    local html = mw.html.create('div'):addClass('gf-infobox')
    
    local name = cleanParam(args['标题']) or cleanParam(args['名字']) or mw.title.getCurrentTitle().subpageText
    html:tag('div'):addClass('gf-title'):wikitext(name)
    
    local image = cleanParam(args['image'])
    local imgContainer = html:tag('div'):addClass('gf-image-container')
    if image then
        imgContainer:wikitext(string.format('[[File:%s|280px]]', image))
        local caption = cleanParam(args['图片说明'])
        if caption then
            imgContainer:tag('div'):css('font-size', '0.9em'):wikitext(caption)
        end
    end
    
    html:tag('div'):addClass('gf-section'):wikitext('基础资料')
    local tableDom = html:tag('div'):addClass('gf-table')
    
    local fields = {
        {'本名', cleanParam(args['本名'])},
        {'别名', cleanParam(args['别名'])},
        {'发色', p.formatColor(args['多种发色'] or args['发色'], 'Hair', frame)},
        {'瞳色', p.formatColor(args['多种瞳色'] or args['瞳色'], 'Eye', frame)},
        {'声优', cleanParam(args['多位声优'] or args['声优'])},
        {'萌点', cleanParam(args['萌点'])},
        {'类型', cleanParam(args['类型'])},
        {'稀有度', p.formatRarity(cleanParam(args['稀有度']))},
        {'团体', cleanParam(args['所属团体'])},
        {'状态', cleanParam(args['个人状态'])}
    }
    
    for _, field in ipairs(fields) do
        if field[2] then
            local row = tableDom:tag('div'):addClass('gf-row')
            row:tag('div'):addClass('gf-label'):wikitext(field[1])
            local val = row:tag('div'):addClass('gf-value')
            if field[1] == '声优' then 
                val:wikitext('[[' .. field[2] .. ']]')
            else 
                val:wikitext(field[2]) 
            end
        end
    end
    
    local related = cleanParam(args['相关人士'])
    if related then
        html:tag('div'):addClass('gf-section'):wikitext('亲属或相关人')
        html:tag('div'):addClass('gf-related'):wikitext(related)
    end
    
    return tostring(html)
end

function p.formatColor(v, cType, frame)
    v = cleanParam(v)
    if not v then return nil end
    return frame:preprocess('{{' .. cType .. '_color|' .. v .. '}}')
end

function p.formatRarity(rarity)
    if not rarity then return nil end
    local colors = {[2]='#777', [3]='#33566f', [4]='#7b813f', [5]='#a7753b', [6]='#ad4229'}
    local num = tonumber(rarity) or (rarity:find('★') and #rarity/3)
    if num and colors[math.floor(num)] then
        return string.format('<span style="color:%s">%s</span>', colors[math.floor(num)], string.rep('★', math.floor(num)))
    end
    return rarity
end

return p