Module:Pagetype
本模块用于检测指定页面之类型,其能自动检测重定向页面,且可高度自定义。本模块可独立使用,亦可作为元模块用于创建其他页面类型检测模板。使用{{pagetype}}亦可访问本模块。
语法
- 基本代码
{{#invoke:pagetype|main}}
- 完整代码
{{#invoke:pagetype|main | page = | defaultns = | main = | user = | wikipedia = | project = | wp = | file = | image = | mediawiki = | template = | help = | category = | portal = | book = | draft = | education program = | timedtext = | module = | topic = | special = | media = | talk = | redirect = | dab = | na = | other = }}
基本用法
如需对当前页面类型作简单检测,使用默认设置:
{{#invoke:pagetype|main}}
如此即可根据页面类型或名字空间生成下列结果:
页面类型 / 名字空间 | 输出 |
---|---|
重定向(任意名字空间) | 重定向 |
主名字空间 | 条目 |
文件名字空间 | 文件 |
模板名字空间 | 模板 |
分类名字空间 | 分类 |
模块名字空间 | 模块 |
图书名字空间 | 图书 |
其他名字空间 | 页面 |
(注:部分名字空间尚未在中文维基百科启用。)
若本模块用于讨论页,则会检测对应主页面类型。
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main}} |
模块 |
页面参数
您可使用page
参数模拟模块调用该页面。
{{#invoke:pagetype|main|page=page name}}
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main|page=英国}} |
条目 |
{{#invoke:pagetype|main|page=UK}} |
条目 |
{{#invoke:pagetype|main|page=Talk:英国}} |
条目 |
{{#invoke:pagetype|main|page=File:Example.svg}} |
文件 |
{{#invoke:pagetype|main|page=Wikipedia:Namespace}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=TimedText:Imagine.ogg.en.srt}} |
条目 |
增减名字空间
可为各名字空间指定与基本用法一节不同的行为。例如,您可能希望模块在用戶名字空间显示“用戶页”而非默认的“页面”,为此您可以使用代码|user=yes
。这样便可为用戶名字空间页面查找典型名称,即本例中的“用戶页”,并在模块使用在用戶名字空间的页面时使用该文本。用于其他名字空间时,请使用小写字母的名字空间名作为参数。
{{#invoke:pagetype|main | user = yes | wikipedia = yes | project = yes | wp = yes | mediawiki = yes | help = yes | portal = yes | draft = yes | education program = yes | timedtext = yes | topic = yes | special = yes | media = yes }}
您可使用下列代码中的任一形式指定名字空间:"yes
"、"y
"、"true
"或"1
",任意大小写字母组合形式均可使用(这些值由模块:Yesno定义)。
此类名字空间的默认文本如下所示:
页面类型 / 名字空间 | 输出 |
---|---|
User | 用戶頁 |
Wikipedia | 维基百科 |
MediaWiki | MediaWiki |
Help | 帮助 |
Portal | 主题 |
Draft | 草稿 |
Education | 教育课程 |
Timed Text | 限时文件 |
Topic | 公告 |
Special | 特殊页面 |
Media | 文件 |
(注:部分名字空间尚未在中文维基百科启用。)
您亦可使用相似的方式移除默认任意名字空间值。例如,若使用代码|template=no
,则模块使用于模板页时会显示“页面”,而非默认的“模板”。
{{#invoke:pagetype|main | main = no | file = no | template = no | category = no | module = no | book = no }}
下列值均可用于移除名字空间值:"no
"、"n
"、"false
"或"0
",任意大小写字母组合形式均可使用。
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main|page=Wikipedia:Namespace}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=Wikipedia:Namespace|wikipedia=yes}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=Talk:英国}} |
条目 |
{{#invoke:pagetype|main|page=Talk:英国|talk=y}} |
讨论页 |
{{#invoke:pagetype|main|page=英国}} |
条目 |
{{#invoke:pagetype|main|page=英国|main=no}} |
页面 |
{{#invoke:pagetype|main|page=TimedText:Imagine.ogg.en.srt}} |
条目 |
{{#invoke:pagetype|main|page=TimedText:Imagine.ogg.en.srt|timedtext=Yes}} |
条目 |
默认名字空间设置
除了添加或移除某个名字空间,亦可使用|defaultns=
指定不同的名字空间集。共有四组集可供使用:all
、extended
、none
和默认集。这些集允许您一次性指定多个名字空间,而无须一一使用所有名字空间参数。名字空间可按下表设置:
名字空间 | |defaultns= 值
|
输出 | |||
---|---|---|---|---|---|
none
|
extended
|
all
|
其他值 | ||
主名字空间 | 条目 | ||||
User | 用户页 | ||||
Wikipedia | 维基百科 | ||||
File | 文件 | ||||
MediaWiki | MediaWiki | ||||
Template | 模板 | ||||
Help | 帮助 | ||||
Category | 分类 | ||||
Portal | 主题 | ||||
Book | 图书 | ||||
Draft | 草稿 | ||||
Education Program | 教育项目 | ||||
TimedText | 限时文字 | ||||
模块 | 模块 | ||||
Topic (Flow boards) | 公告 | ||||
所有讨论名字空间 | 讨论页 | ||||
Special | 特殊页面 | ||||
Media | 文件 |
(注:部分名字空间尚未在中文维基百科启用。)
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main|page=英国}} |
条目 |
{{#invoke:pagetype|main|page=英国|defaultns=none}} |
页面 |
{{#invoke:pagetype|main|page=Talk:英国}} |
条目 |
{{#invoke:pagetype|main|page=Talk:英国|defaultns=all}} |
讨论页 |
{{#invoke:pagetype|main|page=File:Example.svg}} |
文件 |
{{#invoke:pagetype|main|page=File:Example.svg|defaultns=none}} |
页面 |
{{#invoke:pagetype|main|page=Wikipedia:Namespace}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=Wikipedia:Namespace|defaultns=extended}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=TimedText:Imagine.ogg.en.srt|defaultns=extended}} |
条目 |
{{#invoke:pagetype|main|page=TimedText:Imagine.ogg.en.srt|defaultns=all}} |
条目 |
自定义名字空间值
可以为任意名字空间指定自定义值:
{{#invoke:pagetype|main | main = 文字 | user = 文字 | wikipedia = 文字 | project = 文字 | wp = 文字 | file = 文字 | image = 文字 | mediawiki = 文字 | template = 文字 | help = 文字 | category = 文字 | portal = 文字 | book = 文字 | draft = 文字 | education program = 文字 | timedtext = 文字 | module = 文字 | topic = 文字 | special = 文字 | media = 文字 }}
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main|page=Wikipedia:Namespace}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=Wikipedia:Namespace|wikipedia=文字}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=Talk:英国}} |
条目 |
{{#invoke:pagetype|main|page=Talk:英国|talk=文字}} |
文字 |
{{#invoke:pagetype|main|page=英国}} |
条目 |
{{#invoke:pagetype|main|page=英国|main=文字}} |
文字 |
{{#invoke:pagetype|main|page=TimedText:Imagine.ogg.en.srt}} |
条目 |
{{#invoke:pagetype|main|page=TimedText:Imagine.ogg.en.srt|timedtext=文字}} |
条目 |
讨论参数
一般而言,本模块会将讨论页视作对应主页面。然而,如果设有talk
参数,模块则会把讨论页与主页面区别对待。talk
参数会为所有讨论页设置值,即Talk:名字空间的页面、User talk:名字空间的页面、Wikipedia talk:名字空间的页面等等。
{{#invoke:pagetype|main|talk=yes}}
{{#invoke:pagetype|main|talk=文字}}
"talk=yes
"的默认值为"讨论页"。
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main|page=Wikipedia talk:Namespace}} |
条目 |
{{#invoke:pagetype|main|page=Wikipedia talk:Namespace|wikipedia=yes}} |
条目 |
{{#invoke:pagetype|main|page=Wikipedia talk:Namespace|talk=yes}} |
条目 |
{{#invoke:pagetype|main|page=Wikipedia talk:Namespace|wikipedia=yes|talk=yes}} |
条目 |
{{#invoke:pagetype|main|page=Wikipedia talk:Namespace|talk=文字}} |
条目 |
{{#invoke:pagetype|main|page=Wikipedia talk:Namespace|wikipedia=yes|talk=文字}} |
条目 |
主名字空间评级
对于主名字空间的页面,可在第一位置参数处添加一个评级值。
{{#invoke:pagetype|main|class}}
如果该评级值与下表的某一值相匹配,即可生成与默认"条目"不同的输出。
评级 | 评级值 | 输出 |
---|---|---|
消歧义级 | disambiguation 、disambig 、disamb 、dab |
页面 |
不适用级 | na 、n/a |
页面 |
任意大小写字母组合形式均可使用。
自定义主名字空间评级
亦可为主名字空间评级指定自定义值。
{{#invoke:pagetype|main|class|dab=yes|na=yes}}
{{#invoke:pagetype|main|class|dab=文字|na=文字}}
与自定义名字空间页面类型的方式相同,可能的参数有:
- dab:消歧义级页面的自定义值,若设为"
yes
"、"y
"、"true
"或"1
",则生成"消歧义页"。若设为"no
"、"n
"、"false
"或"0
",则不生成自定义值。若设为其他任何值,则生成该文本。 - na:不适用级页面的自定义值,与
dab
参数的运作方式相同。默认值为"yes
",即"页面"。
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main|page=英国}} |
条目 |
{{#invoke:pagetype|main|page=英国|dab}} |
页面 |
{{#invoke:pagetype|main|page=英国|dab|dab=文字}} |
文字 |
{{#invoke:pagetype|main|page=英国|na}} |
页面 |
{{#invoke:pagetype|main|page=英国|na|na=文字}} |
文字 |
重定向
本模块默认检测所有名字空间的重定向。无法按名字空间指定重定向行为,但您可以关闭重定向检测,或对重定向页使用自定义值。
{{#invoke:pagetype|main|redirect=no}}
{{#invoke:pagetype|main|redirect=文字}}
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main|page=UK}} |
条目 |
{{#invoke:pagetype|main|page=UK|redirect=no}} |
条目 |
{{#invoke:pagetype|main|page=UK|redirect=文字}} |
条目 |
其他名字空间
若某名字空间未受指定,本模块默认生成"页面
",该值可通过|other=
参数更改。
{{#invoke:pagetype|main|other=文字}}
- 范例
代码 | 结果 |
---|---|
{{#invoke:pagetype|main|page=Wikipedia:Namespace}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=Wikipedia:Namespace|other=文字}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
{{#invoke:pagetype|main|page=Wikipedia:Namespace|other=文字|wikipedia=维基文字}} |
第182行Lua错误:attempt to concatenate field 'subjectNsText' (a nil value) |
上述文档嵌入自Module:Pagetype/doc。 (编辑 | 历史) 编者可以在本模板的沙盒 (创建 | 镜像)和测试样例 (创建)页面进行实验。 本模块的子页面。 |
--------------------------------------------------------------------------------
-- --
-- PAGETYPE --
-- --
-- This is a meta-module intended to replace {{pagetype}} and similar --
-- templates. It automatically detects namespaces, and allows for a --
-- great deal of customisation. It can easily be ported to other --
-- wikis by changing the values in the [[Module:Pagetype/config]]. --
-- --
--------------------------------------------------------------------------------
-- Load config.
local cfg = mw.loadData('Module:Pagetype/config')
-- Load required modules.
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local nsDetectModule = require('Module:Namespace detect')
local nsDetect = nsDetectModule._main
local getParamMappings = nsDetectModule.getParamMappings
local getPageObject = nsDetectModule.getPageObject
local p = {}
local function shallowCopy(t)
-- Makes a shallow copy of a table.
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
local function checkPagetypeInput(namespace, val)
-- Checks to see whether we need the default value for the given namespace,
-- and if so gets it from the pagetypes table.
-- The yesno function returns true/false for "yes", "no", etc., and returns
-- val for other input.
local ret = yesno(val, val)
if ret and type(ret) ~= 'string' then
ret = cfg.pagetypes[namespace]
end
return ret
end
local function getPagetypeFromClass(class, param, aliasTable, default)
-- Gets the pagetype from a class specified from the first positional
-- parameter.
param = yesno(param, param)
if param ~= false then -- No check if specifically disallowed.
for _, alias in ipairs(aliasTable) do
if class == alias then
if type(param) == 'string' then
return param
else
return default
end
end
end
end
end
local function getNsDetectValue(args)
-- Builds the arguments to pass to [[Module:Namespace detect]] and returns
-- the result.
-- Get the default values.
local ndArgs = {}
local defaultns = args[cfg.defaultns]
if defaultns == cfg.defaultnsAll then
ndArgs = shallowCopy(cfg.pagetypes)
else
local defaultnsArray
if defaultns == cfg.defaultnsExtended then
defaultnsArray = cfg.extendedNamespaces
elseif defaultns == cfg.defaultnsNone then
defaultnsArray = {}
else
defaultnsArray = cfg.defaultNamespaces
end
for _, namespace in ipairs(defaultnsArray) do
ndArgs[namespace] = cfg.pagetypes[namespace]
end
end
--[[
-- Add custom values passed in from the arguments. These overwrite the
-- defaults. The possible argument names are fetched from
-- Module:Namespace detect automatically in case new namespaces are
-- added. Although we accept namespace aliases as parameters, we only pass
-- the local namespace name as a parameter to Module:Namespace detect.
-- This means that the "image" parameter can overwrite defaults for the
-- File: namespace, which wouldn't work if we passed the parameters through
-- separately.
--]]
local mappings = getParamMappings()
for ns, paramAliases in pairs(mappings) do
-- Copy the aliases table, as # doesn't work with tables returned from
-- mw.loadData.
paramAliases = shallowCopy(paramAliases)
local paramName = paramAliases[1]
-- Iterate backwards along the array so that any values for the local
-- namespace names overwrite those for namespace aliases.
for i = #paramAliases, 1, -1 do
local paramAlias = paramAliases[i]
local ndArg = checkPagetypeInput(paramAlias, args[paramAlias])
if ndArg == false then
-- If any arguments are false, convert them to nil to protect
-- against breakage by future changes to
-- [[Module:Namespace detect]].
ndArgs[paramName] = nil
elseif ndArg then
ndArgs[paramName] = ndArg
end
end
end
-- Check for disambiguation-class and N/A-class pages in mainspace.
if ndArgs.main then
local class = args[1]
if type(class) == 'string' then
-- Put in lower case so e.g. "Dab" and "dab" will both match.
class = mw.ustring.lower(class)
end
local dab = getPagetypeFromClass(
class,
args[cfg.dab],
cfg.dabAliases,
cfg.dabDefault
)
if dab then
ndArgs.main = dab
else
local na = getPagetypeFromClass(
class,
args[cfg.na],
cfg.naAliases,
cfg.naDefault
)
if na then
ndArgs.main = na
end
end
end
-- If there is no talk value specified, use the corresponding subject
-- namespace for talk pages.
if not ndArgs.talk then
ndArgs.subjectns = true
end
-- Add the fallback value. This can also be customised, but it cannot be
-- disabled.
local other = args[cfg.other]
-- We will ignore true/false/nil results from yesno here, but using it
-- anyway for consistency.
other = yesno(other, other)
if type(other) == 'string' then
ndArgs.other = other
else
ndArgs.other = cfg.otherDefault
end
-- Allow custom page values.
ndArgs.page = args.page
return nsDetect(ndArgs)
end
local function detectRedirects(args)
local redirect = args[cfg.redirect]
-- The yesno function returns true/false for "yes", "no", etc., and returns
-- redirect for other input.
redirect = yesno(redirect, redirect)
if redirect == false then
-- Detect redirects unless they have been explicitly disallowed with
-- "redirect=no" or similar.
return
end
local pageObject = getPageObject(args.page)
-- If we are using subject namespaces elsewhere, do so here as well.
if pageObject
and not yesno(args.talk, true)
and args[cfg.defaultns] ~= cfg.defaultnsAll
then
pageObject = getPageObject(
pageObject.subjectNsText .. ':' .. pageObject.text
)
end
-- Allow custom values for redirects.
if pageObject and pageObject.isRedirect then
if type(redirect) == 'string' then
return redirect
else
return cfg.redirectDefault
end
end
end
function p._main(args)
local redirect = detectRedirects(args)
if redirect then
return redirect
else
return getNsDetectValue(args)
end
end
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
return p