模块:Utils:修订间差异

来自Mindustry中文wiki
无编辑摘要
(MDTWikiTools #843: publish [b18fe9d2f9c0bc73])
 
(未显示1个用户的9个中间版本)
第44行: 第44行:
     end
     end
     if #cells == 0 then return "no arg" end
     if #cells == 0 then return "no arg" end
     -- 大粪
     -- 目标表容器
     return '<div class="mdtMain">\n<div class="mdtHome">\n<div class="mdtPanel mdtHomeSection">\n<h2 class="mdtFoldHeading" style="margin:0 0 8px 0;">目标列表 <span class="mdtFold"></span></h2>\n{| class="mdtSideTable"\n! 目标 !! 注释\n|-\n| ' .. table.concat(cells, '\n|-\n| ') .. '\n|}\n</div>\n</div>'
     return '<div class="mdtMain">\n<div class="mdtHome">\n<div class="mdtPanel mdtHomeSection">\n<h2 class="mdtFoldHeading" style="margin:0 0 8px 0;">目标列表 <span class="mdtFold"></span></h2>\n{| class="mdtSideTable"\n! 目标 !! 注释\n|-\n| ' .. table.concat(cells, '\n|-\n| ') .. '\n|}\n</div>\n</div>\n</div>'
end
end


-- 这是波次列表的专用函数,其中的内容只有上帝记得,尽量不要修改
-- 波次列表:支持中英文分隔符,校验单位映射后生成链接
function p.renderWaves(frame)
function p.renderWaves(frame)
     local args = frame.args
     local args = frame.args
第56行: 第56行:
     local waves = {}
     local waves = {}
     for key, value in pairs(args) do
     for key, value in pairs(args) do
         local num = key:match("^波次(%d+)$")
         local num = tostring(key):match("^波次(%d+)$")
         if num then
         if num then
             waves[tonumber(num)] = value
             waves[tonumber(num)] = value
         end
         end
     end
     end
     -- 神人写法,这是必要的牺牲
     -- 保持与区块页相同的布局容器
     local result = '<div class="mdtLayout mdtLight mdtWrapRail">\n<div class="mdtMain">\n<div class="mdtHome">\n<div class="mdtPanel mdtHomeSection">\n<h2 class="mdtFoldHeading" style="margin:0 0 8px 0;">波次列表<span class="mdtFold"></span></h2>\n{| class="mdtSideTable"\n'
     local result = '<div class="mdtLayout mdtLight mdtWrapRail">\n<div class="mdtMain">\n<div class="mdtHome">\n<div class="mdtPanel mdtHomeSection">\n<h2 class="mdtFoldHeading" style="margin:0 0 8px 0;">波次列表<span class="mdtFold"></span></h2>\n{| class="mdtSideTable"\n'
     -- 开始遍历波次内容
     -- 开始遍历波次内容
第71行: 第71行:
         if waveText == nil then break end
         if waveText == nil then break end


        waveText = waveText:gsub(",", ","):gsub("、", ","):gsub(";", ","):gsub(";", ","):gsub("×", "*")
         local parts = {}
         local parts = {}
         for item in string.gmatch(waveText, "[^,]+")  
         for item in string.gmatch(waveText, "[^,]+")  
         do
         do
             local name, count = string.match(item, "(.+)[*×](%d+)")
             local name, count = string.match(item, "^%s*(.-)%s*[%*xX]%s*(%d+)%s*$")
             if name then
             if name and tonumber(count) > 0 then
             -- 去除首尾空格
             -- 去除首尾空格
             name = name:gsub("^%s*(.-)%s*$", "%1")
             name = name:gsub("^%s*(.-)%s*$", "%1")
第81行: 第82行:
             -- 配图标
             -- 配图标
             local icon = picture._lookup(name)
             local icon = picture._lookup(name)
             table.insert(parts,count.."x"..'[[File:'..icon..'.png|18px|link='..name..']]'..'[['..name..']]')
             if icon ~= 'ohno' then
                table.insert(parts,count.."x"..'[[File:'..icon..'.png|18px|link='..name..']]'..'[['..name..']]')
             else
             else
             table.insert(parts, '<span style="color:red;">格式错误: ' .. item .. '</span>')
                table.insert(parts, '<span style="color:red;">未知单位: ' .. mw.text.nowiki(name) .. '</span>')
            end
            else
             table.insert(parts, '<span style="color:red;">格式错误: ' .. mw.text.nowiki(item) .. '</span>')
             end
             end
         end
         end
第91行: 第96行:
     end
     end
     local chunksStr = table.concat(chunks,'\n|-\n')
     local chunksStr = table.concat(chunks,'\n|-\n')
     return result..chunksStr..'\n|}\n</div>\n</div>'
     return result..chunksStr..'\n|}\n</div>\n</div>\n</div>\n</div>'
end
end


return p
return p

2026年10月17日 (六) 15:07的最新版本

用途

供区块页面显示目标和波次列表。

renderGoals

命名参数“是否启用目标栏”非空时显示;顺序参数以目标、注释成对传入。

renderWaves

命名参数“是否启用波次栏”非空时显示。使用波次1、波次2等连续编号;缺少一个编号时停止读取。单组格式为单位名称*数量,各组可用英文逗号、中文逗号、顿号或分号分隔,乘号也接受 ×、x、X。

{{#invoke:Utils|renderWaves|是否启用波次栏=是|波次1=尖刀*1,星辉*2|波次2=尖刀×3}}

未知名称或格式错误显示提示,不创建伪词条链接。数量为正整数。


-- 引入Picture模块
local picture = require('Module:Picture')

local p = {}

-- 辅助函数:去除字符串尾部的所有空白字符(空格、换行、回车等)
local function trimTrailing(str)
    if str then
        return str:gsub("%s+$", "")
    end
    return str
end

-- 条件函数,用法:{{#invoke:utils|ifeq|条件|为真输出|为假输出}}
function p.ifeq(frame)
    local cond = frame.args[1] or ''
    if cond ~= '' then
        return frame.args[2]
    else
        return frame.args[3]
    end
end

-- 一个用来打表的函数,会自动适配内容数量,用法:{{#invoke:utils|renderGoals|是否显示(有值为是,空则为否)|目标1|注释1|...}}
function p.renderGoals(frame)
    local args = frame.args
    local cells = {}

    -- if判断是否输出目标栏
    if not args["是否启用目标栏"] or args["是否启用目标栏"] == "" then return "" end

    local i = 1
    while true do
        local val1 = args[i]
        if val1 == nil then break end
        val1 = trimTrailing(val1)

        i = i + 1
        local val2 = args[i]
        if val2 == nil then break end
        val2 = trimTrailing(val2)
        table.insert(cells,val1.." || "..val2)
        i = i + 1
    end
    if #cells == 0 then return "no arg" end
    -- 目标表容器
    return '<div class="mdtMain">\n<div class="mdtHome">\n<div class="mdtPanel mdtHomeSection">\n<h2 class="mdtFoldHeading" style="margin:0 0 8px 0;">目标列表 <span class="mdtFold"></span></h2>\n{| class="mdtSideTable"\n! 目标 !! 注释\n|-\n| ' .. table.concat(cells, '\n|-\n| ') .. '\n|}\n</div>\n</div>\n</div>'
end

-- 波次列表:支持中英文分隔符,校验单位映射后生成链接
function p.renderWaves(frame)
    local args = frame.args
    
    if not args["是否启用波次栏"] or args["是否启用波次栏"] == "" then return "" end

    local waves = {}
    for key, value in pairs(args) do
        local num = tostring(key):match("^波次(%d+)$")
        if num then
            waves[tonumber(num)] = value
        end
    end
    -- 保持与区块页相同的布局容器
    local result = '<div class="mdtLayout mdtLight mdtWrapRail">\n<div class="mdtMain">\n<div class="mdtHome">\n<div class="mdtPanel mdtHomeSection">\n<h2 class="mdtFoldHeading" style="margin:0 0 8px 0;">波次列表<span class="mdtFold"></span></h2>\n{| class="mdtSideTable"\n'
    -- 开始遍历波次内容
    local i = 1
    local chunks = {}
    while true
    do
        local waveText = waves[i]
        if waveText == nil then break end

        waveText = waveText:gsub(",", ","):gsub("、", ","):gsub(";", ","):gsub(";", ","):gsub("×", "*")
        local parts = {}
        for item in string.gmatch(waveText, "[^,]+") 
        do
            local name, count = string.match(item, "^%s*(.-)%s*[%*xX]%s*(%d+)%s*$")
            if name and tonumber(count) > 0 then
            -- 去除首尾空格
            name = name:gsub("^%s*(.-)%s*$", "%1")
            count = count:gsub("^%s*(.-)%s*$", "%1")
            -- 配图标
            local icon = picture._lookup(name)
            if icon ~= 'ohno' then
                table.insert(parts,count.."x"..'[[File:'..icon..'.png|18px|link='..name..']]'..'[['..name..']]')
            else
                table.insert(parts, '<span style="color:red;">未知单位: ' .. mw.text.nowiki(name) .. '</span>')
            end
            else
            table.insert(parts, '<span style="color:red;">格式错误: ' .. mw.text.nowiki(item) .. '</span>')
            end
        end
        local partsStr = table.concat(parts," || ")
        table.insert(chunks,'! rowspan="1" | 波次'..i..'\n|'..partsStr)
        i = i + 1
    end
    local chunksStr = table.concat(chunks,'\n|-\n')
    return result..chunksStr..'\n|}\n</div>\n</div>\n</div>\n</div>'
end

return p