配队/卡牌:修订间差异
来自卡厄思梦境WIKI
无编辑摘要 |
小无编辑摘要 |
||
| (未显示同一用户的3个中间版本) | |||
| 第31行: | 第31行: | ||
local cards = {} | local cards = {} | ||
-- | -- 保留卡牌名称中的中文标点符号 | ||
for cardName in mw.ustring.gmatch(orderStr, '([^,]+)') do | for cardName in mw.ustring.gmatch(orderStr, '([^,]+)') do | ||
cardName = mw.text.trim(cardName) | cardName = mw.text.trim(cardName) | ||
| 第94行: | 第89行: | ||
-- 直接构建 HTML 而不是调用 batch | -- 直接构建 HTML 而不是调用 batch | ||
local html = {} | local html = {} | ||
table.insert(html, '<div style="display:flex;gap: | table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">') | ||
for i, cardName in ipairs(cardNames) do | for i, cardName in ipairs(cardNames) do | ||
| 第137行: | 第132行: | ||
-- 直接构建 HTML | -- 直接构建 HTML | ||
local html = {} | local html = {} | ||
table.insert(html, '<div style="display:flex;gap: | table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">') | ||
for _, cardName in ipairs(cardNames) do | for _, cardName in ipairs(cardNames) do | ||
| 第184行: | 第179行: | ||
-- 直接构建 HTML | -- 直接构建 HTML | ||
local html = {} | local html = {} | ||
table.insert(html, '<div style="display:flex;gap: | table.insert(html, '<div style="display:flex;gap:0px;flex-wrap:wrap;">') | ||
for _, cardName in ipairs(cardNames) do | for _, cardName in ipairs(cardNames) do | ||
| 第216行: | 第211行: | ||
local html = {} | local html = {} | ||
table.insert(html, '<div style="background:#f9f9f9;border:1px solid #ccc;padding: | 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>调试信息:</b><br>') | ||
table.insert(html, '<b>order 类型:</b>' .. type(orderData) .. '<br>') | table.insert(html, '<b>order 类型:</b>' .. type(orderData) .. '<br>') | ||
| 第235行: | 第230行: | ||
for i, name in ipairs(cardNames) do | for i, name in ipairs(cardNames) do | ||
table.insert(html, '<b>' .. i .. '.</b> ' .. mw.text.encode(name) .. '<br>') | 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 | end | ||
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