模块:角色一览表
刷
历
编
跳到导航
跳到搜索
此模块的文档可以在模块:角色一览表/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, "<", "<") -- 转义<
str = string.gsub(str, ">", ">") -- 转义>
str = string.gsub(str, '"', """) -- 转义"
str = string.gsub(str, "'", "'") -- 转义'
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

沪公网安备 31011002002714 号