七日内新公告:全站维护公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

Module:Sandbox/穆斯塔法凯末尔

贴贴♀百科,万娘皆可贴的百科全书!转载请标注来源页面的网页链接,并声明引自贴贴百科。内容不可商用。
跳到导航 跳到搜索
Template-info.svg 模块文档  [创建] [刷新]
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