配队/卡牌:修订间差异
来自卡厄思梦境WIKI
无编辑摘要 |
小无编辑摘要 |
||
| (未显示同一用户的10个中间版本) | |||
| 第1行: | 第1行: | ||
local p = {} | local p = {} | ||
-- 引入依赖模块 | |||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
local cardModule = require('Module:卡牌') | local cardModule = require('Module:卡牌') | ||
| 第10行: | 第10行: | ||
end | end | ||
-- | -- 安全的字符串处理函数 | ||
local function | local function safeString(str) | ||
local | if not str then return "" end | ||
str = tostring(str) | |||
return | -- 确保字符串是有效的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 | end | ||
local | -- 加载战斗员卡牌数据模块 | ||
if not | local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName) | ||
return | if not success or not cardData then | ||
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"') | |||
end | end | ||
-- | -- 获取 card.order | ||
local orderData = cardData.order | |||
if not orderData then | |||
return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order') | |||
end | |||
-- 如果 order 是表格,取第一个元素 | |||
local orderStr = orderData | |||
if | if type(orderData) == "table" then | ||
return | if #orderData == 0 then | ||
return err('错误: card.order 为空') | |||
end | 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 | end | ||
return | table.insert(html, '</div>') | ||
return table.concat(html, '') | |||
end | end | ||
-- | -- 自定义函数:允许指定特定卡牌列表 | ||
-- 用法:{{#invoke:配队/卡牌|custom|模块名|卡牌1|卡牌2|卡牌3|...}} | |||
local | function p.custom(frame) | ||
local args = getArgs(frame, { removeBlank = true }) | |||
local moduleName = safeString(args[1]) | |||
if moduleName == "" then | |||
return err("错误: 未指定战斗员模块名") | |||
end | |||
-- 收集所有卡牌名称(从第2个参数开始) | |||
local | local cardNames = {} | ||
if | local i = 2 | ||
while args[i] do | |||
local cardName = safeString(args[i]) | |||
if cardName ~= "" then | |||
table.insert(cardNames, cardName) | |||
end | 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 | end | ||
return | table.insert(html, '</div>') | ||
return table.concat(html, '') | |||
end | end | ||
-- | -- 显示指定战斗员的所有卡牌(按字母顺序) | ||
function p. | -- 用法:{{#invoke:配队/卡牌|all|模块名}} | ||
function p.all(frame) | |||
local args = getArgs(frame, { removeBlank = true }) | local args = getArgs(frame, { removeBlank = true }) | ||
if | local moduleName = safeString(args[1]) | ||
return err( | if moduleName == "" then | ||
return err("错误: 未指定战斗员模块名") | |||
end | end | ||
-- | -- 加载战斗员卡牌数据模块 | ||
local | local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName) | ||
if not success or not cardData then | |||
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"') | |||
end | |||
if | -- 收集所有卡牌名称(除了 info 和 order) | ||
return err(' | 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 | end | ||
local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName) | |||
local | if not success or not cardData then | ||
return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"') | |||
end | |||
' | |||
local orderData = cardData.order | |||
local | 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 | end | ||
else | |||
table.insert(html, '<b>order 值:</b>' .. mw.text.encode(tostring(orderData)) .. '<br>') | |||
end | 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 | end | ||
table.insert(html, '</div>') | |||
return | return table.concat(html, '') | ||
end | end | ||
-- | -- 配队模拟器专用:显示带有元数据的卡牌 | ||
function p. | function p.deck(frame) | ||
local args = getArgs(frame, { removeBlank = true }) | local args = getArgs(frame, { removeBlank = true }) | ||
if | local moduleName = safeString(args[1]) | ||
return err('错误: | 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 | 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 = {} | local html = {} | ||
table.insert(html, '<div style=" | 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 | |||
for | } | ||
table.insert(html, cardModule.main(subFrame)) | |||
table.insert(html, '< | |||
table.insert(html, '</div>') | |||
end | end | ||
table.insert(html, '</div>') | table.insert(html, '</div>') | ||
return table.concat(html, '') | return table.concat(html, '') | ||
end | end | ||
return p | return p | ||
2025年11月1日 (六) 16:57的最新版本
此模块的文档可以在模块:配队/卡牌/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