模块:GFInfobox
来自OGAS数据中枢
更多操作
此模块的文档可以在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(cleanParam(args['标题'] or args['名字'] or mw.title.getCurrentTitle().subpageText))
-- 图片
local image = cleanParam(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 cleanParam(args['图片说明']) ~= '' then
imgContainer:wikitext('<br/>')
imgContainer:wikitext(cleanParam(args['图片说明']))
end
else
html:tag('div')
:addClass('gf-image-container')
:wikitext('啊嘞?!<br/>怎么回事<br/>这个妹子怎么没有头的样子……')
end
-- 基础资料
html:tag('div')
:addClass('gf-section')
:wikitext('基础资料')
-- 信息字段列表
local fields = {
{'本名', cleanParam(args['本名'])},
{'别名', processMixedContent(args['别名'], frame)},
{'发色', formatHairColor(args, frame)},
{'瞳色', formatEyeColor(args, frame)},
{'声优', formatVoiceActor(args)},
{'萌点', processMixedContent(args['萌点'], frame)},
{'类型', formatWeaponType(cleanParam(args['类型']))},
{'稀有度', formatRarity(cleanParam(args['稀有度']))},
{'原产国', cleanParam(args['原产国'])},
{'研发者', cleanParam(args['研发者'])},
{'研发商', cleanParam(args['研发商'])},
{'研发日期', cleanParam(args['研发日期'])},
{'生产商', cleanParam(args['生产商'])},
{'生产日期', cleanParam(args['生产日期'])},
{'服役期间', cleanParam(args['服役期间'])},
{'出身地区', cleanParam(args['出身地区'])},
{'活动范围', cleanParam(args['活动范围'])},
{'所属团体', cleanParam(args['所属团体'])},
{'个人状态', cleanParam(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 = processMixedContent(args['相关人士'], frame)
if related and related ~= '' then
html:tag('div')
:addClass('gf-section')
:wikitext('亲属或相关人')
html:tag('div')
:addClass('gf-related')
:wikitext(related)
end
return tostring(html)
end
-- 基础清理函数:去除首尾空白和换行
function cleanParam(s)
if not s then return nil end
-- 去除首尾空白字符(包括换行、回车、制表符等)
s = s:gsub('^[%s\n\r\t]+', ''):gsub('[%s\n\r\t]+$', '')
return s
end
-- 处理包含模板的混合内容:将换行符替换为空格,但保留模板展开的内容
function processMixedContent(s, frame)
if not s then return nil end
-- 先清理首尾空白
s = cleanParam(s)
if s == '' then return nil end
-- 将内容中的换行符替换为空格,但小心不要破坏模板调用
-- 更安全的方法:将连续的空白字符替换为单个空格
s = s:gsub('%s+', ' ')
return s
end
-- 格式化发色
function formatHairColor(args, frame)
local multiColor = cleanParam(args['多种发色'])
if multiColor and multiColor ~= '' then
return multiColor
end
local hairColor = cleanParam(args['发色'])
if hairColor and hairColor ~= '' then
return frame:preprocess('{{Hair_color|' .. hairColor .. '}}')
end
return nil
end
-- 格式化瞳色
function formatEyeColor(args, frame)
local multiColor = cleanParam(args['多种瞳色'])
if multiColor and multiColor ~= '' then
return multiColor
end
local eyeColor = cleanParam(args['瞳色'])
if eyeColor and eyeColor ~= '' then
return frame:preprocess('{{Eye_color|' .. eyeColor .. '}}')
end
return nil
end
-- 格式化声优
function formatVoiceActor(args)
local multiVA = cleanParam(args['多位声优'])
if multiVA and multiVA ~= '' then
return multiVA
end
local voiceActor = cleanParam(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