Module:Sandbox/穆斯塔法凯末尔
跳到导航
跳到搜索
local p = {}
local getArgs = require('Module:Arguments').getArgs
local mwHtml = require('mw.html')
-- 辅助函数:检查值是否存在且非空
local function isNotEmpty(s)
return s and s ~= '' and tostring(s):match('%S')
end
-- 辅助函数:检查是否为数字(并添加单位)
local function formatNumberWithUnit(val, unitIfNumber, unitIfNotNumber)
if not isNotEmpty(val) then
return nil
end
if tostring(val):match('^%d+%.?%d*$') then
return val .. unitIfNumber
else
return val .. (unitIfNotNumber or '')
end
end
-- 辅助函数:处理血型参数,确保以“型”结尾
local function formatBloodType(bloodType)
if not isNotEmpty(bloodType) then
return nil
end
if bloodType:match('型$') then
return bloodType
else
return bloodType .. '型'
end
end
-- 关键新增函数:模拟调用wiki模板 (这是一个占位符/回退方案)
-- 在实际wiki中,这些函数应该调用真实的模板。
-- 这里我们提供一个简单的回退机制。
local function callWikiTemplate(templateName, ...)
-- 这是一个非常简化的模拟,无法真正实现模板逻辑
-- 在实际部署中,这部分可能需要wiki管理员进行配置,
-- 或者确保这些模板调用在最终输出的wikitext中能被正确解析。
local args = {...}
if templateName == 'HSRcolor' then
-- 提供一个非常简单的颜色映射回退
local key = args[1] or ''
local default = args[2] or '#000000'
if key == '某一' then return '#224186'
elseif key == '某二' then return '#E6ECFF'
else return default end
elseif templateName == 'ArticleCategory' then
return '' -- 分类通常不直接显示
else
-- 对于其他模板,返回一个原始的wiki文本字符串,让MediaWiki去解析它
local templateText = '{{' .. templateName
for i, arg in ipairs(args) do
if isNotEmpty(arg) then
templateText = templateText .. '|' .. arg
end
end
templateText = templateText .. '}}'
return templateText
end
end
function p._main(args)
local root = mwHtml.create('table')
:addClass('infobox2')
:attr('align', 'right')
:attr('border', '0')
:cssText('float:right;width:22.5em;font-size:90%;margin:1em 0 1em 1em;padding:1px;background:#f9f9f9;border:1px solid #d0d0d0;border-collapse:separate;border-spacing:0.25em;word-break:break-all;clear:right;display:table;')
-- **关键修改:在Lua内部计算颜色**
local elem = args['属性'] or ''
local colorDark = callWikiTemplate('HSRcolor', elem .. '一', '#224186')
local colorLight = callWikiTemplate('HSRcolor', elem .. '二', '#E6ECFF')
-- 定义左右列样式
local lWidth = args['l-width'] or '5em'
local lCss = 'width:' .. lWidth .. '; background-color:' .. colorLight .. '; color:#4f4f4f; border-spacing:0.2em; padding:0.2em; font-weight:bold;'
local rCss = 'padding:2px 4px;'
-- ... (中间处理各个字段的代码与之前基本相同,但需要确保调用 callWikiTemplate 而不是直接写模板文本)
-- 例如,处理属性行的地方原来是:
-- :wikitext('{{HSR elemicon|' .. args['属性'] .. '}}{{HSRcolor|' .. args['属性'] .. '|' .. args['属性'] .. '}}')
-- 现在需要改为类似:
-- :wikitext( callWikiTemplate('HSR elemicon', args['属性']) .. callWikiTemplate('HSRcolor', args['属性'], args['属性']) )
-- 示例:修改属性行的处理
if isNotEmpty(args['属性']) then
root:tag('tr')
:tag('th')
:cssText(lCss)
:wikitext('属性')
:done()
:tag('td')
:cssText('padding:0 4px !important;')
:wikitext( callWikiTemplate('HSR elemicon', args['属性']) .. callWikiTemplate('HSRcolor', args['属性'], args['属性']) )
:done()
:done()
end
-- ... (其他字段处理也需类似修改,用 callWikiTemplate 包裹模板调用)
-- **关键修改:处理未知参数的方式**
-- 不再需要 knownArgs 列表,因为 getArgs 已经将所有参数传入了。
-- Lua 的 pairs 遍历会自然遍历所有传入的参数。
-- 我们只需要过滤掉那些我们已经明确处理过的参数键即可。
local explicitlyHandledKeys = {
['l-width'] = true, ['属性'] = true, -- 添加所有你在上面代码中处理过的参数名...
-- ... 例如: '本名', '英文名', '性别', 等等,所有你手动调用过 args[XXX] 的键
-- 这是一个繁琐但必要的过程,需要根据你 _main 函数中的实际代码来填充这个列表
'image', 'tab', 'tabs', '图片说明', '本名', '原型语言名', '英文名', '日文名',
'韩文名', '别号', '性别', '发色', '多种发色', '瞳色', '多种瞳色', '身高',
'体重', '三围', '年龄', '出生年代', '生日', '特殊生日', '星座', '特殊星座',
'血型', '种族', '属性', '特殊属性', '命途', '特殊命途', '汉语配音',
'多位汉语配音', '日语配音', '多位日语配音', '英语配音', '韩语配音', '其他配音',
'萌点', '出身地区', '活动范围', '所属团体', '个人状态', '短信签名', '常驻位置',
'相关人士', '更多图片', '维基共享'
}
for key, val in pairs(args) do
-- 只处理那些不是数字、非空、且不在“已明确处理”列表中的键
if not explicitlyHandledKeys[key] and isNotEmpty(val) and type(key) == 'string' and not key:match('^%d+$') then
root:tag('tr')
:tag('th')
:cssText(lCss)
:wikitext(key)
:done()
:tag('td')
:cssText(rCss)
:wikitext(tostring(val))
:done()
:done()
end
end
-- ... (处理相关人士的代码)
return tostring(root)
end
function p.main(frame)
local args = getArgs(frame, {
wrappers = 'Template:星穹铁道角色信息',
-- valueFunc 确保去除空白参数
valueFunc = function(key, value)
if value == nil then
return nil
else
value = value:match('^%s*(.-)%s*$')
if value == '' then
return nil
else
return value
end
end
end
})
return p._main(args)
end
return p