模块

配队/卡牌:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第8行: 第8行:
local function err(msg)
local function err(msg)
     return '<span style="color: red;">' .. mw.text.encode(msg) .. '</span>'
     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
end


-- 解析 card.order 字符串,返回卡牌名称数组
-- 解析 card.order 字符串,返回卡牌名称数组
local function parseCardOrder(orderStr)
local function parseCardOrder(orderStr)
     if not orderStr or orderStr == "" then
    orderStr = safeString(orderStr)
     if orderStr == "" then
         return {}
         return {}
     end
     end
      
      
     local cards = {}
     local cards = {}
     -- 支持逗号(中英文)和顿号分隔
     -- 使用 mw.ustring 来处理UTF-8字符串
     orderStr = mw.text.trim(orderStr)
    -- 先统一替换为英文逗号
     for cardName in orderStr:gmatch('([^,]+)') do
    orderStr = mw.ustring.gsub(orderStr, ',', ',')
     orderStr = mw.ustring.gsub(orderStr, '、', ',')
   
    -- 分割字符串
     for cardName in mw.ustring.gmatch(orderStr, '([^,]+)') do
         cardName = mw.text.trim(cardName)
         cardName = mw.text.trim(cardName)
         if cardName ~= "" then
         if cardName ~= "" then
第25行: 第43行:
         end
         end
     end
     end
   
     return cards
     return cards
end
end
第38行: 第57行:
     local size = args[2] or args.size or "small"
     local size = args[2] or args.size or "small"
      
      
     if not moduleName or moduleName == "" then
    moduleName = safeString(moduleName)
     if moduleName == "" then
         return err("错误: 未指定战斗员模块名")
         return err("错误: 未指定战斗员模块名")
     end
     end
第50行: 第70行:
     -- 获取 card.order
     -- 获取 card.order
     local orderData = cardData.order
     local orderData = cardData.order
     if not orderData or (type(orderData) == "table" and #orderData == 0) then
     if not orderData then
         return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
         return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
     end
     end
第57行: 第77行:
     local orderStr = orderData
     local orderStr = orderData
     if type(orderData) == "table" then
     if type(orderData) == "table" then
         orderStr = orderData[1] or ""
        if #orderData == 0 then
            return err('错误: card.order 为空')
        end
         orderStr = orderData[1]
    end
   
    orderStr = safeString(orderStr)
    if orderStr == "" then
        return err('错误: card.order 为空或格式错误')
     end
     end
      
      
第63行: 第91行:
     local cardNames = parseCardOrder(orderStr)
     local cardNames = parseCardOrder(orderStr)
     if #cardNames == 0 then
     if #cardNames == 0 then
         return err('错误: card.order 为空或格式错误')
         return err('错误: card.order 解析后为空,原始值: ' .. mw.text.encode(orderStr))
     end
     end
      
      
第91行: 第119行:
     local args = getArgs(frame, { removeBlank = true })
     local args = getArgs(frame, { removeBlank = true })
      
      
     local moduleName = args[1]
     local moduleName = safeString(args[1])
     if not moduleName or moduleName == "" then
     if moduleName == "" then
         return err("错误: 未指定战斗员模块名")
         return err("错误: 未指定战斗员模块名")
     end
     end
第100行: 第128行:
     local i = 2
     local i = 2
     while args[i] do
     while args[i] do
         local cardName = mw.text.trim(args[i])
         local cardName = safeString(args[i])
         if cardName ~= "" then
         if cardName ~= "" then
             table.insert(cardNames, cardName)
             table.insert(cardNames, cardName)
第135行: 第163行:
     local args = getArgs(frame, { removeBlank = true })
     local args = getArgs(frame, { removeBlank = true })
      
      
     local moduleName = args[1]
     local moduleName = safeString(args[1])
     if not moduleName or moduleName == "" then
     if moduleName == "" then
         return err("错误: 未指定战斗员模块名")
         return err("错误: 未指定战斗员模块名")
     end
     end
第177行: 第205行:
      
      
     return cardModule.batch(subFrame)
     return cardModule.batch(subFrame)
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:10px;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
end


return p
return p

2025年10月18日 (六) 22:44的版本

此模块的文档可以在模块:配队/卡牌/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 = {}
    -- 使用 mw.ustring 来处理UTF-8字符串
    -- 先统一替换为英文逗号
    orderStr = mw.ustring.gsub(orderStr, ',', ',')
    orderStr = mw.ustring.gsub(orderStr, '、', ',')
    
    -- 分割字符串
    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: 战斗员模块名(如 "凯隆")
--   size: 可选,"small"(默认)或 "medium" 或 "large"
function p.main(frame)
    local args = getArgs(frame, { removeBlank = true })
    
    local moduleName = args[1] or args.module
    local size = args[2] or args.size or "small"
    
    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
    
    -- 构建批量调用参数
    local batchArgs = {}
    for i, cardName in ipairs(cardNames) do
        -- 每张卡牌需要5个参数:模块名、卡牌名、变体类型(nil)、变体参数(nil)、变体索引(nil)
        table.insert(batchArgs, moduleName)
        table.insert(batchArgs, cardName)
        table.insert(batchArgs, nil)
        table.insert(batchArgs, nil)
        table.insert(batchArgs, nil)
    end
    
    -- 调用 Module:卡牌 的 batch 函数
    local subFrame = {
        args = batchArgs,
        getParent = function() return frame end
    }
    
    return cardModule.batch(subFrame)
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
    
    -- 构建批量调用参数
    local batchArgs = {}
    for _, cardName in ipairs(cardNames) do
        table.insert(batchArgs, moduleName)
        table.insert(batchArgs, cardName)
        table.insert(batchArgs, nil)
        table.insert(batchArgs, nil)
        table.insert(batchArgs, nil)
    end
    
    -- 调用 Module:卡牌 的 batch 函数
    local subFrame = {
        args = batchArgs,
        getParent = function() return frame end
    }
    
    return cardModule.batch(subFrame)
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
    
    -- 构建批量调用参数
    local batchArgs = {}
    for _, cardName in ipairs(cardNames) do
        table.insert(batchArgs, moduleName)
        table.insert(batchArgs, cardName)
        table.insert(batchArgs, nil)
        table.insert(batchArgs, nil)
        table.insert(batchArgs, nil)
    end
    
    -- 调用 Module:卡牌 的 batch 函数
    local subFrame = {
        args = batchArgs,
        getParent = function() return frame end
    }
    
    return cardModule.batch(subFrame)
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:10px;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

return p