模块

配队/卡牌:修订间差异

来自卡厄思梦境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:卡牌')


第10行: 第12行:
end
end


-- 从页面内容中提取属性值
-- 安全地从页面获取属性值
local function getPropertyFromPage(pageName, propertyName)
local function getProperty(pageName, propertyName)
    local title = mw.title.new(pageName)
     if not pageName or pageName == '' then
     if not title or not title.exists then
         return nil
         return nil
     end
     end
      
      
     local content = title:getContent()
    -- 构造完整页面名(如果需要命名空间)
     if not content then
    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
         return nil
     end
     end
      
      
     -- 匹配 |属性名=值 的格式
     -- 尝试获取属性
     -- 支持多种格式:|属性名=值、| 属性名 = 值 等
     local ok, result = pcall(function()
    local pattern = '%|%s*' .. propertyName:gsub('[%-%[%]%(%)%.]', '%%%1') .. '%s*=%s*([^\n|]*)'
        return mw.ext.cargo.query(
     local value = content:match(pattern)
            '战斗员',
            propertyName,
            { where = '_pageName="' .. fullPageName .. '"' }
        )
     end)
      
      
     if value then
     if ok and result and result[1] and result[1][propertyName] then
        value = mw.text.trim(value)
        return result[1][propertyName]
        if value ~= '' then
    end
            return value
   
    -- 如果 Cargo 失败,尝试直接从页面源码解析
    local content = title:getContent()
    if content then
        local pattern = '|' .. propertyName .. '%s*=%s*([^\n|]*)'
        local value = content:match(pattern)
        if value then
            value = mw.text.trim(value)
            if value ~= '' then
                return value
            end
         end
         end
     end
     end
第37行: 第59行:
end
end


-- 尝试多种页面名称格式
-- 解析卡牌字符串(格式:模块名|卡牌名 或 模块名|卡牌名|变体类型|变体参数|变体索引)
local function findPageName(fighterName)
local function parseCardString(cardStr)
     local candidates = {
     if not cardStr or cardStr == '' then
         fighterName,                    -- 直接使用输入
         return nil
        '战斗员:' .. fighterName,      -- 战斗员命名空间
    end
        'Fighter:' .. fighterName,      -- 英文命名空间
   
     }
    cardStr = mw.text.trim(cardStr)
   
    local parts = {}
    for part in cardStr:gmatch('([^|]+)') do
        table.insert(parts, mw.text.trim(part))
     end
      
      
     for _, pageName in ipairs(candidates) do
     if #parts < 2 then
        local title = mw.title.new(pageName)
        return nil
        if title and title.exists then
            return pageName, title
        end
     end
     end
      
      
     return nil, nil
     return {
        moduleName = parts[1],
        cardName = parts[2],
        variantType = parts[3],
        variantParam = parts[4],
        variantIndex = parts[5]
    }
end
end


第58行: 第88行:
function p.main(frame)
function p.main(frame)
     local args = getArgs(frame, { removeBlank = true })
     local args = getArgs(frame, { removeBlank = true })
    local fighterName = args[1] or args['战斗员'] or args['name']
      
      
     if not fighterName or fighterName == '' then
    -- 第一个参数是战斗员名称
    local characterName = args[1]
   
     if not characterName or characterName == '' then
         return err('错误: 未指定战斗员名称')
         return err('错误: 未指定战斗员名称')
     end
     end
      
      
     -- 查找页面
     -- 定义要读取的卡牌字段列表(按顺序)
     local pageName, title = findPageName(fighterName)
     local cardFields = {
   
    if not pageName then
        return err('错误: 找不到战斗员 "' .. fighterName .. '"')
    end
   
    -- 定义卡牌属性顺序
    local cardProperties = {
         '自我意识技能',
         '自我意识技能',
         '起始卡牌_1',
         '起始卡牌_1',
第84行: 第109行:
     }
     }
      
      
     -- 收集卡牌调用参数
     -- 收集所有卡牌数据
     local batchArgs = {}
     local cardDataList = {}
    local argIndex = 1
      
      
     for _, propName in ipairs(cardProperties) do
     for _, fieldName in ipairs(cardFields) do
         local cardValue = getPropertyFromPage(pageName, propName)
         local cardStr = getProperty(characterName, fieldName)
       
         if cardStr and cardStr ~= '' then
         if cardValue and cardValue ~= '' then
             local cardData = parseCardString(cardStr)
            -- 解析卡牌值(格式:模块名|卡牌名)
             if cardData then
             local moduleName, cardName = cardValue:match('^([^|]+)|(.+)$')
                 table.insert(cardDataList, cardData)
           
             if moduleName and cardName then
                 moduleName = mw.text.trim(moduleName)
                cardName = mw.text.trim(cardName)
               
                -- 添加到批量参数(每组5个参数:模块名, 卡牌名, 变体类型, 变体参数, 变体索引)
                batchArgs[argIndex] = moduleName
                batchArgs[argIndex + 1] = cardName
                batchArgs[argIndex + 2] = nil  -- 变体类型
                batchArgs[argIndex + 3] = nil  -- 变体参数
                batchArgs[argIndex + 4] = nil  -- 变体索引
                argIndex = argIndex + 5
             end
             end
         end
         end
第111行: 第123行:
      
      
     -- 如果没有找到任何卡牌
     -- 如果没有找到任何卡牌
     if #batchArgs == 0 then
     if #cardDataList == 0 then
         return err('错误: 战斗员 "' .. fighterName .. '" 没有配置卡牌数据')
         return err('错误: 战斗员 "' .. characterName .. '" 没有配置任何卡牌')
     end
     end
      
      
     -- 调用批量渲染
     -- 使用 batch 渲染所有卡牌
    local batchArgs = {}
    for _, cardData in ipairs(cardDataList) do
        table.insert(batchArgs, cardData.moduleName)
        table.insert(batchArgs, cardData.cardName)
        table.insert(batchArgs, cardData.variantType or '')
        table.insert(batchArgs, cardData.variantParam or '')
        table.insert(batchArgs, cardData.variantIndex or '')
    end
   
    -- 创建一个模拟的 frame 调用 batch
     local batchFrame = {
     local batchFrame = {
         args = batchArgs,
         args = batchArgs,
第122行: 第144行:
      
      
     return cardModule.batch(batchFrame)
     return cardModule.batch(batchFrame)
end
-- 调试函数:显示页面信息
function p.debug(frame)
    local args = getArgs(frame, { removeBlank = true })
    local fighterName = args[1] or args['战斗员'] or args['name']
   
    if not fighterName or fighterName == '' then
        return err('错误: 未指定战斗员名称')
    end
   
    local html = {}
    table.insert(html, '<div style="border:1px solid #ccc;padding:10px;margin:10px 0;background:#f9f9f9;">')
    table.insert(html, '<h3>调试信息:' .. mw.text.encode(fighterName) .. '</h3>')
   
    -- 测试多种页面格式
    local candidates = {
        fighterName,
        '战斗员:' .. fighterName,
        'Fighter:' .. fighterName,
    }
   
    table.insert(html, '<h4>页面存在性检查:</h4><ul>')
    for _, pageName in ipairs(candidates) do
        local title = mw.title.new(pageName)
        local exists = title and title.exists or false
        local color = exists and 'green' or 'red'
        table.insert(html, '<li><span style="color:' .. color .. ';font-weight:bold;">' .. mw.text.encode(pageName) .. ' - ' .. (exists and '✓ 存在' or '✗ 不存在') .. '</span></li>')
       
        if exists then
            -- 尝试读取属性
            table.insert(html, '<ul style="margin-top:5px;">')
            local cardProperties = {
                '自我意识技能',
                '起始卡牌_1',
                '起始卡牌_2',
                '起始卡牌_3',
                '起始卡牌_4',
                '独特卡牌_1',
                '独特卡牌_2',
                '独特卡牌_3',
                '独特卡牌_4'
            }
           
            for _, propName in ipairs(cardProperties) do
                local value = getPropertyFromPage(pageName, propName)
                local displayValue = value or '<span style="color:#999;">(空)</span>'
                if value then
                    displayValue = '<span style="color:green;"><code>' .. mw.text.encode(value) .. '</code></span>'
                end
                table.insert(html, '<li>' .. mw.text.encode(propName) .. ': ' .. displayValue .. '</li>')
            end
            table.insert(html, '</ul>')
           
            -- 显示部分页面内容(前500字符)
            local content = title:getContent()
            if content then
                local preview = mw.ustring.sub(content, 1, 500)
                table.insert(html, '<details style="margin-top:10px;"><summary style="cursor:pointer;color:#0645ad;">查看页面内容预览</summary>')
                table.insert(html, '<pre style="background:#fff;border:1px solid #ddd;padding:10px;overflow:auto;max-height:300px;">')
                table.insert(html, mw.text.encode(preview))
                if mw.ustring.len(content) > 500 then
                    table.insert(html, '\n\n... (还有 ' .. (mw.ustring.len(content) - 500) .. ' 个字符)')
                end
                table.insert(html, '</pre></details>')
            end
        end
    end
    table.insert(html, '</ul>')
   
    table.insert(html, '</div>')
    return table.concat(html, '')
end
end


return p
return p

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

此模块的文档可以在模块:配队/卡牌/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 getProperty(pageName, propertyName)
    if not pageName or pageName == '' then
        return nil
    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
    
    -- 尝试获取属性
    local ok, result = pcall(function()
        return mw.ext.cargo.query(
            '战斗员',
            propertyName,
            { where = '_pageName="' .. fullPageName .. '"' }
        )
    end)
    
    if ok and result and result[1] and result[1][propertyName] then
        return result[1][propertyName]
    end
    
    -- 如果 Cargo 失败,尝试直接从页面源码解析
    local content = title:getContent()
    if content then
        local pattern = '|' .. propertyName .. '%s*=%s*([^\n|]*)'
        local value = content:match(pattern)
        if value then
            value = mw.text.trim(value)
            if value ~= '' then
                return value
            end
        end
    end
    
    return nil
end

-- 解析卡牌字符串(格式:模块名|卡牌名 或 模块名|卡牌名|变体类型|变体参数|变体索引)
local function parseCardString(cardStr)
    if not cardStr or cardStr == '' then
        return nil
    end
    
    cardStr = mw.text.trim(cardStr)
    
    local parts = {}
    for part in cardStr:gmatch('([^|]+)') do
        table.insert(parts, mw.text.trim(part))
    end
    
    if #parts < 2 then
        return nil
    end
    
    return {
        moduleName = parts[1],
        cardName = parts[2],
        variantType = parts[3],
        variantParam = parts[4],
        variantIndex = parts[5]
    }
end

-- 主函数
function p.main(frame)
    local args = getArgs(frame, { removeBlank = true })
    
    -- 第一个参数是战斗员名称
    local characterName = args[1]
    
    if not characterName or characterName == '' then
        return err('错误: 未指定战斗员名称')
    end
    
    -- 定义要读取的卡牌字段列表(按顺序)
    local cardFields = {
        '自我意识技能',
        '起始卡牌_1',
        '起始卡牌_2',
        '起始卡牌_3',
        '起始卡牌_4',
        '独特卡牌_1',
        '独特卡牌_2',
        '独特卡牌_3',
        '独特卡牌_4'
    }
    
    -- 收集所有卡牌数据
    local cardDataList = {}
    
    for _, fieldName in ipairs(cardFields) do
        local cardStr = getProperty(characterName, fieldName)
        if cardStr and cardStr ~= '' then
            local cardData = parseCardString(cardStr)
            if cardData then
                table.insert(cardDataList, cardData)
            end
        end
    end
    
    -- 如果没有找到任何卡牌
    if #cardDataList == 0 then
        return err('错误: 战斗员 "' .. characterName .. '" 没有配置任何卡牌')
    end
    
    -- 使用 batch 渲染所有卡牌
    local batchArgs = {}
    for _, cardData in ipairs(cardDataList) do
        table.insert(batchArgs, cardData.moduleName)
        table.insert(batchArgs, cardData.cardName)
        table.insert(batchArgs, cardData.variantType or '')
        table.insert(batchArgs, cardData.variantParam or '')
        table.insert(batchArgs, cardData.variantIndex or '')
    end
    
    -- 创建一个模拟的 frame 调用 batch
    local batchFrame = {
        args = batchArgs,
        getParent = function() return frame end
    }
    
    return cardModule.batch(batchFrame)
end

return p