全站通知:

模块:Utils

来自星露谷物语维基
跳到导航 跳到搜索
[ 创建 | 刷新 ]文档页面
当前模块文档缺失,需要扩充。
local arguments = require("Module:Arguments")
---@diagnostic disable-next-line: undefined-global
local mw = mw

local p = {}

function p.getArg(input, index)
    if not index then index = 1 end
    if type(input) == "string" then return input end
    local result = input[index] or (input.args and input.args[index]) or
                       input:getParent().args[index] or ""
    return result
end

-- Normalizes various invocation styles (frame, table, single value) into an args table.
function p.resolveArgs(input, options)
    if type(input) == "table" then
        if type(input.getParent) == "function" then
            return arguments.getArgs(input, options)
        end
        if type(input.args) == "table" then return input.args end
        return input
    end

    return {input}
end

function p.hasChinese(str)
    return type(str) == 'string' and
               string.match(str, "[\228-\233][\128-\191][\128-\191]") ~= nil
end

function p.LazyLoad(moduleName, toLowerCase)
    toLowerCase = toLowerCase or false
    local loaded = nil

    local function doLoad()
        if loaded == nil then
            loaded = mw.loadData(moduleName)
            if toLowerCase then
                local lowerCaseLoaded = {}
                for key, value in pairs(loaded) do
                    lowerCaseLoaded[string.lower(key)] = value
                end
                loaded = lowerCaseLoaded
            end
        end
        return loaded
    end

    local meta = {}
    meta.__index = function(_table, key) return doLoad()[key] end
    meta.__pairs = function(_table) return pairs(doLoad()) end
    meta.__ipairs = function(_table) return ipairs(doLoad()) end

    local ret = {}
    setmetatable(ret, meta)
    return ret
end

function p.ExpandTemplate(title, args)
    return mw.getCurrentFrame():expandTemplate{title = title, args = args}
end

function p.fileExists(filename)
    local url = mw.getCurrentFrame():callParserFunction('filepath', filename)
    return url ~= ''
end

function p.normalizeKey(text)
    if not text then return nil end
    return text:lower():gsub("_", " ")
end

function p.deepCopy(original)
    local copy = {}
    for key, value in pairs(original) do
        if type(value) == "table" then
            copy[key] = p.deepCopy(value)
        else
            copy[key] = value
        end
    end
    return copy
end

function p.tableContains(tbl, element)
    if type(tbl) ~= "table" then return false end
    for _, value in ipairs(tbl) do if value == element then return true end end
    return false
end
function p.uniqueValues(sequence)
    if type(sequence) ~= "table" then return {} end
    local ordered, seen = {}, {}
    for _, value in ipairs(sequence) do
        if not seen[value] then
            seen[value] = true
            table.insert(ordered, value)
        end
    end
    return ordered
end

function p.tablesEqual(t1, t2)
    if t1 == t2 then return true end
    if type(t1) ~= "table" or type(t2) ~= "table" then return false end

    for _, value in pairs(t1) do
        if not p.tableContains(t2, value) then return false end
    end
    for _, value in pairs(t2) do
        if not p.tableContains(t1, value) then return false end
    end
    return true
end

function p.tablesOverlap(t1, t2)
    if t1 == t2 then return true end
    if type(t1) ~= "table" or type(t2) ~= "table" then return false end

    for _, value in pairs(t1) do
        if p.tableContains(t2, value) then return true end
    end
    for _, value in pairs(t2) do
        if p.tableContains(t1, value) then return true end
    end
    return false
end

function p.stringContains(text, substring)
    if type(text) ~= "string" or type(substring) ~= "string" then
        return false
    end
    return string.find(text, substring, 1, true) ~= nil
end

p.lazyload = p.LazyLoad
p.lazyLoad = p.LazyLoad
p.expandTemplate = p.ExpandTemplate

return p