bugfix1001.2

星引擎Party已发行!
欢迎来到Star Engine 星引擎 WIKI
点击成为魔法少女!

全站通知:

模块:角色一览表

来自星引擎WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:角色一览表/doc创建

local p = {}
-- 手动实现HTML转义函数(替代mw.text.escape)
local function escapeHtml(str)
    if not str then return "" end
    str = string.gsub(str, "&", "&")  -- 转义&
    str = string.gsub(str, "<", "&lt;")   -- 转义<
    str = string.gsub(str, ">", "&gt;")   -- 转义>
    str = string.gsub(str, '"', "&quot;") -- 转义"
    str = string.gsub(str, "'", "&#39;")  -- 转义'
    return str
end
-- 常量集中管理(方便后续修改)
local CONST = {
    imgBase = "File:UT_AccountHeadShot_", -- 图片基础路径
    imgSize = "30px", -- 图片尺寸
    imgPrefixDefault = "70", -- 默认图片前缀
    imgPrefixSpecial = "709", -- 特殊角色(联动+3开头编号)的图片前缀
    dataSeparator = ";", -- 角色数据分隔符
    fieldSeparator = "|", -- 角色字段(name|id|period)分隔符
    -- 自定义时期排序优先级:数字越小越靠前
    periodOrder = {
        ["第一期"] = 1,    
        ["第二期"] = 2,
        ["第三期"] = 3,
        ["联动"] = 4,
        ["其他"] = 5
    }
}
function p.main(frame)
    local data = frame.args.data or ""
    local roles = {} -- 按时期分组:{ 时期 = { {name, id, idNum}, ... }, ... }
    
    -- 1. 拆分数据并分组(同时存储编号的数字形式,用于排序)
    for roleStr in string.gmatch(data, "[^" .. CONST.dataSeparator .. "]+") do
        -- 提取name、id、period(使用常量分隔符,增强可读性)
        local name, id, period = string.match(roleStr, "^([^" .. CONST.fieldSeparator .. "]+)" 
            .. CONST.fieldSeparator .. "([^" .. CONST.fieldSeparator .. "]+)" 
            .. CONST.fieldSeparator .. "([^" .. CONST.fieldSeparator .. "]+)$")
        
        if name and id and period then
            -- 使用自定义的escapeHtml函数转义
            local safeName = escapeHtml(name)
            local safeId = escapeHtml(id)
            local safePeriod = escapeHtml(period)
            
            local idNum = tonumber(safeId) or 0
            if not roles[safePeriod] then
                roles[safePeriod] = {}
            end
            table.insert(roles[safePeriod], {
                name = safeName,
                id = safeId,
                idNum = idNum
            })
        end
    end
    
    
    -- 2. 生成表格HTML(使用数组存储片段,提升拼接性能)
    local htmlParts = {"<table>"}
    
    -- 2.1 收集所有时期并按【自定义优先级】排序
    local periods = {}
    for period in pairs(roles) do
        table.insert(periods, period)
    end
    
    -- 自定义排序函数:按periodOrder中的优先级排序
    table.sort(periods, function(a, b)
        -- 获取a和b的优先级(默认值设为一个大数字,让未定义时期排最后)
        local priorityA = CONST.periodOrder[a] or 999
        local priorityB = CONST.periodOrder[b] or 999
        
        -- 先按优先级排序;若优先级相同,再按名称字母排序(避免无序)
        if priorityA ~= priorityB then
            return priorityA < priorityB
        else
            return a < b  -- 优先级相同时,按名称升序
        end
    end)
    
    -- 2.2 遍历排序后的时期,生成表格内容
    for _, period in ipairs(periods) do
        local roleList = roles[period]
        
        -- 对当前时期的角色按编号(数字)升序排序
        table.sort(roleList, function(a, b)
            return a.idNum < b.idNum
        end)
        
        -- 生成时期行(表头+内容)
        table.insert(htmlParts, "<tr><th>" .. period .. "角色</th><td>")
        
        -- 生成角色图片和链接
        for _, role in ipairs(roleList) do
            -- 确定图片前缀(特殊角色判断)
            local imgPrefix = CONST.imgPrefixDefault
            if period == "联动" and string.sub(role.id, 1, 1) == "3" then
                imgPrefix = CONST.imgPrefixSpecial
            end
            
            -- 拼接图片标签(使用常量,减少硬编码)
            local img = string.format(
                "[[%s%s%s.png|%s|link=%s]]",
                CONST.imgBase, imgPrefix, role.id, CONST.imgSize, role.name
            )
            
            -- 拼接角色链接
            local link = "[[" .. role.name .. "]]"
            
            table.insert(htmlParts, img .. link .. " ")
        end
        
        table.insert(htmlParts, "</td></tr>")
    end
    
    table.insert(htmlParts, "</table>")
    
    -- 拼接所有片段并返回
    return table.concat(htmlParts)
end

return p