模组:Namespace
| 此模块已评为稳定版,稳定可靠,可各处使用无误。已可在帮助页面和其他维基百科资源中提及,以帮助新用户学习。为降低服务器负载和错误输出,改善本模块前应进行沙盒测试,而不是重复的试错性编辑。 |
| 此模块已被全保护。仅限管理员编辑。 |
| 此模块已被移动保护。仅限管理员移动。 |
| 此模块被引用于约1,070,000个页面,占全部页面的13%。 为了避免造成大规模的影响,所有对此模块的编辑应先于沙盒或测试样例上测试。实施修改前,建议先在讨论页发起讨论。 模板引用数量会自动更新。 |
本模组判断页面所在的命名空间,并输出命名空间的本地化名称。除了 MediaWiki 的真实命名空间外,也支援伪命名空间(LTA:、NC:、NT:、RSP: 等以冒号前缀模拟命名空间的条目空间页面)。
命名空间编号、英文名与简繁中文名在 Module:Namespace/data 维护,语言回退由 Module:Lan2 处理。若需要依页面的实际内容(重定向、沙盒、子页面……)细分页面类型,请改用 Module:Namespace pagename。
用法
Wikitext
namespace
{{#invoke:Namespace|namespace|命名空間|相符時的輸出|不相符時的輸出}}
比对目前页面所在的命名空间,相符时输出第二个参数,否则输出第三个参数。
| 位置参数 | 具名参数 | 说明 |
|---|---|---|
|1= |
|namespace= |
要比对的命名空间,可用编号、名称或别名,详见 #_isNamespace。 |
|2= |
|then= |
相符时的输出,预设为空字串。 |
|3= |
|else= |
不相符时的输出,预设为空字串。 |
具名参数优先于对应的位置参数。另外,透过模板呼叫时模板的参数会直接传递给本函数,且优先于 #invoke 上所写的参数,因此只要在包装模板中写上 {{#invoke:Namespace|namespace}},模板的使用者即可直接提供上述三个参数。
范例(在 Template:Example):
{{#invoke:Namespace|namespace|template|是模板|不是模板}} <!-- 是模板 -->
{{#invoke:Namespace|namespace|10|是模板|不是模板}} <!-- 是模板 -->
{{#invoke:Namespace|namespace|help|是幫助|不是幫助}} <!-- 不是幫助 -->
{{#invoke:Namespace|namespace|help|是幫助}} <!-- (空字串) -->
{{#invoke:Namespace|namespace|namespace=10|then=是模板|else=不是模板}} <!-- 是模板 -->
目前页面位于伪命名空间时,会以伪命名空间前缀比对,例如在 LTA:Foo 上以 LTA 比对即为相符;伪命名空间的讨论页(Talk:LTA:Foo)同样视为该伪命名空间。
namespaceName
{{#invoke:Namespace|namespaceName|語言|命名空間}}
输出命名空间的本地化名称。
| 参数 | 说明 |
|---|---|
|1= |
语言代码,如 zh-hant、zh-hans、zh-tw、en。省略或留空时取使用者的介面语言({{int:Lang}});无法对应的语言代码会回退为英文。
|
|2= |
命名空间,可用编号(10)、命名空间名称或别名(Template、模板、t)、伪命名空间前缀(LTA、LTA:)或伪命名空间的讨论页前缀(Talk:LTA)。省略时使用目前页面所在的命名空间。
|
- 省略
|2=且目前页面位于条目或讨论命名空间时,会额外判断页面是否位于伪命名空间。 - 本站存在但 Module:Namespace/data 未收录的命名空间(例如
1728)会输出空字串。 - 明确传入空值(
|2=)、无法辨识的命名空间,或伪命名空间的完整页面名(LTA:Foo)时,会输出红字的“输入命名空间错误”。需要由页面名称取得伪命名空间前缀时,请先以 #isPseudoNamespace 取得前缀。
范例:
{{#invoke:Namespace|namespaceName|zh-hant|0}} <!-- 條目 -->
{{#invoke:Namespace|namespaceName|zh-hant|10}} <!-- 模板 -->
{{#invoke:Namespace|namespaceName|zh-hant|t}} <!-- 模板 -->
{{#invoke:Namespace|namespaceName|zh-hant|模板}} <!-- 模板 -->
{{#invoke:Namespace|namespaceName|zh-hant|4}} <!-- 專案 -->
{{#invoke:Namespace|namespaceName|zh-hans|2}} <!-- 用户 -->
{{#invoke:Namespace|namespaceName|zh-tw|2}} <!-- 使用者 -->
{{#invoke:Namespace|namespaceName|en|10}} <!-- Template -->
{{#invoke:Namespace|namespaceName|zh-hant|LTA}} <!-- 持續出沒的破壞者捷徑 -->
{{#invoke:Namespace|namespaceName|zh-hant|Talk:LTA}} <!-- 持續出沒的破壞者討論捷徑頁 -->
{{#invoke:Namespace|namespaceName|zh-hant|1728}} <!-- (空字串) -->
{{#invoke:Namespace|namespaceName|zh-hant|corgi}} <!-- 輸入命名空間錯誤(紅字) -->
conversionNamespaceName
{{#invoke:Namespace|conversionNamespaceName|語言|命名空間}}
参数与行为同 #namespaceName,但优先使用 Module:Namespace/data 中的 編號-display,即本站实际显示的命名空间名称;未定义 -display 的命名空间则与 #namespaceName 完全相同。目前两者有差异的是专案与介面命名空间:
| 命名空间 | namespaceName | conversionNamespaceName |
|---|---|---|
4 |
专案 | 维基百科 |
5 |
专案讨论 | 维基百科讨论 |
8 |
介面 | MediaWiki |
9 |
介面讨论 | MediaWiki讨论 |
isPseudoNamespace
别名:ispseudo
{{#invoke:Namespace|isPseudoNamespace|頁面名稱}}
检查页面是否位于伪命名空间:是则输出伪命名空间前缀,否则输出空字串,|1= 省略时检查目前页面。与 #namespaceName 的 |2= 不同,本函数接受完整页面名称,也接受伪命名空间的讨论页。
范例:
{{#invoke:Namespace|isPseudoNamespace|LTA}} <!-- LTA -->
{{#invoke:Namespace|isPseudoNamespace|LTA:Foo}} <!-- LTA -->
{{#invoke:Namespace|isPseudoNamespace|Talk:LTA:Foo}} <!-- LTA -->
{{#invoke:Namespace|isPseudoNamespace|RSP:Foo}} <!-- RSP -->
{{#invoke:Namespace|isPseudoNamespace|Template:Foo}} <!-- (空字串) -->
{{#invoke:Namespace|ispseudo}} <!-- 目前頁面的偽命名空間前綴 -->
已有包装模板 Template:IsPNS(输出前缀)与 Template:IfPNS(条件判断)。
Lua
以下范例中隐含
local mNS = require('Module:Namespace')
_lan
仅供Module:Namespace pagename使用的内部函数。
_isNamespace
-- @param string|number id
-- @return string|number|nil
mNS._isNamespace(id)检查一个输入是不是伪命名空间或真实命名空间,返回伪命名空间、命名空间编号或 nil。
范例:
mNS._isNamespace("") -- 0
mNS._isNamespace("0") -- 0
mNS._isNamespace(0) -- 0
mNS._isNamespace("t") -- 10
mNS._isNamespace("模板") -- 10
mNS._isNamespace("template") -- 10
mNS._isNamespace("LTA") -- "LTA"
mNS._isNamespace("LTA:") -- "LTA"
mNS._isNamespace("corgi") -- nil
mNS._isNamespace(-999) -- nil
_pseudoNamespaceDisplay
仅供Module:Namespace pagename使用的函数,不保证稳定性。
-- @param string lang
-- @param string ns
-- @param bool isTalk
-- @return string
-- @throw
mNS._pseudoNamespaceDisplay(lang, ns, isTalk)返回伪命名空间的显示名。输入的伪命名空间不存在会抛出错误,使用前请先用 #_isPseudoNamespace 检查是否是有效伪命名空间。
范例:
mNS._pseudoNamespaceDisplay("zh", "LTA") -- 持续出没的破坏者快捷方式
mNS._pseudoNamespaceDisplay("zh", "NC") -- 命名常规快捷方式
mNS._pseudoNamespaceDisplay("zh", "NT") -- 收录标准快捷方式
mNS._pseudoNamespaceDisplay("zh", "RSP") -- 来源评级快捷方式
mNS._pseudoNamespaceDisplay("zh-hant", "LTA", false) -- 持續出沒的破壞者捷徑
mNS._pseudoNamespaceDisplay("zh-hant", "LTA", true) -- 持續出沒的破壞者討論捷徑頁
_isPseudoNamespace
-- @param string|nil ns
-- @param false|nil [isPage]
-- @return nil|string, boolean
-- @throw
mNS._isPseudoNamespace(ns, isPage)
-- @param string|mw.title|nil page
-- @param true isPage
-- @return nil|string, boolean
-- @throw
mNS._isPseudoNamespace(page, isPage)检查一个输入是不是伪命名空间,返回伪命名空间(或 nil),以及该伪命名空间是否位于讨论命名空间。
isPage为true时,第一个参数视为页面,可以是字串或mw.title物件,冒号后的内容会被忽略。isPage为false或nil时,第一个参数只能是字串,且只接受PNS与PNS:两种形式;LTA:Foo这类完整页面名称会被判定为非伪命名空间。- 第一个参数为
nil或省略时改用目前页面,并视为isPage = true。 - 不在条目或讨论命名空间的页面一律返回
nil, false。 - 第一个参数既不是字串也不是
mw.title物件时会抛出错误。
范例:
mNS._isPseudoNamespace("LTA") -- "LTA", false
mNS._isPseudoNamespace("LTA:") -- "LTA", false
mNS._isPseudoNamespace("Talk:LTA") -- "LTA", true
mNS._isPseudoNamespace("LTA:Foo") -- nil, false(isPage 不為 true)
mNS._isPseudoNamespace("") -- nil, false
mNS._isPseudoNamespace("corgi") -- nil, false
mNS._isPseudoNamespace("LTA:Foo", true) -- "LTA", false
mNS._isPseudoNamespace("Talk:LTA:Foo", true) -- "LTA", true
mNS._isPseudoNamespace("Template:LTA", true) -- nil, false(不在條目或討論命名空間)
mNS._isPseudoNamespace(10) -- 拋出錯誤
_namespaceName
-- @param string|nil [lang]
-- @param string|number|nil [ns]
-- @return string
-- @throw
mNS._namespaceName(lang, ns)返回命名空间的本地化名称,参数与 #namespaceName 相同,但错误会直接抛出而不是输出红字讯息。lang 省略或为空字串时取使用者的介面语言;ns 省略时使用目前页面所在的命名空间,并在页面位于条目或讨论命名空间时额外判断伪命名空间。
范例:
mNS._namespaceName("zh-hant", 0) -- "條目"
mNS._namespaceName("zh-hant", "t") -- "模板"
mNS._namespaceName("zh-hant", 4) -- "專案"
mNS._namespaceName("zh-hans", 2) -- "用户"
mNS._namespaceName("zh-tw", 2) -- "使用者"
mNS._namespaceName("en", 10) -- "Template"
mNS._namespaceName("zh-hant", "LTA") -- "持續出沒的破壞者捷徑"
mNS._namespaceName("zh-hant", "Talk:LTA") -- "持續出沒的破壞者討論捷徑頁"
mNS._namespaceName("zh-hant", 1728) -- ""(Module:Namespace/data 未收錄)
mNS._namespaceName("zh-hant") -- 目前頁面所在命名空間的名稱
mNS._namespaceName("zh-hant", "") -- 拋出錯誤
mNS._namespaceName("zh-hant", "corgi") -- 拋出錯誤
mNS._namespaceName("zh-hant", "LTA:Foo") -- 拋出錯誤(請先用 _isPseudoNamespace 取得前綴)
_conversionNamespaceName
-- @param string|nil [lang]
-- @param string|number|nil [ns]
-- @return string
-- @throw
mNS._conversionNamespaceName(lang, ns)同 #_namespaceName,但优先使用 Module:Namespace/data 中的 編號-display,即本站实际显示的命名空间名称,差异见 #conversionNamespaceName。
范例:
mNS._conversionNamespaceName("zh-hant", 4) -- "維基百科"
mNS._conversionNamespaceName("zh-hant", 8) -- "MediaWiki"
mNS._conversionNamespaceName("zh-hant", 10) -- "模板"(無 10-display,同 _namespaceName)
已弃用的别名
下列函数名称因命名不当而弃用,行为与对应的新名称完全相同,请勿在新的程式码中使用:
| 已弃用 | 请改用 |
|---|---|
NamespacesDisplay |
#namespaceName |
NamespacesConversionDisplay |
#conversionNamespaceName |
_NamespacesDisplay |
#_namespaceName |
_NamespacesConversionDisplay |
#_conversionNamespaceName |
_PseudoNamespaceDisplay |
#_pseudoNamespaceDisplay |
参见
- Module:Namespace/data-命名空间与伪命名空间的资料
- Module:Namespace/testcases-单元测试
- Module:Namespace pagename-依页面实际内容细分页面类型
- Module:Lan2-语言回退
- Template:NS、Template:NS1-显示命名空间名称
- Template:IsPNS、Template:IfPNS-伪命名空间判断
require('strict')
local p = {}
local data = mw.loadData('Module:Namespace/data')
local mLan = require('Module:Lan2')
local getArgs
local function ifempty(ret, val)
return ret ~= '' and ret or val
end
local function inArray(str, arr)
for i, v in ipairs(arr) do
if str == v then
return v
end
end
return nil
end
-- @internal
-- @see [[Module:Namespace pagename]]
function p._lan(args, lang)
return mLan.main(args,
ifempty(lang and lang:lower(), mw.getCurrentFrame():callParserFunction { name = 'int', args = { 'Lang' } }), {
['def'] = { 'en' }
})
end
-- 檢查一個輸入是不是偽命名空間或真實命名空間,返回偽命名空間、命名空間編號或 nil。
-- @param string|number id
-- @return string|number|nil
function p._isNamespace(id)
id = tostring(id)
local PNS, _ = p._isPseudoNamespace(id)
return
PNS
or mw.site.namespaces[tonumber(id) or id:lower()] and mw.site.namespaces[tonumber(id) or id:lower()].id
or nil
end
function p.namespace(frame)
local args
if frame == mw.getCurrentFrame() then
-- We're being called via #invoke. The args are passed through to the module
-- from the template page, so use the args that were passed into the template.
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
args = getArgs(frame, { parentFirst = true })
else
-- We're being called from another module or from the debug console, so assume
-- the args are passed in directly.
args = frame
if type(args) ~= type({}) then args = { frame } end
end
local id = tostring(args.namespace or args[1])
local PNS, _ = p._isPseudoNamespace()
return (PNS or mw.title.getCurrentTitle().namespace) == p._isNamespace(id) and (args['then'] or args[2]) or (args['else'] or args[3])
end
local UNKNOWN_NAMESPACE = -3
for key, func in pairs({
namespaceName = function(nsid)
return data.Namespace[tostring(nsid)]
end,
conversionNamespaceName = function(nsid)
return data.Namespace[tostring(nsid) .. '-display'] or data.Namespace[tostring(nsid)]
end,
}) do
-- @param string|nil [lang]
-- @param string|nil [ns]
-- @throw
-- @return string
p['_' .. key] = function(lang, ns)
local PNS, PNSIsTalk
local nsid
if ns ~= nil then
if ns == '' then
nsid = UNKNOWN_NAMESPACE
else
local nsid_info = mw.site.namespaces[tonumber(ns)] or mw.site.namespaces[ns]
if not nsid_info then
PNS, PNSIsTalk = p._isPseudoNamespace(ns, false)
nsid = UNKNOWN_NAMESPACE
else
nsid = nsid_info.id
end
end
else
local title = mw.title.getCurrentTitle()
nsid = title.namespace
if nsid == 0 or nsid == 1 then
PNS, PNSIsTalk = p._isPseudoNamespace(title, true)
end
end
if PNS then
return p._pseudoNamespaceDisplay(lang, PNS, PNSIsTalk)
elseif nsid <= UNKNOWN_NAMESPACE then
error('Input namespace error.')
end
return p._lan(func(nsid), lang)
end
p[key] = function(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {
valueFunc = function(k, v)
if k == 2 then
return type(v) == 'string' and mw.text.trim(v) or v
elseif v then
v = mw.text.trim(v)
if v ~= '' then
return v
end
end
return nil
end
})
local lang = args[1]
local ns = args[2]
local statue, wt = pcall(p['_' .. key], lang, ns)
if statue then
return wt
end
return tostring(mw.html.create('span'):attr('style', 'color:red;'):wikitext(
p._lan({
['en'] = 'Input namespace error',
['zh-hans'] = '输入命名空间错误',
['zh-hant'] = '輸入命名空間錯誤'
}, lang)
):done())
end
end
-- @deprecated 命名不當
p.NamespacesDisplay = p.namespaceName
-- @deprecated 命名不當
p._NamespacesDisplay = p._namespaceName
-- @deprecated 命名不當
p.NamespacesConversionDisplay = p.conversionNamespaceName
-- @deprecated 命名不當
p._NamespacesConversionDisplay = p._conversionNamespaceName
-- @param string|nil ns
-- @param false|nil [isPage]
-- @throw
-- @return nil|string, boolean
-- @overload function _isPseudoNamespace(ns, isPage)
-- ----
-- @param string|mw.title|nil page
-- @param true isPage
-- @throw
-- @return nil|string, boolean
-- @overload function _isPseudoNamespace(page, isPage)
function p._isPseudoNamespace(nsOrPage, isPage)
if not nsOrPage then
nsOrPage = mw.title.getCurrentTitle()
isPage = true
elseif nsOrPage == '' then
return nil, false
end
local success, titleObj
if type(nsOrPage) == type('') then
if not nsOrPage:match(':') then
nsOrPage = nsOrPage .. ':'
end
success, titleObj = pcall(mw.title.new, nsOrPage)
if not success or not titleObj or not titleObj:inNamespaces(0, 1) then
return nil, false
end
local split = mw.text.split(titleObj.text, ':')
if not isPage and (#split > 2 or (split[2] ~= '' and split[2] ~= nil)) then
-- isPage = false 時僅允許:
-- 1. PNS
-- 2. PNS:
return nil, false
end
nsOrPage = split[1] -- 移除冒號後的東西
elseif type(nsOrPage) == type({}) and type(nsOrPage.text) == type('') and isPage then
-- 如果傳入頁面物件,則 isPage 必然要是 true
if not nsOrPage:inNamespaces(0, 1) then
return nil, false
end
titleObj = nsOrPage
nsOrPage = mw.text.split(nsOrPage.text, ':')[1] -- 移除冒號後的東西
else
error(string.format(
'bad argument #1 to \'_isPseudoNamespace[isPage=%s]\' (%s expected, got %s)',
isPage and 'true' or 'false',
isPage and 'string or mw.title object' or 'string',
type(nsOrPage)
))
end
if inArray(nsOrPage, data['PseudoNamespace']['list']) then
return nsOrPage, titleObj.namespace == 1
end
return nil, false
end
function p.isPseudoNamespace(frame)
local arg = require('Module:Arguments').getArgs(frame)['1']
local PNS, _ = p._isPseudoNamespace(arg, true)
return PNS or ''
end
-- @alias
p.ispseudo = p.isPseudoNamespace
-- @internal
-- @see [[Module:Namespace pagename]]
function p._pseudoNamespaceDisplay(lang, ns, isTalk)
if not inArray(ns, data['PseudoNamespace']['list']) then
error('Input pseudo namespace error.')
end
local display = p._lan(data.PseudoNamespace.messages[isTalk and 'talk' or 'main'], lang)
display = mw.ustring.gsub(display, '$1', p._lan(data.PseudoNamespace[ns], lang))
return display
end
-- @deprecated 命名不當
p._PseudoNamespaceDisplay = p._pseudoNamespaceDisplay
return p