local getArgs = require('Module:Arguments').getArgs
local p = {}
function p.main(frame)
local args = getArgs(frame)
local text = args.text
local labelTemplate = args.label or 'Lv.$'
local valueStyle = args.valueStyle or ''
-- 提取占位符名
local placeholders = {}
local placeholderSet = {} -- 用于快速判断是否为占位符
for placeholder in text:gmatch('{([^}]+)}') do
table.insert(placeholders, placeholder)
placeholderSet[placeholder] = true
end
-- 预解析所有占位符参数为列表
local parsed = {}
for _, ph in ipairs(placeholders) do
parsed[ph] = {}
for val in (args[ph] or ''):gmatch('[^,]+') do
table.insert(parsed[ph], mw.text.trim(val))
end
end
-- 假设所有占位符列表长度一致
local tabCount = #parsed[placeholders[1]]
-- 将参数传递给 Tabs 模板
local tabArgs = {}
for k, v in pairs(args) do
-- 跳过本模块内部使用的参数
if k ~= 'text' and k ~= 'label' and not placeholderSet[k] then
tabArgs[k] = v
end
end
-- 构建 Tabs
for i = 1, tabCount do
tabArgs['bt' .. i] = labelTemplate:gsub('%$', tostring(i))
local outText = text
for _, ph in ipairs(placeholders) do
local safeVal = parsed[ph][i]:gsub('%%', '%%%%') -- 将倍率中的 % 替换为 %%,避免被当做转义处理
outText = outText:gsub('{' .. ph .. '}', '<span style="' .. valueStyle .. '">' .. safeVal .. '</span>')
end
tabArgs['tab' .. i] = outText
end
return frame:expandTemplate{ title = 'tabs', args = tabArgs }
end
return p