Thismodule is rated asready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned onhelp pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed throughsandbox testing rather than repeated trial-and-error editing.
This module is used to detect the page type of a given page. It detectsredirect pages automatically and is highly customisable. It can be used on its own or as a meta-module to create other page-type-detection templates. This module can also be accessed using{{pagetype}}.
Syntax
Basic usage
{{#invoke:pagetype|main}}
All parameters
{{#invoke:pagetype|main| page = | defaultns = | main = | user = | wikipedia = | project = | wp = | file = | image = | mediawiki = | template = | help = | category = | portal = | draft = | timedtext = | module = | topic = | special = | media = | talk = | redirect =| soft_redirect = | dab = | na = | other = | sia =| nonexistent =| plural = }}
Basic usage
For simple detection of the page type of the current page, use the default settings:
{{#invoke:pagetype|main}}
That will produce the following results, depending on the page type or thenamespace:
Page type / namespace
Output
Redirects (in any namespace)
redirect
Main namespace
article
File namespace
file
Template namespace
template
Category namespace
category
Module namespace
module
Other namespaces
page
If the module is used on a talk page, it will detect the page type for the corresponding subject page.
Example
Code
Result
{{#invoke:pagetype|main}}
module
Page parameter
You can use thepage parameter to make the module act as though it was called from that page.
{{#invoke:pagetype|main|page=TimedText:Imagine (John Lennon song - sample).ogg.en.srt}}
page
Adding and removing namespaces
It is possible to specify different behaviour for each namespace than that described in thebasic usage section. For example, you might want the module to display "user page" for pages in the user namespace, instead of the default "page". To do this, you can use the code|user=yes. This looks up the typical name used for pages in the user namespace, in this case "user page", and uses that text when the module is used with a page in the user namespace. To use this with other namespaces, use the namespace name in lower case as a parameter:
{{#invoke:pagetype|main| user =yes| wikipedia =yes| project =yes| wp =yes| mediawiki =yes| help =yes| portal =yes| draft =yes| timedtext =yes| topic =yes| special =yes| media =yes}}
You can use any of the following to specify the namespace: "yes", "y", "true" or "1". They can be used in any combination of upper and lower case. (These values are defined byModule:Yesno.)
The default text for these namespaces is as follows:
Page type / namespace
Output
User namespace
user page
Wikipedia namespace
project page
MediaWiki namespace
interface page
Help namespace
help page
Portal namespace
portal
Draft namespace
draft
Timed Text namespace
Timed Text page
Topic namespace
topic
Special namespace
special page
Media namespace
file
You can use a similar process to remove any of the default namespace values as well. For example, if you use the code|template=no, then the module will display "page" when used on a template page, rather than the default "template".
{{#invoke:pagetype|main|page=TimedText:Imagine (John Lennon song - sample).ogg.en.srt}}
page
{{#invoke:pagetype|main|page=TimedText:Imagine (John Lennon song - sample).ogg.en.srt|timedtext=Yes}}
Timed Text page
Default namespace sets
As well as adding and removing individual namespaces, it is possible to specify different sets of namespaces by using the|defaultns=. There are four different sets available:all,extended,none and the default set. These sets allow you to specify many namespaces at once, without having to use all of the individual namespace parameters. Namespaces are set according to the following table:
{{#invoke:pagetype|main|page=TimedText:Imagine (John Lennon song - sample).ogg.en.srt}}
page
{{#invoke:pagetype|main|page=TimedText:Imagine (John Lennon song - sample).ogg.en.srt|timedtext=custom text}}
custom text
Talk parameter
Normally, the module will treat talk pages as if they were in the corresponding subject namespace. However, if thetalk parameter is set, the module will treat talk pages separately from subject pages. Thetalk parameter sets values for all talk pages, i.e. pages in the Talk: namespace, pages in the User talk: namespace, pages in the Wikipedia talk: namespace, and so on.
By default, the module automatically detects redirects in all namespace. It is not possible to specify redirect behaviour by namespace, but you can turn redirect detection off, or use a custom value for redirect pages.
By default, the module usesModule:Disambiguation to detectdisambiguation pages in the main namespace. If you want, you can turn this detection off, or use a custom value for disambiguation pages.
---------------------------------------------------------------------------------- ---- This meta-module which 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.localcfg=mw.loadData('Module:Pagetype/config')-- Load required modules.localyesno=require('Module:Yesno')localp={}-- Look up a namespace argument in the args table.localfunctionlookUpNamespaceArg(args,key)localarg=args[key]-- Convert "yes", "1" etc. to true, "no", "0" etc. to false, and leave-- other values the same.returnyesno(arg,arg)end-- Append multiple values to an arraylocalfunctionappendMultiple(target,source)for_,valueinipairs(source)dotable.insert(target,value)endend-- Get argument keys for a title's namespacelocalfunctiongetNamespaceArgKeys(title)localnsInfo=mw.site.namespaces[title.namespace]localcustomAliases=cfg.customNamespaceAliases[title.namespace]or{}localkeys={}ifnsInfo.name~=''thentable.insert(keys,nsInfo.name)endifnsInfo.canonicalName~=nsInfo.nameandnsInfo.canonicalName~=''thentable.insert(keys,nsInfo.canonicalName)endappendMultiple(keys,nsInfo.aliases)appendMultiple(keys,customAliases)returnkeysend-- Get the argument for a title's namespace, if it was specified in the args table.localfunctiongetNamespaceArg(title,args)iftitle.isTalkPagethenreturnlookUpNamespaceArg(args,cfg.talk)endfor_,keyinipairs(getNamespaceArgKeys(title))dolocalarg=lookUpNamespaceArg(args,mw.ustring.lower(key))ifarg~=nilthenreturnargendendreturnnilend-- Look up a page type specific to the title's namespacelocalfunctiongetExplicitPageType(title)iftitle.isTalkPagethenreturncfg.talkDefaultelsereturncfg.pagetypes[title.namespace]endend-- Get a default page type that is not specific to the title's namespacelocalfunctiongetDefaultPageType(args)localother=lookUpNamespaceArg(args,cfg.other)iftype(other)=='string'thenreturnotherelsereturncfg.otherDefaultendendlocalfunctiondetectRedirects(title,args)localredirect=lookUpNamespaceArg(args,cfg.redirect)ifredirect==falsethen-- Don't detect redirects if they have been specifically disallowed.returnnilend-- Allow custom values for redirects.ifnottitle.isRedirectthenreturnnilelseiftype(redirect)=='string'thenreturnredirectelsereturncfg.redirectDefaultendendlocalfunctioncapitalize(pageType)localfirst=mw.ustring.sub(pageType,1,1)localrest=mw.ustring.sub(pageType,2)returnmw.ustring.upper(first)..restendlocalfunctionpluralize(pageType)ifcfg.irregularPlurals[pageType]thenreturncfg.irregularPlurals[pageType]elsereturnpageType..cfg.plural-- often 's'endendlocalfunctionparseContent(title,args,optionsList)iftitle.namespace==828andtitle.subpageText~='doc'-- don't detect modulesornottitle.exists-- can't check unless page existsthenreturnnilendlocalcontent=title:getContent()ifcontent==nilthenreturnnilendlocaltemplates-- lazily evaluatedfor_,optionsinnext,optionsListdolocallist,parameter,default,articleOnly=unpack(options,1,4)ifnotarticleOnlyortitle.namespace==0then-- only check for templates if we should...localout=lookUpNamespaceArg(args,parameter)iftype(out)=="string"or(out~=falseanddefault)then-- ...and if we actually have anything to say about themifnottemplatesthentemplates={}-- do our delayed evaluation now that we are required tocontent=require('Module:Wikitext Parsing').PrepareText(content)-- disregard templates which do not have any affectfortemplateinstring.gmatch(content,"{{%s*([^|}]-)%s*[|}]")dotemplates[#templates+1]=capitalize(template)endendlocalwantedTemplates=mw.loadData('Module:Pagetype/'..list)localtemplateFound=falsefor_,templateinnext,templatesdoifwantedTemplates[template]thentemplateFound=truebreakendendiftemplateFoundtheniftype(out)=='string'thenreturnoutelseifout~=falseanddefaultthenreturndefaultendendendendendend-- Find pages which do not existlocalfunctionnonExistent(title,args)localarg=lookUpNamespaceArg(args,cfg.ne)ifarg==falsethenreturnnilendlocalexists=falseiftitle.existsthen-- not an article if it does not existexists=trueelseiftitle.namespace==8andmw.message.new(title.text):exists()thenexists=trueelseiftitle.namespace==6andtitle.fileExiststhenexists=trueendifnotexiststheniftype(arg)=='string'thenreturnargelsereturncfg.naDefaultendendend-- Get page types for mainspaces pages with an explicit class specifiedlocalfunctiongetMainNamespaceClassPageType(title,args)localclass=args[1]iftype(class)=='string'then-- Put in lower case so e.g. "na" and "NA" will both matchclass=mw.ustring.lower(class)endlocalarg=lookUpNamespaceArg(args,cfg.na)ifarg==falsethen-- don't check for this class if it is specifically disallowedreturnnilendifcfg.naAliases[class]theniftype(arg)=='string'thenreturnargelsereturncfg.naDefaultendelsereturnnilendend-- Get page type specified by an explicit namespace argument.localfunctiongetNamespaceArgPageType(title,args)localnamespaceArg=getNamespaceArg(title,args)ifnamespaceArg==truethen-- Namespace has been explicitly enabled, so return the default for-- this namespacereturngetExplicitPageType(title)elseifnamespaceArg==falsethen-- Namespace has been explicitly disabledreturngetDefaultPageType(args)elseifnamespaceArgthen-- This namespaces uses custom textreturnnamespaceArgelsereturnnilendend-- Get page type not specified or detected by other meanslocalfunctiongetOtherPageType(title,args)-- Whether the title is in the set of default active namespaces which are looked up in cfg.pagetypes.localisInDefaultActiveNamespace=falselocaldefaultNamespacesKey=args[cfg.defaultns]ifdefaultNamespacesKey==cfg.defaultnsAllthenisInDefaultActiveNamespace=trueelselocaldefaultNamespacesifdefaultNamespacesKey==cfg.defaultnsExtendedthendefaultNamespaces=cfg.extendedNamespaceselseifdefaultNamespacesKey==cfg.defaultnsNonethendefaultNamespaces={}elsedefaultNamespaces=cfg.defaultNamespacesendisInDefaultActiveNamespace=defaultNamespaces[title.namespace]endifisInDefaultActiveNamespacethenreturngetExplicitPageType(title)elsereturngetDefaultPageType(args)endendfunctionp._main(args)localtitleifargs.pagethentitle=mw.title.new(args.page)elsetitle=mw.title.getCurrentTitle()endiftitleandnotyesno(args.talk,true)andargs[cfg.defaultns]~=cfg.defaultnsAllthentitle=title.subjectPageTitleendlocalpageType=detectRedirects(title,args)ornonExistent(title,args)orparseContent(title,args,{{'softredirect',cfg.softRedirect,cfg.softRedirectDefault},{'setindex',cfg.sia,cfg.siaDefault,true},{'disambiguation',cfg.dab,cfg.dabDefault,true},{'rfd',cfg.rfd,cfg.rfdDefault},})or(title.namespace==0andgetMainNamespaceClassPageType(title,args))orgetNamespaceArgPageType(title,args)orgetOtherPageType(title,args)ifyesno(args.plural,false)thenpageType=pluralize(pageType)endifyesno(args.caps,false)thenpageType=capitalize(pageType)endreturnpageTypeendfunctionp.main(frame)localargs=require('Module:Arguments').getArgs(frame)returnp._main(args)endreturnp