<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://anthrodia.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ADocumentation</id>
	<title>Module:Documentation - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://anthrodia.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ADocumentation"/>
	<link rel="alternate" type="text/html" href="https://anthrodia.wiki/index.php?title=Module:Documentation&amp;action=history"/>
	<updated>2026-07-31T18:46:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://anthrodia.wiki/index.php?title=Module:Documentation&amp;diff=109&amp;oldid=prev</id>
		<title>Leftie: 2 revisions imported</title>
		<link rel="alternate" type="text/html" href="https://anthrodia.wiki/index.php?title=Module:Documentation&amp;diff=109&amp;oldid=prev"/>
		<updated>2026-05-27T12:09:25Z</updated>

		<summary type="html">&lt;p&gt;2 revisions imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:09, 27 May 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Leftie</name></author>
	</entry>
	<entry>
		<id>https://anthrodia.wiki/index.php?title=Module:Documentation&amp;diff=108&amp;oldid=prev</id>
		<title>Leftie: 1 revision imported: Import even more templates</title>
		<link rel="alternate" type="text/html" href="https://anthrodia.wiki/index.php?title=Module:Documentation&amp;diff=108&amp;oldid=prev"/>
		<updated>2024-06-27T16:24:36Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported: Import even more templates&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:24, 27 June 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Leftie</name></author>
	</entry>
	<entry>
		<id>https://anthrodia.wiki/index.php?title=Module:Documentation&amp;diff=107&amp;oldid=prev</id>
		<title>dev&gt;Pppery: Pppery moved page Module:Documentation/2 to Module:Documentation without leaving a redirect</title>
		<link rel="alternate" type="text/html" href="https://anthrodia.wiki/index.php?title=Module:Documentation&amp;diff=107&amp;oldid=prev"/>
		<updated>2022-09-30T02:36:08Z</updated>

		<summary type="html">&lt;p&gt;Pppery moved page &lt;a href=&quot;/index.php?title=Module:Documentation/2&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:Documentation/2 (page does not exist)&quot;&gt;Module:Documentation/2&lt;/a&gt; to &lt;a href=&quot;/Module:Documentation&quot; title=&quot;Module:Documentation&quot;&gt;Module:Documentation&lt;/a&gt; without leaving a redirect&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module implements {{documentation}}.&lt;br /&gt;
&lt;br /&gt;
-- Get required modules.&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
-- Get the config table.&lt;br /&gt;
local cfg = mw.loadData(&amp;#039;Module:Documentation/config&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Often-used functions.&lt;br /&gt;
local ugsub = mw.ustring.gsub&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--&lt;br /&gt;
-- These are defined as local functions, but are made available in the p&lt;br /&gt;
-- table for testing purposes.&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function message(cfgKey, valArray, expectType)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Gets a message from the cfg table and formats it if appropriate.&lt;br /&gt;
	-- The function raises an error if the value from the cfg table is not&lt;br /&gt;
	-- of the type expectType. The default type for expectType is &amp;#039;string&amp;#039;.&lt;br /&gt;
	-- If the table valArray is present, strings such as $1, $2 etc. in the&lt;br /&gt;
	-- message are substituted with values from the table keys [1], [2] etc.&lt;br /&gt;
	-- For example, if the message &amp;quot;foo-message&amp;quot; had the value &amp;#039;Foo $2 bar $1.&amp;#039;,&lt;br /&gt;
	-- message(&amp;#039;foo-message&amp;#039;, {&amp;#039;baz&amp;#039;, &amp;#039;qux&amp;#039;}) would return &amp;quot;Foo qux bar baz.&amp;quot;&lt;br /&gt;
	--]]&lt;br /&gt;
	local msg = cfg[cfgKey]&lt;br /&gt;
	expectType = expectType or &amp;#039;string&amp;#039;&lt;br /&gt;
	if type(msg) ~= expectType then&lt;br /&gt;
		error(&amp;#039;message: type error in message cfg.&amp;#039; .. cfgKey .. &amp;#039; (&amp;#039; .. expectType .. &amp;#039; expected, got &amp;#039; .. type(msg) .. &amp;#039;)&amp;#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if not valArray then&lt;br /&gt;
		return msg&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function getMessageVal(match)&lt;br /&gt;
		match = tonumber(match)&lt;br /&gt;
		return valArray[match] or error(&amp;#039;message: no value found for key $&amp;#039; .. match .. &amp;#039; in message cfg.&amp;#039; .. cfgKey, 4)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ugsub(msg, &amp;#039;$([1-9][0-9]*)&amp;#039;, getMessageVal)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.message = message&lt;br /&gt;
&lt;br /&gt;
local function makeWikilink(page, display)&lt;br /&gt;
	if display then&lt;br /&gt;
		return mw.ustring.format(&amp;#039;[[%s|%s]]&amp;#039;, page, display)&lt;br /&gt;
	else&lt;br /&gt;
		return mw.ustring.format(&amp;#039;[[%s]]&amp;#039;, page)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeWikilink = makeWikilink&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(cat, sort)&lt;br /&gt;
	local catns = mw.site.namespaces[14].name&lt;br /&gt;
	return makeWikilink(catns .. &amp;#039;:&amp;#039; .. cat, sort)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeCategoryLink = makeCategoryLink&lt;br /&gt;
&lt;br /&gt;
local function makeUrlLink(url, display)&lt;br /&gt;
	return mw.ustring.format(&amp;#039;[%s %s]&amp;#039;, url, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeUrlLink = makeUrlLink&lt;br /&gt;
&lt;br /&gt;
local function makeToolbar(...)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local lim = select(&amp;#039;#&amp;#039;, ...)&lt;br /&gt;
	if lim &amp;lt; 1 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, lim do&lt;br /&gt;
		ret[#ret + 1] = select(i, ...)&lt;br /&gt;
	end&lt;br /&gt;
	-- &amp;#039;documentation-toolbar&amp;#039;&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;&amp;#039; .. message(&amp;#039;toolbar-class&amp;#039;) .. &amp;#039;&amp;quot;&amp;gt;(&amp;#039;&lt;br /&gt;
		.. table.concat(ret, &amp;#039; &amp;amp;#124; &amp;#039;) .. &amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
p.makeToolbar = makeToolbar&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Argument processing&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = getArgs(frame, {&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
				if type(value) == &amp;#039;string&amp;#039; then&lt;br /&gt;
					value = value:match(&amp;#039;^%s*(.-)%s*$&amp;#039;) -- Remove whitespace.&lt;br /&gt;
					if key == &amp;#039;heading&amp;#039; or value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
						return value&lt;br /&gt;
					else&lt;br /&gt;
						return nil&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					return value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
		return p[funcName](args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Entry points&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.nonexistent(frame)&lt;br /&gt;
	if mw.title.getCurrentTitle().subpageText == &amp;#039;testcases&amp;#039; then&lt;br /&gt;
		return frame:expandTemplate{title = &amp;#039;module test cases notice&amp;#039;}&lt;br /&gt;
	else&lt;br /&gt;
		return p.main(frame)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = makeInvokeFunc(&amp;#039;_main&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- This function defines logic flow for the module.&lt;br /&gt;
	-- @args - table of arguments passed by the user&lt;br /&gt;
	--]]&lt;br /&gt;
	local env = p.getEnvironment(args)&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	root&lt;br /&gt;
		:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			-- &amp;#039;documentation-container&amp;#039;&lt;br /&gt;
			:addClass(message(&amp;#039;container&amp;#039;))&lt;br /&gt;
			:attr(&amp;#039;role&amp;#039;, &amp;#039;complementary&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;aria-labelledby&amp;#039;, args.heading ~= &amp;#039;&amp;#039; and &amp;#039;documentation-heading&amp;#039; or nil)&lt;br /&gt;
			:attr(&amp;#039;aria-label&amp;#039;, args.heading == &amp;#039;&amp;#039; and &amp;#039;Documentation&amp;#039; or nil)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				-- &amp;#039;documentation&amp;#039;&lt;br /&gt;
				:addClass(message(&amp;#039;main-div-classes&amp;#039;))&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(p._startBox(args, env))&lt;br /&gt;
				:wikitext(p._content(args, env))&lt;br /&gt;
				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
					-- &amp;#039;documentation-clear&amp;#039;&lt;br /&gt;
					:addClass(message(&amp;#039;clear&amp;#039;))&lt;br /&gt;
					:done()&lt;br /&gt;
				:newline()&lt;br /&gt;
				:done()&lt;br /&gt;
			:wikitext(p._endBox(args, env))&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(p.addTrackingCategories(env))&lt;br /&gt;
	-- &amp;#039;Module:Documentation/styles.css&amp;#039;&lt;br /&gt;
	return mw.getCurrentFrame():extensionTag (&lt;br /&gt;
		&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src=cfg[&amp;#039;templatestyles&amp;#039;]&lt;br /&gt;
	}) .. tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Environment settings&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.getEnvironment(args)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Returns a table with information about the environment, including title&lt;br /&gt;
	-- objects and other namespace- or path-related data.&lt;br /&gt;
	-- @args - table of arguments passed by the user&lt;br /&gt;
	--&lt;br /&gt;
	-- Title objects include:&lt;br /&gt;
	-- env.title - the page we are making documentation for (usually the current title)&lt;br /&gt;
	-- env.templateTitle - the template (or module, file, etc.)&lt;br /&gt;
	-- env.docTitle - the /doc subpage.&lt;br /&gt;
	-- env.sandboxTitle - the /sandbox subpage.&lt;br /&gt;
	-- env.testcasesTitle - the /testcases subpage.&lt;br /&gt;
	--&lt;br /&gt;
	-- Data includes:&lt;br /&gt;
	-- env.subjectSpace - the number of the title&amp;#039;s subject namespace.&lt;br /&gt;
	-- env.docSpace - the number of the namespace the title puts its documentation in.&lt;br /&gt;
	-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.&lt;br /&gt;
	-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.&lt;br /&gt;
	-- &lt;br /&gt;
	-- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value&lt;br /&gt;
	-- returned will be nil.&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	local env, envFuncs = {}, {}&lt;br /&gt;
&lt;br /&gt;
	-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value&lt;br /&gt;
	-- returned by that function is memoized in the env table so that we don&amp;#039;t call any of the functions&lt;br /&gt;
	-- more than once. (Nils won&amp;#039;t be memoized.)&lt;br /&gt;
	setmetatable(env, {&lt;br /&gt;
		__index = function (t, key)&lt;br /&gt;
			local envFunc = envFuncs[key]&lt;br /&gt;
			if envFunc then&lt;br /&gt;
				local success, val = pcall(envFunc)&lt;br /&gt;
				if success then&lt;br /&gt;
					env[key] = val -- Memoise the value.&lt;br /&gt;
					return val&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	})	&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.title()&lt;br /&gt;
		-- The title object for the current page, or a test page passed with args.page.&lt;br /&gt;
		local title&lt;br /&gt;
		local titleArg = args.page&lt;br /&gt;
		if titleArg then&lt;br /&gt;
			title = mw.title.new(titleArg)&lt;br /&gt;
		else&lt;br /&gt;
			title = mw.title.getCurrentTitle()&lt;br /&gt;
		end&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.templateTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- The template (or module, etc.) title object.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &amp;#039;sandbox-subpage&amp;#039; --&amp;gt; &amp;#039;sandbox&amp;#039;&lt;br /&gt;
		-- &amp;#039;testcases-subpage&amp;#039; --&amp;gt; &amp;#039;testcases&amp;#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		local subjectSpace = env.subjectSpace&lt;br /&gt;
		local title = env.title&lt;br /&gt;
		local subpage = title.subpageText&lt;br /&gt;
		if subpage == message(&amp;#039;sandbox-subpage&amp;#039;) or subpage == message(&amp;#039;testcases-subpage&amp;#039;) then&lt;br /&gt;
			return mw.title.makeTitle(subjectSpace, title.baseText)&lt;br /&gt;
		else&lt;br /&gt;
			return mw.title.makeTitle(subjectSpace, title.text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object of the /doc subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &amp;#039;doc-subpage&amp;#039; --&amp;gt; &amp;#039;doc&amp;#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		local title = env.title&lt;br /&gt;
		local docname = args[1] -- User-specified doc page.&lt;br /&gt;
		local docpage&lt;br /&gt;
		if docname then&lt;br /&gt;
			docpage = docname&lt;br /&gt;
		else&lt;br /&gt;
			docpage = env.docpageBase .. &amp;#039;/&amp;#039; .. message(&amp;#039;doc-subpage&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		return mw.title.new(docpage)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.sandboxTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /sandbox subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &amp;#039;sandbox-subpage&amp;#039; --&amp;gt; &amp;#039;sandbox&amp;#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		return mw.title.new(env.docpageBase .. &amp;#039;/&amp;#039; .. message(&amp;#039;sandbox-subpage&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.testcasesTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /testcases subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &amp;#039;testcases-subpage&amp;#039; --&amp;gt; &amp;#039;testcases&amp;#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		return mw.title.new(env.docpageBase .. &amp;#039;/&amp;#039; .. message(&amp;#039;testcases-subpage&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.subjectSpace()&lt;br /&gt;
		-- The subject namespace number.&lt;br /&gt;
		return mw.site.namespaces[env.title.namespace].subject.id&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docSpace()&lt;br /&gt;
		-- The documentation namespace number. For most namespaces this is the&lt;br /&gt;
		-- same as the subject namespace. However, pages in the Article, File,&lt;br /&gt;
		-- MediaWiki or Category namespaces must have their /doc, /sandbox and&lt;br /&gt;
		-- /testcases pages in talk space.&lt;br /&gt;
		local subjectSpace = env.subjectSpace&lt;br /&gt;
		if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then&lt;br /&gt;
			return subjectSpace + 1&lt;br /&gt;
		else&lt;br /&gt;
			return subjectSpace&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docpageBase()&lt;br /&gt;
		-- The base page of the /doc, /sandbox, and /testcases subpages.&lt;br /&gt;
		-- For some namespaces this is the talk page, rather than the template page.&lt;br /&gt;
		local templateTitle = env.templateTitle&lt;br /&gt;
		local docSpace = env.docSpace&lt;br /&gt;
		local docSpaceText = mw.site.namespaces[docSpace].name&lt;br /&gt;
		-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.&lt;br /&gt;
		return docSpaceText .. &amp;#039;:&amp;#039; .. templateTitle.text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.compareUrl()&lt;br /&gt;
		-- Diff link between the sandbox and the main template using [[Special:ComparePages]].&lt;br /&gt;
		local templateTitle = env.templateTitle&lt;br /&gt;
		local sandboxTitle = env.sandboxTitle&lt;br /&gt;
		if templateTitle.exists and sandboxTitle.exists then&lt;br /&gt;
			local compareUrl = mw.uri.fullUrl(&lt;br /&gt;
				&amp;#039;Special:ComparePages&amp;#039;,&lt;br /&gt;
				{ page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText}&lt;br /&gt;
			)&lt;br /&gt;
			return tostring(compareUrl)&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end		&lt;br /&gt;
&lt;br /&gt;
	return env&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Start box&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.startBox = makeInvokeFunc(&amp;#039;_startBox&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._startBox(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- This function generates the start box.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make&lt;br /&gt;
	-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox&lt;br /&gt;
	-- which generate the box HTML.&lt;br /&gt;
	--]]&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local links&lt;br /&gt;
	local content = args.content&lt;br /&gt;
	if not content or args[1] then&lt;br /&gt;
		-- No need to include the links if the documentation is on the template page itself.&lt;br /&gt;
		local linksData = p.makeStartBoxLinksData(args, env)&lt;br /&gt;
		if linksData then&lt;br /&gt;
			links = p.renderStartBoxLinks(linksData)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Generate the start box html.&lt;br /&gt;
	local data = p.makeStartBoxData(args, env, links)&lt;br /&gt;
	if data then&lt;br /&gt;
		return p.renderStartBox(data)&lt;br /&gt;
	else&lt;br /&gt;
		-- User specified no heading.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeStartBoxLinksData(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Does initial processing of data to make the [view] [edit] [history] [purge] links.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &amp;#039;view-link-display&amp;#039; --&amp;gt; &amp;#039;view&amp;#039;&lt;br /&gt;
	-- &amp;#039;edit-link-display&amp;#039; --&amp;gt; &amp;#039;edit&amp;#039;&lt;br /&gt;
	-- &amp;#039;history-link-display&amp;#039; --&amp;gt; &amp;#039;history&amp;#039;&lt;br /&gt;
	-- &amp;#039;purge-link-display&amp;#039; --&amp;gt; &amp;#039;purge&amp;#039;&lt;br /&gt;
	-- &amp;#039;module-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/preload-module-doc&amp;#039;&lt;br /&gt;
	-- &amp;#039;docpage-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/preload&amp;#039;&lt;br /&gt;
	-- &amp;#039;create-link-display&amp;#039; --&amp;gt; &amp;#039;create&amp;#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not title or not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if docTitle.isRedirect then &lt;br /&gt;
		docTitle = docTitle.redirectTarget&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local data = {}&lt;br /&gt;
	data.title = title&lt;br /&gt;
	data.docTitle = docTitle&lt;br /&gt;
	-- View, display, edit, and purge links if /doc exists.&lt;br /&gt;
	data.viewLinkDisplay = message(&amp;#039;view-link-display&amp;#039;)&lt;br /&gt;
	data.editLinkDisplay = message(&amp;#039;edit-link-display&amp;#039;)&lt;br /&gt;
	data.historyLinkDisplay = message(&amp;#039;history-link-display&amp;#039;)&lt;br /&gt;
	data.purgeLinkDisplay = message(&amp;#039;purge-link-display&amp;#039;)&lt;br /&gt;
	-- Create link if /doc doesn&amp;#039;t exist.&lt;br /&gt;
	local preload = args.preload&lt;br /&gt;
	if not preload then&lt;br /&gt;
		if subjectSpace == 828 then -- Module namespace&lt;br /&gt;
			preload = message(&amp;#039;module-preload&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			preload = message(&amp;#039;docpage-preload&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	data.preload = preload&lt;br /&gt;
	data.createLinkDisplay = message(&amp;#039;create-link-display&amp;#039;)&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderStartBoxLinks(data)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the [view][edit][history][purge] or [create][purge] links from the data table.&lt;br /&gt;
	-- @data - a table of data generated by p.makeStartBoxLinksData&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	local function escapeBrackets(s)&lt;br /&gt;
		-- Escapes square brackets with HTML entities.&lt;br /&gt;
		s = s:gsub(&amp;#039;%[&amp;#039;, &amp;#039;&amp;amp;#91;&amp;#039;) -- Replace square brackets with HTML entities.&lt;br /&gt;
		s = s:gsub(&amp;#039;%]&amp;#039;, &amp;#039;&amp;amp;#93;&amp;#039;)&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret&lt;br /&gt;
	local docTitle = data.docTitle&lt;br /&gt;
	local title = data.title&lt;br /&gt;
	local purgeLink = makeUrlLink(title:fullUrl{action = &amp;#039;purge&amp;#039;}, data.purgeLinkDisplay)&lt;br /&gt;
	if docTitle.exists then&lt;br /&gt;
		local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay)&lt;br /&gt;
		local editLink = makeUrlLink(docTitle:fullUrl{action = &amp;#039;edit&amp;#039;}, data.editLinkDisplay)&lt;br /&gt;
		local historyLink = makeUrlLink(docTitle:fullUrl{action = &amp;#039;history&amp;#039;}, data.historyLinkDisplay)&lt;br /&gt;
		ret = &amp;#039;[%s] [%s] [%s] [%s]&amp;#039;&lt;br /&gt;
		ret = escapeBrackets(ret)&lt;br /&gt;
		ret = mw.ustring.format(ret, viewLink, editLink, historyLink, purgeLink)&lt;br /&gt;
	else&lt;br /&gt;
		local createLink = makeUrlLink(docTitle:fullUrl{action = &amp;#039;edit&amp;#039;, preload = data.preload}, data.createLinkDisplay)&lt;br /&gt;
		ret = &amp;#039;[%s] [%s]&amp;#039;&lt;br /&gt;
		ret = escapeBrackets(ret)&lt;br /&gt;
		ret = mw.ustring.format(ret, createLink, purgeLink)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeStartBoxData(args, env, links)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- @links - a string containing the [view][edit][history][purge] links - could be nil if there&amp;#039;s an error.&lt;br /&gt;
	--&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &amp;#039;documentation-icon-wikitext&amp;#039; --&amp;gt; &amp;#039;[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]&amp;#039;&lt;br /&gt;
	-- &amp;#039;template-namespace-heading&amp;#039; --&amp;gt; &amp;#039;Template documentation&amp;#039;&lt;br /&gt;
	-- &amp;#039;module-namespace-heading&amp;#039; --&amp;gt; &amp;#039;Module documentation&amp;#039;&lt;br /&gt;
	-- &amp;#039;file-namespace-heading&amp;#039; --&amp;gt; &amp;#039;Summary&amp;#039;&lt;br /&gt;
	-- &amp;#039;other-namespaces-heading&amp;#039; --&amp;gt; &amp;#039;Documentation&amp;#039;&lt;br /&gt;
	-- &amp;#039;testcases-create-link-display&amp;#039; --&amp;gt; &amp;#039;create&amp;#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not subjectSpace then&lt;br /&gt;
		-- Default to an &amp;quot;other namespaces&amp;quot; namespace, so that we get at least some output&lt;br /&gt;
		-- if an error occurs.&lt;br /&gt;
		subjectSpace = 2&lt;br /&gt;
	end&lt;br /&gt;
	local data = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Heading&lt;br /&gt;
	local heading = args.heading -- Blank values are not removed.&lt;br /&gt;
	if heading == &amp;#039;&amp;#039; then&lt;br /&gt;
		-- Don&amp;#039;t display the start box if the heading arg is defined but blank.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if heading then&lt;br /&gt;
		data.heading = heading&lt;br /&gt;
	elseif subjectSpace == 10 then -- Template namespace&lt;br /&gt;
		data.heading = message(&amp;#039;documentation-icon-wikitext&amp;#039;) .. &amp;#039; &amp;#039; .. message(&amp;#039;template-namespace-heading&amp;#039;)&lt;br /&gt;
	elseif subjectSpace == 828 then -- Module namespace&lt;br /&gt;
		data.heading = message(&amp;#039;documentation-icon-wikitext&amp;#039;) .. &amp;#039; &amp;#039; .. message(&amp;#039;module-namespace-heading&amp;#039;)&lt;br /&gt;
	elseif subjectSpace == 6 then -- File namespace&lt;br /&gt;
		data.heading = message(&amp;#039;file-namespace-heading&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		data.heading = message(&amp;#039;other-namespaces-heading&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Heading CSS&lt;br /&gt;
	local headingStyle = args[&amp;#039;heading-style&amp;#039;]&lt;br /&gt;
	if headingStyle then&lt;br /&gt;
		data.headingStyleText = headingStyle&lt;br /&gt;
	else&lt;br /&gt;
		-- &amp;#039;documentation-heading&amp;#039;&lt;br /&gt;
		data.headingClass = message(&amp;#039;main-div-heading-class&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Data for the [view][edit][history][purge] or [create] links.&lt;br /&gt;
	if links then&lt;br /&gt;
		-- &amp;#039;mw-editsection-like plainlinks&amp;#039;&lt;br /&gt;
		data.linksClass = message(&amp;#039;start-box-link-classes&amp;#039;)&lt;br /&gt;
		data.links = links&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderStartBox(data)&lt;br /&gt;
	-- Renders the start box html.&lt;br /&gt;
	-- @data - a table of data generated by p.makeStartBoxData.&lt;br /&gt;
	local sbox = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	sbox&lt;br /&gt;
		-- &amp;#039;documentation-startbox&amp;#039;&lt;br /&gt;
		:addClass(message(&amp;#039;start-box-class&amp;#039;))&lt;br /&gt;
		:newline()&lt;br /&gt;
		:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:addClass(data.headingClass)&lt;br /&gt;
			:attr(&amp;#039;id&amp;#039;, &amp;#039;documentation-heading&amp;#039;)&lt;br /&gt;
			:cssText(data.headingStyleText)&lt;br /&gt;
			:wikitext(data.heading)&lt;br /&gt;
	local links = data.links&lt;br /&gt;
	if links then&lt;br /&gt;
		sbox:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:addClass(data.linksClass)&lt;br /&gt;
			:attr(&amp;#039;id&amp;#039;, data.linksId)&lt;br /&gt;
			:wikitext(links)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(sbox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Documentation content&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.content = makeInvokeFunc(&amp;#039;_content&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._content(args, env)&lt;br /&gt;
	-- Displays the documentation contents&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	local content = args.content&lt;br /&gt;
	if not content and docTitle and docTitle.exists then&lt;br /&gt;
		content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText}&lt;br /&gt;
	end&lt;br /&gt;
	-- The line breaks below are necessary so that &amp;quot;=== Headings ===&amp;quot; at the start and end&lt;br /&gt;
	-- of docs are interpreted correctly.&lt;br /&gt;
	return &amp;#039;\n&amp;#039; .. (content or &amp;#039;&amp;#039;) .. &amp;#039;\n&amp;#039; &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.contentTitle = makeInvokeFunc(&amp;#039;_contentTitle&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._contentTitle(args, env)&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not args.content and docTitle and docTitle.exists then&lt;br /&gt;
		return docTitle.prefixedText&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- End box&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.endBox = makeInvokeFunc(&amp;#039;_endBox&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._endBox(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- This function generates the end box (also known as the link box).&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	--]=]&lt;br /&gt;
	&lt;br /&gt;
	-- Get environment data.&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not subjectSpace or not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	-- Check whether we should output the end box at all. Add the end&lt;br /&gt;
	-- box by default if the documentation exists or if we are in the&lt;br /&gt;
	-- user, module or template namespaces.&lt;br /&gt;
	local linkBox = args[&amp;#039;link box&amp;#039;]&lt;br /&gt;
	if linkBox == &amp;#039;off&amp;#039;&lt;br /&gt;
		or not (&lt;br /&gt;
			docTitle.exists&lt;br /&gt;
			or subjectSpace == 2&lt;br /&gt;
			or subjectSpace == 828&lt;br /&gt;
			or subjectSpace == 10&lt;br /&gt;
		)&lt;br /&gt;
	then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Assemble the link box.&lt;br /&gt;
	local text = &amp;#039;&amp;#039;&lt;br /&gt;
	if linkBox then&lt;br /&gt;
		text = text .. linkBox&lt;br /&gt;
	else&lt;br /&gt;
		text = text .. (p.makeDocPageBlurb(args, env) or &amp;#039;&amp;#039;) -- &amp;quot;This documentation is transcluded from [[Foo]].&amp;quot; &lt;br /&gt;
		if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then&lt;br /&gt;
			-- We are in the user, template or module namespaces.&lt;br /&gt;
			-- Add sandbox and testcases links.&lt;br /&gt;
			-- &amp;quot;Editors can experiment in this template&amp;#039;s sandbox and testcases pages.&amp;quot;&lt;br /&gt;
			text = text .. (p.makeExperimentBlurb(args, env) or &amp;#039;&amp;#039;) .. &amp;#039;&amp;lt;br /&amp;gt;&amp;#039;&lt;br /&gt;
			if not args.content and not args[1] then&lt;br /&gt;
				-- &amp;quot;Please add categories to the /doc subpage.&amp;quot;&lt;br /&gt;
				-- Don&amp;#039;t show this message with inline docs or with an explicitly specified doc page,&lt;br /&gt;
				-- as then it is unclear where to add the categories.&lt;br /&gt;
				text = text .. (p.makeCategoriesBlurb(args, env) or &amp;#039;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			text = text .. &amp;#039; &amp;#039; .. (p.makeSubpagesBlurb(args, env) or &amp;#039;&amp;#039;) --&amp;quot;Subpages of this template&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local box = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	-- &amp;#039;documentation-metadata&amp;#039;&lt;br /&gt;
	box:attr(&amp;#039;role&amp;#039;, &amp;#039;note&amp;#039;)&lt;br /&gt;
		:addClass(message(&amp;#039;end-box-class&amp;#039;))&lt;br /&gt;
		-- &amp;#039;plainlinks&amp;#039;&lt;br /&gt;
		:addClass(message(&amp;#039;end-box-plainlinks&amp;#039;))&lt;br /&gt;
		:wikitext(text)&lt;br /&gt;
		:done()&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039;\n&amp;#039; .. tostring(box)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeDocPageBlurb(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Makes the blurb &amp;quot;This documentation is transcluded from [[Template:Foo]] (edit, history)&amp;quot;.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &amp;#039;edit-link-display&amp;#039; --&amp;gt; &amp;#039;edit&amp;#039;&lt;br /&gt;
	-- &amp;#039;history-link-display&amp;#039; --&amp;gt; &amp;#039;history&amp;#039;&lt;br /&gt;
	-- &amp;#039;transcluded-from-blurb&amp;#039; --&amp;gt; &lt;br /&gt;
	-- &amp;#039;The above [[Wikipedia:Template documentation|documentation]] &lt;br /&gt;
	-- is [[Help:Transclusion|transcluded]] from $1.&amp;#039;&lt;br /&gt;
	-- &amp;#039;module-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/preload-module-doc&amp;#039;&lt;br /&gt;
	-- &amp;#039;create-link-display&amp;#039; --&amp;gt; &amp;#039;create&amp;#039;&lt;br /&gt;
	-- &amp;#039;create-module-doc-blurb&amp;#039; --&amp;gt;&lt;br /&gt;
	-- &amp;#039;You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].&amp;#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local ret&lt;br /&gt;
	if docTitle.exists then&lt;br /&gt;
		-- /doc exists; link to it.&lt;br /&gt;
		local docLink = makeWikilink(docTitle.prefixedText)&lt;br /&gt;
		local editUrl = docTitle:fullUrl{action = &amp;#039;edit&amp;#039;}&lt;br /&gt;
		local editDisplay = message(&amp;#039;edit-link-display&amp;#039;)&lt;br /&gt;
		local editLink = makeUrlLink(editUrl, editDisplay)&lt;br /&gt;
		local historyUrl = docTitle:fullUrl{action = &amp;#039;history&amp;#039;}&lt;br /&gt;
		local historyDisplay = message(&amp;#039;history-link-display&amp;#039;)&lt;br /&gt;
		local historyLink = makeUrlLink(historyUrl, historyDisplay)&lt;br /&gt;
		ret = message(&amp;#039;transcluded-from-blurb&amp;#039;, {docLink})&lt;br /&gt;
			.. &amp;#039; &amp;#039;&lt;br /&gt;
			.. makeToolbar(editLink, historyLink)&lt;br /&gt;
			.. &amp;#039;&amp;lt;br /&amp;gt;&amp;#039;&lt;br /&gt;
	elseif env.subjectSpace == 828 then&lt;br /&gt;
		-- /doc does not exist; ask to create it.&lt;br /&gt;
		local createUrl = docTitle:fullUrl{action = &amp;#039;edit&amp;#039;, preload = message(&amp;#039;module-preload&amp;#039;)}&lt;br /&gt;
		local createDisplay = message(&amp;#039;create-link-display&amp;#039;)&lt;br /&gt;
		local createLink = makeUrlLink(createUrl, createDisplay)&lt;br /&gt;
		ret = message(&amp;#039;create-module-doc-blurb&amp;#039;, {createLink})&lt;br /&gt;
			.. &amp;#039;&amp;lt;br /&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeExperimentBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Renders the text &amp;quot;Editors can experiment in this template&amp;#039;s sandbox (edit | diff) and testcases (edit) pages.&amp;quot;&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &amp;#039;sandbox-link-display&amp;#039; --&amp;gt; &amp;#039;sandbox&amp;#039;&lt;br /&gt;
	-- &amp;#039;sandbox-edit-link-display&amp;#039; --&amp;gt; &amp;#039;edit&amp;#039;&lt;br /&gt;
	-- &amp;#039;compare-link-display&amp;#039; --&amp;gt; &amp;#039;diff&amp;#039;&lt;br /&gt;
	-- &amp;#039;module-sandbox-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/preload-module-sandbox&amp;#039;&lt;br /&gt;
	-- &amp;#039;template-sandbox-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/preload-sandbox&amp;#039;&lt;br /&gt;
	-- &amp;#039;sandbox-create-link-display&amp;#039; --&amp;gt; &amp;#039;create&amp;#039;&lt;br /&gt;
	-- &amp;#039;mirror-edit-summary&amp;#039; --&amp;gt; &amp;#039;Create sandbox version of $1&amp;#039;&lt;br /&gt;
	-- &amp;#039;mirror-link-display&amp;#039; --&amp;gt; &amp;#039;mirror&amp;#039;&lt;br /&gt;
	-- &amp;#039;mirror-link-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/mirror&amp;#039;&lt;br /&gt;
	-- &amp;#039;sandbox-link-display&amp;#039; --&amp;gt; &amp;#039;sandbox&amp;#039;&lt;br /&gt;
	-- &amp;#039;testcases-link-display&amp;#039; --&amp;gt; &amp;#039;testcases&amp;#039;&lt;br /&gt;
	-- &amp;#039;testcases-edit-link-display&amp;#039;--&amp;gt; &amp;#039;edit&amp;#039;&lt;br /&gt;
	-- &amp;#039;template-sandbox-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/preload-sandbox&amp;#039;&lt;br /&gt;
	-- &amp;#039;testcases-create-link-display&amp;#039; --&amp;gt; &amp;#039;create&amp;#039;&lt;br /&gt;
	-- &amp;#039;testcases-link-display&amp;#039; --&amp;gt; &amp;#039;testcases&amp;#039;&lt;br /&gt;
	-- &amp;#039;testcases-edit-link-display&amp;#039; --&amp;gt; &amp;#039;edit&amp;#039;&lt;br /&gt;
	-- &amp;#039;module-testcases-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/preload-module-testcases&amp;#039;&lt;br /&gt;
	-- &amp;#039;template-testcases-preload&amp;#039; --&amp;gt; &amp;#039;Template:Documentation/preload-testcases&amp;#039;&lt;br /&gt;
	-- &amp;#039;experiment-blurb-module&amp;#039; --&amp;gt; &amp;#039;Editors can experiment in this module&amp;#039;s $1 and $2 pages.&amp;#039;&lt;br /&gt;
	-- &amp;#039;experiment-blurb-template&amp;#039; --&amp;gt; &amp;#039;Editors can experiment in this template&amp;#039;s $1 and $2 pages.&amp;#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	local sandboxTitle = env.sandboxTitle&lt;br /&gt;
	local testcasesTitle = env.testcasesTitle&lt;br /&gt;
	local templatePage = templateTitle.prefixedText&lt;br /&gt;
	if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Make links.&lt;br /&gt;
	local sandboxLinks, testcasesLinks&lt;br /&gt;
	if sandboxTitle.exists then&lt;br /&gt;
		local sandboxPage = sandboxTitle.prefixedText&lt;br /&gt;
		local sandboxDisplay = message(&amp;#039;sandbox-link-display&amp;#039;)&lt;br /&gt;
		local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay)&lt;br /&gt;
		local sandboxEditUrl = sandboxTitle:fullUrl{action = &amp;#039;edit&amp;#039;}&lt;br /&gt;
		local sandboxEditDisplay = message(&amp;#039;sandbox-edit-link-display&amp;#039;)&lt;br /&gt;
		local sandboxEditLink = makeUrlLink(sandboxEditUrl, sandboxEditDisplay)&lt;br /&gt;
		local compareUrl = env.compareUrl&lt;br /&gt;
		local compareLink&lt;br /&gt;
		if compareUrl then&lt;br /&gt;
			local compareDisplay = message(&amp;#039;compare-link-display&amp;#039;)&lt;br /&gt;
			compareLink = makeUrlLink(compareUrl, compareDisplay)&lt;br /&gt;
		end&lt;br /&gt;
		sandboxLinks = sandboxLink .. &amp;#039; &amp;#039; .. makeToolbar(sandboxEditLink, compareLink)&lt;br /&gt;
	else&lt;br /&gt;
		local sandboxPreload&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			sandboxPreload = message(&amp;#039;module-sandbox-preload&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			sandboxPreload = message(&amp;#039;template-sandbox-preload&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local sandboxCreateUrl = sandboxTitle:fullUrl{action = &amp;#039;edit&amp;#039;, preload = sandboxPreload}&lt;br /&gt;
		local sandboxCreateDisplay = message(&amp;#039;sandbox-create-link-display&amp;#039;)&lt;br /&gt;
		local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay)&lt;br /&gt;
		local mirrorSummary = message(&amp;#039;mirror-edit-summary&amp;#039;, {makeWikilink(templatePage)})&lt;br /&gt;
		local mirrorPreload = message(&amp;#039;mirror-link-preload&amp;#039;)&lt;br /&gt;
		local mirrorUrl = sandboxTitle:fullUrl{action = &amp;#039;edit&amp;#039;, preload = mirrorPreload, summary = mirrorSummary}&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			mirrorUrl = sandboxTitle:fullUrl{action = &amp;#039;edit&amp;#039;, preload = templateTitle.prefixedText, summary = mirrorSummary}&lt;br /&gt;
		end&lt;br /&gt;
		local mirrorDisplay = message(&amp;#039;mirror-link-display&amp;#039;)&lt;br /&gt;
		local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay)&lt;br /&gt;
		sandboxLinks = message(&amp;#039;sandbox-link-display&amp;#039;) .. &amp;#039; &amp;#039; .. makeToolbar(sandboxCreateLink, mirrorLink)&lt;br /&gt;
	end&lt;br /&gt;
	if testcasesTitle.exists then&lt;br /&gt;
		local testcasesPage = testcasesTitle.prefixedText&lt;br /&gt;
		local testcasesDisplay = message(&amp;#039;testcases-link-display&amp;#039;)&lt;br /&gt;
		local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay)&lt;br /&gt;
		local testcasesEditUrl = testcasesTitle:fullUrl{action = &amp;#039;edit&amp;#039;}&lt;br /&gt;
		local testcasesEditDisplay = message(&amp;#039;testcases-edit-link-display&amp;#039;)&lt;br /&gt;
		local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay)&lt;br /&gt;
		-- for Modules, add testcases run link if exists&lt;br /&gt;
		if testcasesTitle.contentModel == &amp;quot;Scribunto&amp;quot;  and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then&lt;br /&gt;
			local testcasesRunLinkDisplay = message(&amp;#039;testcases-run-link-display&amp;#039;)&lt;br /&gt;
			local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)&lt;br /&gt;
			testcasesLinks = testcasesLink .. &amp;#039; &amp;#039; .. makeToolbar(testcasesEditLink, testcasesRunLink)&lt;br /&gt;
		else&lt;br /&gt;
			testcasesLinks = testcasesLink .. &amp;#039; &amp;#039; .. makeToolbar(testcasesEditLink)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local testcasesPreload&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			testcasesPreload = message(&amp;#039;module-testcases-preload&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			testcasesPreload = message(&amp;#039;template-testcases-preload&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local testcasesCreateUrl = testcasesTitle:fullUrl{action = &amp;#039;edit&amp;#039;, preload = testcasesPreload}&lt;br /&gt;
		local testcasesCreateDisplay = message(&amp;#039;testcases-create-link-display&amp;#039;)&lt;br /&gt;
		local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay)&lt;br /&gt;
		testcasesLinks = message(&amp;#039;testcases-link-display&amp;#039;) .. &amp;#039; &amp;#039; .. makeToolbar(testcasesCreateLink)&lt;br /&gt;
	end&lt;br /&gt;
	local messageName&lt;br /&gt;
	if subjectSpace == 828 then&lt;br /&gt;
		messageName = &amp;#039;experiment-blurb-module&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		messageName = &amp;#039;experiment-blurb-template&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return message(messageName, {sandboxLinks, testcasesLinks})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeCategoriesBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the text &amp;quot;Please add categories to the /doc subpage.&amp;quot;&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &amp;#039;doc-link-display&amp;#039; --&amp;gt; &amp;#039;/doc&amp;#039;&lt;br /&gt;
	-- &amp;#039;add-categories-blurb&amp;#039; --&amp;gt; &amp;#039;Please add categories to the $1 subpage.&amp;#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local docPathLink = makeWikilink(docTitle.prefixedText, message(&amp;#039;doc-link-display&amp;#039;))&lt;br /&gt;
	return message(&amp;#039;add-categories-blurb&amp;#039;, {docPathLink})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeSubpagesBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the &amp;quot;Subpages of this template&amp;quot; link.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &amp;#039;template-pagetype&amp;#039; --&amp;gt; &amp;#039;template&amp;#039;&lt;br /&gt;
	-- &amp;#039;module-pagetype&amp;#039; --&amp;gt; &amp;#039;module&amp;#039;&lt;br /&gt;
	-- &amp;#039;default-pagetype&amp;#039; --&amp;gt; &amp;#039;page&amp;#039;&lt;br /&gt;
	-- &amp;#039;subpages-link-display&amp;#039; --&amp;gt; &amp;#039;Subpages of this $1&amp;#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	if not subjectSpace or not templateTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local pagetype&lt;br /&gt;
	if subjectSpace == 10 then&lt;br /&gt;
		pagetype = message(&amp;#039;template-pagetype&amp;#039;)&lt;br /&gt;
	elseif subjectSpace == 828 then&lt;br /&gt;
		pagetype = message(&amp;#039;module-pagetype&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		pagetype = message(&amp;#039;default-pagetype&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local subpagesLink = makeWikilink(&lt;br /&gt;
		&amp;#039;Special:PrefixIndex/&amp;#039; .. templateTitle.prefixedText .. &amp;#039;/&amp;#039;,&lt;br /&gt;
		message(&amp;#039;subpages-link-display&amp;#039;, {pagetype})&lt;br /&gt;
	)&lt;br /&gt;
	return message(&amp;#039;subpages-blurb&amp;#039;, {subpagesLink})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Tracking categories&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.addTrackingCategories(env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Check if {{documentation}} is transcluded on a /doc or /testcases page.&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &amp;#039;display-strange-usage-category&amp;#039; --&amp;gt; true&lt;br /&gt;
	-- &amp;#039;doc-subpage&amp;#039; --&amp;gt; &amp;#039;doc&amp;#039;&lt;br /&gt;
	-- &amp;#039;testcases-subpage&amp;#039; --&amp;gt; &amp;#039;testcases&amp;#039;&lt;br /&gt;
	-- &amp;#039;strange-usage-category&amp;#039; --&amp;gt; &amp;#039;Wikipedia pages with strange ((documentation)) usage&amp;#039;&lt;br /&gt;
	-- &lt;br /&gt;
	-- /testcases pages in the module namespace are not categorised, as they may have&lt;br /&gt;
	-- {{documentation}} transcluded automatically.&lt;br /&gt;
	--]]&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not title or not subjectSpace then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	if message(&amp;#039;display-strange-usage-category&amp;#039;, nil, &amp;#039;boolean&amp;#039;)&lt;br /&gt;
		and (&lt;br /&gt;
			subpage == message(&amp;#039;doc-subpage&amp;#039;)&lt;br /&gt;
			or subjectSpace ~= 828 and subpage == message(&amp;#039;testcases-subpage&amp;#039;)&lt;br /&gt;
		)&lt;br /&gt;
	then&lt;br /&gt;
		ret = ret .. makeCategoryLink(message(&amp;#039;strange-usage-category&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>dev&gt;Pppery</name></author>
	</entry>
</feed>