模块:配队/卡牌
来自卡厄思梦境WIKI
此模块的文档可以在模块:配队/卡牌/doc创建
local p = {}
-- 引入依赖模块
local getArgs = require('Module:Arguments').getArgs
local cardModule = require('Module:卡牌')
-- 安全的错误输出
local function err(msg)
return '<span style="color: red;">' .. mw.text.encode(msg) .. '</span>'
end
-- 安全的字符串处理函数
local function safeString(str)
if not str then return "" end
str = tostring(str)
-- 确保字符串是有效的UTF-8
if not mw.ustring then
return str
end
-- 移除可能的BOM和其他非打印字符
str = mw.text.trim(str)
return str
end
-- 解析 card.order 字符串,返回卡牌名称数组
local function parseCardOrder(orderStr)
orderStr = safeString(orderStr)
if orderStr == "" then
return {}
end
local cards = {}
-- 保留卡牌名称中的中文标点符号
for cardName in mw.ustring.gmatch(orderStr, '([^,]+)') do
cardName = mw.text.trim(cardName)
if cardName ~= "" then
table.insert(cards, cardName)
end
end
return cards
end
-- 主函数:批量显示指定战斗员的卡牌
-- 参数:
-- moduleName: 战斗员模块名(如 "凯隆")
function p.main(frame)
local args = getArgs(frame, { removeBlank = true })
local moduleName = args[1] or args.module
moduleName = safeString(moduleName)
if moduleName == "" then
return err("错误: 未指定战斗员模块名")
end
-- 加载战斗员卡牌数据模块
local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
if not success or not cardData then
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
end
-- 获取 card.order
local orderData = cardData.order
if not orderData then
return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
end
-- 如果 order 是表格,取第一个元素
local orderStr = orderData
if type(orderData) == "table" then
if #orderData == 0 then
return err('错误: card.order 为空')
end
orderStr = orderData[1]
end
orderStr = safeString(orderStr)
if orderStr == "" then
return err('错误: card.order 为空或格式错误')
end
-- 解析卡牌顺序
local cardNames = parseCardOrder(orderStr)
if #cardNames == 0 then
return err('错误: card.order 解析后为空,原始值: ' .. mw.text.encode(orderStr))
end
-- 直接构建 HTML 而不是调用 batch
local html = {}
table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
for i, cardName in ipairs(cardNames) do
-- 为每张卡牌创建独立的 frame
local subFrame = {
args = {moduleName, cardName},
getParent = function() return frame end
}
table.insert(html, cardModule.main(subFrame))
end
table.insert(html, '</div>')
return table.concat(html, '')
end
-- 自定义函数:允许指定特定卡牌列表
-- 用法:{{#invoke:配队/卡牌|custom|模块名|卡牌1|卡牌2|卡牌3|...}}
function p.custom(frame)
local args = getArgs(frame, { removeBlank = true })
local moduleName = safeString(args[1])
if moduleName == "" then
return err("错误: 未指定战斗员模块名")
end
-- 收集所有卡牌名称(从第2个参数开始)
local cardNames = {}
local i = 2
while args[i] do
local cardName = safeString(args[i])
if cardName ~= "" then
table.insert(cardNames, cardName)
end
i = i + 1
end
if #cardNames == 0 then
return err("错误: 未指定任何卡牌")
end
-- 直接构建 HTML
local html = {}
table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
for _, cardName in ipairs(cardNames) do
local subFrame = {
args = {moduleName, cardName},
getParent = function() return frame end
}
table.insert(html, cardModule.main(subFrame))
end
table.insert(html, '</div>')
return table.concat(html, '')
end
-- 显示指定战斗员的所有卡牌(按字母顺序)
-- 用法:{{#invoke:配队/卡牌|all|模块名}}
function p.all(frame)
local args = getArgs(frame, { removeBlank = true })
local moduleName = safeString(args[1])
if moduleName == "" then
return err("错误: 未指定战斗员模块名")
end
-- 加载战斗员卡牌数据模块
local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
if not success or not cardData then
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
end
-- 收集所有卡牌名称(除了 info 和 order)
local cardNames = {}
for cardName, _ in pairs(cardData) do
if cardName ~= "info" and cardName ~= "order" and type(cardData[cardName]) == "table" then
table.insert(cardNames, cardName)
end
end
table.sort(cardNames) -- 按字母顺序排序
if #cardNames == 0 then
return err("错误: 模块中没有找到任何卡牌")
end
-- 直接构建 HTML
local html = {}
table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">')
for _, cardName in ipairs(cardNames) do
local subFrame = {
args = {moduleName, cardName},
getParent = function() return frame end
}
table.insert(html, cardModule.main(subFrame))
end
table.insert(html, '</div>')
return table.concat(html, '')
end
-- 调试函数:显示 card.order 的原始内容
function p.debug(frame)
local args = getArgs(frame, { removeBlank = true })
local moduleName = safeString(args[1])
if moduleName == "" then
return err("错误: 未指定战斗员模块名")
end
local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
if not success or not cardData then
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
end
local orderData = cardData.order
local html = {}
table.insert(html, '<div style="background:#f9f9f9;border:1px solid #ccc;padding:0px;margin:10px 0;">')
table.insert(html, '<b>调试信息:</b><br>')
table.insert(html, '<b>order 类型:</b>' .. type(orderData) .. '<br>')
if type(orderData) == "table" then
table.insert(html, '<b>order 长度:</b>' .. #orderData .. '<br>')
for i, v in ipairs(orderData) do
table.insert(html, '<b>order[' .. i .. ']:</b>' .. mw.text.encode(tostring(v)) .. '<br>')
end
else
table.insert(html, '<b>order 值:</b>' .. mw.text.encode(tostring(orderData)) .. '<br>')
end
local orderStr = type(orderData) == "table" and orderData[1] or orderData
local cardNames = parseCardOrder(orderStr)
table.insert(html, '<b>解析后的卡牌数量:</b>' .. #cardNames .. '<br>')
for i, name in ipairs(cardNames) do
table.insert(html, '<b>' .. i .. '.</b> ' .. mw.text.encode(name) .. '<br>')
end
table.insert(html, '</div>')
return table.concat(html, '')
end
-- 配队模拟器专用:显示带有元数据的卡牌
function p.deck(frame)
local args = getArgs(frame, { removeBlank = true })
local moduleName = safeString(args[1])
if moduleName == "" then
return err("错误: 未指定战斗员模块名")
end
-- 加载战斗员卡牌数据模块
local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
if not success or not cardData then
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
end
-- 获取 card.order
local orderData = cardData.order
if not orderData then
return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
end
-- 如果 order 是表格,取第一个元素
local orderStr = orderData
if type(orderData) == "table" then
if #orderData == 0 then
return err('错误: card.order 为空')
end
orderStr = orderData[1]
end
orderStr = safeString(orderStr)
if orderStr == "" then
return err('错误: card.order 为空或格式错误')
end
-- 解析卡牌顺序
local cardNames = parseCardOrder(orderStr)
if #cardNames == 0 then
return err('错误: card.order 解析后为空')
end
-- 构建带有特殊标记的 HTML
local html = {}
table.insert(html, '<div class="deck-cards-container" style="display:flex;gap:0px;flex-wrap:wrap;min-height:360px;">')
for i, cardName in ipairs(cardNames) do
-- 为每张卡牌创建包装器,包含元数据
table.insert(html, '<div class="deck-card-wrapper" data-module="' .. mw.text.encode(moduleName) .. '" data-card="' .. mw.text.encode(cardName) .. '" style="display:inline-block;">')
-- 调用原始的卡牌显示
local subFrame = {
args = {moduleName, cardName},
getParent = function() return frame end
}
table.insert(html, cardModule.main(subFrame))
table.insert(html, '</div>')
end
table.insert(html, '</div>')
return table.concat(html, '')
end
return p