模块

配队/卡牌:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第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:卡牌')


第12行: 第10行:
end
end


-- 安全地从页面获取属性值
-- 解析 card.order 字符串,返回卡牌名称数组
local function getProperty(pageName, propertyName)
local function parseCardOrder(orderStr)
     if not pageName or pageName == '' then
     if not orderStr or orderStr == "" then
        return nil
         return {}
    end
   
    -- 构造完整页面名(如果需要命名空间)
    local fullPageName = pageName
    if not pageName:match(':') then
        fullPageName = '战斗员:' .. pageName
    end
   
    -- 检查页面是否存在
    local title = mw.title.new(fullPageName)
    if not title or not title.exists then
         return nil
     end
     end
      
      
     -- 尝试从页面源码解析
    local cards = {}
     local content = title:getContent()
     -- 支持逗号(中英文)和顿号分隔
     if content then
     orderStr = mw.text.trim(orderStr)
        local pattern = '|' .. propertyName .. '%s*=%s*([^\n|]*)'
     for cardName in orderStr:gmatch('([^,、]+)') do
        local value = content:match(pattern)
         cardName = mw.text.trim(cardName)
         if value then
        if cardName ~= "" then
            value = mw.text.trim(value)
             table.insert(cards, cardName)
            if value ~= '' then
                return value
             end
         end
         end
     end
     end
   
     return cards
     return nil
end
end


-- 已知的卡牌模块列表(按优先级排序)
-- 主函数:批量显示指定战斗员的卡牌
local knownModules = {
-- 参数:
    '凯隆',
--  moduleName: 战斗员模块名(如 "凯隆")
    -- 可以继续添加更多模块
--   size: 可选,"small"(默认)或 "medium" 或 "large"
}
function p.main(frame)
 
    local args = getArgs(frame, { removeBlank = true })
-- 查找卡牌所在的模块
   
local function findCardModule(cardName)
    local moduleName = args[1] or args.module
     if not cardName or cardName == '' then
    local size = args[2] or args.size or "small"
         return nil
   
     if not moduleName or moduleName == "" then
         return err("错误: 未指定战斗员模块名")
     end
     end
      
      
     -- 遍历已知模块,查找卡牌
     -- 加载战斗员卡牌数据模块
     for _, moduleName in ipairs(knownModules) do
     local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
        local ok, dataModule = pcall(require, 'Module:卡牌/' .. moduleName)
    if not success or not cardData then
        if ok and dataModule then
        return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
            -- 检查卡牌是否存在于该模块
            if dataModule[cardName] then
                return moduleName
            end
        end
     end
     end
      
      
     return nil
     -- 获取 card.order
end
    local orderData = cardData.order
 
     if not orderData or (type(orderData) == "table" and #orderData == 0) then
-- 解析卡牌字符串
         return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
-- 支持格式:
-- 1. 卡牌名
-- 2. 模块名|卡牌名
-- 3. 模块名|卡牌名|变体类型|变体参数|变体索引
local function parseCardString(cardStr)
     if not cardStr or cardStr == '' then
         return nil
     end
     end
      
      
     cardStr = mw.text.trim(cardStr)
     -- 如果 order 是表格,取第一个元素
      
     local orderStr = orderData
    -- 检查是否包含 | 分隔符
     if type(orderData) == "table" then
     if not cardStr:match('|') then
         orderStr = orderData[1] or ""
         -- 格式1:只有卡牌名,需要自动查找模块
        local moduleName = findCardModule(cardStr)
        if not moduleName then
            return nil, '找不到卡牌 "' .. cardStr .. '" 所在的模块'
        end
        return {
            moduleName = moduleName,
            cardName = cardStr,
            variantType = nil,
            variantParam = nil,
            variantIndex = nil
        }
     end
     end
      
      
     -- 格式2或3:包含模块名
     -- 解析卡牌顺序
     local parts = {}
     local cardNames = parseCardOrder(orderStr)
     for part in cardStr:gmatch('([^|]+)') do
     if #cardNames == 0 then
         table.insert(parts, mw.text.trim(part))
         return err('错误: card.order 为空或格式错误')
     end
     end
      
      
     if #parts < 2 then
     -- 构建批量调用参数
         return nil, '卡牌字符串格式错误: ' .. cardStr
    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
     end
      
      
     return {
     -- 调用 Module:卡牌 的 batch 函数
        moduleName = parts[1],
    local subFrame = {
         cardName = parts[2],
         args = batchArgs,
         variantType = parts[3],
         getParent = function() return frame end
        variantParam = parts[4],
        variantIndex = parts[5]
     }
     }
   
    return cardModule.batch(subFrame)
end
end


-- 主函数
-- 自定义函数:允许指定特定卡牌列表
function p.main(frame)
-- 用法:{{#invoke:配队/卡牌|custom|模块名|卡牌1|卡牌2|卡牌3|...}}
function p.custom(frame)
     local args = getArgs(frame, { removeBlank = true })
     local args = getArgs(frame, { removeBlank = true })
      
      
    -- 第一个参数是战斗员名称
     local moduleName = args[1]
     local characterName = args[1]
     if not moduleName or moduleName == "" then
   
         return err("错误: 未指定战斗员模块名")
     if not characterName or characterName == '' then
         return err('错误: 未指定战斗员名称')
     end
     end
      
      
     -- 定义要读取的卡牌字段列表(按顺序)
     -- 收集所有卡牌名称(从第2个参数开始)
     local cardFields = {
     local cardNames = {}
        '自我意识技能',
     local i = 2
        '起始卡牌_1',
     while args[i] do
        '起始卡牌_2',
         local cardName = mw.text.trim(args[i])
        '起始卡牌_3',
         if cardName ~= "" then
        '起始卡牌_4',
             table.insert(cardNames, cardName)
        '独特卡牌_1',
        '独特卡牌_2',
        '独特卡牌_3',
        '独特卡牌_4'
    }
   
    -- 收集所有卡牌数据
    local cardDataList = {}
     local errors = {}
   
     for _, fieldName in ipairs(cardFields) do
         local cardStr = getProperty(characterName, fieldName)
         if cardStr and cardStr ~= '' then
             local cardData, errMsg = parseCardString(cardStr)
            if cardData then
                table.insert(cardDataList, cardData)
            elseif errMsg then
                table.insert(errors, fieldName .. ': ' .. errMsg)
            end
         end
         end
        i = i + 1
     end
     end
      
      
    -- 如果有错误,显示错误信息
     if #cardNames == 0 then
     if #errors > 0 then
         return err("错误: 未指定任何卡牌")
         local errorHtml = {}
        table.insert(errorHtml, '<div style="color: red;">')
        table.insert(errorHtml, '解析卡牌信息时出错:<br>')
        for _, errMsg in ipairs(errors) do
            table.insert(errorHtml, '- ' .. mw.text.encode(errMsg) .. '<br>')
        end
        table.insert(errorHtml, '</div>')
        return table.concat(errorHtml, '')
     end
     end
      
      
     -- 如果没有找到任何卡牌
     -- 构建批量调用参数
    if #cardDataList == 0 then
        return err('错误: 战斗员 "' .. characterName .. '" 没有配置任何卡牌')
    end
   
    -- 使用 batch 渲染所有卡牌
     local batchArgs = {}
     local batchArgs = {}
     for _, cardData in ipairs(cardDataList) do
     for _, cardName in ipairs(cardNames) do
         table.insert(batchArgs, cardData.moduleName)
         table.insert(batchArgs, moduleName)
         table.insert(batchArgs, cardData.cardName)
         table.insert(batchArgs, cardName)
         table.insert(batchArgs, cardData.variantType or '')
         table.insert(batchArgs, nil)
         table.insert(batchArgs, cardData.variantParam or '')
         table.insert(batchArgs, nil)
         table.insert(batchArgs, cardData.variantIndex or '')
         table.insert(batchArgs, nil)
     end
     end
      
      
     -- 创建一个模拟的 frame 调用 batch
     -- 调用 Module:卡牌 的 batch 函数
     local batchFrame = {
     local subFrame = {
         args = batchArgs,
         args = batchArgs,
         getParent = function() return frame end
         getParent = function() return frame end
     }
     }
      
      
     return cardModule.batch(batchFrame)
     return cardModule.batch(subFrame)
end
end


-- 手动更新模块列表的函数(可选)
-- 显示指定战斗员的所有卡牌(包括灵光一闪、神光一闪变体)
function p.updateModules(frame)
-- 用法:{{#invoke:配队/卡牌|all|模块名}}
function p.all(frame)
     local args = getArgs(frame, { removeBlank = true })
     local args = getArgs(frame, { removeBlank = true })
      
      
     -- 这个函数可以用来动态更新 knownModules 列表
     local moduleName = args[1]
     -- 例如:{{#invoke:配队/卡牌|updateModules|新模块1|新模块2}}
     if not moduleName or moduleName == "" then
        return err("错误: 未指定战斗员模块名")
    end
      
      
     for i, moduleName in ipairs(args) do
     -- 加载战斗员卡牌数据模块
        local found = false
    local success, cardData = pcall(require, 'Module:卡牌/' .. moduleName)
        for _, existing in ipairs(knownModules) do
    if not success or not cardData then
            if existing == moduleName then
        return err('错误: 找不到模块 "Module:卡牌/' .. moduleName .. '"')
                found = true
    end
                break
   
            end
    -- 收集所有卡牌名称(除了 info 和 order)
        end
    local cardNames = {}
        if not found then
    for cardName, _ in pairs(cardData) do
             table.insert(knownModules, moduleName)
        if cardName ~= "info" and cardName ~= "order" and type(cardData[cardName]) == "table" then
             table.insert(cardNames, cardName)
         end
         end
     end
     end
      
      
     return '已更新模块列表'
     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
end


return p
return p

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

此模块的文档可以在模块:配队/卡牌/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

-- 解析 card.order 字符串,返回卡牌名称数组
local function parseCardOrder(orderStr)
    if not orderStr or orderStr == "" then
        return {}
    end
    
    local cards = {}
    -- 支持逗号(中英文)和顿号分隔
    orderStr = mw.text.trim(orderStr)
    for cardName in orderStr:gmatch('([^,、]+)') 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"
    
    if not moduleName or 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 or (type(orderData) == "table" and #orderData == 0) then
        return err('错误: 模块 "' .. moduleName .. '" 没有定义 card.order')
    end
    
    -- 如果 order 是表格,取第一个元素
    local orderStr = orderData
    if type(orderData) == "table" then
        orderStr = orderData[1] or ""
    end
    
    -- 解析卡牌顺序
    local cardNames = parseCardOrder(orderStr)
    if #cardNames == 0 then
        return err('错误: card.order 为空或格式错误')
    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 = args[1]
    if not moduleName or moduleName == "" then
        return err("错误: 未指定战斗员模块名")
    end
    
    -- 收集所有卡牌名称(从第2个参数开始)
    local cardNames = {}
    local i = 2
    while args[i] do
        local cardName = mw.text.trim(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 = args[1]
    if not moduleName or 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

return p