全站通知:

模块:精魄表美化

来自黑神话:悟空WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:精魄表美化/doc创建

-- 定义 startsWith 辅助函数
local function startsWith(str, prefix)
    return str:sub(1, #prefix) == prefix
end

local function applyColorRule(text, color, applyColors)
    -- 定义颜色样式
    local colorStyles = {
        green = 'color:#4f4;',
        red = 'color:#f33;'
    }

    -- 检查是否有有效的颜色并且是否应用颜色
    if not colorStyles[color] or not applyColors then return text end

    -- 使用 gsub 遍历并替换所有带符号的数字部分(包括 +, -, % 和 /s)
    return (text:gsub("([%+%-]?%d+%.?%d*%%?/?s?)", function(num)
        -- 将整个匹配项用颜色样式包裹
        return '<span style="' .. colorStyles[color] .. '">' .. num .. '</span>'
    end))
end

-- 定义替换模式
local replacements = {
    ["火焚耐性"] = "{{i|火焚耐性}}火焚耐性",
    ["雷蛰耐性"] = "{{i|雷蛰耐性}}雷蛰耐性",
    ["寒冻耐性"] = "{{i|寒冻耐性}}寒冻耐性",
    ["毒伤耐性"] = "{{i|毒伤耐性}}毒伤耐性",
    ["火焚攻击"] = "{{i|火焚}}火焚攻击",
    ["雷蛰攻击"] = "{{i|雷蛰}}雷蛰攻击",
    ["寒冻攻击"] = "{{i|寒冻}}寒冻攻击",
    ["毒伤攻击"] = "{{i|毒伤}}毒伤攻击",
    ["移动速度"] = "{{i|移动速度}}移动速度",
    ["气力恢复"] = "{{i|气力恢复}}气力恢复",
    ["伤害减免"] = "{{i|伤害减免}}伤害减免",
    ["伤害加成"] = "{{i|伤害加成}}伤害加成",
    ["法术"] = "{{i|法术}}法术",
    ["暴击伤害"] = "{{i|暴击伤害}}暴击伤害",
    ["暴击率"] = "{{i|暴击率}}暴击率",
    ["防御"] = "{{i|防御}}防御",
    ["法力"] = "{{i|法力}}法力",
    ["生命"] = "{{i|生命}}生命"
}

-- 初始化 M 表
local M = {}

function M.main(frame)
    local args = frame.args
    local input = args[1] or ''
    local eff = mw.ustring.lower(args.eff or '') == 'true'
    
    -- 分割输入为各个部分
    local parts = mw.text.split(input, ',')
    local output = {}

    for _, part in ipairs(parts) do
        -- 去除首尾空格
        part = part:match("^%s*(.-)%s*$")

        -- 保存原始文本用于后续处理
        local originalPart = part

        -- 移除 GRW 前缀,不论 eff 是否为 true
        if startsWith(originalPart, 'G') or startsWith(originalPart, 'R') or startsWith(originalPart, 'W') then
            part = part:sub(2)
        end

        -- 如果部分包含数字,并且 eff 为 true,则应用颜色规则
        if part:match("%d") and eff then
            local color = nil
            -- 检查是否有前缀 G, R, W 并相应设置颜色(这部分已经在前面移除了前缀)
            if startsWith(originalPart, 'G') then
                color = 'green'
            elseif startsWith(originalPart, 'R') then
                color = 'red'
            elseif startsWith(originalPart, 'W') then
                color = nil
            else
                -- 如果部分包含负号,则默认为红色,否则为绿色
                if part:find('-') then
                    color = 'red'
                else
                    color = 'green'
                end
            end
            part = applyColorRule(part, color, eff)
        end

        -- 处理 i 标记,仅当 eff 为 true 时应用
        if eff then
            -- 应用 i 攻击 和 i 气力 的特殊替换
            part = part:gsub('i(攻击)', '{{i|攻击}}攻击')
            part = part:gsub('i(气力)', '{{i|气力}}气力')

            -- 对于其他需要替换的关键字,使用 replacements 表
            for key, replacement in pairs(replacements) do
                part = part:gsub(key, replacement)
            end
        else
            -- 移除 i 标记,保留原始文本
            part = part:gsub('i(攻击)', '攻击')
            part = part:gsub('i(气力)', '气力')
        end

        -- 将处理后的部分插入到输出表中
        table.insert(output, part)
    end

    -- 将所有处理过的部分用逗号连接起来,去掉可能存在的结尾逗号
    local result = table.concat(output, ', ')
    result = result:gsub(',$', '')
    return result
end

return M