VOOZH about

URL: https://en.wikipedia.org/wiki/Module:Documentation

⇱ Module:Documentation - Wikipedia


Jump to content
From Wikipedia, the free encyclopedia
👁 Image
Module documentation
[view] [edit] [history] [purge]
👁 Warning
This Lua module is used in MediaWiki:Scribunto-doc-page-show, in MediaWiki:Scribunto-doc-page-does-not-exist, and on approximately 198,000 pages.
Changes to it can cause immediate changes to the Wikipedia user interface.
To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on the talk page before implementing them.
👁 Image
This module is rated as ready 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 on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing.
👁 Page template-protected
This module is currently protected from editing.
See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected.
👁 Image
This module depends on the following other modules:
👁 CSS
This module uses TemplateStyles:

This module displays a green box containing documentation for templates, Lua modules, or other pages. The {{documentation}} template invokes it.

Normal usage

For most uses, you should use the {{documentation}} template; please see that template's page for its usage instructions and parameters.

Use in other modules

To use this module from another Lua module, first load it with require:

localdocumentation=require('Module:Documentation').main

Then you can simply call it using a table of arguments.

documentation{content='Some documentation',['link box']='My custom link box'}

Please refer to the template documentation for usage instructions and a list of parameters.

Porting to other wikis

The module has a configuration file at Module:Documentation/config which is intended to allow easy translation and porting to other wikis. Please see the code comments in the config page for instructions. Also, links to Wikipedia within config strings, i.e. [[Wikipedia:Template documentation|documentation]] will point to non-existent Wikipedia pages if config is on another wiki. Either modify, remove it, or add the interwiki prefix like so: [[w:Wikipedia:Template documentation|documentation]].

If you have any questions, or you need a feature which is not currently implemented, please leave a message at Template talk:Documentation to get the attention of a developer.

The messages that need to be customized to display a documentation template/module at the top of module pages are MediaWiki:Scribunto-doc-page-show and MediaWiki:Scribunto-doc-page-does-not-exist.

-- This module implements {{documentation}}.
-- Get required modules.
localgetArgs=require('Module:Arguments').getArgs
-- Get the config table.
localcfg=mw.loadData('Module:Documentation/config')
localp={}
-- Often-used functions.
localugsub=mw.ustring.gsub
localformat=mw.ustring.format
----------------------------------------------------------------------------
-- Helper functions
--
-- These are defined as local functions, but are made available in the p
-- table for testing purposes.
----------------------------------------------------------------------------
localfunctionmessage(cfgKey,valArray,expectType)
--[[
	-- Gets a message from the cfg table and formats it if appropriate.
	-- The function raises an error if the value from the cfg table is not
	-- of the type expectType. The default type for expectType is 'string'.
	-- If the table valArray is present, strings such as $1, $2 etc. in the
	-- message are substituted with values from the table keys [1], [2] etc.
	-- For example, if the message "foo-message" had the value 'Foo $2 bar $1.',
	-- message('foo-message', {'baz', 'qux'}) would return "Foo qux bar baz."
	--]]
localmsg=cfg[cfgKey]
expectType=expectTypeor'string'
iftype(msg)~=expectTypethen
error('message: type error in message cfg.'..cfgKey..' ('..expectType..' expected, got '..type(msg)..')',2)
end
ifnotvalArraythen
returnmsg
end
localfunctiongetMessageVal(match)
match=tonumber(match)
returnvalArray[match]orerror('message: no value found for key $'..match..' in message cfg.'..cfgKey,4)
end
returnugsub(msg,'$([1-9][0-9]*)',getMessageVal)
end
p.message=message
localfunctionmakeWikilink(page,display)
ifdisplaythen
returnformat('[[%s|%s]]',page,display)
else
returnformat('[[%s]]',page)
end
end
p.makeWikilink=makeWikilink
localfunctionmakeCategoryLink(cat,sort)
localcatns=mw.site.namespaces[14].name
returnmakeWikilink(catns..':'..cat,sort)
end
p.makeCategoryLink=makeCategoryLink
localfunctionmakeUrlLink(url,display)
returnformat('[%s %s]',url,display)
end
p.makeUrlLink=makeUrlLink
localfunctionmakeToolbar(...)
localret={}
locallim=select('#',...)
iflim<1then
returnnil
end
fori=1,limdo
ret[#ret+1]=select(i,...)
end
-- 'documentation-toolbar'
returnformat(
'<span class="%s">(%s)</span>',
message('toolbar-class'),
table.concat(ret,' &#124; ')
)
end
p.makeToolbar=makeToolbar
----------------------------------------------------------------------------
-- Argument processing
----------------------------------------------------------------------------
localfunctionmakeInvokeFunc(funcName)
returnfunction(frame)
localargs=getArgs(frame,{
valueFunc=function(key,value)
iftype(value)=='string'then
value=value:match('^%s*(.-)%s*$')-- Remove whitespace.
ifkey=='heading'orvalue~=''then
returnvalue
else
returnnil
end
else
returnvalue
end
end
})
returnp[funcName](args)
end
end
----------------------------------------------------------------------------
-- Entry points
----------------------------------------------------------------------------
functionp.nonexistent(frame)
ifmw.title.getCurrentTitle().subpageText=='testcases'then
returnframe:expandTemplate{title='module test cases notice'}
else
returnp.main(frame)
end
end
p.main=makeInvokeFunc('_main')
functionp._main(args)
--[[
	-- This function defines logic flow for the module.
	-- @args - table of arguments passed by the user
	--]]
localenv=p.getEnvironment(args)
localroot=mw.html.create()
root
:wikitext(p._getModuleWikitext(args,env))
:wikitext(p.protectionTemplate(env))
:wikitext(p.sandboxNotice(args,env))
:tag('div')
-- 'documentation-container'
:addClass(message('container'))
:attr('role','complementary')
:attr('aria-labelledby',args.heading~=''and'documentation-heading'ornil)
:attr('aria-label',args.heading==''and'Documentation'ornil)
:newline()
:tag('div')
-- 'documentation'
:addClass(message('main-div-classes'))
:newline()
:wikitext(p._startBox(args,env))
:wikitext(p._content(args,env))
:tag('div')
-- 'documentation-clear'
:addClass(message('clear'))
:done()
:newline()
:done()
:wikitext(p._endBox(args,env))
:done()
:wikitext(p.addTrackingCategories(env))
-- 'Module:Documentation/styles.css'
returnmw.getCurrentFrame():extensionTag(
'templatestyles','',{src=cfg['templatestyles']
})..tostring(root)
end
----------------------------------------------------------------------------
-- Environment settings
----------------------------------------------------------------------------
functionp.getEnvironment(args)
--[[
	-- Returns a table with information about the environment, including title
	-- objects and other namespace- or path-related data.
	-- @args - table of arguments passed by the user
	--
	-- Title objects include:
	-- env.title - the page we are making documentation for (usually the current title)
	-- env.templateTitle - the template (or module, file, etc.)
	-- env.docTitle - the /doc subpage.
	-- env.sandboxTitle - the /sandbox subpage.
	-- env.testcasesTitle - the /testcases subpage.
	--
	-- Data includes:
	-- env.protectionLevels - the protection levels table of the title object.
	-- env.subjectSpace - the number of the title's subject namespace.
	-- env.docSpace - the number of the namespace the title puts its documentation in.
	-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.
	-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.
	-- 
	-- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value
	-- returned will be nil.
	--]]
localenv,envFuncs={},{}
-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value
-- returned by that function is memoized in the env table so that we don't call any of the functions
-- more than once. (Nils won't be memoized.)
setmetatable(env,{
__index=function(t,key)
localenvFunc=envFuncs[key]
ifenvFuncthen
localsuccess,val=pcall(envFunc)
ifsuccessthen
env[key]=val-- Memoise the value.
returnval
end
end
returnnil
end
})
functionenvFuncs.title()
-- The title object for the current page, or a test page passed with args.page.
localtitle
localtitleArg=args.page
iftitleArgthen
title=mw.title.new(titleArg)
else
title=mw.title.getCurrentTitle()
end
returntitle
end
functionenvFuncs.templateTitle()
--[[
		-- The template (or module, etc.) title object.
		-- Messages:
		-- 'sandbox-subpage' --> 'sandbox'
		-- 'testcases-subpage' --> 'testcases'
		--]]
localsubjectSpace=env.subjectSpace
localtitle=env.title
localsubpage=title.subpageText
ifsubpage==message('sandbox-subpage')orsubpage==message('testcases-subpage')or(subpage==message('doc-subpage')andmw.title.getCurrentTitle().namespace==env.docSpace)then
returnmw.title.makeTitle(subjectSpace,title.baseText)
else
returnmw.title.makeTitle(subjectSpace,title.text)
end
end
functionenvFuncs.docTitle()
--[[
		-- Title object of the /doc subpage.
		-- Messages:
		-- 'doc-subpage' --> 'doc'
		--]]
localtitle=env.title
localdocname=args[1]-- User-specified doc page.
localdocpage
ifdocnamethen
docpage=docname
else
docpage=env.docpageBase..'/'..message('doc-subpage')
end
returnmw.title.new(docpage)
end
functionenvFuncs.sandboxTitle()
--[[
		-- Title object for the /sandbox subpage.
		-- Messages:
		-- 'sandbox-subpage' --> 'sandbox'
		--]]
returnmw.title.new(env.docpageBase..'/'..message('sandbox-subpage'))
end
functionenvFuncs.testcasesTitle()
--[[
		-- Title object for the /testcases subpage.
		-- Messages:
		-- 'testcases-subpage' --> 'testcases'
		--]]
returnmw.title.new(env.docpageBase..'/'..message('testcases-subpage'))
end
functionenvFuncs.protectionLevels()
-- The protection levels table of the title object.
returnenv.title.protectionLevels
end
functionenvFuncs.subjectSpace()
-- The subject namespace number.
returnmw.site.namespaces[env.title.namespace].subject.id
end
functionenvFuncs.docSpace()
-- The documentation namespace number. For most namespaces this is the
-- same as the subject namespace. However, pages in the Article, File,
-- MediaWiki or Category namespaces must have their /doc, /sandbox and
-- /testcases pages in talk space.
localsubjectSpace=env.subjectSpace
ifsubjectSpace==0orsubjectSpace==6orsubjectSpace==8orsubjectSpace==14then
returnsubjectSpace+1
else
returnsubjectSpace
end
end
functionenvFuncs.docpageBase()
-- The base page of the /doc, /sandbox, and /testcases subpages.
-- For some namespaces this is the talk page, rather than the template page.
localtemplateTitle=env.templateTitle
localdocSpace=env.docSpace
localdocSpaceText=mw.site.namespaces[docSpace].name
-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.
returndocSpaceText..':'..templateTitle.text
end
functionenvFuncs.compareUrl()
-- Diff link between the sandbox and the main template using [[Special:ComparePages]].
localtemplateTitle=env.templateTitle
localsandboxTitle=env.sandboxTitle
iftemplateTitle.existsandsandboxTitle.existsthen
localcompareUrl=mw.uri.canonicalUrl(
'Special:ComparePages',
{page1=templateTitle.prefixedText,page2=sandboxTitle.prefixedText}
)
returntostring(compareUrl)
else
returnnil
end
end
returnenv
end
----------------------------------------------------------------------------
-- Auxiliary templates
----------------------------------------------------------------------------
p.getModuleWikitext=makeInvokeFunc('_getModuleWikitext')
functionp._getModuleWikitext(args,env)
localcurrentTitle=mw.title.getCurrentTitle()
ifcurrentTitle.contentModel~='Scribunto'thenreturnend
pcall(require,currentTitle.prefixedText)-- if it fails, we don't care
localmoduleWikitext=package.loaded["Module:Module wikitext"]
ifmoduleWikitextthen
returnmoduleWikitext.main()
end
end
functionp.sandboxNotice(args,env)
--[=[
	-- Generates a sandbox notice for display above sandbox pages.
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- 
	-- Messages:
	-- 'sandbox-notice-image' --> '[[File:Sandbox.svg|50px|alt=|link=]]'
	-- 'sandbox-notice-blurb' --> 'This is the $1 for $2.'
	-- 'sandbox-notice-diff-blurb' --> 'This is the $1 for $2 ($3).'
	-- 'sandbox-notice-pagetype-template' --> '[[Wikipedia:Template test cases|template sandbox]] page'
	-- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] page'
	-- 'sandbox-notice-pagetype-other' --> 'sandbox page'
	-- 'sandbox-notice-compare-link-display' --> 'diff'
	-- 'sandbox-notice-testcases-blurb' --> 'See also the companion subpage for $1.'
	-- 'sandbox-notice-testcases-link-display' --> 'test cases'
	-- 'sandbox-category' --> 'Template sandboxes'
	-- 'module-sandbox-category' --> 'Module sandboxes'
	-- 'other-sandbox-category' --> 'Sandboxes outside of template or module namespace'
	--]=]
localtitle=env.title
localsandboxTitle=env.sandboxTitle
localtemplateTitle=env.templateTitle
localsubjectSpace=env.subjectSpace
ifnot(subjectSpaceandtitleandsandboxTitleandtemplateTitle
andmw.title.equals(title,sandboxTitle))then
returnnil
end
-- Build the table of arguments to pass to {{ombox}}. We need just two fields, "image" and "text".
localomargs={}
omargs.image=message('sandbox-notice-image')
-- Get the text. We start with the opening blurb, which is something like
-- "This is the template sandbox for [[Template:Foo]] (diff)."
localtext='__EXPECTUNUSEDTEMPLATE__'
localpagetype,sandboxCat
ifsubjectSpace==10then
pagetype=message('sandbox-notice-pagetype-template')
sandboxCat=message('sandbox-category')
elseifsubjectSpace==828then
pagetype=message('sandbox-notice-pagetype-module')
sandboxCat=message('module-sandbox-category')
else
pagetype=message('sandbox-notice-pagetype-other')
sandboxCat=message('other-sandbox-category')
end
localtemplateLink=makeWikilink(templateTitle.prefixedText)
localcompareUrl=env.compareUrl
ifcompareUrlthen
localcompareDisplay=message('sandbox-notice-compare-link-display')
localcompareLink=makeUrlLink(compareUrl,compareDisplay)
text=text..message('sandbox-notice-diff-blurb',{pagetype,templateLink,compareLink})
else
text=text..message('sandbox-notice-blurb',{pagetype,templateLink})
end
-- Get the test cases page blurb if the page exists. This is something like
-- "See also the companion subpage for [[Template:Foo/testcases|test cases]]."
localtestcasesTitle=env.testcasesTitle
iftestcasesTitleandtestcasesTitle.existsthen
iftestcasesTitle.contentModel=="Scribunto"then
localtestcasesLinkDisplay=message('sandbox-notice-testcases-link-display')
localtestcasesRunLinkDisplay=message('sandbox-notice-testcases-run-link-display')
localtestcasesLink=makeWikilink(testcasesTitle.prefixedText,testcasesLinkDisplay)
localtestcasesRunLink=makeWikilink(testcasesTitle.talkPageTitle.prefixedText,testcasesRunLinkDisplay)
text=text..'<br />'..message('sandbox-notice-testcases-run-blurb',{testcasesLink,testcasesRunLink})
else
localtestcasesLinkDisplay=message('sandbox-notice-testcases-link-display')
localtestcasesLink=makeWikilink(testcasesTitle.prefixedText,testcasesLinkDisplay)
text=text..'<br />'..message('sandbox-notice-testcases-blurb',{testcasesLink})
end
end
-- Add the sandbox to the sandbox category.
omargs.text=text..makeCategoryLink(sandboxCat)
-- 'documentation-clear'
return'<div class="'..message('clear')..'"></div>'
..require('Module:Message box').main('ombox',omargs)
end
functionp.protectionTemplate(env)
-- Generates the padlock icon in the top right.
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'protection-template' --> 'pp-template'
-- 'protection-template-args' --> {docusage = 'yes'}
localprotectionLevels=env.protectionLevels
ifnotprotectionLevelsthen
returnnil
end
localeditProt=protectionLevels.editandprotectionLevels.edit[1]
localmoveProt=protectionLevels.moveandprotectionLevels.move[1]
ifeditProtthen
-- The page is edit-protected.
returnrequire('Module:Protection banner')._main{
message('protection-reason-edit'),small=true
}
elseifmoveProtandmoveProt~='autoconfirmed'then
-- The page is move-protected but not edit-protected. Exclude move
-- protection with the level "autoconfirmed", as this is equivalent to
-- no move protection at all.
returnrequire('Module:Protection banner')._main{
action='move',small=true
}
else
returnnil
end
end
----------------------------------------------------------------------------
-- Start box
----------------------------------------------------------------------------
p.startBox=makeInvokeFunc('_startBox')
functionp._startBox(args,env)
--[[
	-- This function generates the start box.
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- 
	-- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make
	-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox
	-- which generate the box HTML.
	--]]
env=envorp.getEnvironment(args)
locallinks
localcontent=args.content
ifnotcontentorargs[1]then
-- No need to include the links if the documentation is on the template page itself.
locallinksData=p.makeStartBoxLinksData(args,env)
iflinksDatathen
links=p.renderStartBoxLinks(linksData)
end
end
-- Generate the start box html.
localdata=p.makeStartBoxData(args,env,links)
ifdatathen
returnp.renderStartBox(data)
else
-- User specified no heading.
returnnil
end
end
functionp.makeStartBoxLinksData(args,env)
--[[
	-- Does initial processing of data to make the [view] [edit] [history] [purge] links.
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- 
	-- Messages:
	-- 'view-link-display' --> 'view'
	-- 'edit-link-display' --> 'edit'
	-- 'history-link-display' --> 'history'
	-- 'purge-link-display' --> 'purge'
	-- 'module-preload' --> 'Template:Documentation/preload-module-doc'
	-- 'docpage-preload' --> 'Template:Documentation/preload'
	-- 'create-link-display' --> 'create'
	--]]
localsubjectSpace=env.subjectSpace
localtitle=env.title
localdocTitle=env.docTitle
ifnottitleornotdocTitlethen
returnnil
end
ifdocTitle.isRedirectthen
docTitle=docTitle.redirectTarget
end
-- Create link if /doc doesn't exist.
localpreload=args.preload
ifnotpreloadthen
ifsubjectSpace==828then-- Module namespace
preload=message('module-preload')
else
preload=message('docpage-preload')
end
end
return{
title=title,
docTitle=docTitle,
-- View, display, edit, and purge links if /doc exists.
viewLinkDisplay=message('view-link-display'),
editLinkDisplay=message('edit-link-display'),
historyLinkDisplay=message('history-link-display'),
purgeLinkDisplay=message('purge-link-display'),
preload=preload,
createLinkDisplay=message('create-link-display')
}
end
functionp.renderStartBoxLinks(data)
--[[
	-- Generates the [view][edit][history][purge] or [create][purge] links from the data table.
	-- @data - a table of data generated by p.makeStartBoxLinksData
	--]]
localdocTitle=data.docTitle
-- yes, we do intend to purge the template page on which the documentation appears
localpurgeLink=makeWikilink("Special:Purge/"..data.title.prefixedText,data.purgeLinkDisplay)
ifdocTitle.existsthen
localviewLink=makeWikilink(docTitle.prefixedText,data.viewLinkDisplay)
localeditLink=makeWikilink("Special:EditPage/"..docTitle.prefixedText,data.editLinkDisplay)
localhistoryLink=makeWikilink("Special:PageHistory/"..docTitle.prefixedText,data.historyLinkDisplay)
return"&#91;"..viewLink.."&#93; &#91;"..editLink.."&#93; &#91;"..historyLink.."&#93; &#91;"..purgeLink.."&#93;"
else
localcreateLink=makeUrlLink(docTitle:canonicalUrl{action='edit',preload=data.preload},data.createLinkDisplay)
return"&#91;"..createLink.."&#93; &#91;"..purgeLink.."&#93;"
end
returnret
end
functionp.makeStartBoxData(args,env,links)
--[=[
	-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- @links - a string containing the [view][edit][history][purge] links - could be nil if there's an error.
	--
	-- Messages:
	-- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'
	-- 'template-namespace-heading' --> 'Template documentation'
	-- 'module-namespace-heading' --> 'Module documentation'
	-- 'file-namespace-heading' --> 'Summary'
	-- 'other-namespaces-heading' --> 'Documentation'
	-- 'testcases-create-link-display' --> 'create'
	--]=]
localsubjectSpace=env.subjectSpace
ifnotsubjectSpacethen
-- Default to an "other namespaces" namespace, so that we get at least some output
-- if an error occurs.
subjectSpace=2
end
localdata={}
-- Heading
localheading=args.heading-- Blank values are not removed.
ifheading==''then
-- Don't display the start box if the heading arg is defined but blank.
returnnil
end
ifheadingthen
data.heading=heading
elseifsubjectSpace==10then-- Template namespace
data.heading=message('documentation-icon-wikitext')..' '..message('template-namespace-heading')
elseifsubjectSpace==828then-- Module namespace
data.heading=message('documentation-icon-wikitext')..' '..message('module-namespace-heading')
elseifsubjectSpace==6then-- File namespace
data.heading=message('file-namespace-heading')
else
data.heading=message('other-namespaces-heading')
end
-- Heading CSS
localheadingStyle=args['heading-style']
ifheadingStylethen
data.headingStyleText=headingStyle
else
-- 'documentation-heading'
data.headingClass=message('main-div-heading-class')
end
-- Data for the [view][edit][history][purge] or [create] links.
iflinksthen
-- 'mw-editsection-like plainlinks'
data.linksClass=message('start-box-link-classes')
data.links=links
end
returndata
end
functionp.renderStartBox(data)
-- Renders the start box html.
-- @data - a table of data generated by p.makeStartBoxData.
localsbox=mw.html.create('div')
sbox
-- 'documentation-startbox'
:addClass(message('start-box-class'))
:newline()
:tag('span')
:addClass(data.headingClass)
:attr('id','documentation-heading')
:cssText(data.headingStyleText)
:wikitext(data.heading)
locallinks=data.links
iflinksthen
sbox:tag('span')
:addClass(data.linksClass)
:attr('id',data.linksId)
:wikitext(links)
end
returntostring(sbox)
end
----------------------------------------------------------------------------
-- Documentation content
----------------------------------------------------------------------------
p.content=makeInvokeFunc('_content')
functionp._content(args,env)
-- Displays the documentation contents
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
env=envorp.getEnvironment(args)
localdocTitle=env.docTitle
localcontent=args.content
ifnotcontentanddocTitleanddocTitle.existsthen
content=args._contentormw.getCurrentFrame():expandTemplate{title=docTitle.prefixedText}
end
-- The line breaks below are necessary so that "=== Headings ===" at the start and end
-- of docs are interpreted correctly.
return'\n'..(contentor'')..'\n'
end
p.contentTitle=makeInvokeFunc('_contentTitle')
functionp._contentTitle(args,env)
env=envorp.getEnvironment(args)
localdocTitle=env.docTitle
ifnotargs.contentanddocTitleanddocTitle.existsthen
returndocTitle.prefixedText
else
return''
end
end
----------------------------------------------------------------------------
-- End box
----------------------------------------------------------------------------
p.endBox=makeInvokeFunc('_endBox')
functionp._endBox(args,env)
--[=[
	-- This function generates the end box (also known as the link box).
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- 
	--]=]
-- Get environment data.
env=envorp.getEnvironment(args)
localsubjectSpace=env.subjectSpace
localdocTitle=env.docTitle
ifnotsubjectSpaceornotdocTitlethen
returnnil
end
-- Check whether we should output the end box at all. Add the end
-- box by default if the documentation exists or if we are in the
-- user, module or template namespaces.
locallinkBox=args['link box']
iflinkBox=='off'
ornot(
docTitle.exists
orsubjectSpace==2
orsubjectSpace==828
orsubjectSpace==10
)
then
returnnil
end
-- Assemble the link box.
localtext=''
iflinkBoxthen
text=text..linkBox
else
text=text..(p.makeDocPageBlurb(args,env)or'')-- "This documentation is transcluded from [[Foo]]." 
ifsubjectSpace==2orsubjectSpace==10orsubjectSpace==828then
-- We are in the user, template or module namespaces.
-- Add sandbox and testcases links.
-- "Editors can experiment in this template's sandbox and testcases pages."
text=text..(p.makeExperimentBlurb(args,env)or'')..'<br />'
ifnotargs.contentandnotargs[1]then
-- "Please add categories to the /doc subpage."
-- Don't show this message with inline docs or with an explicitly specified doc page,
-- as then it is unclear where to add the categories.
text=text..(p.makeCategoriesBlurb(args,env)or'')
end
text=text..' '..(p.makeSubpagesBlurb(args,env)or'')--"Subpages of this template"
end
end
localbox=mw.html.create('div')
-- 'documentation-metadata'
box:attr('role','note')
:addClass(message('end-box-class'))
-- 'plainlinks'
:addClass(message('end-box-plainlinks'))
:wikitext(text)
:done()
return'\n'..tostring(box)
end
functionp.makeDocPageBlurb(args,env)
--[=[
	-- Makes the blurb "This documentation is transcluded from [[Template:Foo]] (edit, history)".
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- 
	-- Messages:
	-- 'edit-link-display' --> 'edit'
	-- 'history-link-display' --> 'history'
	-- 'transcluded-from-blurb' --> 
	-- 'The above [[Wikipedia:Template documentation|documentation]] 
	-- is [[Help:Transclusion|transcluded]] from $1.'
	-- 'module-preload' --> 'Template:Documentation/preload-module-doc'
	-- 'create-link-display' --> 'create'
	-- 'create-module-doc-blurb' -->
	-- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'
	--]=]
localdocTitle=env.docTitle
ifnotdocTitlethen
returnnil
end
ifdocTitle.existsthen
-- /doc exists; link to it.
localdocLink=makeWikilink(docTitle.prefixedText)
localeditDisplay=message('edit-link-display')
localeditLink=makeWikilink("Special:EditPage/"..docTitle.prefixedText,editDisplay)
localhistoryDisplay=message('history-link-display')
localhistoryLink=makeWikilink("Special:PageHistory/"..docTitle.prefixedText,historyDisplay)
returnmessage('transcluded-from-blurb',{docLink})
..' '
..makeToolbar(editLink,historyLink)
..'<br />'
elseifenv.subjectSpace==828then
-- /doc does not exist; ask to create it.
localcreateUrl=docTitle:canonicalUrl{action='edit',preload=message('module-preload')}
localcreateDisplay=message('create-link-display')
localcreateLink=makeUrlLink(createUrl,createDisplay)
returnmessage('create-module-doc-blurb',{createLink})
..'<br />'
end
end
functionp.makeExperimentBlurb(args,env)
--[[
	-- Renders the text "Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages."
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- 
	-- Messages:
	-- 'sandbox-link-display' --> 'sandbox'
	-- 'sandbox-edit-link-display' --> 'edit'
	-- 'compare-link-display' --> 'diff'
	-- 'module-sandbox-preload' --> 'Template:Documentation/preload-module-sandbox'
	-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'
	-- 'sandbox-create-link-display' --> 'create'
	-- 'mirror-edit-summary' --> 'Create sandbox version of $1'
	-- 'mirror-link-display' --> 'mirror'
	-- 'mirror-link-preload' --> 'Template:Documentation/mirror'
	-- 'sandbox-link-display' --> 'sandbox'
	-- 'testcases-link-display' --> 'testcases'
	-- 'testcases-edit-link-display'--> 'edit'
	-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'
	-- 'testcases-create-link-display' --> 'create'
	-- 'testcases-link-display' --> 'testcases'
	-- 'testcases-edit-link-display' --> 'edit'
	-- 'module-testcases-preload' --> 'Template:Documentation/preload-module-testcases'
	-- 'template-testcases-preload' --> 'Template:Documentation/preload-testcases'
	-- 'experiment-blurb-module' --> 'Editors can experiment in this module's $1 and $2 pages.'
	-- 'experiment-blurb-template' --> 'Editors can experiment in this template's $1 and $2 pages.'
	--]]
localsubjectSpace=env.subjectSpace
localtemplateTitle=env.templateTitle
localsandboxTitle=env.sandboxTitle
localtestcasesTitle=env.testcasesTitle
localtemplatePage=templateTitle.prefixedText
ifnotsubjectSpaceornottemplateTitleornotsandboxTitleornottestcasesTitlethen
returnnil
end
-- Make links.
localsandboxLinks,testcasesLinks
ifsandboxTitle.existsthen
localsandboxPage=sandboxTitle.prefixedText
localsandboxDisplay=message('sandbox-link-display')
localsandboxLink=makeWikilink(sandboxPage,sandboxDisplay)
localsandboxEditDisplay=message('sandbox-edit-link-display')
localsandboxEditLink=makeWikilink("Special:EditPage/"..sandboxPage,sandboxEditDisplay)
localcompareUrl=env.compareUrl
localcompareLink
ifcompareUrlthen
localcompareDisplay=message('compare-link-display')
compareLink=makeUrlLink(compareUrl,compareDisplay)
end
sandboxLinks=sandboxLink..' '..makeToolbar(sandboxEditLink,compareLink)
else
localsandboxPreload
ifsubjectSpace==828then
sandboxPreload=message('module-sandbox-preload')
else
sandboxPreload=message('template-sandbox-preload')
end
localsandboxCreateUrl=sandboxTitle:canonicalUrl{action='edit',preload=sandboxPreload}
localsandboxCreateDisplay=message('sandbox-create-link-display')
localsandboxCreateLink=makeUrlLink(sandboxCreateUrl,sandboxCreateDisplay)
localmirrorSummary=message('mirror-edit-summary',{makeWikilink(templatePage)})
localmirrorPreload=message('mirror-link-preload')
localmirrorUrl=sandboxTitle:canonicalUrl{action='edit',preload=mirrorPreload,summary=mirrorSummary}
ifsubjectSpace==828then
mirrorUrl=sandboxTitle:canonicalUrl{action='edit',preload=templateTitle.prefixedText,summary=mirrorSummary}
end
localmirrorDisplay=message('mirror-link-display')
localmirrorLink=makeUrlLink(mirrorUrl,mirrorDisplay)
sandboxLinks=message('sandbox-link-display')..' '..makeToolbar(sandboxCreateLink,mirrorLink)
end
iftestcasesTitle.existsthen
localtestcasesPage=testcasesTitle.prefixedText
localtestcasesDisplay=message('testcases-link-display')
localtestcasesLink=makeWikilink(testcasesPage,testcasesDisplay)
localtestcasesEditUrl=testcasesTitle:canonicalUrl{action='edit'}
localtestcasesEditDisplay=message('testcases-edit-link-display')
localtestcasesEditLink=makeWikilink("Special:EditPage/"..testcasesPage,testcasesEditDisplay)
-- for Modules, add testcases run link if exists
iftestcasesTitle.contentModel=="Scribunto"andtestcasesTitle.talkPageTitleandtestcasesTitle.talkPageTitle.existsthen
localtestcasesRunLinkDisplay=message('testcases-run-link-display')
localtestcasesRunLink=makeWikilink(testcasesTitle.talkPageTitle.prefixedText,testcasesRunLinkDisplay)
testcasesLinks=testcasesLink..' '..makeToolbar(testcasesEditLink,testcasesRunLink)
else
testcasesLinks=testcasesLink..' '..makeToolbar(testcasesEditLink)
end
else
localtestcasesPreload
ifsubjectSpace==828then
testcasesPreload=message('module-testcases-preload')
else
testcasesPreload=message('template-testcases-preload')
end
localtestcasesCreateUrl=testcasesTitle:canonicalUrl{action='edit',preload=testcasesPreload}
localtestcasesCreateDisplay=message('testcases-create-link-display')
localtestcasesCreateLink=makeUrlLink(testcasesCreateUrl,testcasesCreateDisplay)
testcasesLinks=message('testcases-link-display')..' '..makeToolbar(testcasesCreateLink)
end
localmessageName
ifsubjectSpace==828then
messageName='experiment-blurb-module'
else
messageName='experiment-blurb-template'
end
returnmessage(messageName,{sandboxLinks,testcasesLinks})
end
functionp.makeCategoriesBlurb(args,env)
--[[
	-- Generates the text "Please add categories to the /doc subpage."
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- Messages:
	-- 'doc-link-display' --> '/doc'
	-- 'add-categories-blurb' --> 'Please add categories to the $1 subpage.'
	--]]
localdocTitle=env.docTitle
ifnotdocTitlethen
returnnil
end
localdocPathLink=makeWikilink(docTitle.prefixedText,message('doc-link-display'))
returnmessage('add-categories-blurb',{docPathLink})
end
functionp.makeSubpagesBlurb(args,env)
--[[
	-- Generates the "Subpages of this template" link.
	-- @args - a table of arguments passed by the user
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- Messages:
	-- 'template-pagetype' --> 'template'
	-- 'module-pagetype' --> 'module'
	-- 'default-pagetype' --> 'page'
	-- 'subpages-link-display' --> 'Subpages of this $1'
	--]]
localsubjectSpace=env.subjectSpace
localtemplateTitle=env.templateTitle
ifnotsubjectSpaceornottemplateTitlethen
returnnil
end
localpagetype
ifsubjectSpace==10then
pagetype=message('template-pagetype')
elseifsubjectSpace==828then
pagetype=message('module-pagetype')
else
pagetype=message('default-pagetype')
end
localsubpagesLink=makeWikilink(
'Special:PrefixIndex/'..templateTitle.prefixedText..'/',
message('subpages-link-display',{pagetype})
)
returnmessage('subpages-blurb',{subpagesLink})
end
----------------------------------------------------------------------------
-- Tracking categories
----------------------------------------------------------------------------
functionp.addTrackingCategories(env)
--[[
	-- Check if {{documentation}} is transcluded on a /doc or /testcases page.
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment
	-- Messages:
	-- 'display-strange-usage-category' --> true
	-- 'doc-subpage' --> 'doc'
	-- 'testcases-subpage' --> 'testcases'
	-- 'strange-usage-category' --> 'Wikipedia pages with strange ((documentation)) usage'
	-- 
	-- /testcases pages in the module namespace are not categorised, as they may have
	-- {{documentation}} transcluded automatically.
	--]]
localtitle=env.title
localsubjectSpace=env.subjectSpace
ifnottitleornotsubjectSpacethen
returnnil
end
localsubpage=title.subpageText
ifmessage('display-strange-usage-category',nil,'boolean')
and(
subpage==message('doc-subpage')
orsubjectSpace~=828andsubpage==message('testcases-subpage')
)
then
returnmakeCategoryLink(message('strange-usage-category'))
end
return''
end
returnp