2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Module:Sig2User

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [查看] [编辑] [历史] [刷新]

这个模块可以从带有用户页、用户讨论页或用户贡献链接的签名中找出用户名。

为提高效率,仅在常见名字空间无法匹配时,才会获取mw.site.namespaces表中对应名字空间所有的别名(例如繁体或简写)。

使用方式:

{{subst:#invoke:Sig2User|main|1=签名放在这里}}

如果不想出现错误大红字大红字爬或者不想被加入Category:有脚本错误的页面的情况下,可以指定suppress参数。

{{subst:#invoke:Sig2User|main|1=签名放在这里|suppress=任意值}}
-- Module:Sig2User
-- Made with ♥ by User:Leranjun

-- This module takes a signature and returns the username found in the signature.

-- For efficiency reasons, the module first looks for the "common" namespace aliases
-- before obtaining all aliases from the mw.site.namespaces table.

local p = {}

local getArgs = require("Module:Arguments").getArgs

local function isempty(s)
    return not s or s == ""
end

local function throw(e, suppress)
    return suppress and ("Error: " .. e) or error(e)
end

local function toComp(v)
    local r =
        mw.ustring.gsub(
        mw.ustring.gsub(v, "%s", "[ _]"),
        "(%%?)(.)",
        function(percent, letter)
            if percent ~= "" or not letter:match("%a") then -- do not use ustring!
                -- if the '%' matched, or `letter` is not a letter, return "as is"
                return percent .. letter
            else
                -- else, return a case-insensitive character class of the matched letter
                return mw.ustring.format("[%s%s]", mw.ustring.lower(letter), mw.ustring.upper(letter))
            end
        end
    )
    return r
end

local function findFromTable(s, prefixes, lang)
    local r = nil
    for _, v in pairs(prefixes) do
        pattern = "%[%[:?" .. toComp(v) .. "([^|/]+)|?.-/?.-%]%]"
        r = mw.ustring.match(s, pattern)
        if r then
            return lang:ucfirst(r)
        end
    end
end

local function patternExtend()
    local r = {}

    local NS_USER = mw.site.namespaces[2]["aliases"]
    local NS_USER_TALK = mw.site.namespaces[3]["aliases"]
    local NS_SPECIAL = mw.site.namespaces[-1]["aliases"]

    for _, v in pairs(NS_USER) do
        table.insert(r, v .. ":")
    end

    for _, v in pairs(NS_USER_TALK) do
        table.insert(r, v .. ":")
    end

    for _, v in pairs(NS_SPECIAL) do
        table.insert(r, v .. ":Contributions/")
        table.insert(r, v .. ":用[户戶][贡貢][献獻]/")
    end

    return r
end

function p._main(args)
    local s = args[1]
    local suppress = args["suppress"]

    if isempty(s) then
        return throw("Empty string", suppress)
    end

    -- Common namespace aliases
    local COMMON_PREFIX = {
        "User:",
        "U:",
        "User talk:",
        "Special:Contributions/",
        "Special:用[户戶][贡貢][献獻]/"
    }

    local lang = mw.language.getContentLanguage()

    local r = findFromTable(s, COMMON_PREFIX, lang)
    if r then
        return r
    end

    -- All namespace aliases
    r = findFromTable(s, patternExtend(), lang)
    if r then
        return r
    end

    -- Nothing found :(
    return throw("Invalid signature", suppress)
end

function p.main(frame)
    return p._main(getArgs(frame))
end

return p