打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

模块:Namespace detect

来自SAPedia
Other Wiki 本模块部分或全部内容最初来源于萌娘百科,依CC BY-NC-SA 3.0 CN引入,原贡献者可参见此处。经双方编辑者修改后,这些内容可能已有很大不同。

用于实现{{Namespace detect}},参数与用法参见模板文档


local p = {}

local lower = mw.ustring.lower
local trim = mw.text.trim
local getArgs = require('Module:Arguments').getArgs

local namespaceKeysCache = {}

-- 主命名空间的别名集合
local MAIN_NAMESPACE_ALIASES = {
    "main",
    "条目",  -- 简体
    "條目",  -- 繁体
    "主"
}

local function addUniqueKey(keys, seen, value)
    if not value or value == '' then
        return
    end

    value = lower(value)
    if seen[value] then
        return
    end

    seen[value] = true
    table.insert(keys, value)
end

-- 规范化参数名:小写 + 下划线转空格 + trim
local function normaliseKey(s)
    if not s then return nil end
    s = tostring(s)
    s = lower(s)
    s = s:gsub('_', ' ')
    s = trim(s)
    return s
end

-- 规范化整个参数表
local function normaliseArgs(args)
    local out = {}
    for k, v in pairs(args) do
        if type(k) == 'number' then
            out[k] = v
        else
            out[normaliseKey(k)] = v
        end
    end
    return out
end

-- 获取 namespace 可匹配 key 列表(含 alias)
local function getNamespaceKeys(nsid)
    if namespaceKeysCache[nsid] then
        return namespaceKeysCache[nsid]
    end

    local ns = mw.site.namespaces[nsid]
    local keys = {}
    local seen = {}

    if ns then
        addUniqueKey(keys, seen, ns.name)

        if ns.canonicalName then
            addUniqueKey(keys, seen, ns.canonicalName)
        end

        for _, alias in ipairs(ns.aliases or {}) do
            addUniqueKey(keys, seen, alias)
        end
    end

    -- 主命名空间
    if nsid == 0 then
        for _, alias in ipairs(MAIN_NAMESPACE_ALIASES) do
            addUniqueKey(keys, seen, alias)
        end
    end

    namespaceKeysCache[nsid] = keys
    return keys
end

function p.main(frame)
    local rawArgs = getArgs(frame, {
        removeBlanks = false
    })

    local args = normaliseArgs(rawArgs)
    local nsid = mw.title.getCurrentTitle().namespace

    local keys = getNamespaceKeys(nsid)

    -- 按 namespace alias 顺序匹配参数
    for _, key in ipairs(keys) do
        if args[key] ~= nil then
            return args[key]
        end
    end

    -- fallback
    return args.other or ''
end

return p