Module:GFInfobox:修订间差异
来自OGAS数据中枢
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第9行: | 第9行: | ||
html:tag('div') | html:tag('div') | ||
:addClass('gf-title') | :addClass('gf-title') | ||
:wikitext(args['标题'] or args['名字'] or mw.title.getCurrentTitle().subpageText) | :wikitext(cleanParam(args['标题'] or args['名字'] or mw.title.getCurrentTitle().subpageText)) | ||
-- 图片 | -- 图片 | ||
local image = args['image'] | local image = cleanParam(args['image']) | ||
if image and image ~= '' then | if image and image ~= '' then | ||
local imgContainer = html:tag('div') | local imgContainer = html:tag('div') | ||
:addClass('gf-image-container') | :addClass('gf-image-container') | ||
imgContainer:wikitext(string.format('[[File:%s|280px|class=infobox-image]]', image)) | imgContainer:wikitext(string.format('[[File:%s|280px|class=infobox-image]]', image)) | ||
if args['图片说明'] | if cleanParam(args['图片说明']) ~= '' then | ||
imgContainer:wikitext('<br/>') | imgContainer:wikitext('<br/>') | ||
imgContainer:wikitext(args['图片说明']) | imgContainer:wikitext(cleanParam(args['图片说明'])) | ||
end | end | ||
else | else | ||
| 第34行: | 第34行: | ||
-- 信息字段列表 | -- 信息字段列表 | ||
local fields = { | local fields = { | ||
{'本名', args['本名']}, | {'本名', cleanParam(args['本名'])}, | ||
{'别名', args['别名']}, | {'别名', processMixedContent(args['别名'], frame)}, | ||
{'发色', formatHairColor(args, frame)}, | {'发色', formatHairColor(args, frame)}, | ||
{'瞳色', formatEyeColor(args, frame)}, | {'瞳色', formatEyeColor(args, frame)}, | ||
{'声优', formatVoiceActor(args)}, | {'声优', formatVoiceActor(args)}, | ||
{'萌点', args['萌点']}, | {'萌点', processMixedContent(args['萌点'], frame)}, | ||
{'类型', formatWeaponType(args['类型'])}, | {'类型', formatWeaponType(cleanParam(args['类型']))}, | ||
{'稀有度', formatRarity(args['稀有度'])}, | {'稀有度', formatRarity(cleanParam(args['稀有度']))}, | ||
{'原产国', args['原产国']}, | {'原产国', cleanParam(args['原产国'])}, | ||
{'研发者', args['研发者']}, | {'研发者', cleanParam(args['研发者'])}, | ||
{'研发商', args['研发商']}, | {'研发商', cleanParam(args['研发商'])}, | ||
{'研发日期', args['研发日期']}, | {'研发日期', cleanParam(args['研发日期'])}, | ||
{'生产商', args['生产商']}, | {'生产商', cleanParam(args['生产商'])}, | ||
{'生产日期', args['生产日期']}, | {'生产日期', cleanParam(args['生产日期'])}, | ||
{'服役期间', args['服役期间']}, | {'服役期间', cleanParam(args['服役期间'])}, | ||
{'出身地区', args['出身地区']}, | {'出身地区', cleanParam(args['出身地区'])}, | ||
{'活动范围', args['活动范围']}, | {'活动范围', cleanParam(args['活动范围'])}, | ||
{'所属团体', args['所属团体']}, | {'所属团体', cleanParam(args['所属团体'])}, | ||
{'个人状态', args['个人状态']} | {'个人状态', cleanParam(args['个人状态'])} | ||
} | } | ||
| 第69行: | 第69行: | ||
-- 亲属或相关人 | -- 亲属或相关人 | ||
local related = args['相关人士'] | local related = processMixedContent(args['相关人士'], frame) | ||
if related and related ~= '' then | if related and related ~= '' then | ||
html:tag('div') | html:tag('div') | ||
| 第79行: | 第79行: | ||
end | end | ||
-- | return tostring(html) | ||
return | 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 | end | ||
-- 格式化发色 | -- 格式化发色 | ||
function formatHairColor(args, frame) | function formatHairColor(args, frame) | ||
local multiColor = args['多种发色'] | local multiColor = cleanParam(args['多种发色']) | ||
if multiColor and multiColor ~= '' then | if multiColor and multiColor ~= '' then | ||
return multiColor | return multiColor | ||
end | end | ||
local hairColor = args['发色'] | local hairColor = cleanParam(args['发色']) | ||
if hairColor and hairColor ~= '' then | if hairColor and hairColor ~= '' then | ||
return frame:preprocess('{{Hair_color|' .. hairColor .. '}}') | return frame:preprocess('{{Hair_color|' .. hairColor .. '}}') | ||
| 第100行: | 第121行: | ||
-- 格式化瞳色 | -- 格式化瞳色 | ||
function formatEyeColor(args, frame) | function formatEyeColor(args, frame) | ||
local multiColor = args['多种瞳色'] | local multiColor = cleanParam(args['多种瞳色']) | ||
if multiColor and multiColor ~= '' then | if multiColor and multiColor ~= '' then | ||
return multiColor | return multiColor | ||
end | end | ||
local eyeColor = args['瞳色'] | local eyeColor = cleanParam(args['瞳色']) | ||
if eyeColor and eyeColor ~= '' then | if eyeColor and eyeColor ~= '' then | ||
return frame:preprocess('{{Eye_color|' .. eyeColor .. '}}') | return frame:preprocess('{{Eye_color|' .. eyeColor .. '}}') | ||
| 第115行: | 第136行: | ||
-- 格式化声优 | -- 格式化声优 | ||
function formatVoiceActor(args) | function formatVoiceActor(args) | ||
local multiVA = args['多位声优'] | local multiVA = cleanParam(args['多位声优']) | ||
if multiVA and multiVA ~= '' then | if multiVA and multiVA ~= '' then | ||
return multiVA | return multiVA | ||
end | end | ||
local voiceActor = args['声优'] | local voiceActor = cleanParam(args['声优']) | ||
if voiceActor and voiceActor ~= '' then | if voiceActor and voiceActor ~= '' then | ||
return string.format('[[%s]]', voiceActor) | return string.format('[[%s]]', voiceActor) | ||
2026年5月8日 (五) 22:00的版本
此模块的文档可以在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