模块:GFInfobox
来自OGAS数据中枢
更多操作
此模块的文档可以在Module:GFInfobox/doc创建
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.html.create('div')
:addClass('gf-infobox')
-- 标题
local title = args['名字'] or args['标题'] or mw.title.getCurrentTitle().text
html:tag('div')
:addClass('gf-title')
:wikitext(title)
-- 图片
local image = args['image'] or args['图片']
if image and image ~= '' then
local imageDiv = html:tag('div')
:addClass('gf-image-container')
imageDiv:wikitext(string.format('[[File:%s|280px|class=gf-image]]', image))
local imgDesc = args['图片说明']
if imgDesc and imgDesc ~= '' then
imageDiv:tag('br'):done()
imageDiv:wikitext(imgDesc)
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)},
{'瞳色', formatEyeColor(args)},
{'声优', 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-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
return tostring(html)
end
-- 格式化发色
function formatHairColor(args)
local multiColor = args['多种发色']
if multiColor and multiColor ~= '' then
return multiColor
end
local hairColor = args['发色']
if hairColor then
return string.format('{{Hair_color|%s}}', hairColor)
end
return nil
end
-- 格式化瞳色
function formatEyeColor(args)
local multiColor = args['多种瞳色']
if multiColor and multiColor ~= '' then
return multiColor
end
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
return p