<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Hongkongggag Wiki  - Recent changes [en]</title>
		<link>https://wiki.852r.org/index.php/Special:RecentChanges</link>
		<description>Track the most recent changes to the wiki in this feed.</description>
		<language>en</language>
		<generator>MediaWiki 1.42.1</generator>
		<lastBuildDate>Thu, 06 Aug 2026 22:54:01 GMT</lastBuildDate>
		<item>
			<title>History of Hongkongggag</title>
			<link>https://wiki.852r.org/index.php?title=History_of_Hongkongggag&amp;diff=3925&amp;oldid=3797</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=History_of_Hongkongggag&amp;diff=3925&amp;oldid=3797</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:47, 6 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{Very long}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This is the history of [[Hongkongggag]] from its creation in 2018 to the present day.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This is the history of [[Hongkongggag]] from its creation in 2018 to the present day.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:47:22 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Talk:History_of_Hongkongggag</comments>
		</item>
		<item>
			<title>Module:Pagetype/rfd</title>
			<link>https://wiki.852r.org/index.php?title=Module:Pagetype/rfd&amp;diff=3924&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Pagetype/rfd&amp;diff=3924&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Pagetype/rfd&quot; title=&quot;Module:Pagetype/rfd&quot;&gt;Module:Pagetype/rfd&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This page contains a table of all RfD templates and their&lt;br /&gt;
-- redirects. Templates names are capitalized, and the Template: prefix is&lt;br /&gt;
-- removed. Templates are grouped with the main template first, followed by&lt;br /&gt;
-- its redirects.&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	-- Template forms (these should be substituted so we should rarely see these)&lt;br /&gt;
	[&amp;quot;Redirect for discussion&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;RFD&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;RfD&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;Rfd1&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;Rfd-t&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;Rfd&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;Rfd-NPF&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;Rfd-NPF/core&amp;quot;] = true,&lt;br /&gt;
	-- Module forms&lt;br /&gt;
	[&amp;quot;#invoke:RfD&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:RfD&amp;quot;] = true, -- The form made by substituting RfD&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Pagetype/rfd</comments>
		</item>
		<item>
			<title>Module:Pagetype/softredirect</title>
			<link>https://wiki.852r.org/index.php?title=Module:Pagetype/softredirect&amp;diff=3922&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Pagetype/softredirect&amp;diff=3922&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Pagetype/softredirect&quot; title=&quot;Module:Pagetype/softredirect&quot;&gt;Module:Pagetype/softredirect&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This page contains a table of all soft redirect templates and their&lt;br /&gt;
-- redirects. Templates names are capitalized, and the Template: prefix is&lt;br /&gt;
-- removed. Templates are grouped with the main template first, followed by&lt;br /&gt;
-- its redirects.&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	[&amp;quot;R from category navigation&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Redirect from category navigation&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Category redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Cat move&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Cat red&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Cat redir&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Cat redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Category move&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Category Redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Categoryredirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Catr&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Catred&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Catredir&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Catredirect&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;R from template-generated category&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Redirect from template-generated category&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Portal soft redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Portal Redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Portal redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Portal Soft Redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Portalredirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Portalsoftredirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;PortRed&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Portred&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Portsoftred&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;PSR&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Psr&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Soft portal redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Soft redirect portal&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;SPR&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Spr&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;SRP&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Srp&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Salted redirect&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Soft redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Interwiki redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Plain soft redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Soft&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Soft link&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Soft redir&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Soft Redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Softr&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Softredir&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;SoftRedirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Softredirect&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Userrename&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Wikibooks redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;WBOOK&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wbook&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wikibook redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wikibooks Redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;WikibooksRedirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wikibooksredirect&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Wikimedia Commons redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;COMM&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Comm&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Commons Redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Commons redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;CommonsRedirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Commonsredirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wikimedia commons redirect&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Wikiquote redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wq&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Wikisource redirect&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Wikispecies redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wikispecies Redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;WikispeciesRedirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wikispeciesredirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;WSPEC&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wspec&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Wikivoyage redirect&amp;quot;] = true,&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;Wiktionary redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Moved to Wiktionary&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;RedirecttoWiktionary&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wi&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wikt red&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wikt redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wiktionary Redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wiktionary-redirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;WiktionaryRedirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wiktionaryredirect&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wiktr&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wiktred&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wiktredir&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wtr&amp;quot;] = true,&lt;br /&gt;
	[&amp;quot;Wtsr&amp;quot;] = true,&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Pagetype/softredirect</comments>
		</item>
		<item>
			<title>Module:Wikitext Parsing</title>
			<link>https://wiki.852r.org/index.php?title=Module:Wikitext_Parsing&amp;diff=3920&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Wikitext_Parsing&amp;diff=3920&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Wikitext_Parsing&quot; title=&quot;Module:Wikitext Parsing&quot;&gt;Module:Wikitext Parsing&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;quot;strict&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- We&amp;#039;re calling up to thousands of string methods each time we run, so&lt;br /&gt;
-- do this very simple micro optimisation to help a tiny bit&lt;br /&gt;
local string = string&lt;br /&gt;
&lt;br /&gt;
-- Helper functions for PrepareText --&lt;br /&gt;
local function endswith(text, subtext)&lt;br /&gt;
	return string.sub(text, -#subtext, -1) == subtext&lt;br /&gt;
end&lt;br /&gt;
local function allcases(s)&lt;br /&gt;
	return string.gsub(s, &amp;quot;%a&amp;quot;, function(c)&lt;br /&gt;
		return &amp;quot;[&amp;quot;..string.upper(c)..string.lower(c)..&amp;quot;]&amp;quot;&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[ Implementation notes&lt;br /&gt;
---- NORMAL HTML TAGS ----&lt;br /&gt;
Tags are very strict on how they want to start, but loose on how they end.&lt;br /&gt;
The start must strictly follow &amp;lt;[tAgNaMe](%s|&amp;gt;) with no room for whitespace in&lt;br /&gt;
the tag&amp;#039;s name, but may then flow as they want afterwards, making&lt;br /&gt;
&amp;lt;div\nclass\n=\n&amp;quot;\nerror\n&amp;quot;\n&amp;gt; valid. If a tag has no end, it will consume all&lt;br /&gt;
text instead of not processing.&lt;br /&gt;
&lt;br /&gt;
There&amp;#039;s no sense of escaping &amp;lt; or &amp;gt;&lt;br /&gt;
E.g.&lt;br /&gt;
 &amp;lt;div class=&amp;quot;error\&amp;gt;&amp;quot;&amp;gt; will end at \&amp;gt; despite it being inside a quote&lt;br /&gt;
 &amp;lt;div class=&amp;quot;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;error&amp;lt;/span&amp;gt;&amp;quot;&amp;gt; will not process the larger div&lt;br /&gt;
&lt;br /&gt;
---- NOPROCESSING TAGS (nowiki, pre, syntaxhighlight, source, etc.) ----&lt;br /&gt;
(Note: &amp;lt;source&amp;gt; is the deprecated version of &amp;lt;syntaxhighlight&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
No-processing tags have some differences to the above rules. Specifically, their&lt;br /&gt;
syntax is a lot stricter. While an opening tag follows the same set of rules, A&lt;br /&gt;
closing tag can&amp;#039;t have any sort of extra formatting. &amp;lt;/div a/a&amp;gt; is valid,&lt;br /&gt;
&amp;lt;/nowiki a/a&amp;gt; is not. Only newlines and spaces/tabs are allowed in closing tags.&lt;br /&gt;
Note that, even though tags may cause a visual change without an ending tag like&lt;br /&gt;
&amp;lt;pre&amp;gt;, one is required for the no-processing effects.&lt;br /&gt;
&lt;br /&gt;
Both the content inside the tag pair and the text in the tags will not be&lt;br /&gt;
processed. E.g. &amp;lt;nowiki |}}&amp;gt;|}}&amp;lt;/nowiki&amp;gt; would have both of the |}} escaped.&lt;br /&gt;
&lt;br /&gt;
Since we only care about these no-processing tags, we can ignore the idea of an&lt;br /&gt;
intercepting tag messing us up, and just go for the first ending we can find. If&lt;br /&gt;
there is no ending, the tag will NOT consume the rest of the text. Even if there&lt;br /&gt;
is no ending tag, the content inside the opening tag will still be unprocessed,&lt;br /&gt;
meaning {{X20|&amp;lt;nowiki }}&amp;gt;}} wouldn&amp;#039;t end at the first }} despite there being no&lt;br /&gt;
ending tag.&lt;br /&gt;
&lt;br /&gt;
There are some tags, like &amp;lt;math&amp;gt;, which also function like &amp;lt;nowiki&amp;gt; for our&lt;br /&gt;
purposes, and are handled here. Some other tags, like &amp;lt;ref&amp;gt;, have more complex&lt;br /&gt;
behaviour that can&amp;#039;t be reasonably implemented in this, and so are ignored. I&lt;br /&gt;
suspect that every tag listed in [[Special:Version]] may behave somewhat like&lt;br /&gt;
this, but that&amp;#039;s far too many cases worth checking for rarely used tags that may&lt;br /&gt;
not even have a good reason to contain {{ or }} anyways, so we leave them alone.&lt;br /&gt;
&lt;br /&gt;
---- INCLUDEONLY ----&lt;br /&gt;
While includeonly tags do technically serve the same purpose as a nowiki tag for&lt;br /&gt;
what this module does, contextually they don&amp;#039;t always make sense to escape, and&lt;br /&gt;
as such are ignored by this module entirely.&lt;br /&gt;
--]=]&lt;br /&gt;
-- This function expects the string to start with the tag&lt;br /&gt;
local validtags = {nowiki=1, pre=1, syntaxhighlight=1, source=1, math=1}&lt;br /&gt;
local function TestForNowikiTag(text, scanPosition)&lt;br /&gt;
	local tagName = string.match(text, &amp;quot;^&amp;lt;([^\n /&amp;gt;]+)&amp;quot;, scanPosition)&lt;br /&gt;
	if not tagName or not validtags[string.lower(tagName)] then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local nextOpener = string.find(text, &amp;quot;&amp;lt;&amp;quot;, scanPosition+1, true)&lt;br /&gt;
	local nextCloser = string.find(text, &amp;quot;&amp;gt;&amp;quot;, scanPosition+1, true)&lt;br /&gt;
	if nextCloser and (not nextOpener or nextCloser &amp;lt; nextOpener) then&lt;br /&gt;
		local startingTag = string.sub(text, scanPosition, nextCloser)&lt;br /&gt;
		-- We have our starting tag (E.g. &amp;#039;&amp;lt;pre style=&amp;quot;color:red&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
		-- Now find our ending...&lt;br /&gt;
		if endswith(startingTag, &amp;quot;/&amp;gt;&amp;quot;) then -- self-closing tag (we are our own ending)&lt;br /&gt;
			return {&lt;br /&gt;
				Tag = tagName,&lt;br /&gt;
				Start = startingTag,&lt;br /&gt;
				Content = &amp;quot;&amp;quot;, End = &amp;quot;&amp;quot;,&lt;br /&gt;
				Length = #startingTag&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		else&lt;br /&gt;
			local endingTagStart, endingTagEnd = string.find(text, &amp;quot;&amp;lt;/&amp;quot;..allcases(tagName)..&amp;quot;[ \t\n]*&amp;gt;&amp;quot;, scanPosition)&lt;br /&gt;
			if endingTagStart then --Regular tag formation&lt;br /&gt;
				local endingTag = string.sub(text, endingTagStart, endingTagEnd)&lt;br /&gt;
				local tagContent = string.sub(text, nextCloser+1, endingTagStart-1)&lt;br /&gt;
				return {&lt;br /&gt;
					Tag = tagName,&lt;br /&gt;
					Start = startingTag,&lt;br /&gt;
					Content = tagContent,&lt;br /&gt;
					End = endingTag,&lt;br /&gt;
					Length = #startingTag + #tagContent + #endingTag&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
			else -- Content inside still needs escaping (also linter error!)&lt;br /&gt;
				return {&lt;br /&gt;
					Tag = tagName,&lt;br /&gt;
					Start = startingTag,&lt;br /&gt;
					Content = &amp;quot;&amp;quot;, End = &amp;quot;&amp;quot;,&lt;br /&gt;
					Length = #startingTag&lt;br /&gt;
				}&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
--[=[ Implementation Notes&lt;br /&gt;
HTML Comments are about as basic as it gets. Start at &amp;lt;!--, end at --&amp;gt;, no extra&lt;br /&gt;
conditions. If a comment has no end, it will eat all the text ahead.&lt;br /&gt;
--]=]&lt;br /&gt;
local function TestForComment(text, scanPosition)&lt;br /&gt;
	if string.match(text, &amp;quot;^&amp;lt;!%-%-&amp;quot;, scanPosition) then&lt;br /&gt;
		local commentEnd = string.find(text, &amp;quot;--&amp;gt;&amp;quot;, scanPosition+4, true)&lt;br /&gt;
		if commentEnd then&lt;br /&gt;
			return {&lt;br /&gt;
				Start = &amp;quot;&amp;lt;!--&amp;quot;, End = &amp;quot;--&amp;gt;&amp;quot;,&lt;br /&gt;
				Content = string.sub(text, scanPosition+4, commentEnd-1),&lt;br /&gt;
				Length = commentEnd-scanPosition+3&lt;br /&gt;
			}&lt;br /&gt;
		else -- Consumes all text if not given an ending&lt;br /&gt;
			return {&lt;br /&gt;
				Start = &amp;quot;&amp;lt;!--&amp;quot;, End = &amp;quot;&amp;quot;,&lt;br /&gt;
				Content = string.sub(text, scanPosition+4),&lt;br /&gt;
				Length = #text-scanPosition+1&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ Implementation notes&lt;br /&gt;
The goal of this function is to escape all text that wouldn&amp;#039;t be parsed if it&lt;br /&gt;
was preprocessed (see above implementation notes).&lt;br /&gt;
&lt;br /&gt;
Using keepComments will keep all HTML comments instead of removing them. They&lt;br /&gt;
will still be escaped regardless.&lt;br /&gt;
--]]&lt;br /&gt;
local function PrepareText(text, keepComments)&lt;br /&gt;
	local newtext = {}&lt;br /&gt;
	local scanPosition = 1&lt;br /&gt;
	local textPosition = 1&lt;br /&gt;
	while true do&lt;br /&gt;
		local nextCheck = string.find(text, &amp;quot;&amp;lt;&amp;quot;, scanPosition, true) -- Advance to the next potential tag we care about&lt;br /&gt;
		if not nextCheck then -- Done&lt;br /&gt;
			newtext[#newtext+1] = string.sub(text, textPosition)&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		scanPosition = nextCheck&lt;br /&gt;
		local Comment = TestForComment(text, scanPosition)&lt;br /&gt;
		if Comment then&lt;br /&gt;
			newtext[#newtext+1] = string.sub(text, textPosition, nextCheck-1)&lt;br /&gt;
			if keepComments then&lt;br /&gt;
				newtext[#newtext+1] = Comment.Start .. mw.text.nowiki(Comment.Content) .. Comment.End&lt;br /&gt;
			end&lt;br /&gt;
			scanPosition = scanPosition + Comment.Length&lt;br /&gt;
			textPosition = scanPosition&lt;br /&gt;
		else&lt;br /&gt;
			local Tag = TestForNowikiTag(text, scanPosition)&lt;br /&gt;
			if Tag then&lt;br /&gt;
				newtext[#newtext+1] = string.sub(text, textPosition, nextCheck-1)&lt;br /&gt;
				local newTagStart = &amp;quot;&amp;lt;&amp;quot; .. mw.text.nowiki(string.sub(Tag.Start, 2, -2)) .. &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				local newTagEnd =&lt;br /&gt;
					Tag.End == &amp;quot;&amp;quot; and &amp;quot;&amp;quot; or -- Respect no tag ending&lt;br /&gt;
					&amp;quot;&amp;lt;/&amp;quot; .. mw.text.nowiki(string.sub(Tag.End, 3, -2)) .. &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
				local newContent = mw.text.nowiki(Tag.Content)&lt;br /&gt;
				newtext[#newtext+1] = newTagStart .. newContent .. newTagEnd&lt;br /&gt;
				scanPosition = scanPosition + Tag.Length&lt;br /&gt;
				textPosition = scanPosition&lt;br /&gt;
			else -- Nothing special, move on...&lt;br /&gt;
				scanPosition = scanPosition + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(newtext, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
--Main entry points&lt;br /&gt;
p.PrepareText = PrepareText&lt;br /&gt;
--Extra entry points, not really required&lt;br /&gt;
p.TestForNowikiTag = TestForNowikiTag&lt;br /&gt;
p.TestForComment = TestForComment&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&lt;br /&gt;
--[==[ console tests&lt;br /&gt;
&lt;br /&gt;
local s = [=[Hey!{{Text|&amp;lt;nowiki | ||&amp;gt;&lt;br /&gt;
Hey! }}&lt;br /&gt;
A&amp;lt;/nowiki&amp;gt;|&amp;lt;!--AAAAA|AAA--&amp;gt;Should see|Shouldn&amp;#039;t see}}]=]&lt;br /&gt;
local out = p.PrepareText(s)&lt;br /&gt;
mw.logObject(out)&lt;br /&gt;
&lt;br /&gt;
local s = [=[B&amp;lt;!--&lt;br /&gt;
Hey!&lt;br /&gt;
--&amp;gt;A]=]&lt;br /&gt;
local out = p.TestForComment(s, 2)&lt;br /&gt;
mw.logObject(out); mw.log(string.sub(s, 2, out.Length))&lt;br /&gt;
&lt;br /&gt;
]==]&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Wikitext_Parsing</comments>
		</item>
		<item>
			<title>Module:Shortcut/styles.css</title>
			<link>https://wiki.852r.org/index.php?title=Module:Shortcut/styles.css&amp;diff=3918&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Shortcut/styles.css&amp;diff=3918&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Shortcut/styles.css&quot; title=&quot;Module:Shortcut/styles.css&quot;&gt;Module:Shortcut/styles.css&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* {{pp-template}} */&lt;br /&gt;
.module-shortcutboxplain {&lt;br /&gt;
	float: right;&lt;br /&gt;
	margin: 0 0 0 1em;&lt;br /&gt;
	border: 1px solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
	background-color: var(--background-color-base, #fff);&lt;br /&gt;
	padding: 0.3em 0.6em 0.2em 0.6em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	font-size: 85%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.module-shortcutboxleft {&lt;br /&gt;
	float: left;&lt;br /&gt;
	margin: 0 1em 0 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.module-shortcutlist {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	border-bottom: 1px solid var(--border-color-base, #a2a9b1);&lt;br /&gt;
	margin-bottom: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.module-shortcutboxplain ul {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.module-shortcutanchordiv {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	top: -3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
li .module-shortcutanchordiv {&lt;br /&gt;
	float: right; /* IE/Edge in list items */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mbox-imageright .module-shortcutboxplain {&lt;br /&gt;
	padding: 0.4em 1em;&lt;br /&gt;
	line-height: 1.3;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	float: initial;&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Shortcut/styles.css</comments>
		</item>
		<item>
			<title>Template:Plainlist/styles.css</title>
			<link>https://wiki.852r.org/index.php?title=Template:Plainlist/styles.css&amp;diff=3916&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Plainlist/styles.css&amp;diff=3916&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Plainlist/styles.css&quot; title=&quot;Template:Plainlist/styles.css&quot;&gt;Template:Plainlist/styles.css&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* {{pp-template|small=yes}} */&lt;br /&gt;
.plainlist ol,&lt;br /&gt;
.plainlist ul {&lt;br /&gt;
	line-height: inherit;&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 0; /* Reset Minerva default */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.plainlist ol li,&lt;br /&gt;
.plainlist ul li {&lt;br /&gt;
	margin-bottom: 0;&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Plainlist/styles.css</comments>
		</item>
		<item>
			<title>Module:Message box/ambox.css</title>
			<link>https://wiki.852r.org/index.php?title=Module:Message_box/ambox.css&amp;diff=3914&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Message_box/ambox.css&amp;diff=3914&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Message_box/ambox.css&quot; title=&quot;Module:Message box/ambox.css&quot;&gt;Module:Message box/ambox.css&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* {{pp|small=y}} */&lt;br /&gt;
.ambox {&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #36c;  /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
	background-color: #fbfbfb;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Single border between stacked boxes.&lt;br /&gt;
 * category and TemplateStyles are wrapped in an &amp;quot;empty&amp;quot; span [[phab:T378906]]&lt;br /&gt;
 * [[phab:T200206]] may be relevant at a later date&lt;br /&gt;
 */&lt;br /&gt;
.ambox + .mw-empty-elt + .ambox,&lt;br /&gt;
.ambox + .mw-empty-elt + .mw-empty-elt + .ambox,&lt;br /&gt;
/*&lt;br /&gt;
 * and Template:Dated maintenance category. we can probably remove this flavor&lt;br /&gt;
 * when T200206 is fixed&lt;br /&gt;
 */&lt;br /&gt;
.ambox + .mw-empty-elt + .mw-empty-elt + .mw-empty-elt + .ambox {&lt;br /&gt;
	margin-top: -1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For the &amp;quot;small=left&amp;quot; option. */&lt;br /&gt;
/* must override .ambox + .ambox styles above */&lt;br /&gt;
html body.mediawiki .ambox.mbox-small-left {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin: 4px 1em 4px 0;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox-speedy {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #b32424;    /* Red */&lt;br /&gt;
	background-color: #fee7e6;          /* Pink */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox-delete {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #b32424;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox-content {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox-style {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #fc3;       /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox-move {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox-protection {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	border-left: 10px solid #a2a9b1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox .mbox-text {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 0.25em 0.5em;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox .mbox-image {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.5em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox .mbox-imageright {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.5em 2px 0;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* An empty narrow cell */&lt;br /&gt;
.ambox .mbox-empty-cell {&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ambox .mbox-image-div {&lt;br /&gt;
	width: 52px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (min-width: 720px) {&lt;br /&gt;
	.ambox {&lt;br /&gt;
		margin: 0 10%; /* 10% = Will not overlap with other elements */&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	body.ns-0 .ambox {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Message_box/ambox.css</comments>
		</item>
		<item>
			<title>Template:Very long/doc</title>
			<link>https://wiki.852r.org/index.php?title=Template:Very_long/doc&amp;diff=3912&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Very_long/doc&amp;diff=3912&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Very_long/doc&quot; title=&quot;Template:Very long/doc&quot;&gt;Template:Very long/doc&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Documentation subpage}}&lt;br /&gt;
&amp;lt;!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --&amp;gt;&lt;br /&gt;
{{Twinkle standard installation}}&lt;br /&gt;
{{Template shortcut|Long|Toobig|Toolong|Too-long|Too long|VeryLong}}&lt;br /&gt;
&lt;br /&gt;
See [[Wikipedia:Article size]] for more information on this topic.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Add {{Tlx|Very long|date{{=}}{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} to the top of the article, below any [[WP:HAT|hatnotes]].&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;small&amp;lt;/code&amp;gt; parameter&lt;br /&gt;
: {{Tlx|Very long|small{{=}}left|date{{=}}{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} generates the following smaller-sized template, a left-size box instead of a banner (which is usually only of use with {{para|section}}, below): {{Very long|small=left|date={{CURRENTMONTHNAME}} {{CURRENTYEAR}}}}&lt;br /&gt;
; Section-specific use&lt;br /&gt;
: If just a particular section of an article is getting long, it can be tagged by adding the {{para|section}} parameter, or using the {{tlx|Very long section}} template variant:&lt;br /&gt;
: {{Tlx|Very long section}} and {{Tlx|Very long|section|small{{=}}left|date{{=}}{{CURRENTMONTHNAME}} {{CURRENTYEAR}}}} both render: {{Very long section}}&lt;br /&gt;
; Readable prose size (in words)&lt;br /&gt;
: The readable prose size in words, calculated with the help of tools like [[User:Dr pda/prosesize|Prosesize]] or [[User:Shubinator/DYKcheck|Shubinator&amp;#039;s DYK tool]], can be added manually to the template:&lt;br /&gt;
: {{Tlx|Very long|words{{=}}7,000}} generates the following template: {{Very long|words=7,000}}&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;nosplit&amp;lt;/code&amp;gt; parameter&lt;br /&gt;
: Adding {{para|nosplit|yes}} (or any other value for that parameter, such as &amp;lt;kbd&amp;gt;y&amp;lt;/kbd&amp;gt; or &amp;lt;kbd&amp;gt;true&amp;lt;/kbd&amp;gt;) will suppress mention of splitting the material to new sub-articles, since not all content is suitable for splitting (usually because it would fail [[WP:Notability]] as a stand-alone article).&lt;br /&gt;
&lt;br /&gt;
; Reason parameter&lt;br /&gt;
: Adding {{para|reason|your reason here}} will add a new second sentence to the banner reading: &lt;br /&gt;
:: {{xt|The specific problem is: &amp;#039;&amp;#039;&amp;#039;your reason here&amp;#039;&amp;#039;&amp;#039;}}. &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;#039;&amp;#039;(bolded, as shown)&amp;#039;&amp;#039;&lt;br /&gt;
: Final punctuation is provided, you do not need to include it.&lt;br /&gt;
&lt;br /&gt;
; Categorization&lt;br /&gt;
: This template adds tagged articles to [[:Category:Articles that may be too long]], or one of its dated subcategories.&lt;br /&gt;
&lt;br /&gt;
{{Wikipedia:Template messages/Splitting/List|noheading=yes}}{{Wikipedia:Template messages/Merging/List|noheading=yes}}&lt;br /&gt;
&lt;br /&gt;
== TemplateData ==&lt;br /&gt;
{{TemplateData header}}&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Use this cleanup template to indicate that an article may be too long to read and navigate comfortably.&amp;quot;,&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Affected area&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Text to replace the word \&amp;quot;article\&amp;quot;, usually \&amp;quot;section\&amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;section&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;section&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;date&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Month and year&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The month and year that the template was placed (in full). \&amp;quot;{{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}\&amp;quot; inserts the current month and year automatically.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;line&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;{{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;January 2013&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;nosplit&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Don&amp;#039;t suggest splitting&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Enter any text here to remove \&amp;quot;splitting content into sub-articles\&amp;quot; from the suggested fix, if the content would not be suitable for splitting (usually because it would fail WP:NOTABILITY as a standalone article).&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;y&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;y&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;fix&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Suggested fix&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Text to replace the suggested fix (\&amp;quot;Consider splitting content into sub-articles, condensing it, or adding subheadings.\&amp;quot;)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;Consider splitting content into a history sub-article and condensing the geography section.&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;small&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Make template small&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Enter \&amp;quot;left\&amp;quot; here to make the template box small and aligned to the left. This also condenses the text and replaces \&amp;quot;article\&amp;quot; with \&amp;quot;section\&amp;quot;.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;left&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;left&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;words&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Word count&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;The present word count of the article&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;15,000&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;date&amp;quot;,&lt;br /&gt;
		&amp;quot;nosplit&amp;quot;,&lt;br /&gt;
		&amp;quot;fix&amp;quot;,&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;small&amp;quot;,&lt;br /&gt;
		&amp;quot;words&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* A list of related [[Wikipedia:Cleanup|cleanup]] templates at [[Wikipedia:Template index/Cleanup]]&lt;br /&gt;
* {{Tl|Lead too long}}&lt;br /&gt;
* {{Tl|Long plot}}&lt;br /&gt;
* {{Tl|Sections}}&lt;br /&gt;
* {{Tl|Subsections}}&lt;br /&gt;
* {{Tl|Summarize section}}&lt;br /&gt;
* {{Tl|Overly detailed}}&lt;br /&gt;
* {{Tl|Too many see alsos}}&lt;br /&gt;
* {{Tl|Very long section}}&lt;br /&gt;
* {{tl|Archive request}} – a template for long talk pages&lt;br /&gt;
&lt;br /&gt;
==Tracking categories==&lt;br /&gt;
* {{clc|Pages using Very long with unknown parameters}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
&amp;lt;!-- Categories below this line, please; interwikis at Wikidata --&amp;gt;&lt;br /&gt;
[[Category:Cleanup templates]]&lt;br /&gt;
[[Category:Coherency templates]]&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Very_long/doc</comments>
		</item>
		<item>
			<title>Template:Parameter</title>
			<link>https://wiki.852r.org/index.php?title=Template:Parameter&amp;diff=3910&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Parameter&amp;diff=3910&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Parameter&quot; title=&quot;Template:Parameter&quot;&gt;Template:Parameter&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}{{{color|}}}&lt;br /&gt;
	| &amp;lt;code class=&amp;quot;tpl-para&amp;quot; style=&amp;quot;word-break:break-word;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{plain|}}}&lt;br /&gt;
		| border: none; background-color: inherit;&lt;br /&gt;
	}} {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{color|}}}&lt;br /&gt;
		| color: {{{color}}};&lt;br /&gt;
		| {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{mxt|}}}{{{green|}}}&lt;br /&gt;
			| color: #006400;&lt;br /&gt;
			| {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{!mxt|}}}{{{red|}}}&lt;br /&gt;
				| color: #8B0000;&lt;br /&gt;
				| color: inherit;&lt;br /&gt;
			}}&lt;br /&gt;
		}}&lt;br /&gt;
	}} {{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{style|}}}|{{{style}}}}}&amp;quot;&amp;gt;&amp;amp;#124;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{1|}}}&lt;br /&gt;
		| {{{1}}}&amp;amp;#61;&lt;br /&gt;
	}}{{{2|}}}&amp;lt;/code&amp;gt;&lt;br /&gt;
	| &amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot; inline style=&amp;quot;display: none;&amp;quot; /&amp;gt;&amp;lt;!-- required to fetch syntaxhighlight&amp;#039;s css --&amp;gt;&amp;lt;code class=&amp;quot;mw-highlight&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;p&amp;quot;&amp;gt;&amp;amp;#124;&amp;lt;/span&amp;gt;{{safesubst:&amp;lt;noinclude /&amp;gt;#if:{{{1|}}}&lt;br /&gt;
		| &amp;lt;span class=&amp;quot;nl&amp;quot;&amp;gt;{{{1}}}&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;o&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt;&lt;br /&gt;
	}}{{{2|}}}&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go near the bottom of the /doc subpage – interwikis go to Wikidata, thank you! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Parameter</comments>
		</item>
		<item>
			<title>Module:Message box/ombox.css</title>
			<link>https://wiki.852r.org/index.php?title=Module:Message_box/ombox.css&amp;diff=3908&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Message_box/ombox.css&amp;diff=3908&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Message_box/ombox.css&quot; title=&quot;Module:Message box/ombox.css&quot;&gt;Module:Message box/ombox.css&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* {{pp|small=y}} */&lt;br /&gt;
.ombox {&lt;br /&gt;
	margin: 4px 0;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	border: 1px solid #a2a9b1;    /* Default &amp;quot;notice&amp;quot; gray */&lt;br /&gt;
	background-color: var(--background-color-neutral-subtle, #f8f9fa);&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
    color: var(--color-base, #202122);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
.ombox.mbox-small {&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox-speedy {&lt;br /&gt;
	border: 2px solid #b32424;    /* Red */&lt;br /&gt;
	background-color: #fee7e6;    /* Pink */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox-delete {&lt;br /&gt;
	border: 2px solid #b32424;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox-content {&lt;br /&gt;
	border: 1px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox-style {&lt;br /&gt;
	border: 1px solid #fc3;       /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox-move {&lt;br /&gt;
	border: 1px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox-protection {&lt;br /&gt;
	border: 2px solid #a2a9b1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox .mbox-text {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 0.25em 0.9em;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox .mbox-image {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.9em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ombox .mbox-imageright {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.9em 2px 0;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* An empty narrow cell */&lt;br /&gt;
.ombox .mbox-empty-cell {&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* keep synced with each other type of message box as this isn&amp;#039;t qualified */&lt;br /&gt;
.mbox-invalid-type {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (min-width: 720px) {&lt;br /&gt;
	.ombox {&lt;br /&gt;
		margin: 4px 10%;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.ombox.mbox-small {&lt;br /&gt;
		/* @noflip */&lt;br /&gt;
		clear: right;&lt;br /&gt;
		/* @noflip */&lt;br /&gt;
		float: right;&lt;br /&gt;
		/* @noflip */&lt;br /&gt;
		margin: 4px 0 4px 1em;&lt;br /&gt;
		width: 238px;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** T367463 */&lt;br /&gt;
body.skin--responsive table.ombox img {&lt;br /&gt;
	max-width: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen {&lt;br /&gt;
	html.skin-theme-clientpref-night .ombox-speedy {&lt;br /&gt;
		background-color: #310402;    /* Dark red, same hue/saturation as light */&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (prefers-color-scheme: dark) {&lt;br /&gt;
	html.skin-theme-clientpref-os .ombox-speedy {&lt;br /&gt;
		background-color: #310402; /* Dark red, same hue/saturation as light */&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Message_box/ombox.css</comments>
		</item>
		<item>
			<title>Template:Example text</title>
			<link>https://wiki.852r.org/index.php?title=Template:Example_text&amp;diff=3906&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Example_text&amp;diff=3906&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Example_text&quot; title=&quot;Template:Example text&quot;&gt;Template:Example text&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{#ifeq:{{NAMESPACE}}|{{ns:0}}|{{FormattingError|[[:{{safesubst:&amp;lt;noinclude/&amp;gt;#invoke:TEMPLATENAME|main}}]] is only for examples of style and formatting. Do not use it in actual articles.}}|&amp;lt;span class=&amp;quot;example&amp;quot; style=&amp;quot;font-family: Georgia, &amp;#039;DejaVu Serif&amp;#039;, serif; color: var(--color-content-added, #006400);&amp;quot; {{#if:{{{title|}}}|title=&amp;quot;{{{title}}}&amp;quot;}}&amp;gt;{{{1|Example text}}}&amp;lt;/span&amp;gt;}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Example_text</comments>
		</item>
		<item>
			<title>Hongkongggag Wiki:Template messages/Splitting/List</title>
			<link>https://wiki.852r.org/index.php?title=Hongkongggag_Wiki:Template_messages/Splitting/List&amp;diff=3904&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Hongkongggag_Wiki:Template_messages/Splitting/List&amp;diff=3904&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Hongkongggag_Wiki:Template_messages/Splitting/List&quot; class=&quot;mw-redirect&quot; title=&quot;Hongkongggag Wiki:Template messages/Splitting/List&quot;&gt;Hongkongggag Wiki:Template messages/Splitting/List&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#REDIRECT [[Wikipedia:Template index/Splitting/List]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Hongkongggag_Wiki_talk:Template_messages/Splitting/List</comments>
		</item>
		<item>
			<title>Hongkongggag Wiki:Template messages/Merging/List</title>
			<link>https://wiki.852r.org/index.php?title=Hongkongggag_Wiki:Template_messages/Merging/List&amp;diff=3902&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Hongkongggag_Wiki:Template_messages/Merging/List&amp;diff=3902&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Hongkongggag_Wiki:Template_messages/Merging/List&quot; class=&quot;mw-redirect&quot; title=&quot;Hongkongggag Wiki:Template messages/Merging/List&quot;&gt;Hongkongggag Wiki:Template messages/Merging/List&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#REDIRECT [[Wikipedia:Template index/Merging/List]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Hongkongggag_Wiki_talk:Template_messages/Merging/List</comments>
		</item>
		<item>
			<title>Hongkongggag Wiki:Template index/Splitting/List</title>
			<link>https://wiki.852r.org/index.php?title=Hongkongggag_Wiki:Template_index/Splitting/List&amp;diff=3900&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Hongkongggag_Wiki:Template_index/Splitting/List&amp;diff=3900&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Hongkongggag_Wiki:Template_index/Splitting/List&quot; title=&quot;Hongkongggag Wiki:Template index/Splitting/List&quot;&gt;Hongkongggag Wiki:Template index/Splitting/List&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Short description|Wikimedia project page}}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;;This page is utilized as a sub-template :which is called and is common to the usage sections of the split templates it lists. &lt;br /&gt;
:It does nothing more than list these links and self-categorize itself.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:{{{noheading|}}}||&amp;lt;h2&amp;gt;See also&amp;lt;/h2&amp;gt;&lt;br /&gt;
{{further2|[[Wikipedia:Splitting]]|[[Wikipedia:Merging]]|[[Wikipedia:Section move]]}}&lt;br /&gt;
}}{{#if:{{{only split|}}}||&lt;br /&gt;
&amp;lt;h3&amp;gt;Splitting&amp;lt;/h3&amp;gt;&lt;br /&gt;
}}{{div col|colwidth=15em}}&lt;br /&gt;
* {{tl|Split}}&lt;br /&gt;
* {{tl|Being split}}&lt;br /&gt;
* {{tl|Split section}}&lt;br /&gt;
* {{tl|Split sections}}&lt;br /&gt;
* {{tl|Split portions}}&lt;br /&gt;
* {{tl|Split section portions}}&lt;br /&gt;
* {{tl|Cleanup split}}&lt;br /&gt;
* {{tl|Copied}}&lt;br /&gt;
* {{tl|Split dab}}&lt;br /&gt;
* {{tl|Split and dab}}&lt;br /&gt;
* {{tl|Split article}}&lt;br /&gt;
* {{tl|Very long}}&lt;br /&gt;
{{div col end}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Documentation see also templates|Splitting]]&lt;br /&gt;
[[Category:Wikipedia template administration]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Hongkongggag_Wiki_talk:Template_index/Splitting/List</comments>
		</item>
		<item>
			<title>Hongkongggag Wiki:Template index/Merging/List</title>
			<link>https://wiki.852r.org/index.php?title=Hongkongggag_Wiki:Template_index/Merging/List&amp;diff=3898&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Hongkongggag_Wiki:Template_index/Merging/List&amp;diff=3898&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Hongkongggag_Wiki:Template_index/Merging/List&quot; title=&quot;Hongkongggag Wiki:Template index/Merging/List&quot;&gt;Hongkongggag Wiki:Template index/Merging/List&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;noinclude&amp;gt;;This page is utilized as a sub-template :which is called and is common to the usage sections of the merge templates it lists. &lt;br /&gt;
:It does nothing more than list these links and self-categorize itself.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:{{{noheading|}}}||&amp;lt;h2&amp;gt;See also&amp;lt;/h2&amp;gt;&lt;br /&gt;
{{further|Wikipedia:Splitting|Wikipedia:Merging}}&lt;br /&gt;
}}{{#if:{{{only merge|}}}||&lt;br /&gt;
&amp;lt;h3&amp;gt;Merging&amp;lt;/h3&amp;gt;&lt;br /&gt;
}}{{div col|colwidth=15em}}&lt;br /&gt;
* {{tl|Merge}} - DEPRECATED&lt;br /&gt;
* {{tl|Merge to}} - DEPRECATED&lt;br /&gt;
* {{tl|Merge from}} - new discussions use &amp;quot;afd&amp;quot; parameter&lt;br /&gt;
* {{tl|AfDM}} - replaces &amp;quot;Merge to&amp;quot; for new discussions&lt;br /&gt;
* {{tl|Afd-merge to}} - merges with consensus that have not been implemented yet, in the new system&lt;br /&gt;
* {{tl|Being merged}}&lt;br /&gt;
* {{tl|Merge portions from}}&lt;br /&gt;
* {{tl|Cleanup merge}}&lt;br /&gt;
* {{tl|Copied}}&lt;br /&gt;
* {{tl|Merged-to}}&lt;br /&gt;
* {{tl|Merged-from}}&lt;br /&gt;
* {{tl|Old merge}}&lt;br /&gt;
* {{tl|Duplication}}&lt;br /&gt;
{{div col end|}}&lt;br /&gt;
{{#if:{{{only merge|}}}||&lt;br /&gt;
===Section moving===&lt;br /&gt;
{{div col|colwidth=15em}}&lt;br /&gt;
* {{tl|Section move from}}&lt;br /&gt;
* {{tl|Section move to}}&lt;br /&gt;
{{div col end|}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Documentation see also templates|Merging]]&lt;br /&gt;
[[Category:Wikipedia template administration]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:20 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Hongkongggag_Wiki_talk:Template_index/Merging/List</comments>
		</item>
		<item>
			<title>Template:Template shortcut</title>
			<link>https://wiki.852r.org/index.php?title=Template:Template_shortcut&amp;diff=3896&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Template_shortcut&amp;diff=3896&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Template_shortcut&quot; title=&quot;Template:Template shortcut&quot;&gt;Template:Template shortcut&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Shortcut|main|template=yes}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Template_shortcut</comments>
		</item>
		<item>
			<title>Template:Clc</title>
			<link>https://wiki.852r.org/index.php?title=Template:Clc&amp;diff=3894&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Clc&amp;diff=3894&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Clc&quot; class=&quot;mw-redirect&quot; title=&quot;Template:Clc&quot;&gt;Template:Clc&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#REDIRECT [[Template:Category link with count]]&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Clc</comments>
		</item>
		<item>
			<title>Template:Template parameter usage</title>
			<link>https://wiki.852r.org/index.php?title=Template:Template_parameter_usage&amp;diff=3892&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Template_parameter_usage&amp;diff=3892&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Template_parameter_usage&quot; title=&quot;Template:Template parameter usage&quot;&gt;Template:Template parameter usage&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{#switch:{{{label|}}}&lt;br /&gt;
 |=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&amp;amp;template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|S|s}}ee a monthly parameter usage report] for {{#if:{{{1|}}}|[[Template:{{ROOTPAGENAME:{{{1|}}}}}]]|this template}} in articles{{#ifeq:{{yesno-no|{{{based}}}}}|yes|&amp;amp;#32;based on {{#if:{{{1|}}}|its|this}} TemplateData}}.&lt;br /&gt;
 |None|none=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&amp;amp;template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|P|p}}arameter usage report]{{#ifeq:{{yesno-no|{{{based}}}}}|yes|&amp;amp;#32;based on {{#if:{{{1|}}}|its|this}} TemplateData}}&lt;br /&gt;
 |for|For=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&amp;amp;template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|P|p}}arameter usage report] for {{#if:{{{1|}}}|[[Template:{{ROOTPAGENAME:{{{1|}}}}}]]|[[Template:{{ROOTPAGENAME}}]]}}{{#ifeq:{{yesno-no|{{{based}}}}}|yes|&amp;amp;#32;based on {{#if:{{{1|}}}|its|this}} TemplateData}}.&lt;br /&gt;
 |#default=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&amp;amp;template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{{label|}}}]{{#ifeq:{{yesno-no|{{{based}}}}}|yes|&amp;amp;#32;based on {{#if:{{{1|}}}|its|this}} TemplateData}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Template_parameter_usage</comments>
		</item>
		<item>
			<title>Template:TemplateData header</title>
			<link>https://wiki.852r.org/index.php?title=Template:TemplateData_header&amp;diff=3890&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:TemplateData_header&amp;diff=3890&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:TemplateData_header&quot; title=&quot;Template:TemplateData header&quot;&gt;Template:TemplateData header&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;div class=&amp;quot;templatedata-header&amp;quot;&amp;gt;{{#if:{{{noheader|}}}|&amp;lt;!--&lt;br /&gt;
 noheader:&lt;br /&gt;
--&amp;gt;{{Template parameter usage|{{{1|{{BASEPAGENAME}}}}}|based=y}}|&amp;lt;!--&lt;br /&gt;
 +header:&lt;br /&gt;
--&amp;gt;This is the {{#if:{{{nolink|}}}|&amp;lt;!--&lt;br /&gt;
  +header, nolink TD&lt;br /&gt;
  --&amp;gt;TemplateData|&amp;lt;!--&lt;br /&gt;
  +header,  +link [[TD]]; DEFAULT:&lt;br /&gt;
--&amp;gt;[[Wikipedia:TemplateData|TemplateData]]}}&amp;lt;!--&lt;br /&gt;
   e.o. #if:nolink; DEFAULT:&lt;br /&gt;
--&amp;gt; for this template used by [[mw:Extension:TemplateWizard|TemplateWizard]], [[Wikipedia:VisualEditor|VisualEditor]] and other tools. {{Template parameter usage|{{{1|{{BASEPAGENAME}}}}}|based=y}}&amp;lt;!--&lt;br /&gt;
   e.o. #if:noheader&lt;br /&gt;
--&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TemplateData for {{{1|{{BASEPAGENAME}}}}}&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 check parameters&lt;br /&gt;
--&amp;gt;{{#invoke:Check for unknown parameters|check&lt;br /&gt;
|unknown={{template other|1=[[Category:Pages using TemplateData header with unknown parameters|_VALUE_]]}}&lt;br /&gt;
|template=Template:TemplateData header&lt;br /&gt;
|1 |nolink |noheader&lt;br /&gt;
|preview=&amp;lt;div class=&amp;quot;error&amp;quot; style=&amp;quot;font-weight:normal&amp;quot;&amp;gt;Unknown parameter &amp;#039;_VALUE_&amp;#039; in [[Template:TemplateData header]].&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{template other|{{sandbox other||&lt;br /&gt;
[[Category:Templates using TemplateData]]&lt;br /&gt;
&lt;br /&gt;
}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:TemplateData_header</comments>
		</item>
		<item>
			<title>Template:Twinkle standard installation</title>
			<link>https://wiki.852r.org/index.php?title=Template:Twinkle_standard_installation&amp;diff=3888&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Twinkle_standard_installation&amp;diff=3888&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Twinkle_standard_installation&quot; title=&quot;Template:Twinkle standard installation&quot;&gt;Template:Twinkle standard installation&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Mbox&lt;br /&gt;
| image = [[File:Twinkle logo.svg|50x40px|alt=Logo of Twinkle|link=]]&lt;br /&gt;
| text = Any [[Template:Twinkle standard installation#&amp;quot;Breaking changes&amp;quot;|breaking changes]] to this template, including moving it or nominating it for deletion, {{strong|must be communicated in advance}} to [[Wikipedia:Twinkle|Twinkle]]&amp;#039;s users and maintainers at [[Wikipedia talk:Twinkle]]. The standard installation of Twinkle relies on this template. Thank you.{{#if:{{{1|}}}|&amp;lt;br&amp;gt;&lt;br /&gt;
{{{1}}}}}}}&amp;lt;includeonly&amp;gt;{{#if:{{{nocat|}}}||{{#ifeq:{{PAGENAME}}|{{BASEPAGENAME}}|[[Category:Templates used by Twinkle|{{PAGENAME}}]]}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Twinkle_standard_installation</comments>
		</item>
		<item>
			<title>Template:Very long section</title>
			<link>https://wiki.852r.org/index.php?title=Template:Very_long_section&amp;diff=3886&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Very_long_section&amp;diff=3886&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Very_long_section&quot; title=&quot;Template:Very long section&quot;&gt;Template:Very long section&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{ {{{|safesubst:}}}#invoke:Unsubst||date=__DATE__ |$B=&lt;br /&gt;
{{Very long&lt;br /&gt;
|name=Very long section&lt;br /&gt;
|subst=&amp;lt;includeonly&amp;gt;{{subst:&amp;lt;/includeonly&amp;gt;&amp;lt;includeonly&amp;gt;substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
|1=section&lt;br /&gt;
|date={{{date|}}}&lt;br /&gt;
|nosplit={{{nosplit|}}}&lt;br /&gt;
}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&amp;lt;!--Please add this template&amp;#039;s categories to the /doc subpage, interwikis to Wikidata, not here - thanks!--&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Very_long_section</comments>
		</item>
		<item>
			<title>Module:Shortcut/config</title>
			<link>https://wiki.852r.org/index.php?title=Module:Shortcut/config&amp;diff=3884&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Shortcut/config&amp;diff=3884&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Shortcut/config&quot; title=&quot;Module:Shortcut/config&quot;&gt;Module:Shortcut/config&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module holds configuration data for [[Module:Shortcut]].&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
&lt;br /&gt;
-- The heading at the top of the shortcut box. It accepts the following parameter:&lt;br /&gt;
-- $1 - the total number of shortcuts. (required)&lt;br /&gt;
[&amp;#039;shortcut-heading&amp;#039;] = &amp;#039;[[Wikipedia:Shortcut|{{PLURAL:$1|Shortcut|Shortcuts}}]]&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
-- The heading when |redirect=yes is given. It accepts the following parameter:&lt;br /&gt;
-- $1 - the total number of shortcuts. (required)&lt;br /&gt;
[&amp;#039;redirect-heading&amp;#039;] = &amp;#039;[[Wikipedia:Redirect|{{PLURAL:$1|Redirect|Redirects}}]]&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
-- The error message to display when a shortcut is invalid (is not a string, or&lt;br /&gt;
-- is the blank string). It accepts the following parameter:&lt;br /&gt;
-- $1 - the number of the shortcut in the argument list. (required)&lt;br /&gt;
[&amp;#039;invalid-shortcut-error&amp;#039;] = &amp;#039;shortcut #$1 was invalid (shortcuts must be &amp;#039; ..&lt;br /&gt;
	&amp;#039;strings of at least one character in length)&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
-- The error message to display when no shortcuts or other displayable content&lt;br /&gt;
-- were specified. (required)&lt;br /&gt;
[&amp;#039;no-content-error&amp;#039;] = &amp;#039;Error: no shortcuts were specified and the &amp;#039; ..&lt;br /&gt;
	mw.text.nowiki(&amp;#039;|msg=&amp;#039;) ..&lt;br /&gt;
	&amp;#039; parameter was not set.&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
-- A category to add when the no-content-error message is displayed. (optional)&lt;br /&gt;
[&amp;#039;no-content-error-category&amp;#039;] = &amp;#039;Shortcut templates with missing parameters&amp;#039;,&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Shortcut/config</comments>
		</item>
		<item>
			<title>Module:Shortcut</title>
			<link>https://wiki.852r.org/index.php?title=Module:Shortcut&amp;diff=3882&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Shortcut&amp;diff=3882&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Shortcut&quot; title=&quot;Module:Shortcut&quot;&gt;Module:Shortcut&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module implements {{shortcut}}.&lt;br /&gt;
&lt;br /&gt;
-- Set constants&lt;br /&gt;
local CONFIG_MODULE = &amp;#039;Module:Shortcut/config&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- Load required modules&lt;br /&gt;
local checkType = require(&amp;#039;libraryUtil&amp;#039;).checkType&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function message(msg, ...)&lt;br /&gt;
	return mw.message.newRawMessage(msg, ...):plain()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(cat)&lt;br /&gt;
	return string.format(&amp;#039;[[%s:%s]]&amp;#039;, mw.site.namespaces[14].name, cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(shortcuts, options, frame, cfg)&lt;br /&gt;
	checkType(&amp;#039;_main&amp;#039;, 1, shortcuts, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;_main&amp;#039;, 2, options, &amp;#039;table&amp;#039;, true)&lt;br /&gt;
	options = options or {}&lt;br /&gt;
	frame = frame or mw.getCurrentFrame()&lt;br /&gt;
	cfg = cfg or mw.loadData(CONFIG_MODULE)&lt;br /&gt;
	local templateMode = options.template and yesno(options.template)&lt;br /&gt;
	local redirectMode = options.redirect and yesno(options.redirect)&lt;br /&gt;
	local isCategorized = not options.category or yesno(options.category) ~= false&lt;br /&gt;
&lt;br /&gt;
	-- Validate shortcuts&lt;br /&gt;
	for i, shortcut in ipairs(shortcuts) do&lt;br /&gt;
		if type(shortcut) ~= &amp;#039;string&amp;#039; or #shortcut &amp;lt; 1 then&lt;br /&gt;
			error(message(cfg[&amp;#039;invalid-shortcut-error&amp;#039;], i), 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Make the list items. These are the shortcuts plus any extra lines such&lt;br /&gt;
	-- as options.msg.&lt;br /&gt;
	local listItems = {}&lt;br /&gt;
	for i, shortcut in ipairs(shortcuts) do&lt;br /&gt;
		local templatePath, prefix&lt;br /&gt;
		if templateMode then&lt;br /&gt;
			-- Namespace detection&lt;br /&gt;
			local titleObj = mw.title.new(shortcut, 10)&lt;br /&gt;
			if titleObj.namespace == 10 then&lt;br /&gt;
				templatePath = titleObj.fullText&lt;br /&gt;
			else&lt;br /&gt;
				templatePath = shortcut&lt;br /&gt;
			end&lt;br /&gt;
			prefix = options[&amp;#039;pre&amp;#039; .. i] or options.pre or &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		if options.target and yesno(options.target) then&lt;br /&gt;
			listItems[i] = templateMode&lt;br /&gt;
				and string.format(&amp;quot;&amp;amp;#123;&amp;amp;#123;%s[[%s|%s]]&amp;amp;#125;&amp;amp;#125;&amp;quot;, prefix, templatePath, shortcut)&lt;br /&gt;
				or string.format(&amp;quot;[[%s]]&amp;quot;, shortcut)&lt;br /&gt;
		else&lt;br /&gt;
			listItems[i] = frame:expandTemplate{&lt;br /&gt;
				title = &amp;#039;No redirect&amp;#039;,&lt;br /&gt;
				args = templateMode and {templatePath, shortcut} or {shortcut, shortcut}&lt;br /&gt;
			}&lt;br /&gt;
			if templateMode then&lt;br /&gt;
				listItems[i] = string.format(&amp;quot;&amp;amp;#123;&amp;amp;#123;%s%s&amp;amp;#125;&amp;amp;#125;&amp;quot;, prefix, listItems[i])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(listItems, options.msg)&lt;br /&gt;
&lt;br /&gt;
	-- Return an error if we have nothing to display&lt;br /&gt;
	if #listItems &amp;lt; 1 then&lt;br /&gt;
		local msg = cfg[&amp;#039;no-content-error&amp;#039;]&lt;br /&gt;
		msg = string.format(&amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;%s&amp;lt;/strong&amp;gt;&amp;#039;, msg)&lt;br /&gt;
		if isCategorized and cfg[&amp;#039;no-content-error-category&amp;#039;] then&lt;br /&gt;
			msg = msg .. makeCategoryLink(cfg[&amp;#039;no-content-error-category&amp;#039;])&lt;br /&gt;
		end&lt;br /&gt;
		return msg&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	root:wikitext(frame:extensionTag{ name = &amp;#039;templatestyles&amp;#039;, args = { src = &amp;#039;Module:Shortcut/styles.css&amp;#039;} })&lt;br /&gt;
	-- Anchors&lt;br /&gt;
	local anchorDiv = root&lt;br /&gt;
		:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;module-shortcutanchordiv&amp;#039;)&lt;br /&gt;
	for i, shortcut in ipairs(shortcuts) do&lt;br /&gt;
		local anchor = mw.uri.anchorEncode(shortcut)&lt;br /&gt;
		anchorDiv:tag(&amp;#039;span&amp;#039;):attr(&amp;#039;id&amp;#039;, anchor)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Shortcut heading&lt;br /&gt;
	local shortcutHeading&lt;br /&gt;
	do&lt;br /&gt;
		local nShortcuts = #shortcuts&lt;br /&gt;
		if nShortcuts &amp;gt; 0 then&lt;br /&gt;
			local headingMsg = options[&amp;#039;shortcut-heading&amp;#039;] or&lt;br /&gt;
				redirectMode and cfg[&amp;#039;redirect-heading&amp;#039;] or&lt;br /&gt;
				cfg[&amp;#039;shortcut-heading&amp;#039;]&lt;br /&gt;
			shortcutHeading = message(headingMsg, nShortcuts)&lt;br /&gt;
			shortcutHeading = frame:preprocess(shortcutHeading)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Shortcut box&lt;br /&gt;
	local shortcutList = root&lt;br /&gt;
		:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;module-shortcutboxplain noprint&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;role&amp;#039;, &amp;#039;note&amp;#039;)&lt;br /&gt;
	if options.float and options.float:lower() == &amp;#039;left&amp;#039; then&lt;br /&gt;
		shortcutList:addClass(&amp;#039;module-shortcutboxleft&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if options.clear and options.clear ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		shortcutList:css(&amp;#039;clear&amp;#039;, options.clear)&lt;br /&gt;
	end&lt;br /&gt;
	if shortcutHeading then&lt;br /&gt;
		shortcutList&lt;br /&gt;
			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;module-shortcutlist&amp;#039;)&lt;br /&gt;
				:wikitext(shortcutHeading)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ubl = require(&amp;#039;Module:List&amp;#039;).unbulleted(listItems)&lt;br /&gt;
	shortcutList:wikitext(ubl)&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	-- Separate shortcuts from options&lt;br /&gt;
	local shortcuts, options = {}, {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if type(k) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			shortcuts[k] = v&lt;br /&gt;
		else&lt;br /&gt;
			options[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Compress the shortcut array, which may contain nils.&lt;br /&gt;
	local function compressArray(t)&lt;br /&gt;
		local nums, ret = {}, {}&lt;br /&gt;
		for k in pairs(t) do&lt;br /&gt;
			nums[#nums + 1] = k&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(nums)&lt;br /&gt;
		for i, num in ipairs(nums) do&lt;br /&gt;
			ret[i] = t[num]&lt;br /&gt;
		end&lt;br /&gt;
		return ret&lt;br /&gt;
	end&lt;br /&gt;
	shortcuts = compressArray(shortcuts)&lt;br /&gt;
&lt;br /&gt;
	return p._main(shortcuts, options, frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Shortcut</comments>
		</item>
		<item>
			<title>Template:Documentation subpage</title>
			<link>https://wiki.852r.org/index.php?title=Template:Documentation_subpage&amp;diff=3880&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Documentation_subpage&amp;diff=3880&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Documentation_subpage&quot; title=&quot;Template:Documentation subpage&quot;&gt;Template:Documentation subpage&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#ifeq:{{lc:{{SUBPAGENAME}}}} |{{{override|doc}}}&lt;br /&gt;
     | &amp;lt;!--(this template has been transcluded on a /doc or /{{{override}}} page)--&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
      --&amp;gt;{{#ifeq:{{{doc-notice|show}}} |show&lt;br /&gt;
          | {{Mbox&lt;br /&gt;
             | type = notice&lt;br /&gt;
             | style = margin-bottom:1.0em;&lt;br /&gt;
             | image = [[File:Edit-copy green.svg|40px|alt=icon]]&lt;br /&gt;
             | text =&lt;br /&gt;
{{strong|This is a [[Wikipedia:Template documentation|documentation subpage]]}} for {{terminate sentence|{{{1|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}]]}}}}}&amp;lt;br /&amp;gt;It may contain usage information, [[Wikipedia:Categorization|categories]] and other content that is not part of the original {{#if:{{{text2|}}} |{{{text2}}} |{{#if:{{{text1|}}} |{{{text1}}} |{{#ifeq:{{SUBJECTSPACE}} |{{ns:User}} |{{lc:{{SUBJECTSPACE}}}} template page |{{#if:{{SUBJECTSPACE}} |{{lc:{{SUBJECTSPACE}}}} page|article}}}}}}}}. &lt;br /&gt;
            }}&lt;br /&gt;
         }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
      --&amp;gt;{{DEFAULTSORT:{{{defaultsort|{{PAGENAME}}}}}}}&amp;lt;!--&lt;br /&gt;
      &lt;br /&gt;
      --&amp;gt;&amp;lt;includeonly&amp;gt;__EXPECTED_UNCONNECTED_PAGE__&amp;lt;/includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
      --&amp;gt;{{#if:{{{nocat|}}}{{{inhibit|}}}|&amp;lt;!--(don&amp;#039;t categorize)--&amp;gt;&lt;br /&gt;
          |&amp;lt;includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
               --&amp;gt;{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}&lt;br /&gt;
                   | [[Category:{{#switch:{{SUBJECTSPACE}} |Template=Template |Module=Module |User=User |#default=Wikipedia}} documentation pages]]&lt;br /&gt;
                   | [[Category:Documentation subpages without corresponding pages]]&lt;br /&gt;
                  }}&amp;lt;!--&lt;br /&gt;
           --&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
         }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
(completing initial #ifeq: at start of template:)&lt;br /&gt;
--&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
     | &amp;lt;!--(this template has not been transcluded on a /doc or /{{{override}}} page)--&amp;gt;&lt;br /&gt;
    }}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Documentation_subpage</comments>
		</item>
		<item>
			<title>Template:Sandbox other</title>
			<link>https://wiki.852r.org/index.php?title=Template:Sandbox_other&amp;diff=3878&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Sandbox_other&amp;diff=3878&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Sandbox_other&quot; title=&quot;Template:Sandbox other&quot;&gt;Template:Sandbox other&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{safesubst:&amp;lt;noinclude/&amp;gt;#if:{{safesubst:&amp;lt;noinclude/&amp;gt;#ifeq:{{safesubst:&amp;lt;noinclude/&amp;gt;#invoke:String|sublength|s={{safesubst:&amp;lt;noinclude/&amp;gt;SUBPAGENAME}}|i=0|len=7}}|sandbox|1}}{{safesubst:&amp;lt;noinclude/&amp;gt;#ifeq:{{safesubst:&amp;lt;noinclude/&amp;gt;SUBPAGENAME}}|doc|1}}{{safesubst:&amp;lt;noinclude/&amp;gt;#invoke:String|match|{{safesubst:&amp;lt;noinclude/&amp;gt;PAGENAME}}|/sandbox/styles.css$|plain=false|nomatch=}}|{{{1|}}}|{{{2|}}}}}&amp;lt;/onlyinclude&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{documentation}}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Sandbox_other</comments>
		</item>
		<item>
			<title>Module:Documentation/styles.css</title>
			<link>https://wiki.852r.org/index.php?title=Module:Documentation/styles.css&amp;diff=3876&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Documentation/styles.css&amp;diff=3876&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Documentation/styles.css&quot; title=&quot;Module:Documentation/styles.css&quot;&gt;Module:Documentation/styles.css&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* {{pp|small=yes}} */&lt;br /&gt;
.documentation,&lt;br /&gt;
.documentation-metadata {&lt;br /&gt;
	border: 1px solid var( --border-color-base, #a2a9b1 );&lt;br /&gt;
	background-color: #ecfcf4;&lt;br /&gt;
	color:inherit;&lt;br /&gt;
	clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation {&lt;br /&gt;
	margin: 1em 0 0 0;&lt;br /&gt;
	padding: 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-metadata {&lt;br /&gt;
	margin: 0.2em 0; /* same margin left-right as .documentation */&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
    padding: 0.4em 1em; /* same padding left-right as .documentation */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-startbox {&lt;br /&gt;
	padding-bottom: 3px;&lt;br /&gt;
	border-bottom: 1px solid var( --border-color-base, #a2a9b1 );&lt;br /&gt;
	margin-bottom: 1ex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-heading {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 125%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
body.skin-minerva .documentation-startbox .mw-editsection-like a,&lt;br /&gt;
body.skin-timeless .documentation-startbox .mw-editsection-like a {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	margin-left: 0.3em;&lt;br /&gt;
	margin-right: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-clear { /* Don&amp;#039;t want things to stick out where they shouldn&amp;#039;t. */&lt;br /&gt;
	clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.documentation-toolbar {&lt;br /&gt;
	font-style: normal;&lt;br /&gt;
	font-size: 85%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@media screen {&lt;br /&gt;
    html.skin-theme-clientpref-night .documentation,&lt;br /&gt;
	html.skin-theme-clientpref-night .documentation-metadata {&lt;br /&gt;
	    background-color: #0b1e1c;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@media screen and ( prefers-color-scheme: dark ) {&lt;br /&gt;
    html.skin-theme-clientpref-os .documentation,&lt;br /&gt;
    html.skin-theme-clientpref-os .documentation-metadata {&lt;br /&gt;
        background-color: #0b1e1c;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Documentation/styles.css</comments>
		</item>
		<item>
			<title>Module:Documentation/config</title>
			<link>https://wiki.852r.org/index.php?title=Module:Documentation/config&amp;diff=3874&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Documentation/config&amp;diff=3874&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Documentation/config&quot; title=&quot;Module:Documentation/config&quot;&gt;Module:Documentation/config&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;----------------------------------------------------------------------------------------------------&lt;br /&gt;
--&lt;br /&gt;
--                               Configuration for Module:Documentation&lt;br /&gt;
--&lt;br /&gt;
-- Here you can set the values of the parameters and messages used in Module:Documentation to&lt;br /&gt;
-- localise it to your wiki and your language. Unless specified otherwise, values given here&lt;br /&gt;
-- should be string values.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Do not edit this line.&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Protection template configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;protection-reason-edit&amp;#039;]&lt;br /&gt;
-- The protection reason for edit-protected templates to pass to&lt;br /&gt;
-- [[Module:Protection banner]].&lt;br /&gt;
cfg[&amp;#039;protection-reason-edit&amp;#039;] = &amp;#039;template&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Sandbox notice configuration&lt;br /&gt;
--&lt;br /&gt;
-- On sandbox pages the module can display a template notifying users that the current page is a&lt;br /&gt;
-- sandbox, and the location of test cases pages, etc. The module decides whether the page is a&lt;br /&gt;
-- sandbox or not based on the value of cfg[&amp;#039;sandbox-subpage&amp;#039;]. The following settings configure the&lt;br /&gt;
-- messages that the notices contains.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-image&amp;#039;]&lt;br /&gt;
-- The image displayed in the sandbox notice.&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-image&amp;#039;] = &amp;#039;[[File:Edit In Sandbox Icon - Color.svg|50px|alt=|link=]]&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-pagetype-template&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-pagetype-module&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-pagetype-other&amp;#039;]&lt;br /&gt;
-- The page type of the sandbox page. The message that is displayed depends on the current subject&lt;br /&gt;
-- namespace. This message is used in either cfg[&amp;#039;sandbox-notice-blurb&amp;#039;] or&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-diff-blurb&amp;#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-pagetype-template&amp;#039;] = &amp;#039;[[Wikipedia:Template test cases|template sandbox]] page&amp;#039;&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-pagetype-module&amp;#039;] = &amp;#039;[[Wikipedia:Template test cases|module sandbox]] page&amp;#039;&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-pagetype-other&amp;#039;] = &amp;#039;sandbox page&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-blurb&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-diff-blurb&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-diff-display&amp;#039;]&lt;br /&gt;
-- Either cfg[&amp;#039;sandbox-notice-blurb&amp;#039;] or cfg[&amp;#039;sandbox-notice-diff-blurb&amp;#039;] is the opening sentence&lt;br /&gt;
-- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page&lt;br /&gt;
-- type, which is either cfg[&amp;#039;sandbox-notice-pagetype-template&amp;#039;],&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-pagetype-module&amp;#039;] or cfg[&amp;#039;sandbox-notice-pagetype-other&amp;#039;] depending what&lt;br /&gt;
-- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between&lt;br /&gt;
-- the sandbox and the main template. The display value of the diff link is set by &lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-compare-link-display&amp;#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-blurb&amp;#039;] = &amp;#039;This is the $1 for $2.&amp;#039;&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-diff-blurb&amp;#039;] = &amp;#039;This is the $1 for $2 ($3).&amp;#039;&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-compare-link-display&amp;#039;] = &amp;#039;diff&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-testcases-blurb&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-testcases-link-display&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-testcases-run-blurb&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-testcases-run-link-display&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-testcases-blurb&amp;#039;] is a sentence notifying the user that there is a test cases page&lt;br /&gt;
-- corresponding to this sandbox that they can edit. $1 is a link to the test cases page.&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-testcases-link-display&amp;#039;] is the display value for that link.&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-testcases-run-blurb&amp;#039;] is a sentence notifying the user that there is a test cases page&lt;br /&gt;
-- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test&lt;br /&gt;
-- cases page, and $2 is a link to the page to run it.&lt;br /&gt;
-- cfg[&amp;#039;sandbox-notice-testcases-run-link-display&amp;#039;] is the display value for the link to run the test&lt;br /&gt;
-- cases.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-testcases-blurb&amp;#039;] = &amp;#039;See also the companion subpage for $1.&amp;#039;&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-testcases-link-display&amp;#039;] = &amp;#039;test cases&amp;#039;&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-testcases-run-blurb&amp;#039;] = &amp;#039;See also the companion subpage for $1 ($2).&amp;#039;&lt;br /&gt;
cfg[&amp;#039;sandbox-notice-testcases-run-link-display&amp;#039;] = &amp;#039;run&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;sandbox-category&amp;#039;] - A category to add to all template sandboxes.&lt;br /&gt;
-- cfg[&amp;#039;module-sandbox-category&amp;#039;] - A category to add to all module sandboxes.&lt;br /&gt;
-- cfg[&amp;#039;module-sandbox-category&amp;#039;] - A category to add to all sandboxe not in templates or modules.&lt;br /&gt;
cfg[&amp;#039;sandbox-category&amp;#039;] = &amp;#039;Template sandboxes&amp;#039;&lt;br /&gt;
cfg[&amp;#039;module-sandbox-category&amp;#039;] = &amp;#039;Module sandboxes&amp;#039;&lt;br /&gt;
cfg[&amp;#039;other-sandbox-category&amp;#039;] = &amp;#039;Sandboxes outside of template or module namespace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Start box configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;documentation-icon-wikitext&amp;#039;]&lt;br /&gt;
-- The wikitext for the icon shown at the top of the template.&lt;br /&gt;
cfg[&amp;#039;documentation-icon-wikitext&amp;#039;] = &amp;#039;[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;template-namespace-heading&amp;#039;]&lt;br /&gt;
-- The heading shown in the template namespace.&lt;br /&gt;
cfg[&amp;#039;template-namespace-heading&amp;#039;] = &amp;#039;Template documentation&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;module-namespace-heading&amp;#039;]&lt;br /&gt;
-- The heading shown in the module namespace.&lt;br /&gt;
cfg[&amp;#039;module-namespace-heading&amp;#039;] = &amp;#039;Module documentation&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;file-namespace-heading&amp;#039;]&lt;br /&gt;
-- The heading shown in the file namespace.&lt;br /&gt;
cfg[&amp;#039;file-namespace-heading&amp;#039;] = &amp;#039;Summary&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;other-namespaces-heading&amp;#039;]&lt;br /&gt;
-- The heading shown in other namespaces.&lt;br /&gt;
cfg[&amp;#039;other-namespaces-heading&amp;#039;] = &amp;#039;Documentation&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;view-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;view&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;view-link-display&amp;#039;] = &amp;#039;view&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;edit-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;edit-link-display&amp;#039;] = &amp;#039;edit&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;history-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;history&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;history-link-display&amp;#039;] = &amp;#039;history&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;purge-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;purge&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;purge-link-display&amp;#039;] = &amp;#039;purge&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;create-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;create-link-display&amp;#039;] = &amp;#039;create&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Link box (end box) configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;transcluded-from-blurb&amp;#039;]&lt;br /&gt;
-- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page.&lt;br /&gt;
cfg[&amp;#039;transcluded-from-blurb&amp;#039;] = &amp;#039;The above [[Wikipedia:Template documentation|documentation]] is [[Help:Transclusion|transcluded]] from $1.&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&amp;#039;create-module-doc-blurb&amp;#039;]&lt;br /&gt;
-- Notice displayed in the module namespace when the documentation subpage does not exist.&lt;br /&gt;
-- $1 is a link to create the documentation page with the preload cfg[&amp;#039;module-preload&amp;#039;] and the&lt;br /&gt;
-- display cfg[&amp;#039;create-link-display&amp;#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&amp;#039;create-module-doc-blurb&amp;#039;] = &amp;#039;You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Experiment blurb configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&amp;#039;experiment-blurb-template&amp;#039;]&lt;br /&gt;
-- cfg[&amp;#039;experiment-blurb-module&amp;#039;]&lt;br /&gt;
-- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages.&lt;br /&gt;
-- It is only shown in the template and module namespaces. With the default English settings, it&lt;br /&gt;
-- might look like this:&lt;br /&gt;
--&lt;br /&gt;
-- Editors can experiment in this template&amp;#039;s sandbox (edit | diff) and testcases (edit) pages.&lt;br /&gt;
--&lt;br /&gt;
-- In this example, &amp;quot;sandbox&amp;quot;, &amp;quot;edit&amp;quot;, &amp;quot;diff&amp;quot;, &amp;quot;testcases&amp;quot;, and &amp;quot;edit&amp;quot; would all be links.&lt;br /&gt;
--&lt;br /&gt;
-- There are two versions, cfg[&amp;#039;experiment-blurb-template&amp;#039;] and cfg[&amp;#039;experiment-blurb-module&amp;#039;], depending&lt;br /&gt;
-- on what namespace we are in.&lt;br /&gt;
-- &lt;br /&gt;
-- Parameters:&lt;br /&gt;
--&lt;br /&gt;
-- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&amp;#039;sandbox-link-display&amp;#039;] (cfg[&amp;#039;sandbox-edit-link-display&amp;#039;] | cfg[&amp;#039;compare-link-display&amp;#039;])&lt;br /&gt;
-- &lt;br /&gt;
-- If the sandbox doesn&amp;#039;t exist, it is in the format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&amp;#039;sandbox-link-display&amp;#039;] (cfg[&amp;#039;sandbox-create-link-display&amp;#039;] | cfg[&amp;#039;mirror-link-display&amp;#039;])&lt;br /&gt;
-- &lt;br /&gt;
-- The link for cfg[&amp;#039;sandbox-create-link-display&amp;#039;] link preloads the page with cfg[&amp;#039;template-sandbox-preload&amp;#039;]&lt;br /&gt;
-- or cfg[&amp;#039;module-sandbox-preload&amp;#039;], depending on the current namespace. The link for cfg[&amp;#039;mirror-link-display&amp;#039;]&lt;br /&gt;
-- loads a default edit summary of cfg[&amp;#039;mirror-edit-summary&amp;#039;].&lt;br /&gt;
--&lt;br /&gt;
-- $2 is a link to the test cases page. If the test cases page exists, it is in the following format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&amp;#039;testcases-link-display&amp;#039;] (cfg[&amp;#039;testcases-edit-link-display&amp;#039;] | cfg[&amp;#039;testcases-run-link-display&amp;#039;])&lt;br /&gt;
--&lt;br /&gt;
-- If the test cases page doesn&amp;#039;t exist, it is in the format:&lt;br /&gt;
-- &lt;br /&gt;
--     cfg[&amp;#039;testcases-link-display&amp;#039;] (cfg[&amp;#039;testcases-create-link-display&amp;#039;])&lt;br /&gt;
--&lt;br /&gt;
-- If the test cases page doesn&amp;#039;t exist, the link for cfg[&amp;#039;testcases-create-link-display&amp;#039;] preloads the&lt;br /&gt;
-- page with cfg[&amp;#039;template-testcases-preload&amp;#039;] or cfg[&amp;#039;module-testcases-preload&amp;#039;], depending on the current&lt;br /&gt;
-- namespace.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&amp;#039;experiment-blurb-template&amp;#039;] = &amp;quot;Editors can experiment in this template&amp;#039;s $1 and $2 pages.&amp;quot;&lt;br /&gt;
cfg[&amp;#039;experiment-blurb-module&amp;#039;] = &amp;quot;Editors can experiment in this module&amp;#039;s $1 and $2 pages.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Sandbox link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;sandbox-subpage&amp;#039;]&lt;br /&gt;
-- The name of the template subpage typically used for sandboxes.&lt;br /&gt;
cfg[&amp;#039;sandbox-subpage&amp;#039;] = &amp;#039;sandbox&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;template-sandbox-preload&amp;#039;]&lt;br /&gt;
-- Preload file for template sandbox pages.&lt;br /&gt;
cfg[&amp;#039;template-sandbox-preload&amp;#039;] = &amp;#039;Template:Documentation/preload-sandbox&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;module-sandbox-preload&amp;#039;]&lt;br /&gt;
-- Preload file for Lua module sandbox pages.&lt;br /&gt;
cfg[&amp;#039;module-sandbox-preload&amp;#039;] = &amp;#039;Template:Documentation/preload-module-sandbox&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;sandbox-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;sandbox&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;sandbox-link-display&amp;#039;] = &amp;#039;sandbox&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;sandbox-edit-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for sandbox &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;sandbox-edit-link-display&amp;#039;] = &amp;#039;edit&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;sandbox-create-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for sandbox &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;sandbox-create-link-display&amp;#039;] = &amp;#039;create&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;compare-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;compare&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;compare-link-display&amp;#039;] = &amp;#039;diff&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;mirror-edit-summary&amp;#039;]&lt;br /&gt;
-- The default edit summary to use when a user clicks the &amp;quot;mirror&amp;quot; link. $1 is a wikilink to the&lt;br /&gt;
-- template page.&lt;br /&gt;
cfg[&amp;#039;mirror-edit-summary&amp;#039;] = &amp;#039;Create sandbox version of $1&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;mirror-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;mirror&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;mirror-link-display&amp;#039;] = &amp;#039;mirror&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;mirror-link-preload&amp;#039;]&lt;br /&gt;
-- The page to preload when a user clicks the &amp;quot;mirror&amp;quot; link.&lt;br /&gt;
cfg[&amp;#039;mirror-link-preload&amp;#039;] = &amp;#039;Template:Documentation/mirror&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Test cases link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;testcases-subpage&amp;#039;]&lt;br /&gt;
-- The name of the template subpage typically used for test cases.&lt;br /&gt;
cfg[&amp;#039;testcases-subpage&amp;#039;] = &amp;#039;testcases&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;template-testcases-preload&amp;#039;]&lt;br /&gt;
-- Preload file for template test cases pages.&lt;br /&gt;
cfg[&amp;#039;template-testcases-preload&amp;#039;] = &amp;#039;Template:Documentation/preload-testcases&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;module-testcases-preload&amp;#039;]&lt;br /&gt;
-- Preload file for Lua module test cases pages.&lt;br /&gt;
cfg[&amp;#039;module-testcases-preload&amp;#039;] = &amp;#039;Template:Documentation/preload-module-testcases&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;testcases-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for &amp;quot;testcases&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;testcases-link-display&amp;#039;] = &amp;#039;testcases&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;testcases-edit-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for test cases &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;testcases-edit-link-display&amp;#039;] = &amp;#039;edit&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;testcases-run-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for test cases &amp;quot;run&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;testcases-run-link-display&amp;#039;] = &amp;#039;run&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;testcases-create-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for test cases &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg[&amp;#039;testcases-create-link-display&amp;#039;] = &amp;#039;create&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Add categories blurb configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&amp;#039;add-categories-blurb&amp;#039;]&lt;br /&gt;
-- Text to direct users to add categories to the /doc subpage. Not used if the &amp;quot;content&amp;quot; or&lt;br /&gt;
-- &amp;quot;docname fed&amp;quot; arguments are set, as then it is not clear where to add the categories. $1 is a&lt;br /&gt;
-- link to the /doc subpage with a display value of cfg[&amp;#039;doc-link-display&amp;#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&amp;#039;add-categories-blurb&amp;#039;] = &amp;#039;Add categories to the $1 subpage.&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;doc-link-display&amp;#039;]&lt;br /&gt;
-- The text to display when linking to the /doc subpage.&lt;br /&gt;
cfg[&amp;#039;doc-link-display&amp;#039;] = &amp;#039;/doc&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Subpages link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&amp;#039;subpages-blurb&amp;#039;]&lt;br /&gt;
-- The &amp;quot;Subpages of this template&amp;quot; blurb. $1 is a link to the main template&amp;#039;s subpages with a&lt;br /&gt;
-- display value of cfg[&amp;#039;subpages-link-display&amp;#039;]. In the English version this blurb is simply&lt;br /&gt;
-- the link followed by a period, and the link display provides the actual text.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&amp;#039;subpages-blurb&amp;#039;] = &amp;#039;$1.&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&amp;#039;subpages-link-display&amp;#039;]&lt;br /&gt;
-- The text to display for the &amp;quot;subpages of this page&amp;quot; link. $1 is cfg[&amp;#039;template-pagetype&amp;#039;],&lt;br /&gt;
-- cfg[&amp;#039;module-pagetype&amp;#039;] or cfg[&amp;#039;default-pagetype&amp;#039;], depending on whether the current page is in&lt;br /&gt;
-- the template namespace, the module namespace, or another namespace.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&amp;#039;subpages-link-display&amp;#039;] = &amp;#039;Subpages of this $1&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;template-pagetype&amp;#039;]&lt;br /&gt;
-- The pagetype to display for template pages.&lt;br /&gt;
cfg[&amp;#039;template-pagetype&amp;#039;] = &amp;#039;template&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;module-pagetype&amp;#039;]&lt;br /&gt;
-- The pagetype to display for Lua module pages.&lt;br /&gt;
cfg[&amp;#039;module-pagetype&amp;#039;] = &amp;#039;module&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;default-pagetype&amp;#039;]&lt;br /&gt;
-- The pagetype to display for pages other than templates or Lua modules.&lt;br /&gt;
cfg[&amp;#039;default-pagetype&amp;#039;] = &amp;#039;page&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Doc link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;doc-subpage&amp;#039;]&lt;br /&gt;
-- The name of the subpage typically used for documentation pages.&lt;br /&gt;
cfg[&amp;#039;doc-subpage&amp;#039;] = &amp;#039;doc&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;docpage-preload&amp;#039;]&lt;br /&gt;
-- Preload file for template documentation pages in all namespaces.&lt;br /&gt;
cfg[&amp;#039;docpage-preload&amp;#039;] = &amp;#039;Template:Documentation/preload&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;module-preload&amp;#039;]&lt;br /&gt;
-- Preload file for Lua module documentation pages.&lt;br /&gt;
cfg[&amp;#039;module-preload&amp;#039;] = &amp;#039;Template:Documentation/preload-module-doc&amp;#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- HTML and CSS configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;templatestyles&amp;#039;]&lt;br /&gt;
-- The name of the TemplateStyles page where CSS is kept.&lt;br /&gt;
-- Sandbox CSS will be at Module:Documentation/sandbox/styles.css when needed.&lt;br /&gt;
cfg[&amp;#039;templatestyles&amp;#039;] = &amp;#039;Module:Documentation/styles.css&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;container&amp;#039;]&lt;br /&gt;
-- Class which can be used to set flex or grid CSS on the&lt;br /&gt;
-- two child divs documentation and documentation-metadata&lt;br /&gt;
cfg[&amp;#039;container&amp;#039;] = &amp;#039;documentation-container&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;main-div-classes&amp;#039;]&lt;br /&gt;
-- Classes added to the main HTML &amp;quot;div&amp;quot; tag.&lt;br /&gt;
cfg[&amp;#039;main-div-classes&amp;#039;] = &amp;#039;documentation&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;main-div-heading-class&amp;#039;]&lt;br /&gt;
-- Class for the main heading for templates and modules and assoc. talk spaces&lt;br /&gt;
cfg[&amp;#039;main-div-heading-class&amp;#039;] = &amp;#039;documentation-heading&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;start-box-class&amp;#039;]&lt;br /&gt;
-- Class for the start box&lt;br /&gt;
cfg[&amp;#039;start-box-class&amp;#039;] = &amp;#039;documentation-startbox&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;start-box-link-classes&amp;#039;]&lt;br /&gt;
-- Classes used for the [view][edit][history] or [create] links in the start box.&lt;br /&gt;
-- mw-editsection-like is per [[Wikipedia:Village pump (technical)/Archive 117]]&lt;br /&gt;
cfg[&amp;#039;start-box-link-classes&amp;#039;] = &amp;#039;mw-editsection-like plainlinks&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;end-box-class&amp;#039;]&lt;br /&gt;
-- Class for the end box.&lt;br /&gt;
cfg[&amp;#039;end-box-class&amp;#039;] = &amp;#039;documentation-metadata&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;end-box-plainlinks&amp;#039;]&lt;br /&gt;
-- Plainlinks&lt;br /&gt;
cfg[&amp;#039;end-box-plainlinks&amp;#039;] = &amp;#039;plainlinks&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;toolbar-class&amp;#039;]&lt;br /&gt;
-- Class added for toolbar links.&lt;br /&gt;
cfg[&amp;#039;toolbar-class&amp;#039;] = &amp;#039;documentation-toolbar&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;clear&amp;#039;]&lt;br /&gt;
-- Just used to clear things.&lt;br /&gt;
cfg[&amp;#039;clear&amp;#039;] = &amp;#039;documentation-clear&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Tracking category configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;display-strange-usage-category&amp;#039;]&lt;br /&gt;
-- Set to true to enable output of cfg[&amp;#039;strange-usage-category&amp;#039;] if the module is used on a /doc subpage&lt;br /&gt;
-- or a /testcases subpage. This should be a boolean value (either true or false).&lt;br /&gt;
cfg[&amp;#039;display-strange-usage-category&amp;#039;] = true&lt;br /&gt;
&lt;br /&gt;
-- cfg[&amp;#039;strange-usage-category&amp;#039;]&lt;br /&gt;
-- Category to output if cfg[&amp;#039;display-strange-usage-category&amp;#039;] is set to true and the module is used on a&lt;br /&gt;
-- /doc subpage or a /testcases subpage.&lt;br /&gt;
cfg[&amp;#039;strange-usage-category&amp;#039;] = &amp;#039;Wikipedia pages with strange ((documentation)) usage&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- End configuration&lt;br /&gt;
--&lt;br /&gt;
-- Don&amp;#039;t edit anything below this line.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
return cfg&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Documentation/config</comments>
		</item>
		<item>
			<title>Module:Documentation</title>
			<link>https://wiki.852r.org/index.php?title=Module:Documentation&amp;diff=3872&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Documentation&amp;diff=3872&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Documentation&quot; title=&quot;Module:Documentation&quot;&gt;Module:Documentation&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;a href=&quot;https://wiki.852r.org/index.php?title=Module:Documentation&amp;amp;diff=3872&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Documentation</comments>
		</item>
		<item>
			<title>Template:No redirect</title>
			<link>https://wiki.852r.org/index.php?title=Template:No_redirect&amp;diff=3870&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:No_redirect&amp;diff=3870&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:No_redirect&quot; title=&quot;Template:No redirect&quot;&gt;Template:No redirect&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{safesubst:&amp;lt;noinclude/&amp;gt;#if: {{safesubst:&amp;lt;noinclude/&amp;gt;#invoke:Redirect|isRedirect|{{{1}}}}}&lt;br /&gt;
| &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{safesubst:&amp;lt;noinclude/&amp;gt;fullurl:{{{1}}}|redirect=no}} {{{2|{{{1}}}}}}]&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;display: none&amp;quot;&amp;gt;[[:{{{1}}}]]&amp;lt;/span&amp;gt;&lt;br /&gt;
| [[:{{safesubst:&amp;lt;noinclude/&amp;gt;FULLPAGENAME:{{{1}}}}}|{{{2|{{{1}}}}}}]]&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:19 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:No_redirect</comments>
		</item>
		<item>
			<title>Template:Para</title>
			<link>https://wiki.852r.org/index.php?title=Template:Para&amp;diff=3868&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Para&amp;diff=3868&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Para&quot; class=&quot;mw-redirect&quot; title=&quot;Template:Para&quot;&gt;Template:Para&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#REDIRECT [[Template:Parameter]]&lt;br /&gt;
&lt;br /&gt;
{{Rcat shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
{{R from template shortcut}}&lt;br /&gt;
}}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Para</comments>
		</item>
		<item>
			<title>Template:Strong</title>
			<link>https://wiki.852r.org/index.php?title=Template:Strong&amp;diff=3866&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Strong&amp;diff=3866&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Strong&quot; title=&quot;Template:Strong&quot;&gt;Template:Strong&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;strong {{#if:{{{role|}}}|role=&amp;quot;{{{role}}}&amp;quot;}} {{#if:{{{class|}}}|class=&amp;quot;{{{class}}}&amp;quot;}} {{#if:{{{id|}}}|id=&amp;quot;{{{id}}}&amp;quot;}} {{#if:{{{style|}}}|style=&amp;quot;{{{style}}}&amp;quot;}} {{#if:{{{title|}}}|title=&amp;quot;{{{title}}}&amp;quot;}}&amp;gt;{{{1}}}&amp;lt;/strong&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add cats and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Strong</comments>
		</item>
		<item>
			<title>Template:Div col end</title>
			<link>https://wiki.852r.org/index.php?title=Template:Div_col_end&amp;diff=3864&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Div_col_end&amp;diff=3864&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Div_col_end&quot; title=&quot;Template:Div col end&quot;&gt;Template:Div col end&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation|Template:Div col/doc}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Div_col_end</comments>
		</item>
		<item>
			<title>Template:Div col/styles.css</title>
			<link>https://wiki.852r.org/index.php?title=Template:Div_col/styles.css&amp;diff=3862&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Div_col/styles.css&amp;diff=3862&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Div_col/styles.css&quot; title=&quot;Template:Div col/styles.css&quot;&gt;Template:Div col/styles.css&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* {{pp|small=yes}} */&lt;br /&gt;
.div-col {&lt;br /&gt;
	margin-top: 0.3em;&lt;br /&gt;
	column-width: 30em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.div-col-small {&lt;br /&gt;
	font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.div-col-rules {&lt;br /&gt;
	column-rule: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Reset top margin for lists in div col */&lt;br /&gt;
.div-col dl,&lt;br /&gt;
.div-col ol,&lt;br /&gt;
.div-col ul {&lt;br /&gt;
	margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Avoid elements breaking between columns&lt;br /&gt;
   See also Template:No col break */&lt;br /&gt;
.div-col li,&lt;br /&gt;
.div-col dd {&lt;br /&gt;
	page-break-inside: avoid; /* Removed from CSS in favor of break-inside c. 2020 */&lt;br /&gt;
	break-inside: avoid-column;&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Div_col/styles.css</comments>
		</item>
		<item>
			<title>Module:Protection banner/config</title>
			<link>https://wiki.852r.org/index.php?title=Module:Protection_banner/config&amp;diff=3860&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Protection_banner/config&amp;diff=3860&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Protection_banner/config&quot; title=&quot;Module:Protection banner/config&quot;&gt;Module:Protection banner/config&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;a href=&quot;https://wiki.852r.org/index.php?title=Module:Protection_banner/config&amp;amp;diff=3860&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Protection_banner/config</comments>
		</item>
		<item>
			<title>Module:Protection banner</title>
			<link>https://wiki.852r.org/index.php?title=Module:Protection_banner&amp;diff=3858&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Protection_banner&amp;diff=3858&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Protection_banner&quot; title=&quot;Module:Protection banner&quot;&gt;Module:Protection banner&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module implements {{pp-meta}} and its daughter templates such as&lt;br /&gt;
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.&lt;br /&gt;
&lt;br /&gt;
-- Initialise necessary modules.&lt;br /&gt;
require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local makeFileLink = require(&amp;#039;Module:File link&amp;#039;)._main&lt;br /&gt;
local effectiveProtectionLevel = require(&amp;#039;Module:Effective protection level&amp;#039;)._main&lt;br /&gt;
local effectiveProtectionExpiry = require(&amp;#039;Module:Effective protection expiry&amp;#039;)._main&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily initialise modules and objects we don&amp;#039;t always need.&lt;br /&gt;
local getArgs, makeMessageBox, lang&lt;br /&gt;
&lt;br /&gt;
-- Set constants.&lt;br /&gt;
local CONFIG_MODULE = &amp;#039;Module:Protection banner/config&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(cat, sort)&lt;br /&gt;
	if cat then&lt;br /&gt;
		return string.format(&lt;br /&gt;
			&amp;#039;[[%s:%s|%s]]&amp;#039;,&lt;br /&gt;
			mw.site.namespaces[14].name,&lt;br /&gt;
			cat,&lt;br /&gt;
			sort&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Validation function for the expiry and the protection date&lt;br /&gt;
local function validateDate(dateString, dateType)&lt;br /&gt;
	if not lang then&lt;br /&gt;
		lang = mw.language.getContentLanguage()&lt;br /&gt;
	end&lt;br /&gt;
	local success, result = pcall(lang.formatDate, lang, &amp;#039;U&amp;#039;, dateString)&lt;br /&gt;
	if success then&lt;br /&gt;
		result = tonumber(result)&lt;br /&gt;
		if result then&lt;br /&gt;
			return result&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	error(string.format(&lt;br /&gt;
		&amp;#039;invalid %s: %s&amp;#039;,&lt;br /&gt;
		dateType,&lt;br /&gt;
		tostring(dateString)&lt;br /&gt;
	), 4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeFullUrl(page, query, display)&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&amp;#039;[%s %s]&amp;#039;,&lt;br /&gt;
		tostring(mw.uri.fullUrl(page, query)),&lt;br /&gt;
		display&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given a directed graph formatted as node -&amp;gt; table of direct successors,&lt;br /&gt;
-- get a table of all nodes reachable from a given node (though always&lt;br /&gt;
-- including the given node).&lt;br /&gt;
local function getReachableNodes(graph, start)&lt;br /&gt;
	local toWalk, retval = {[start] = true}, {}&lt;br /&gt;
	while true do&lt;br /&gt;
		-- Can&amp;#039;t use pairs() since we&amp;#039;re adding and removing things as we&amp;#039;re iterating&lt;br /&gt;
		local k = next(toWalk) -- This always gets the &amp;quot;first&amp;quot; key&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return retval&lt;br /&gt;
		end&lt;br /&gt;
		toWalk[k] = nil&lt;br /&gt;
		retval[k] = true&lt;br /&gt;
		for _,v in ipairs(graph[k]) do&lt;br /&gt;
			if not retval[v] then&lt;br /&gt;
				toWalk[v] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Protection class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Protection = {}&lt;br /&gt;
Protection.__index = Protection&lt;br /&gt;
&lt;br /&gt;
Protection.supportedActions = {&lt;br /&gt;
	edit = true,&lt;br /&gt;
	move = true,&lt;br /&gt;
	autoreview = true,&lt;br /&gt;
	upload = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Protection.bannerConfigFields = {&lt;br /&gt;
	&amp;#039;text&amp;#039;,&lt;br /&gt;
	&amp;#039;explanation&amp;#039;,&lt;br /&gt;
	&amp;#039;tooltip&amp;#039;,&lt;br /&gt;
	&amp;#039;alt&amp;#039;,&lt;br /&gt;
	&amp;#039;link&amp;#039;,&lt;br /&gt;
	&amp;#039;image&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Protection.new(args, cfg, title)&lt;br /&gt;
	local obj = {}&lt;br /&gt;
	obj._cfg = cfg&lt;br /&gt;
	obj.title = title or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set action&lt;br /&gt;
	if not args.action then&lt;br /&gt;
		obj.action = &amp;#039;edit&amp;#039;&lt;br /&gt;
	elseif Protection.supportedActions[args.action] then&lt;br /&gt;
		obj.action = args.action&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;#039;invalid action: %s&amp;#039;,&lt;br /&gt;
			tostring(args.action)&lt;br /&gt;
		), 3)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set level&lt;br /&gt;
	obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)&lt;br /&gt;
	if not obj.level or (obj.action == &amp;#039;move&amp;#039; and obj.level == &amp;#039;autoconfirmed&amp;#039;) then&lt;br /&gt;
		-- Users need to be autoconfirmed to move pages anyway, so treat&lt;br /&gt;
		-- semi-move-protected pages as unprotected.&lt;br /&gt;
		obj.level = &amp;#039;*&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set expiry&lt;br /&gt;
	local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)&lt;br /&gt;
	if effectiveExpiry == &amp;#039;infinity&amp;#039; then&lt;br /&gt;
		obj.expiry = &amp;#039;indef&amp;#039;&lt;br /&gt;
	elseif effectiveExpiry ~= &amp;#039;unknown&amp;#039; then&lt;br /&gt;
		obj.expiry = validateDate(effectiveExpiry, &amp;#039;expiry date&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set reason&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		obj.reason = mw.ustring.lower(args[1])&lt;br /&gt;
		if obj.reason:find(&amp;#039;|&amp;#039;) then&lt;br /&gt;
			error(&amp;#039;reasons cannot contain the pipe character (&amp;quot;|&amp;quot;)&amp;#039;, 3)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set protection date&lt;br /&gt;
	if args.date then&lt;br /&gt;
		obj.protectionDate = validateDate(args.date, &amp;#039;protection date&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Set banner config&lt;br /&gt;
	do&lt;br /&gt;
		obj.bannerConfig = {}&lt;br /&gt;
		local configTables = {}&lt;br /&gt;
		if cfg.banners[obj.action] then&lt;br /&gt;
			configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]&lt;br /&gt;
		end&lt;br /&gt;
		if cfg.defaultBanners[obj.action] then&lt;br /&gt;
			configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]&lt;br /&gt;
			configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default&lt;br /&gt;
		end&lt;br /&gt;
		configTables[#configTables + 1] = cfg.masterBanner&lt;br /&gt;
		for i, field in ipairs(Protection.bannerConfigFields) do&lt;br /&gt;
			for j, t in ipairs(configTables) do&lt;br /&gt;
				if t[field] then&lt;br /&gt;
					obj.bannerConfig[field] = t[field]&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return setmetatable(obj, Protection)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isUserScript()&lt;br /&gt;
	-- Whether the page is a user JavaScript or CSS page.&lt;br /&gt;
	local title = self.title&lt;br /&gt;
	return title.namespace == 2 and (&lt;br /&gt;
		title.contentModel == &amp;#039;javascript&amp;#039; or title.contentModel == &amp;#039;css&amp;#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isProtected()&lt;br /&gt;
	return self.level ~= &amp;#039;*&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:shouldShowLock()&lt;br /&gt;
	-- Whether we should output a banner/padlock&lt;br /&gt;
	return self:isProtected() and not self:isUserScript()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Whether this page needs a protection category.&lt;br /&gt;
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock&lt;br /&gt;
&lt;br /&gt;
function Protection:isTemporary()&lt;br /&gt;
	return type(self.expiry) == &amp;#039;number&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:makeProtectionCategory()&lt;br /&gt;
	if not self:shouldHaveProtectionCategory() then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local cfg = self._cfg&lt;br /&gt;
	local title = self.title&lt;br /&gt;
	&lt;br /&gt;
	-- Get the expiry key fragment.&lt;br /&gt;
	local expiryFragment&lt;br /&gt;
	if self.expiry == &amp;#039;indef&amp;#039; then&lt;br /&gt;
		expiryFragment = self.expiry&lt;br /&gt;
	elseif type(self.expiry) == &amp;#039;number&amp;#039; then&lt;br /&gt;
		expiryFragment = &amp;#039;temp&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the namespace key fragment.&lt;br /&gt;
	local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]&lt;br /&gt;
	if not namespaceFragment and title.namespace % 2 == 1 then&lt;br /&gt;
			namespaceFragment = &amp;#039;talk&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define the order that key fragments are tested in. This is done with an&lt;br /&gt;
	-- array of tables containing the value to be tested, along with its&lt;br /&gt;
	-- position in the cfg.protectionCategories table.&lt;br /&gt;
	local order = {&lt;br /&gt;
		{val = expiryFragment,    keypos = 1},&lt;br /&gt;
		{val = namespaceFragment, keypos = 2},&lt;br /&gt;
		{val = self.reason,       keypos = 3},&lt;br /&gt;
		{val = self.level,        keypos = 4},&lt;br /&gt;
		{val = self.action,       keypos = 5}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- The old protection templates used an ad-hoc protection category system,&lt;br /&gt;
	-- with some templates prioritising namespaces in their categories, and&lt;br /&gt;
	-- others prioritising the protection reason. To emulate this in this module&lt;br /&gt;
	-- we use the config table cfg.reasonsWithNamespacePriority to set the&lt;br /&gt;
	-- reasons for which namespaces have priority over protection reason.&lt;br /&gt;
	-- If we are dealing with one of those reasons, move the namespace table to&lt;br /&gt;
	-- the end of the order table, i.e. give it highest priority. If not, the&lt;br /&gt;
	-- reason should have highest priority, so move that to the end of the table&lt;br /&gt;
	-- instead.&lt;br /&gt;
	--]]&lt;br /&gt;
	table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))&lt;br /&gt;
 &lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define the attempt order. Inactive subtables (subtables with nil &amp;quot;value&amp;quot;&lt;br /&gt;
	-- fields) are moved to the end, where they will later be given the key&lt;br /&gt;
	-- &amp;quot;all&amp;quot;. This is to cut down on the number of table lookups in&lt;br /&gt;
	-- cfg.protectionCategories, which grows exponentially with the number of&lt;br /&gt;
	-- non-nil keys. We keep track of the number of active subtables with the&lt;br /&gt;
	-- noActive parameter.&lt;br /&gt;
	--]]&lt;br /&gt;
	local noActive, attemptOrder&lt;br /&gt;
	do&lt;br /&gt;
		local active, inactive = {}, {}&lt;br /&gt;
		for i, t in ipairs(order) do&lt;br /&gt;
			if t.val then&lt;br /&gt;
				active[#active + 1] = t&lt;br /&gt;
			else&lt;br /&gt;
				inactive[#inactive + 1] = t&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		noActive = #active&lt;br /&gt;
		attemptOrder = active&lt;br /&gt;
		for i, t in ipairs(inactive) do&lt;br /&gt;
			attemptOrder[#attemptOrder + 1] = t&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	--[[&lt;br /&gt;
	-- Check increasingly generic key combinations until we find a match. If a&lt;br /&gt;
	-- specific category exists for the combination of key fragments we are&lt;br /&gt;
	-- given, that match will be found first. If not, we keep trying different&lt;br /&gt;
	-- key fragment combinations until we match using the key&lt;br /&gt;
	-- &amp;quot;all-all-all-all-all&amp;quot;.&lt;br /&gt;
	--&lt;br /&gt;
	-- To generate the keys, we index the key subtables using a binary matrix&lt;br /&gt;
	-- with indexes i and j. j is only calculated up to the number of active&lt;br /&gt;
	-- subtables. For example, if there were three active subtables, the matrix&lt;br /&gt;
	-- would look like this, with 0 corresponding to the key fragment &amp;quot;all&amp;quot;, and&lt;br /&gt;
	-- 1 corresponding to other key fragments.&lt;br /&gt;
	-- &lt;br /&gt;
	--   j 1  2  3&lt;br /&gt;
	-- i  &lt;br /&gt;
	-- 1   1  1  1&lt;br /&gt;
	-- 2   0  1  1&lt;br /&gt;
	-- 3   1  0  1&lt;br /&gt;
	-- 4   0  0  1&lt;br /&gt;
	-- 5   1  1  0&lt;br /&gt;
	-- 6   0  1  0&lt;br /&gt;
	-- 7   1  0  0&lt;br /&gt;
	-- 8   0  0  0&lt;br /&gt;
	-- &lt;br /&gt;
	-- Values of j higher than the number of active subtables are set&lt;br /&gt;
	-- to the string &amp;quot;all&amp;quot;.&lt;br /&gt;
	--&lt;br /&gt;
	-- A key for cfg.protectionCategories is constructed for each value of i.&lt;br /&gt;
	-- The position of the value in the key is determined by the keypos field in&lt;br /&gt;
	-- each subtable.&lt;br /&gt;
	--]]&lt;br /&gt;
	local cats = cfg.protectionCategories&lt;br /&gt;
	for i = 1, 2^noActive do&lt;br /&gt;
		local key = {}&lt;br /&gt;
		for j, t in ipairs(attemptOrder) do&lt;br /&gt;
			if j &amp;gt; noActive then&lt;br /&gt;
				key[t.keypos] = &amp;#039;all&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				local quotient = i / 2 ^ (j - 1)&lt;br /&gt;
				quotient = math.ceil(quotient)&lt;br /&gt;
				if quotient % 2 == 1 then&lt;br /&gt;
					key[t.keypos] = t.val&lt;br /&gt;
				else&lt;br /&gt;
					key[t.keypos] = &amp;#039;all&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		key = table.concat(key, &amp;#039;|&amp;#039;)&lt;br /&gt;
		local attempt = cats[key]&lt;br /&gt;
		if attempt then&lt;br /&gt;
			return makeCategoryLink(attempt, title.text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isIncorrect()&lt;br /&gt;
	if not self:shouldHaveProtectionCategory() then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	if type(self.expiry) ~= &amp;#039;number&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local expiry = os.date(&amp;#039;*t&amp;#039;, self.expiry)&lt;br /&gt;
	-- Avoid checking today.day or os.time(), unless close. https://phabricator.wikimedia.org/T416616&lt;br /&gt;
	local today = os.date(&amp;#039;*t&amp;#039;)&lt;br /&gt;
	return (expiry.year &amp;lt; today.year)&lt;br /&gt;
		or (expiry.year == today.year and expiry.month &amp;lt; today.month)&lt;br /&gt;
		or (expiry.year == today.year and expiry.month == today.month and expiry.day &amp;lt; today.day)&lt;br /&gt;
		or (expiry.year == today.year and expiry.month == today.month and expiry.day == today.day and self.expiry &amp;lt; os.time())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:isTemplateProtectedNonTemplate()&lt;br /&gt;
	local action, namespace = self.action, self.title.namespace&lt;br /&gt;
	return self.level == &amp;#039;templateeditor&amp;#039;&lt;br /&gt;
		and (&lt;br /&gt;
			(action ~= &amp;#039;edit&amp;#039; and action ~= &amp;#039;move&amp;#039;)&lt;br /&gt;
			or (namespace ~= 10 and namespace ~= 828)&lt;br /&gt;
		)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Protection:makeCategoryLinks()&lt;br /&gt;
	local msg = self._cfg.msg&lt;br /&gt;
	local ret = {self:makeProtectionCategory()}&lt;br /&gt;
	if self:isIncorrect() then&lt;br /&gt;
		ret[#ret + 1] = makeCategoryLink(&lt;br /&gt;
			msg[&amp;#039;tracking-category-incorrect&amp;#039;],&lt;br /&gt;
			self.title.text&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	if self:isTemplateProtectedNonTemplate() then&lt;br /&gt;
		ret[#ret + 1] = makeCategoryLink(&lt;br /&gt;
			msg[&amp;#039;tracking-category-template&amp;#039;],&lt;br /&gt;
			self.title.text&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Blurb class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Blurb = {}&lt;br /&gt;
Blurb.__index = Blurb&lt;br /&gt;
&lt;br /&gt;
Blurb.bannerTextFields = {&lt;br /&gt;
	text = true,&lt;br /&gt;
	explanation = true,&lt;br /&gt;
	tooltip = true,&lt;br /&gt;
	alt = true,&lt;br /&gt;
	link = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Blurb.new(protectionObj, args, cfg)&lt;br /&gt;
	return setmetatable({&lt;br /&gt;
		_cfg = cfg,&lt;br /&gt;
		_protectionObj = protectionObj,&lt;br /&gt;
		_args = args&lt;br /&gt;
	}, Blurb)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Private methods --&lt;br /&gt;
&lt;br /&gt;
function Blurb:_formatDate(num)&lt;br /&gt;
	-- Formats a Unix timestamp into dd Month, YYYY format.&lt;br /&gt;
	lang = lang or mw.language.getContentLanguage()&lt;br /&gt;
	local success, date = pcall(&lt;br /&gt;
		lang.formatDate,&lt;br /&gt;
		lang,&lt;br /&gt;
		self._cfg.msg[&amp;#039;expiry-date-format&amp;#039;] or &amp;#039;j F Y&amp;#039;,&lt;br /&gt;
		&amp;#039;@&amp;#039; .. tostring(num)&lt;br /&gt;
	)&lt;br /&gt;
	if success then&lt;br /&gt;
		return date&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_getExpandedMessage(msgKey)&lt;br /&gt;
	return self:_substituteParameters(self._cfg.msg[msgKey])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_substituteParameters(msg)&lt;br /&gt;
	if not self._params then&lt;br /&gt;
		local parameterFuncs = {}&lt;br /&gt;
&lt;br /&gt;
		parameterFuncs.CURRENTVERSION     = self._makeCurrentVersionParameter&lt;br /&gt;
		parameterFuncs.EDITREQUEST        = self._makeEditRequestParameter&lt;br /&gt;
		parameterFuncs.EXPIRY             = self._makeExpiryParameter&lt;br /&gt;
		parameterFuncs.EXPLANATIONBLURB   = self._makeExplanationBlurbParameter&lt;br /&gt;
		parameterFuncs.IMAGELINK          = self._makeImageLinkParameter&lt;br /&gt;
		parameterFuncs.INTROBLURB         = self._makeIntroBlurbParameter&lt;br /&gt;
		parameterFuncs.INTROFRAGMENT      = self._makeIntroFragmentParameter&lt;br /&gt;
		parameterFuncs.PAGETYPE           = self._makePagetypeParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONBLURB    = self._makeProtectionBlurbParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONDATE     = self._makeProtectionDateParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONLEVEL    = self._makeProtectionLevelParameter&lt;br /&gt;
		parameterFuncs.PROTECTIONLOG      = self._makeProtectionLogParameter&lt;br /&gt;
		parameterFuncs.TALKPAGE           = self._makeTalkPageParameter&lt;br /&gt;
		parameterFuncs.TOOLTIPBLURB       = self._makeTooltipBlurbParameter&lt;br /&gt;
		parameterFuncs.TOOLTIPFRAGMENT    = self._makeTooltipFragmentParameter&lt;br /&gt;
		parameterFuncs.VANDAL             = self._makeVandalTemplateParameter&lt;br /&gt;
		&lt;br /&gt;
		self._params = setmetatable({}, {&lt;br /&gt;
			__index = function (t, k)&lt;br /&gt;
				local param&lt;br /&gt;
				if parameterFuncs[k] then&lt;br /&gt;
					param = parameterFuncs[k](self)&lt;br /&gt;
				end&lt;br /&gt;
				param = param or &amp;#039;&amp;#039;&lt;br /&gt;
				t[k] = param&lt;br /&gt;
				return param&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	msg = msg:gsub(&amp;#039;${(%u+)}&amp;#039;, self._params)&lt;br /&gt;
	return msg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeCurrentVersionParameter()&lt;br /&gt;
	-- A link to the page history or the move log, depending on the kind of&lt;br /&gt;
	-- protection.&lt;br /&gt;
	local pagename = self._protectionObj.title.prefixedText&lt;br /&gt;
	if self._protectionObj.action == &amp;#039;move&amp;#039; then&lt;br /&gt;
		-- We need the move log link.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&amp;#039;Special:Log&amp;#039;,&lt;br /&gt;
			{type = &amp;#039;move&amp;#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&amp;#039;current-version-move-display&amp;#039;)&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		-- We need the history link.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			pagename,&lt;br /&gt;
			{action = &amp;#039;history&amp;#039;},&lt;br /&gt;
			self:_getExpandedMessage(&amp;#039;current-version-edit-display&amp;#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeEditRequestParameter()&lt;br /&gt;
	local mEditRequest = require(&amp;#039;Module:Submit an edit request&amp;#039;)&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	&lt;br /&gt;
	-- Get the edit request type.&lt;br /&gt;
	local requestType&lt;br /&gt;
	if action == &amp;#039;edit&amp;#039; then&lt;br /&gt;
		if level == &amp;#039;autoconfirmed&amp;#039; then&lt;br /&gt;
			requestType = &amp;#039;semi&amp;#039;&lt;br /&gt;
		elseif level == &amp;#039;extendedconfirmed&amp;#039; then&lt;br /&gt;
			requestType = &amp;#039;extended&amp;#039;&lt;br /&gt;
		elseif level == &amp;#039;templateeditor&amp;#039; then&lt;br /&gt;
			requestType = &amp;#039;template&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	requestType = requestType or &amp;#039;full&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	-- Get the display value.&lt;br /&gt;
	local display = self:_getExpandedMessage(&amp;#039;edit-request-display&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	return mEditRequest._link{type = requestType, display = display}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeExpiryParameter()&lt;br /&gt;
	local expiry = self._protectionObj.expiry&lt;br /&gt;
	if type(expiry) == &amp;#039;number&amp;#039; then&lt;br /&gt;
		return self:_formatDate(expiry)&lt;br /&gt;
	else&lt;br /&gt;
		return expiry&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeExplanationBlurbParameter()&lt;br /&gt;
	-- Cover special cases first.&lt;br /&gt;
	if self._protectionObj.title.namespace == 8 then&lt;br /&gt;
		-- MediaWiki namespace&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;explanation-blurb-nounprotect&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get explanation blurb table keys&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local talkKey = self._protectionObj.title.isTalkPage and &amp;#039;talk&amp;#039; or &amp;#039;subject&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	-- Find the message in the explanation blurb table and substitute any&lt;br /&gt;
	-- parameters.&lt;br /&gt;
	local explanations = self._cfg.explanationBlurbs&lt;br /&gt;
	local msg&lt;br /&gt;
	if explanations[action][level] and explanations[action][level][talkKey] then&lt;br /&gt;
		msg = explanations[action][level][talkKey]&lt;br /&gt;
	elseif explanations[action][level] and explanations[action][level].default then&lt;br /&gt;
		msg = explanations[action][level].default&lt;br /&gt;
	elseif explanations[action].default and explanations[action].default[talkKey] then&lt;br /&gt;
		msg = explanations[action].default[talkKey]&lt;br /&gt;
	elseif explanations[action].default and explanations[action].default.default then&lt;br /&gt;
		msg = explanations[action].default.default&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;#039;could not find explanation blurb for action &amp;quot;%s&amp;quot;, level &amp;quot;%s&amp;quot; and talk key &amp;quot;%s&amp;quot;&amp;#039;,&lt;br /&gt;
			action,&lt;br /&gt;
			level,&lt;br /&gt;
			talkKey&lt;br /&gt;
		), 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeImageLinkParameter()&lt;br /&gt;
	local imageLinks = self._cfg.imageLinks&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if imageLinks[action][level] then&lt;br /&gt;
		msg = imageLinks[action][level]&lt;br /&gt;
	elseif imageLinks[action].default then&lt;br /&gt;
		msg = imageLinks[action].default&lt;br /&gt;
	else&lt;br /&gt;
		msg = imageLinks.edit.default&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeIntroBlurbParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;intro-blurb-expiry&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;intro-blurb-noexpiry&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeIntroFragmentParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;intro-fragment-expiry&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;intro-fragment-noexpiry&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makePagetypeParameter()&lt;br /&gt;
	local pagetypes = self._cfg.pagetypes&lt;br /&gt;
	return pagetypes[self._protectionObj.title.namespace]&lt;br /&gt;
		or pagetypes.default&lt;br /&gt;
		or error(&amp;#039;no default pagetype defined&amp;#039;, 8)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionBlurbParameter()&lt;br /&gt;
	local protectionBlurbs = self._cfg.protectionBlurbs&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if protectionBlurbs[action][level] then&lt;br /&gt;
		msg = protectionBlurbs[action][level]&lt;br /&gt;
	elseif protectionBlurbs[action].default then&lt;br /&gt;
		msg = protectionBlurbs[action].default&lt;br /&gt;
	elseif protectionBlurbs.edit.default then&lt;br /&gt;
		msg = protectionBlurbs.edit.default&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;#039;no protection blurb defined for protectionBlurbs.edit.default&amp;#039;, 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionDateParameter()&lt;br /&gt;
	local protectionDate = self._protectionObj.protectionDate&lt;br /&gt;
	if type(protectionDate) == &amp;#039;number&amp;#039; then&lt;br /&gt;
		return self:_formatDate(protectionDate)&lt;br /&gt;
	else&lt;br /&gt;
		return protectionDate&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionLevelParameter()&lt;br /&gt;
	local protectionLevels = self._cfg.protectionLevels&lt;br /&gt;
	local action = self._protectionObj.action&lt;br /&gt;
	local level = self._protectionObj.level&lt;br /&gt;
	local msg&lt;br /&gt;
	if protectionLevels[action][level] then&lt;br /&gt;
		msg = protectionLevels[action][level]&lt;br /&gt;
	elseif protectionLevels[action].default then&lt;br /&gt;
		msg = protectionLevels[action].default&lt;br /&gt;
	elseif protectionLevels.edit.default then&lt;br /&gt;
		msg = protectionLevels.edit.default&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;#039;no protection level defined for protectionLevels.edit.default&amp;#039;, 8)&lt;br /&gt;
	end&lt;br /&gt;
	return self:_substituteParameters(msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeProtectionLogParameter()&lt;br /&gt;
	local pagename = self._protectionObj.title.prefixedText&lt;br /&gt;
	if self._protectionObj.action == &amp;#039;autoreview&amp;#039; then&lt;br /&gt;
		-- We need the pending changes log.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&amp;#039;Special:Log&amp;#039;,&lt;br /&gt;
			{type = &amp;#039;stable&amp;#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&amp;#039;pc-log-display&amp;#039;)&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		-- We need the protection log.&lt;br /&gt;
		return makeFullUrl(&lt;br /&gt;
			&amp;#039;Special:Log&amp;#039;,&lt;br /&gt;
			{type = &amp;#039;protect&amp;#039;, page = pagename},&lt;br /&gt;
			self:_getExpandedMessage(&amp;#039;protection-log-display&amp;#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTalkPageParameter()&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&amp;#039;[[%s:%s#%s|%s]]&amp;#039;,&lt;br /&gt;
		mw.site.namespaces[self._protectionObj.title.namespace].talk.name,&lt;br /&gt;
		self._protectionObj.title.text,&lt;br /&gt;
		self._args.section or &amp;#039;top&amp;#039;,&lt;br /&gt;
		self:_getExpandedMessage(&amp;#039;talk-page-link-display&amp;#039;)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTooltipBlurbParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;tooltip-blurb-expiry&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;tooltip-blurb-noexpiry&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeTooltipFragmentParameter()&lt;br /&gt;
	if self._protectionObj:isTemporary() then&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;tooltip-fragment-expiry&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return self:_getExpandedMessage(&amp;#039;tooltip-fragment-noexpiry&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Blurb:_makeVandalTemplateParameter()&lt;br /&gt;
	return mw.getCurrentFrame():expandTemplate{&lt;br /&gt;
		title=&amp;quot;vandal-m&amp;quot;,&lt;br /&gt;
		args={self._args.user or self._protectionObj.title.baseText}&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Public methods --&lt;br /&gt;
&lt;br /&gt;
function Blurb:makeBannerText(key)&lt;br /&gt;
	-- Validate input.&lt;br /&gt;
	if not key or not Blurb.bannerTextFields[key] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;#039;&amp;quot;%s&amp;quot; is not a valid banner config field&amp;#039;,&lt;br /&gt;
			tostring(key)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Generate the text.&lt;br /&gt;
	local msg = self._protectionObj.bannerConfig[key]&lt;br /&gt;
	if type(msg) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return self:_substituteParameters(msg)&lt;br /&gt;
	elseif type(msg) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		msg = msg(self._protectionObj, self._args)&lt;br /&gt;
		if type(msg) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&amp;#039;bad output from banner config function with key &amp;quot;%s&amp;quot;&amp;#039;&lt;br /&gt;
					.. &amp;#039; (expected string, got %s)&amp;#039;,&lt;br /&gt;
				tostring(key),&lt;br /&gt;
				type(msg)&lt;br /&gt;
			), 4)&lt;br /&gt;
		end&lt;br /&gt;
		return self:_substituteParameters(msg)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- BannerTemplate class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local BannerTemplate = {}&lt;br /&gt;
BannerTemplate.__index = BannerTemplate&lt;br /&gt;
&lt;br /&gt;
function BannerTemplate.new(protectionObj, cfg)&lt;br /&gt;
	local obj = {}&lt;br /&gt;
	obj._cfg = cfg&lt;br /&gt;
&lt;br /&gt;
	-- Set the image filename.&lt;br /&gt;
	local imageFilename = protectionObj.bannerConfig.image&lt;br /&gt;
	if imageFilename then&lt;br /&gt;
		obj._imageFilename = imageFilename&lt;br /&gt;
	else&lt;br /&gt;
		-- If an image filename isn&amp;#039;t specified explicitly in the banner config,&lt;br /&gt;
		-- generate it from the protection status and the namespace.&lt;br /&gt;
		local action = protectionObj.action&lt;br /&gt;
		local level = protectionObj.level&lt;br /&gt;
		local namespace = protectionObj.title.namespace&lt;br /&gt;
		local reason = protectionObj.reason&lt;br /&gt;
		&lt;br /&gt;
		-- Deal with special cases first.&lt;br /&gt;
		if (&lt;br /&gt;
			namespace == 10&lt;br /&gt;
			or namespace == 828&lt;br /&gt;
			or reason and obj._cfg.indefImageReasons[reason]&lt;br /&gt;
			)&lt;br /&gt;
			and action == &amp;#039;edit&amp;#039;&lt;br /&gt;
			and level == &amp;#039;sysop&amp;#039;&lt;br /&gt;
			and not protectionObj:isTemporary()&lt;br /&gt;
		then&lt;br /&gt;
			-- Fully protected modules and templates get the special red &amp;quot;indef&amp;quot;&lt;br /&gt;
			-- padlock.&lt;br /&gt;
			obj._imageFilename = obj._cfg.msg[&amp;#039;image-filename-indef&amp;#039;]&lt;br /&gt;
		else&lt;br /&gt;
			-- Deal with regular protection types.&lt;br /&gt;
			local images = obj._cfg.images&lt;br /&gt;
			if images[action] then&lt;br /&gt;
				if images[action][level] then&lt;br /&gt;
					obj._imageFilename = images[action][level]&lt;br /&gt;
				elseif images[action].default then&lt;br /&gt;
					obj._imageFilename = images[action].default&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return setmetatable(obj, BannerTemplate)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function BannerTemplate:renderImage()&lt;br /&gt;
	local filename = self._imageFilename&lt;br /&gt;
		or self._cfg.msg[&amp;#039;image-filename-default&amp;#039;]&lt;br /&gt;
		or &amp;#039;Transparent.gif&amp;#039;&lt;br /&gt;
	return makeFileLink{&lt;br /&gt;
		file = filename,&lt;br /&gt;
		size = (self.imageWidth or 20) .. &amp;#039;px&amp;#039;,&lt;br /&gt;
		alt = self._imageAlt,&lt;br /&gt;
		link = self._imageLink,&lt;br /&gt;
		caption = self.imageCaption&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Banner class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Banner = setmetatable({}, BannerTemplate)&lt;br /&gt;
Banner.__index = Banner&lt;br /&gt;
&lt;br /&gt;
function Banner.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
	local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn&amp;#039;t need the blurb.&lt;br /&gt;
	obj.imageWidth = 40&lt;br /&gt;
	obj.imageCaption = blurbObj:makeBannerText(&amp;#039;alt&amp;#039;) -- Large banners use the alt text for the tooltip.&lt;br /&gt;
	obj._reasonText = blurbObj:makeBannerText(&amp;#039;text&amp;#039;)&lt;br /&gt;
	obj._explanationText = blurbObj:makeBannerText(&amp;#039;explanation&amp;#039;)&lt;br /&gt;
	obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.&lt;br /&gt;
	return setmetatable(obj, Banner)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:__tostring()&lt;br /&gt;
	-- Renders the banner.&lt;br /&gt;
	makeMessageBox = makeMessageBox or require(&amp;#039;Module:Message box&amp;#039;).main&lt;br /&gt;
	local reasonText = self._reasonText or error(&amp;#039;no reason text set&amp;#039;, 2)&lt;br /&gt;
	local explanationText = self._explanationText&lt;br /&gt;
	local mbargs = {&lt;br /&gt;
		page = self._page,&lt;br /&gt;
		type = &amp;#039;protection&amp;#039;,&lt;br /&gt;
		image = self:renderImage(),&lt;br /&gt;
		text = string.format(&lt;br /&gt;
			&amp;quot;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;%s&amp;quot;,&lt;br /&gt;
			reasonText,&lt;br /&gt;
			explanationText and &amp;#039;&amp;lt;br /&amp;gt;&amp;#039; .. explanationText or &amp;#039;&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	}&lt;br /&gt;
	return makeMessageBox(&amp;#039;mbox&amp;#039;, mbargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Padlock class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Padlock = setmetatable({}, BannerTemplate)&lt;br /&gt;
Padlock.__index = Padlock&lt;br /&gt;
&lt;br /&gt;
function Padlock.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
	local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn&amp;#039;t need the blurb.&lt;br /&gt;
	obj.imageWidth = 20&lt;br /&gt;
	obj.imageCaption = blurbObj:makeBannerText(&amp;#039;tooltip&amp;#039;)&lt;br /&gt;
	obj._imageAlt = blurbObj:makeBannerText(&amp;#039;alt&amp;#039;)&lt;br /&gt;
	obj._imageLink = blurbObj:makeBannerText(&amp;#039;link&amp;#039;)&lt;br /&gt;
	obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]&lt;br /&gt;
		or cfg.padlockIndicatorNames.default&lt;br /&gt;
		or &amp;#039;pp-default&amp;#039;&lt;br /&gt;
	return setmetatable(obj, Padlock)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Padlock:__tostring()&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- The nowiki tag helps prevent whitespace at the top of articles.&lt;br /&gt;
	return frame:extensionTag{name = &amp;#039;nowiki&amp;#039;} .. frame:extensionTag{&lt;br /&gt;
		name = &amp;#039;indicator&amp;#039;,&lt;br /&gt;
		args = {name = self._indicatorName},&lt;br /&gt;
		content = self:renderImage()&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- This is used for testing purposes.&lt;br /&gt;
	return {&lt;br /&gt;
		Protection = Protection,&lt;br /&gt;
		Blurb = Blurb,&lt;br /&gt;
		BannerTemplate = BannerTemplate,&lt;br /&gt;
		Banner = Banner,&lt;br /&gt;
		Padlock = Padlock,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, cfg, title)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	cfg = cfg or require(CONFIG_MODULE)&lt;br /&gt;
&lt;br /&gt;
	local protectionObj = Protection.new(args, cfg, title)&lt;br /&gt;
&lt;br /&gt;
	local ret = {}&lt;br /&gt;
&lt;br /&gt;
	-- If a page&amp;#039;s edit protection is equally or more restrictive than its&lt;br /&gt;
	-- protection from some other action, then don&amp;#039;t bother displaying anything&lt;br /&gt;
	-- for the other action (except categories).&lt;br /&gt;
	if not yesno(args.catonly) and (protectionObj.action == &amp;#039;edit&amp;#039; or&lt;br /&gt;
		args.demolevel or&lt;br /&gt;
		not getReachableNodes(&lt;br /&gt;
			cfg.hierarchy,&lt;br /&gt;
			protectionObj.level&lt;br /&gt;
		)[effectiveProtectionLevel(&amp;#039;edit&amp;#039;, protectionObj.title)])&lt;br /&gt;
	then&lt;br /&gt;
		-- Initialise the blurb object&lt;br /&gt;
		local blurbObj = Blurb.new(protectionObj, args, cfg)&lt;br /&gt;
	&lt;br /&gt;
		-- Render the banner&lt;br /&gt;
		if protectionObj:shouldShowLock() then&lt;br /&gt;
			ret[#ret + 1] = tostring(&lt;br /&gt;
				(yesno(args.small) and Padlock or Banner)&lt;br /&gt;
				.new(protectionObj, blurbObj, cfg)&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the categories&lt;br /&gt;
	if yesno(args.category) ~= false then&lt;br /&gt;
		ret[#ret + 1] = protectionObj:makeCategoryLinks()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them&lt;br /&gt;
	if protectionObj.level == &amp;quot;extendedconfirmed&amp;quot; then&lt;br /&gt;
		if require(&amp;quot;Module:TableTools&amp;quot;).inArray(protectionObj.title.talkPageTitle.categories, &amp;quot;Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict&amp;quot;) then&lt;br /&gt;
			ret[#ret + 1] = &amp;quot;&amp;lt;p class=&amp;#039;PIA-flag&amp;#039; style=&amp;#039;display:none; visibility:hidden;&amp;#039; title=&amp;#039;This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.&amp;#039;&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(ret)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, cfg)&lt;br /&gt;
	cfg = cfg or require(CONFIG_MODULE)&lt;br /&gt;
&lt;br /&gt;
	-- Find default args, if any.&lt;br /&gt;
	local parent = frame.getParent and frame:getParent()&lt;br /&gt;
	local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub(&amp;#039;/sandbox$&amp;#039;, &amp;#039;&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
	-- Find user args, and use the parent frame if we are being called from a&lt;br /&gt;
	-- wrapper template.&lt;br /&gt;
	getArgs = getArgs or require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	local userArgs = getArgs(frame, {&lt;br /&gt;
		parentOnly = defaultArgs,&lt;br /&gt;
		frameOnly = not defaultArgs&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	-- Build the args table. User-specified args overwrite default args.&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for k, v in pairs(defaultArgs or {}) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(userArgs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return p._main(args, cfg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Protection_banner</comments>
		</item>
		<item>
			<title>Module:Effective protection level</title>
			<link>https://wiki.852r.org/index.php?title=Module:Effective_protection_level&amp;diff=3856&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Effective_protection_level&amp;diff=3856&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Effective_protection_level&quot; title=&quot;Module:Effective protection level&quot;&gt;Module:Effective protection level&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
-- Returns the permission required to perform a given action on a given title.&lt;br /&gt;
-- If no title is specified, the title of the page being displayed is used.&lt;br /&gt;
function p._main(action, pagename)&lt;br /&gt;
	local title&lt;br /&gt;
	if type(pagename) == &amp;#039;table&amp;#039; and pagename.prefixedText then&lt;br /&gt;
		title = pagename&lt;br /&gt;
	elseif pagename then&lt;br /&gt;
		title = mw.title.new(pagename)&lt;br /&gt;
	else&lt;br /&gt;
		title = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
	pagename = title.prefixedText&lt;br /&gt;
	if action == &amp;#039;autoreview&amp;#039; then&lt;br /&gt;
		local level = mw.ext.FlaggedRevs.getStabilitySettings(title)&lt;br /&gt;
		level = level and level.autoreview&lt;br /&gt;
		if level == &amp;#039;review&amp;#039; then&lt;br /&gt;
			return &amp;#039;reviewer&amp;#039;&lt;br /&gt;
		elseif level ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			return level&lt;br /&gt;
		else&lt;br /&gt;
			return nil -- not &amp;#039;*&amp;#039;. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not &amp;#039;&amp;#039;, as that would mean PC-protected but nobody can review&lt;br /&gt;
		end&lt;br /&gt;
	elseif action ~= &amp;#039;edit&amp;#039; and action ~= &amp;#039;move&amp;#039; and action ~= &amp;#039;create&amp;#039; and action ~= &amp;#039;upload&amp;#039; and action ~= &amp;#039;undelete&amp;#039; then&lt;br /&gt;
		error( &amp;#039;First parameter must be one of edit, move, create, upload, undelete, autoreview&amp;#039;, 2 )&lt;br /&gt;
	end&lt;br /&gt;
	if title.namespace == 8 then -- MediaWiki namespace&lt;br /&gt;
		if title.text:sub(-3) == &amp;#039;.js&amp;#039; or title.text:sub(-4) == &amp;#039;.css&amp;#039; or title.contentModel == &amp;#039;javascript&amp;#039; or title.contentModel == &amp;#039;css&amp;#039; then -- site JS or CSS page&lt;br /&gt;
			return &amp;#039;interfaceadmin&amp;#039;&lt;br /&gt;
		elseif title.baseText == &amp;quot;Gadgets-definition&amp;quot; then&lt;br /&gt;
			return &amp;#039;interfaceadmin&amp;#039;&lt;br /&gt;
		else -- any non-JS/CSS MediaWiki page&lt;br /&gt;
			return &amp;#039;sysop&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	elseif title.namespace == 2 and title.isSubpage then&lt;br /&gt;
		if title.contentModel == &amp;#039;javascript&amp;#039; or title.contentModel == &amp;#039;css&amp;#039; then -- user JS or CSS page&lt;br /&gt;
			return &amp;#039;interfaceadmin&amp;#039;&lt;br /&gt;
		elseif title.contentModel == &amp;#039;json&amp;#039; then -- user JSON page&lt;br /&gt;
			return &amp;#039;sysop&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if action == &amp;#039;undelete&amp;#039; then&lt;br /&gt;
		return &amp;#039;sysop&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local level = title.protectionLevels[action] and title.protectionLevels[action][1]&lt;br /&gt;
	if level == &amp;#039;sysop&amp;#039; or level == &amp;#039;editprotected&amp;#039; then&lt;br /&gt;
		return &amp;#039;sysop&amp;#039;&lt;br /&gt;
	elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page&lt;br /&gt;
		return &amp;#039;sysop&amp;#039;&lt;br /&gt;
	elseif level == &amp;#039;templateeditor&amp;#039; then&lt;br /&gt;
		return &amp;#039;templateeditor&amp;#039;&lt;br /&gt;
	elseif action == &amp;#039;move&amp;#039; then&lt;br /&gt;
		local blacklistentry = mw.ext.TitleBlacklist.test(&amp;#039;edit&amp;#039;, pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.&lt;br /&gt;
		if blacklistentry and not blacklistentry.params.autoconfirmed then&lt;br /&gt;
			return &amp;#039;templateeditor&amp;#039;&lt;br /&gt;
		elseif title.namespace == 6 then&lt;br /&gt;
			return &amp;#039;filemover&amp;#039;&lt;br /&gt;
		elseif level == &amp;#039;extendedconfirmed&amp;#039; then&lt;br /&gt;
			return &amp;#039;extendedconfirmed&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;autoconfirmed&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)&lt;br /&gt;
	if blacklistentry then&lt;br /&gt;
		if not blacklistentry.params.autoconfirmed then&lt;br /&gt;
			return &amp;#039;templateeditor&amp;#039;&lt;br /&gt;
		elseif level == &amp;#039;extendedconfirmed&amp;#039; then&lt;br /&gt;
			return &amp;#039;extendedconfirmed&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;autoconfirmed&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	elseif level == &amp;#039;editsemiprotected&amp;#039; then -- create-semiprotected pages return this for some reason&lt;br /&gt;
		return &amp;#039;autoconfirmed&amp;#039;&lt;br /&gt;
	elseif level then&lt;br /&gt;
		return level&lt;br /&gt;
	elseif action == &amp;#039;upload&amp;#039; then&lt;br /&gt;
		return &amp;#039;autoconfirmed&amp;#039;&lt;br /&gt;
	elseif action == &amp;#039;create&amp;#039; and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts&lt;br /&gt;
		if title.namespace == 0 then&lt;br /&gt;
			return &amp;#039;autoconfirmed&amp;#039; -- Per [[WP:ACPERM]], you need to be autoconfirmed to create pages in mainspace&lt;br /&gt;
		end&lt;br /&gt;
		return &amp;#039;user&amp;#039;&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;
setmetatable(p, { __index = function(t, k)&lt;br /&gt;
	return function(frame)&lt;br /&gt;
		return t._main(k, frame.args[1])&lt;br /&gt;
	end&lt;br /&gt;
end })&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Effective_protection_level</comments>
		</item>
		<item>
			<title>Template:Xt</title>
			<link>https://wiki.852r.org/index.php?title=Template:Xt&amp;diff=3854&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Xt&amp;diff=3854&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Xt&quot; class=&quot;mw-redirect&quot; title=&quot;Template:Xt&quot;&gt;Template:Xt&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#REDIRECT [[Template:Example text]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Xt</comments>
		</item>
		<item>
			<title>Module:Template link general</title>
			<link>https://wiki.852r.org/index.php?title=Module:Template_link_general&amp;diff=3852&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Template_link_general&amp;diff=3852&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Template_link_general&quot; title=&quot;Module:Template link general&quot;&gt;Module:Template link general&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This implements Template:Template link general and various other templates in its family&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Is a string non-empty?&lt;br /&gt;
local function _ne(s) &lt;br /&gt;
	return s ~= nil and s ~= &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local nw = mw.text.nowiki&lt;br /&gt;
&lt;br /&gt;
local function addTemplate(s)&lt;br /&gt;
	local i, _ = s:find(&amp;#039;:&amp;#039;, 1, true)&lt;br /&gt;
	if i == nil then&lt;br /&gt;
		return &amp;#039;Template:&amp;#039; .. s&lt;br /&gt;
	end&lt;br /&gt;
	local ns = s:sub(1, i - 1)&lt;br /&gt;
	if ns == &amp;#039;&amp;#039; or mw.site.namespaces[ns] then&lt;br /&gt;
		return s&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;Template:&amp;#039; .. s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trimTemplate(s)&lt;br /&gt;
	local needle = &amp;#039;template:&amp;#039;&lt;br /&gt;
	if s:sub(1, needle:len()):lower() == needle then&lt;br /&gt;
		return s:sub(needle:len() + 1)	&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Builds the link part&lt;br /&gt;
local function linkTitle(args)&lt;br /&gt;
	local titleObj&lt;br /&gt;
	if args[&amp;#039;1&amp;#039;] then&lt;br /&gt;
		-- This handles :Page and other NS&lt;br /&gt;
		titleObj = mw.title.new(args[&amp;#039;1&amp;#039;], &amp;#039;Template&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		titleObj = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local textPart = args.alttext&lt;br /&gt;
	if not _ne(textPart) then&lt;br /&gt;
		if titleObj ~= nil then&lt;br /&gt;
			textPart = titleObj:inNamespace(&amp;quot;Template&amp;quot;) and args[&amp;#039;1&amp;#039;] or titleObj.fullText&lt;br /&gt;
		else&lt;br /&gt;
			-- redlink&lt;br /&gt;
			textPart = args[&amp;#039;1&amp;#039;]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if _ne(args.subst) then&lt;br /&gt;
		-- HACK: the ns thing above is probably broken&lt;br /&gt;
		textPart = &amp;#039;subst:&amp;#039; .. textPart&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if _ne(args.brace) then&lt;br /&gt;
		textPart = nw(&amp;#039;{{&amp;#039;) .. textPart .. nw(&amp;#039;}}&amp;#039;)&lt;br /&gt;
	elseif _ne(args.braceinside) then&lt;br /&gt;
		textPart = nw(&amp;#039;{&amp;#039;) .. textPart .. nw(&amp;#039;}&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local titlePart&lt;br /&gt;
	if _ne(args.nolink) then&lt;br /&gt;
		titlePart = textPart&lt;br /&gt;
	else&lt;br /&gt;
		titlePart = &amp;#039;[[&amp;#039; .. (titleObj ~= nil and titleObj.fullText or addTemplate(args[&amp;#039;1&amp;#039;])) ..&lt;br /&gt;
			&amp;#039;|&amp;#039; .. textPart .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if _ne(args.braceinside) then&lt;br /&gt;
		titlePart = nw(&amp;#039;{&amp;#039;) .. titlePart .. nw(&amp;#039;}&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local bold = _ne(args.bold) or _ne(args.boldlink) or _ne(args.boldname)&lt;br /&gt;
	if bold then&lt;br /&gt;
		titlePart = &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. titlePart .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if _ne(args.nowrapname) then&lt;br /&gt;
		titlePart = &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&amp;#039; .. titlePart .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return titlePart&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame, {&lt;br /&gt;
		trim = true,&lt;br /&gt;
		removeBlanks = false&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local italic = _ne(args.italic) or _ne(args.italics)&lt;br /&gt;
	local dontBrace = _ne(args.brace) or _ne(args.braceinside)&lt;br /&gt;
	local code = _ne(args.code) or _ne(args.tt)&lt;br /&gt;
	local show_result = _ne(args._show_result)&lt;br /&gt;
	local expand = _ne(args._expand)&lt;br /&gt;
	&lt;br /&gt;
	local titlePart = linkTitle(args)&lt;br /&gt;
	&lt;br /&gt;
	-- Build the arguments&lt;br /&gt;
	local textPart = &amp;quot;&amp;quot;&lt;br /&gt;
	local textPartBuffer = &amp;quot;&amp;amp;#124;&amp;quot;&lt;br /&gt;
	local codeArguments = {}&lt;br /&gt;
	local codeArgumentsString = &amp;quot;&amp;quot;&lt;br /&gt;
	local i = 2&lt;br /&gt;
	local j = 1&lt;br /&gt;
	while args[i] do&lt;br /&gt;
		local val = args[i]&lt;br /&gt;
		if val ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			if _ne(args.nowiki) then&lt;br /&gt;
				-- Unstrip nowiki tags first because calling nw on something that already contains nowiki tags will&lt;br /&gt;
				-- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up&lt;br /&gt;
				val = nw(mw.text.unstripNoWiki(val))&lt;br /&gt;
			end&lt;br /&gt;
			local k, v = string.match(val, &amp;quot;(.*)=(.*)&amp;quot;)&lt;br /&gt;
			if not k then&lt;br /&gt;
				codeArguments[j] = val&lt;br /&gt;
				j = j + 1&lt;br /&gt;
			else&lt;br /&gt;
				codeArguments[k] = v&lt;br /&gt;
			end&lt;br /&gt;
			codeArgumentsString = codeArgumentsString .. textPartBuffer .. val&lt;br /&gt;
			if italic then&lt;br /&gt;
				val = &amp;#039;&amp;lt;span style=&amp;quot;font-style:italic;&amp;quot;&amp;gt;&amp;#039; .. val .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			textPart = textPart .. textPartBuffer .. val&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- final wrap&lt;br /&gt;
	local ret = titlePart .. textPart&lt;br /&gt;
	if not dontBrace then ret = nw(&amp;#039;{{&amp;#039;) .. ret .. nw(&amp;#039;}}&amp;#039;) end&lt;br /&gt;
	if _ne(args.a) then ret = nw(&amp;#039;*&amp;#039;) .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. ret end&lt;br /&gt;
	if _ne(args.kbd) then ret = &amp;#039;&amp;lt;kbd&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/kbd&amp;gt;&amp;#039; end&lt;br /&gt;
	if code then&lt;br /&gt;
		ret = &amp;#039;&amp;lt;code&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
	elseif _ne(args.plaincode) then&lt;br /&gt;
		ret = &amp;#039;&amp;lt;code style=&amp;quot;border:none;background:transparent;color:inherit&amp;quot;&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if _ne(args.nowrap) then ret = &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&amp;#039; .. ret .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; end&lt;br /&gt;
	&lt;br /&gt;
	--[[ Wrap as html?? &lt;br /&gt;
	local span = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
	span:wikitext(ret)&lt;br /&gt;
	--]]&lt;br /&gt;
	if _ne(args.debug) then ret = ret .. &amp;#039;\n&amp;lt;pre&amp;gt;&amp;#039; .. mw.text.encode(mw.dumpObject(args)) .. &amp;#039;&amp;lt;/pre&amp;gt;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
	if show_result then&lt;br /&gt;
		if _ne(args.nocat) then codeArguments[&amp;#039;nocat&amp;#039;] = true end&lt;br /&gt;
		local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments}&lt;br /&gt;
		ret = ret .. &amp;quot; → &amp;quot; .. result&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if expand then&lt;br /&gt;
		local query = mw.text.encode(&amp;#039;{{&amp;#039; .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, &amp;quot;|&amp;quot;) .. &amp;#039;}}&amp;#039;)&lt;br /&gt;
		local url = mw.uri.fullUrl(&amp;#039;special:ExpandTemplates&amp;#039;, &amp;#039;wpInput=&amp;#039; .. query)&lt;br /&gt;
		mw.log()&lt;br /&gt;
		ret = ret .. &amp;quot; [&amp;quot; .. tostring(url) .. &amp;quot;]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Template_link_general</comments>
		</item>
		<item>
			<title>Module:Category handler/blacklist</title>
			<link>https://wiki.852r.org/index.php?title=Module:Category_handler/blacklist&amp;diff=3850&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Category_handler/blacklist&amp;diff=3850&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Category_handler/blacklist&quot; title=&quot;Module:Category handler/blacklist&quot;&gt;Module:Category handler/blacklist&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module contains the blacklist used by [[Module:Category handler]].&lt;br /&gt;
-- Pages that match Lua patterns in this list will not be categorised unless&lt;br /&gt;
-- categorisation is explicitly requested.&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	&amp;#039;^Main Page$&amp;#039;, -- don&amp;#039;t categorise the main page.&lt;br /&gt;
&lt;br /&gt;
	-- Don&amp;#039;t categorise the following pages or their subpages.&lt;br /&gt;
	-- &amp;quot;%f[/\0]&amp;quot; matches if the next character is &amp;quot;/&amp;quot; or the end of the string.&lt;br /&gt;
	&amp;#039;^Wikipedia:Cascade%-protected items%f[/\0]&amp;#039;,&lt;br /&gt;
	&amp;#039;^User:UBX%f[/\0]&amp;#039;, -- The userbox &amp;quot;template&amp;quot; space.&lt;br /&gt;
	&amp;#039;^User talk:UBX%f[/\0]&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
	-- Don&amp;#039;t categorise subpages of these pages, but allow&lt;br /&gt;
	-- categorisation of the base page.&lt;br /&gt;
	&amp;#039;^Wikipedia:Template index/.*$&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
	-- Don&amp;#039;t categorise archives.&lt;br /&gt;
	&amp;#039;/[aA]rchive&amp;#039;,&lt;br /&gt;
	&amp;quot;^Wikipedia:Administrators&amp;#039; noticeboard/IncidentArchive%d+$&amp;quot;,&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Category_handler/blacklist</comments>
		</item>
		<item>
			<title>Module:Category handler/shared</title>
			<link>https://wiki.852r.org/index.php?title=Module:Category_handler/shared&amp;diff=3848&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Category_handler/shared&amp;diff=3848&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Category_handler/shared&quot; title=&quot;Module:Category handler/shared&quot;&gt;Module:Category handler/shared&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module contains shared functions used by [[Module:Category handler]]&lt;br /&gt;
-- and its submodules.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.matchesBlacklist(page, blacklist)&lt;br /&gt;
	for i, pattern in ipairs(blacklist) do&lt;br /&gt;
		local match = mw.ustring.match(page, pattern)&lt;br /&gt;
		if match then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getParamMappings(useLoadData)&lt;br /&gt;
	local dataPage = &amp;#039;Module:Namespace detect/data&amp;#039;&lt;br /&gt;
	if useLoadData then&lt;br /&gt;
		return mw.loadData(dataPage).mappings&lt;br /&gt;
	else&lt;br /&gt;
		return require(dataPage).mappings&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getNamespaceParameters(titleObj, mappings)&lt;br /&gt;
	-- We don&amp;#039;t use title.nsText for the namespace name because it adds&lt;br /&gt;
	-- underscores.&lt;br /&gt;
	local mappingsKey&lt;br /&gt;
	if titleObj.isTalkPage then&lt;br /&gt;
		mappingsKey = &amp;#039;talk&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		mappingsKey = mw.site.namespaces[titleObj.namespace].name&lt;br /&gt;
	end&lt;br /&gt;
	mappingsKey = mw.ustring.lower(mappingsKey)&lt;br /&gt;
	return mappings[mappingsKey] or {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Category_handler/shared</comments>
		</item>
		<item>
			<title>Module:Category handler/config</title>
			<link>https://wiki.852r.org/index.php?title=Module:Category_handler/config&amp;diff=3846&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Category_handler/config&amp;diff=3846&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Category_handler/config&quot; title=&quot;Module:Category handler/config&quot;&gt;Module:Category handler/config&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--            [[Module:Category handler]] configuration data                  --&lt;br /&gt;
--       Language-specific parameter names and values can be set here.        --&lt;br /&gt;
--       For blacklist config, see [[Module:Category handler/blacklist]].     --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Don&amp;#039;t edit this line.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                       Start configuration data                             --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter names                               --&lt;br /&gt;
-- These configuration items specify custom parameter names.                  --&lt;br /&gt;
-- To add one extra name, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- foo = &amp;#039;parameter name&amp;#039;,                                                    --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To add multiple names, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- foo = {&amp;#039;parameter name 1&amp;#039;, &amp;#039;parameter name 2&amp;#039;, &amp;#039;parameter name 3&amp;#039;},        --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.parameters = {&lt;br /&gt;
	&lt;br /&gt;
	-- The nocat and categories parameter suppress&lt;br /&gt;
	-- categorisation. They are used with Module:Yesno, and work as follows:&lt;br /&gt;
	--&lt;br /&gt;
	-- cfg.nocat:&lt;br /&gt;
	-- Result of yesno()                        Effect&lt;br /&gt;
	-- true                                     Categorisation is suppressed&lt;br /&gt;
	-- false                                    Categorisation is allowed, and&lt;br /&gt;
	--                                          the blacklist check is skipped&lt;br /&gt;
	-- nil                                      Categorisation is allowed&lt;br /&gt;
	--&lt;br /&gt;
	-- cfg.categories:&lt;br /&gt;
	-- Result of yesno()                        Effect&lt;br /&gt;
	-- true                                     Categorisation is allowed, and&lt;br /&gt;
	--                                          the blacklist check is skipped&lt;br /&gt;
	-- false                                    Categorisation is suppressed&lt;br /&gt;
	-- nil                                      Categorisation is allowed&lt;br /&gt;
	nocat = &amp;#039;nocat&amp;#039;,&lt;br /&gt;
	categories = &amp;#039;categories&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name for the legacy &amp;quot;category2&amp;quot; parameter. This skips the&lt;br /&gt;
	-- blacklist if set to the cfg.category2Yes value, and suppresses&lt;br /&gt;
	-- categorisation if present but equal to anything other than&lt;br /&gt;
	-- cfg.category2Yes or cfg.category2Negative.&lt;br /&gt;
	category2 = &amp;#039;category2&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- cfg.subpage is the parameter name to specify how to behave on subpages.&lt;br /&gt;
	subpage = &amp;#039;subpage&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter for data to return in all namespaces.&lt;br /&gt;
	all = &amp;#039;all&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name for data to return if no data is specified for the&lt;br /&gt;
	-- namespace that is detected.&lt;br /&gt;
	other = &amp;#039;other&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name used to specify a page other than the current page;&lt;br /&gt;
	-- used for testing and demonstration.&lt;br /&gt;
	demopage = &amp;#039;page&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter values                              --&lt;br /&gt;
-- These are set values that can be used with certain parameters. Only one    --&lt;br /&gt;
-- value can be specified, like this:                                         --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = &amp;#039;value name&amp;#039;                                                     --                                               --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- The following settings are used with the cfg.category2 parameter. Setting&lt;br /&gt;
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2&lt;br /&gt;
-- is present but equal to anything other than cfg.category2Yes or&lt;br /&gt;
-- cfg.category2Negative then it supresses cateogrisation.&lt;br /&gt;
cfg.category2Yes = &amp;#039;yes&amp;#039;&lt;br /&gt;
cfg.category2Negative = &amp;#039;¬&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The following settings are used with the cfg.subpage parameter.&lt;br /&gt;
-- cfg.subpageNo is the value to specify to not categorise on subpages;&lt;br /&gt;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.&lt;br /&gt;
cfg.subpageNo = &amp;#039;no&amp;#039;&lt;br /&gt;
cfg.subpageOnly = &amp;#039;only&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           Default namespaces                               --&lt;br /&gt;
-- This is a table of namespaces to categorise by default. The keys are the   --&lt;br /&gt;
-- namespace numbers.                                                         --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.defaultNamespaces = {&lt;br /&gt;
	[  0] = true, -- main&lt;br /&gt;
	[  6] = true, -- file&lt;br /&gt;
	[ 12] = true, -- help&lt;br /&gt;
	[ 14] = true, -- category&lt;br /&gt;
	[100] = true, -- portal&lt;br /&gt;
	[108] = true, -- book&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                                Wrappers                                    --&lt;br /&gt;
-- This is a wrapper template or a list of wrapper templates to be passed to  --&lt;br /&gt;
-- [[Module:Arguments]].                                                      --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.wrappers = &amp;#039;Template:Category handler&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           End configuration data                           --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return cfg -- Don&amp;#039;t edit this line.&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Category_handler/config</comments>
		</item>
		<item>
			<title>Module:Category handler/data</title>
			<link>https://wiki.852r.org/index.php?title=Module:Category_handler/data&amp;diff=3844&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Category_handler/data&amp;diff=3844&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Category_handler/data&quot; title=&quot;Module:Category handler/data&quot;&gt;Module:Category handler/data&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module assembles data to be passed to [[Module:Category handler]] using&lt;br /&gt;
-- mw.loadData. This includes the configuration data and whether the current&lt;br /&gt;
-- page matches the title blacklist.&lt;br /&gt;
&lt;br /&gt;
local data = require(&amp;#039;Module:Category handler/config&amp;#039;)&lt;br /&gt;
local mShared = require(&amp;#039;Module:Category handler/shared&amp;#039;)&lt;br /&gt;
local blacklist = require(&amp;#039;Module:Category handler/blacklist&amp;#039;)&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(&lt;br /&gt;
	title.prefixedText,&lt;br /&gt;
	blacklist&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(&lt;br /&gt;
	title,&lt;br /&gt;
	mShared.getParamMappings()&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
return data&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Category_handler/data</comments>
		</item>
		<item>
			<title>Module:Category handler</title>
			<link>https://wiki.852r.org/index.php?title=Module:Category_handler&amp;diff=3842&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Category_handler&amp;diff=3842&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Category_handler&quot; title=&quot;Module:Category handler&quot;&gt;Module:Category handler&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--                              CATEGORY HANDLER                              --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--      This module implements the {{category handler}} template in Lua,      --&lt;br /&gt;
--      with a few improvements: all namespaces and all namespace aliases     --&lt;br /&gt;
--      are supported, and namespace names are detected automatically for     --&lt;br /&gt;
--      the local wiki. This module requires [[Module:Namespace detect]]      --&lt;br /&gt;
--      and [[Module:Yesno]] to be available on the local wiki. It can be     --&lt;br /&gt;
--      configured for different wikis by altering the values in              --&lt;br /&gt;
--      [[Module:Category handler/config]], and pages can be blacklisted      --&lt;br /&gt;
--      from categorisation by using [[Module:Category handler/blacklist]].   --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Load required modules&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily load things we don&amp;#039;t always need&lt;br /&gt;
local mShared, mappings&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function trimWhitespace(s, removeBlanks)&lt;br /&gt;
	if type(s) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	s = s:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
	if removeBlanks then&lt;br /&gt;
		if s ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			return s&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- CategoryHandler class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local CategoryHandler = {}&lt;br /&gt;
CategoryHandler.__index = CategoryHandler&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler.new(data, args)&lt;br /&gt;
	local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)&lt;br /&gt;
	&lt;br /&gt;
	-- Set the title object&lt;br /&gt;
	do&lt;br /&gt;
		local pagename = obj:parameter(&amp;#039;demopage&amp;#039;)&lt;br /&gt;
		local success, titleObj&lt;br /&gt;
		if pagename then&lt;br /&gt;
			success, titleObj = pcall(mw.title.new, pagename)&lt;br /&gt;
		end&lt;br /&gt;
		if success and titleObj then&lt;br /&gt;
			obj.title = titleObj&lt;br /&gt;
			if titleObj == mw.title.getCurrentTitle() then&lt;br /&gt;
				obj._usesCurrentTitle = true&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			obj.title = mw.title.getCurrentTitle()&lt;br /&gt;
			obj._usesCurrentTitle = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set suppression parameter values&lt;br /&gt;
	for _, key in ipairs{&amp;#039;nocat&amp;#039;, &amp;#039;categories&amp;#039;} do&lt;br /&gt;
		local value = obj:parameter(key)&lt;br /&gt;
		value = trimWhitespace(value, true)&lt;br /&gt;
		obj[&amp;#039;_&amp;#039; .. key] = yesno(value)&lt;br /&gt;
	end&lt;br /&gt;
	do&lt;br /&gt;
		local subpage = obj:parameter(&amp;#039;subpage&amp;#039;)&lt;br /&gt;
		local category2 = obj:parameter(&amp;#039;category2&amp;#039;)&lt;br /&gt;
		if type(subpage) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(subpage)&lt;br /&gt;
		end&lt;br /&gt;
		if type(category2) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(category2)&lt;br /&gt;
		end&lt;br /&gt;
		obj._subpage = trimWhitespace(subpage, true)&lt;br /&gt;
		obj._category2 = trimWhitespace(category2) -- don&amp;#039;t remove blank values&lt;br /&gt;
	end&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:parameter(key)&lt;br /&gt;
	local parameterNames = self._data.parameters[key]&lt;br /&gt;
	local pntype = type(parameterNames)&lt;br /&gt;
	if pntype == &amp;#039;string&amp;#039; or pntype == &amp;#039;number&amp;#039; then&lt;br /&gt;
		return self._args[parameterNames]&lt;br /&gt;
	elseif pntype == &amp;#039;table&amp;#039; then&lt;br /&gt;
		for _, name in ipairs(parameterNames) do&lt;br /&gt;
			local value = self._args[name]&lt;br /&gt;
			if value ~= nil then&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;#039;invalid config key &amp;quot;%s&amp;quot;&amp;#039;,&lt;br /&gt;
			tostring(key)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressedByArguments()&lt;br /&gt;
	return&lt;br /&gt;
		-- See if a category suppression argument has been set.&lt;br /&gt;
		self._nocat == true&lt;br /&gt;
		or self._categories == false&lt;br /&gt;
		or (&lt;br /&gt;
			self._category2&lt;br /&gt;
			and self._category2 ~= self._data.category2Yes&lt;br /&gt;
			and self._category2 ~= self._data.category2Negative&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		-- Check whether we are on a subpage, and see if categories are&lt;br /&gt;
		-- suppressed based on our subpage status.&lt;br /&gt;
		or self._subpage == self._data.subpageNo and self.title.isSubpage&lt;br /&gt;
		or self._subpage == self._data.subpageOnly and not self.title.isSubpage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:shouldSkipBlacklistCheck()&lt;br /&gt;
	-- Check whether the category suppression arguments indicate we&lt;br /&gt;
	-- should skip the blacklist check.&lt;br /&gt;
	return self._nocat == false&lt;br /&gt;
		or self._categories == true&lt;br /&gt;
		or self._category2 == self._data.category2Yes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:matchesBlacklist()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleMatchesBlacklist&lt;br /&gt;
	else&lt;br /&gt;
		mShared = mShared or require(&amp;#039;Module:Category handler/shared&amp;#039;)&lt;br /&gt;
		return mShared.matchesBlacklist(&lt;br /&gt;
			self.title.prefixedText,&lt;br /&gt;
			mw.loadData(&amp;#039;Module:Category handler/blacklist&amp;#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressed()&lt;br /&gt;
	-- Find if categories are suppressed by either the arguments or by&lt;br /&gt;
	-- matching the blacklist.&lt;br /&gt;
	return self:isSuppressedByArguments()&lt;br /&gt;
		or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getNamespaceParameters()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleNamespaceParameters&lt;br /&gt;
	else&lt;br /&gt;
		if not mappings then&lt;br /&gt;
			mShared = mShared or require(&amp;#039;Module:Category handler/shared&amp;#039;)&lt;br /&gt;
			mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
		end&lt;br /&gt;
		return mShared.getNamespaceParameters(&lt;br /&gt;
			self.title,&lt;br /&gt;
			mappings&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:namespaceParametersExist()&lt;br /&gt;
	-- Find whether any namespace parameters have been specified.&lt;br /&gt;
	-- We use the order &amp;quot;all&amp;quot; --&amp;gt; namespace params --&amp;gt; &amp;quot;other&amp;quot; as this is what&lt;br /&gt;
	-- the old template did.&lt;br /&gt;
	if self:parameter(&amp;#039;all&amp;#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	if not mappings then&lt;br /&gt;
		mShared = mShared or require(&amp;#039;Module:Category handler/shared&amp;#039;)&lt;br /&gt;
		mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
	end&lt;br /&gt;
	for ns, params in pairs(mappings) do&lt;br /&gt;
		for i, param in ipairs(params) do&lt;br /&gt;
			if self._args[param] then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if self:parameter(&amp;#039;other&amp;#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getCategories()&lt;br /&gt;
	local params = self:getNamespaceParameters()&lt;br /&gt;
	local nsCategory&lt;br /&gt;
	for i, param in ipairs(params) do&lt;br /&gt;
		local value = self._args[param]&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			nsCategory = value&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if nsCategory ~= nil or self:namespaceParametersExist() then&lt;br /&gt;
		-- Namespace parameters exist - advanced usage.&lt;br /&gt;
		if nsCategory == nil then&lt;br /&gt;
			nsCategory = self:parameter(&amp;#039;other&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local ret = {self:parameter(&amp;#039;all&amp;#039;)}&lt;br /&gt;
		local numParam = tonumber(nsCategory)&lt;br /&gt;
		if numParam and numParam &amp;gt;= 1 and math.floor(numParam) == numParam then&lt;br /&gt;
			-- nsCategory is an integer&lt;br /&gt;
			ret[#ret + 1] = self._args[numParam]&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = nsCategory&lt;br /&gt;
		end&lt;br /&gt;
		if #ret &amp;lt; 1 then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return table.concat(ret)&lt;br /&gt;
		end&lt;br /&gt;
	elseif self._data.defaultNamespaces[self.title.namespace] then&lt;br /&gt;
		-- Namespace parameters don&amp;#039;t exist, simple usage.&lt;br /&gt;
		return self._args[1]&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- Used for testing purposes.&lt;br /&gt;
	return {&lt;br /&gt;
		CategoryHandler = CategoryHandler&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, data)&lt;br /&gt;
	data = data or mw.loadData(&amp;#039;Module:Category handler/data&amp;#039;)&lt;br /&gt;
	local handler = CategoryHandler.new(data, args)&lt;br /&gt;
	if handler:isSuppressed() then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return handler:getCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, data)&lt;br /&gt;
	data = data or mw.loadData(&amp;#039;Module:Category handler/data&amp;#039;)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = data.wrappers,&lt;br /&gt;
		valueFunc = function (k, v)&lt;br /&gt;
			v = trimWhitespace(v)&lt;br /&gt;
			if type(k) == &amp;#039;number&amp;#039; then&lt;br /&gt;
				if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					return v&lt;br /&gt;
				else&lt;br /&gt;
					return nil&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args, data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Category_handler</comments>
		</item>
		<item>
			<title>Module:TableTools</title>
			<link>https://wiki.852r.org/index.php?title=Module:TableTools&amp;diff=3840&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:TableTools&amp;diff=3840&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:TableTools&quot; title=&quot;Module:TableTools&quot;&gt;Module:TableTools&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;------------------------------------------------------------------------------------&lt;br /&gt;
--                                   TableTools                                   --&lt;br /&gt;
--                                                                                --&lt;br /&gt;
-- This module includes a number of functions for dealing with Lua tables.        --&lt;br /&gt;
-- It is a meta-module, meant to be called from other Lua modules, and should not --&lt;br /&gt;
-- be called directly from #invoke.                                               --&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Define often-used variables and functions.&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
local infinity = math.huge&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local checkTypeMulti = libraryUtil.checkTypeMulti&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isPositiveInteger&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given value is a positive integer, and false&lt;br /&gt;
-- if not. Although it doesn&amp;#039;t operate on tables, it is included here as it is&lt;br /&gt;
-- useful for determining whether a given table key is in the array part or the&lt;br /&gt;
-- hash part of a table.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isPositiveInteger(v)&lt;br /&gt;
	return type(v) == &amp;#039;number&amp;#039; and v &amp;gt;= 1 and floor(v) == v and v &amp;lt; infinity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isNan&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given number is a NaN value, and false if&lt;br /&gt;
-- not. Although it doesn&amp;#039;t operate on tables, it is included here as it is useful&lt;br /&gt;
-- for determining whether a value can be a valid table key. Lua will generate an&lt;br /&gt;
-- error if a NaN is used as a table key.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isNan(v)&lt;br /&gt;
	return type(v) == &amp;#039;number&amp;#039; and v ~= v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- shallowClone&lt;br /&gt;
--&lt;br /&gt;
-- This returns a clone of a table. The value returned is a new table, but all&lt;br /&gt;
-- subtables and functions are shared. Metamethods are respected, but the returned&lt;br /&gt;
-- table will have no metatable of its own.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.shallowClone(t)&lt;br /&gt;
	checkType(&amp;#039;shallowClone&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		ret[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- removeDuplicates&lt;br /&gt;
--&lt;br /&gt;
-- This removes duplicate values from an array. Non-positive-integer keys are&lt;br /&gt;
-- ignored. The earliest value is kept, and all subsequent duplicate values are&lt;br /&gt;
-- removed, but otherwise the array order is unchanged.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.removeDuplicates(arr)&lt;br /&gt;
	checkType(&amp;#039;removeDuplicates&amp;#039;, 1, arr, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local ret, exists = {}, {}&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if isNan(v) then&lt;br /&gt;
			-- NaNs can&amp;#039;t be table keys, and they are also unique, so we don&amp;#039;t need to check existence.&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
		elseif not exists[v] then&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
			exists[v] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numKeys&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of any numerical&lt;br /&gt;
-- keys that have non-nil values, sorted in numerical order.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.numKeys(t)&lt;br /&gt;
	checkType(&amp;#039;numKeys&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local isPositiveInteger = p.isPositiveInteger&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		if isPositiveInteger(k) then&lt;br /&gt;
			nums[#nums + 1] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- affixNums&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of keys with the&lt;br /&gt;
-- specified prefix and suffix. For example, for the table&lt;br /&gt;
-- {a1 = &amp;#039;foo&amp;#039;, a3 = &amp;#039;bar&amp;#039;, a6 = &amp;#039;baz&amp;#039;} and the prefix &amp;quot;a&amp;quot;, affixNums will return&lt;br /&gt;
-- {1, 3, 6}.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.affixNums(t, prefix, suffix)&lt;br /&gt;
	checkType(&amp;#039;affixNums&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;affixNums&amp;#039;, 2, prefix, &amp;#039;string&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;affixNums&amp;#039;, 3, suffix, &amp;#039;string&amp;#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local function cleanPattern(s)&lt;br /&gt;
		-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.&lt;br /&gt;
		return s:gsub(&amp;#039;([%(%)%%%.%[%]%*%+%-%?%^%$])&amp;#039;, &amp;#039;%%%1&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	prefix = prefix or &amp;#039;&amp;#039;&lt;br /&gt;
	suffix = suffix or &amp;#039;&amp;#039;&lt;br /&gt;
	prefix = cleanPattern(prefix)&lt;br /&gt;
	suffix = cleanPattern(suffix)&lt;br /&gt;
	local pattern = &amp;#039;^&amp;#039; .. prefix .. &amp;#039;([1-9]%d*)&amp;#039; .. suffix .. &amp;#039;$&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		if type(k) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			local num = mw.ustring.match(k, pattern)&lt;br /&gt;
			if num then&lt;br /&gt;
				nums[#nums + 1] = tonumber(num)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numData&lt;br /&gt;
--&lt;br /&gt;
-- Given a table with keys like {&amp;quot;foo1&amp;quot;, &amp;quot;bar1&amp;quot;, &amp;quot;foo2&amp;quot;, &amp;quot;baz2&amp;quot;}, returns a table&lt;br /&gt;
-- of subtables in the format&lt;br /&gt;
-- {[1] = {foo = &amp;#039;text&amp;#039;, bar = &amp;#039;text&amp;#039;}, [2] = {foo = &amp;#039;text&amp;#039;, baz = &amp;#039;text&amp;#039;}}.&lt;br /&gt;
-- Keys that don&amp;#039;t end with an integer are stored in a subtable named &amp;quot;other&amp;quot;. The&lt;br /&gt;
-- compress option compresses the table so that it can be iterated over with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.numData(t, compress)&lt;br /&gt;
	checkType(&amp;#039;numData&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;numData&amp;#039;, 2, compress, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		local prefix, num = mw.ustring.match(tostring(k), &amp;#039;^([^0-9]*)([1-9][0-9]*)$&amp;#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			local subtable = ret[num] or {}&lt;br /&gt;
			if prefix == &amp;#039;&amp;#039; then&lt;br /&gt;
				-- Positional parameters match the blank string; put them at the start of the subtable instead.&lt;br /&gt;
				prefix = 1&lt;br /&gt;
			end&lt;br /&gt;
			subtable[prefix] = v&lt;br /&gt;
			ret[num] = subtable&lt;br /&gt;
		else&lt;br /&gt;
			local subtable = ret.other or {}&lt;br /&gt;
			subtable[k] = v&lt;br /&gt;
			ret.other = subtable&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if compress then&lt;br /&gt;
		local other = ret.other&lt;br /&gt;
		ret = p.compressSparseArray(ret)&lt;br /&gt;
		ret.other = other&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- compressSparseArray&lt;br /&gt;
--&lt;br /&gt;
-- This takes an array with one or more nil values, and removes the nil values&lt;br /&gt;
-- while preserving the order, so that the array can be safely traversed with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.compressSparseArray(t)&lt;br /&gt;
	checkType(&amp;#039;compressSparseArray&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		ret[#ret + 1] = t[num]&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseIpairs&lt;br /&gt;
--&lt;br /&gt;
-- This is an iterator for sparse arrays. It can be used like ipairs, but can&lt;br /&gt;
-- handle nil values.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sparseIpairs(t)&lt;br /&gt;
	checkType(&amp;#039;sparseIpairs&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	local lim = #nums&lt;br /&gt;
	return function ()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if i &amp;lt;= lim then&lt;br /&gt;
			local key = nums[i]&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- size&lt;br /&gt;
--&lt;br /&gt;
-- This returns the size of a key/value pair table. It will also work on arrays,&lt;br /&gt;
-- but for arrays it is more efficient to use the # operator.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.size(t)&lt;br /&gt;
	checkType(&amp;#039;size&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(t) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function defaultKeySort(item1, item2)&lt;br /&gt;
	-- &amp;quot;number&amp;quot; &amp;lt; &amp;quot;string&amp;quot;, so numbers will be sorted before strings.&lt;br /&gt;
	local type1, type2 = type(item1), type(item2)&lt;br /&gt;
	if type1 ~= type2 then&lt;br /&gt;
		return type1 &amp;lt; type2&lt;br /&gt;
	elseif type1 == &amp;#039;table&amp;#039; or type1 == &amp;#039;boolean&amp;#039; or type1 == &amp;#039;function&amp;#039; then&lt;br /&gt;
		return tostring(item1) &amp;lt; tostring(item2)&lt;br /&gt;
	else&lt;br /&gt;
		return item1 &amp;lt; item2&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- keysToList&lt;br /&gt;
--&lt;br /&gt;
-- Returns an array of the keys in a table, sorted using either a default&lt;br /&gt;
-- comparison function or a custom keySort function.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.keysToList(t, keySort, checked)&lt;br /&gt;
	if not checked then&lt;br /&gt;
		checkType(&amp;#039;keysToList&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
		checkTypeMulti(&amp;#039;keysToList&amp;#039;, 2, keySort, {&amp;#039;function&amp;#039;, &amp;#039;boolean&amp;#039;, &amp;#039;nil&amp;#039;})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local arr = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		arr[index] = k&lt;br /&gt;
		index = index + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if keySort ~= false then&lt;br /&gt;
		keySort = type(keySort) == &amp;#039;function&amp;#039; and keySort or defaultKeySort&lt;br /&gt;
		table.sort(arr, keySort)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return arr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sortedPairs&lt;br /&gt;
--&lt;br /&gt;
-- Iterates through a table, with the keys sorted using the keysToList function.&lt;br /&gt;
-- If there are only numerical keys, sparseIpairs is probably more efficient.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sortedPairs(t, keySort)&lt;br /&gt;
	checkType(&amp;#039;sortedPairs&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;sortedPairs&amp;#039;, 2, keySort, &amp;#039;function&amp;#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local arr = p.keysToList(t, keySort, true)&lt;br /&gt;
&lt;br /&gt;
	local i = 0&lt;br /&gt;
	return function ()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		local key = arr[i]&lt;br /&gt;
		if key ~= nil then&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isArray&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if the given value is a table and all keys are consecutive&lt;br /&gt;
-- integers starting at 1.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isArray(v)&lt;br /&gt;
	if type(v) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(v) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if v[i] == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isArrayLike&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if the given value is iterable and all keys are consecutive&lt;br /&gt;
-- integers starting at 1.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isArrayLike(v)&lt;br /&gt;
	if not pcall(pairs, v) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(v) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if v[i] == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- invert&lt;br /&gt;
--&lt;br /&gt;
-- Transposes the keys and values in an array. For example, {&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;} -&amp;gt;&lt;br /&gt;
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to&lt;br /&gt;
-- the index of the last duplicate) and NaN values are ignored.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.invert(arr)&lt;br /&gt;
	checkType(&amp;quot;invert&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local map = {}&lt;br /&gt;
	for i, v in ipairs(arr) do&lt;br /&gt;
		if not isNan(v) then&lt;br /&gt;
			map[v] = i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return map&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- listToSet&lt;br /&gt;
--&lt;br /&gt;
-- Creates a set from the array part of the table. Indexing the set by any of the&lt;br /&gt;
-- values of the array returns true. For example, {&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;} -&amp;gt;&lt;br /&gt;
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them&lt;br /&gt;
-- never equal to any value (including other NaNs or even themselves).&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.listToSet(arr)&lt;br /&gt;
	checkType(&amp;quot;listToSet&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local set = {}&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if not isNan(v) then&lt;br /&gt;
			set[v] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- deepCopy&lt;br /&gt;
--&lt;br /&gt;
-- Recursive deep copy function. Preserves identities of subtables.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
local function _deepCopy(orig, includeMetatable, already_seen)&lt;br /&gt;
	if type(orig) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		return orig&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- already_seen stores copies of tables indexed by the original table.&lt;br /&gt;
	local copy = already_seen[orig]&lt;br /&gt;
	if copy ~= nil then&lt;br /&gt;
		return copy&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	copy = {}&lt;br /&gt;
	already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops&lt;br /&gt;
	&lt;br /&gt;
	for orig_key, orig_value in pairs(orig) do&lt;br /&gt;
		copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if includeMetatable then&lt;br /&gt;
		local mt = getmetatable(orig)&lt;br /&gt;
		if mt ~= nil then&lt;br /&gt;
			setmetatable(copy, _deepCopy(mt, true, already_seen))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.deepCopy(orig, noMetatable, already_seen)&lt;br /&gt;
	checkType(&amp;quot;deepCopy&amp;quot;, 3, already_seen, &amp;quot;table&amp;quot;, true)&lt;br /&gt;
	return _deepCopy(orig, not noMetatable, already_seen or {})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseConcat&lt;br /&gt;
--&lt;br /&gt;
-- Concatenates all values in the table that are indexed by a number, in order.&lt;br /&gt;
-- sparseConcat{a, nil, c, d}  =&amp;gt;  &amp;quot;acd&amp;quot;&lt;br /&gt;
-- sparseConcat{nil, b, c, d}  =&amp;gt;  &amp;quot;bcd&amp;quot;&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sparseConcat(t, sep, i, j)&lt;br /&gt;
	local arr = {}&lt;br /&gt;
&lt;br /&gt;
	local arr_i = 0&lt;br /&gt;
	for _, v in p.sparseIpairs(t) do&lt;br /&gt;
		arr_i = arr_i + 1&lt;br /&gt;
		arr[arr_i] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(arr, sep, i, j)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- length&lt;br /&gt;
--&lt;br /&gt;
-- Finds the length of an array, or of a quasi-array with keys such as &amp;quot;data1&amp;quot;,&lt;br /&gt;
-- &amp;quot;data2&amp;quot;, etc., using an exponential search algorithm. It is similar to the&lt;br /&gt;
-- operator #, but may return a different value when there are gaps in the array&lt;br /&gt;
-- portion of the table. Intended to be used on data loaded with mw.loadData. For&lt;br /&gt;
-- other tables, use #.&lt;br /&gt;
-- Note: #frame.args in frame object always be set to 0, regardless of  the number&lt;br /&gt;
-- of unnamed template parameters, so use this function for frame.args.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.length(t, prefix)&lt;br /&gt;
	-- requiring module inline so that [[Module:Exponential search]] which is&lt;br /&gt;
	-- only needed by this one function doesn&amp;#039;t get millions of transclusions&lt;br /&gt;
	local expSearch = require(&amp;quot;Module:Exponential search&amp;quot;)&lt;br /&gt;
	checkType(&amp;#039;length&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;length&amp;#039;, 2, prefix, &amp;#039;string&amp;#039;, true)&lt;br /&gt;
	return expSearch(function (i)&lt;br /&gt;
		local key&lt;br /&gt;
		if prefix then&lt;br /&gt;
			key = prefix .. tostring(i)&lt;br /&gt;
		else&lt;br /&gt;
			key = i&lt;br /&gt;
		end&lt;br /&gt;
		return t[key] ~= nil&lt;br /&gt;
	end) or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- inArray&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if searchElement is a member of the array, and false otherwise.&lt;br /&gt;
-- Equivalent to JavaScript array.includes(searchElement) or&lt;br /&gt;
-- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.inArray(array, searchElement, fromIndex)&lt;br /&gt;
	checkType(&amp;quot;inArray&amp;quot;, 1, array, &amp;quot;table&amp;quot;)&lt;br /&gt;
	-- if searchElement is nil, error?&lt;br /&gt;
&lt;br /&gt;
	fromIndex = tonumber(fromIndex)&lt;br /&gt;
	if fromIndex then&lt;br /&gt;
		if (fromIndex &amp;lt; 0) then&lt;br /&gt;
			fromIndex = #array + fromIndex + 1&lt;br /&gt;
		end&lt;br /&gt;
		if fromIndex &amp;lt; 1 then fromIndex = 1 end&lt;br /&gt;
		for _, v in ipairs({unpack(array, fromIndex)}) do&lt;br /&gt;
			if v == searchElement then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for _, v in pairs(array) do&lt;br /&gt;
			if v == searchElement then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- merge&lt;br /&gt;
--&lt;br /&gt;
-- Given the arrays, returns an array containing the elements of each input array&lt;br /&gt;
-- in sequence.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.merge(...)&lt;br /&gt;
	local arrays = {...}&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for i, arr in ipairs(arrays) do&lt;br /&gt;
		checkType(&amp;#039;merge&amp;#039;, i, arr, &amp;#039;table&amp;#039;)&lt;br /&gt;
		for _, v in ipairs(arr) do&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- extend&lt;br /&gt;
--&lt;br /&gt;
-- Extends the first array in place by appending all elements from the second&lt;br /&gt;
-- array.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.extend(arr1, arr2)&lt;br /&gt;
	checkType(&amp;#039;extend&amp;#039;, 1, arr1, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;extend&amp;#039;, 2, arr2, &amp;#039;table&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	for _, v in ipairs(arr2) do&lt;br /&gt;
		arr1[#arr1 + 1] = v&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:TableTools</comments>
		</item>
		<item>
			<title>Module:List</title>
			<link>https://wiki.852r.org/index.php?title=Module:List&amp;diff=3838&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:List&amp;diff=3838&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:List&quot; title=&quot;Module:List&quot;&gt;Module:List&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local libUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
local checkType = libUtil.checkType&lt;br /&gt;
local mTableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local listTypes = {&lt;br /&gt;
	[&amp;#039;bulleted&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;unbulleted&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;horizontal&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ordered&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;horizontal_ordered&amp;#039;] = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.makeListData(listType, args)&lt;br /&gt;
	-- Constructs a data table to be passed to p.renderList.&lt;br /&gt;
	local data = {}&lt;br /&gt;
&lt;br /&gt;
	-- Classes and TemplateStyles&lt;br /&gt;
	data.classes = {}&lt;br /&gt;
	data.templatestyles = &amp;#039;&amp;#039;&lt;br /&gt;
	if listType == &amp;#039;horizontal&amp;#039; or listType == &amp;#039;horizontal_ordered&amp;#039; then&lt;br /&gt;
		table.insert(data.classes, &amp;#039;hlist&amp;#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &amp;#039;templatestyles&amp;#039;, args = { src = &amp;#039;Hlist/styles.css&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	elseif listType == &amp;#039;unbulleted&amp;#039; then&lt;br /&gt;
		table.insert(data.classes, &amp;#039;plainlist&amp;#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &amp;#039;templatestyles&amp;#039;, args = { src = &amp;#039;Plainlist/styles.css&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(data.classes, args.class)&lt;br /&gt;
&lt;br /&gt;
	-- Main div style&lt;br /&gt;
	data.style = args.style&lt;br /&gt;
&lt;br /&gt;
	-- Indent for horizontal lists&lt;br /&gt;
	if listType == &amp;#039;horizontal&amp;#039; or listType == &amp;#039;horizontal_ordered&amp;#039; then&lt;br /&gt;
		local indent = tonumber(args.indent)&lt;br /&gt;
		indent = indent and indent * 1.6 or 0&lt;br /&gt;
		if indent &amp;gt; 0 then&lt;br /&gt;
			data.marginLeft = indent .. &amp;#039;em&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List style types for ordered lists&lt;br /&gt;
	-- This could be &amp;quot;1, 2, 3&amp;quot;, &amp;quot;a, b, c&amp;quot;, or a number of others. The list style&lt;br /&gt;
	-- type is either set by the &amp;quot;type&amp;quot; attribute or the &amp;quot;list-style-type&amp;quot; CSS&lt;br /&gt;
	-- property.&lt;br /&gt;
	if listType == &amp;#039;ordered&amp;#039; or listType == &amp;#039;horizontal_ordered&amp;#039; then &lt;br /&gt;
		data.listStyleType = args.list_style_type or args[&amp;#039;list-style-type&amp;#039;]&lt;br /&gt;
		data.type = args[&amp;#039;type&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
		-- Detect invalid type attributes and attempt to convert them to&lt;br /&gt;
		-- list-style-type CSS properties.&lt;br /&gt;
		if data.type &lt;br /&gt;
			and not data.listStyleType&lt;br /&gt;
			and not tostring(data.type):find(&amp;#039;^%s*[1AaIi]%s*$&amp;#039;)&lt;br /&gt;
		then&lt;br /&gt;
			data.listStyleType = data.type&lt;br /&gt;
			data.type = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List tag type&lt;br /&gt;
	if listType == &amp;#039;ordered&amp;#039; or listType == &amp;#039;horizontal_ordered&amp;#039; then&lt;br /&gt;
		data.listTag = &amp;#039;ol&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		data.listTag = &amp;#039;ul&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Start number for ordered lists&lt;br /&gt;
	data.start = args.start&lt;br /&gt;
	if listType == &amp;#039;horizontal_ordered&amp;#039; then&lt;br /&gt;
		-- Apply fix to get start numbers working with horizontal ordered lists.&lt;br /&gt;
		local startNum = tonumber(data.start)&lt;br /&gt;
		if startNum then&lt;br /&gt;
			data.counterReset = &amp;#039;listitem &amp;#039; .. tostring(startNum - 1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- List style&lt;br /&gt;
	 -- ul_style and ol_style are included for backwards compatibility. No&lt;br /&gt;
	 -- distinction is made for ordered or unordered lists.&lt;br /&gt;
	data.listStyle = args.list_style&lt;br /&gt;
&lt;br /&gt;
	-- List items&lt;br /&gt;
	-- li_style is included for backwards compatibility. item_style was included&lt;br /&gt;
	-- to be easier to understand for non-coders.&lt;br /&gt;
	data.itemStyle = args.item_style or args.li_style&lt;br /&gt;
	data.items = {}&lt;br /&gt;
	for _, num in ipairs(mTableTools.numKeys(args)) do&lt;br /&gt;
		local item = {}&lt;br /&gt;
		item.content = args[num]&lt;br /&gt;
		item.style = args[&amp;#039;item&amp;#039; .. tostring(num) .. &amp;#039;_style&amp;#039;]&lt;br /&gt;
			or args[&amp;#039;item_style&amp;#039; .. tostring(num)]&lt;br /&gt;
		item.value = args[&amp;#039;item&amp;#039; .. tostring(num) .. &amp;#039;_value&amp;#039;]&lt;br /&gt;
			or args[&amp;#039;item_value&amp;#039; .. tostring(num)]&lt;br /&gt;
		table.insert(data.items, item)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderList(data)&lt;br /&gt;
	-- Renders the list HTML.&lt;br /&gt;
	&lt;br /&gt;
	-- Return the blank string if there are no list items.&lt;br /&gt;
	if type(data.items) ~= &amp;#039;table&amp;#039; or #data.items &amp;lt; 1 then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Render the main div tag.&lt;br /&gt;
	local root = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	for _, class in ipairs(data.classes or {}) do&lt;br /&gt;
		root:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	root:css{[&amp;#039;margin-left&amp;#039;] = data.marginLeft}&lt;br /&gt;
	if data.style then&lt;br /&gt;
		root:cssText(data.style)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list tag.&lt;br /&gt;
	local list = root:tag(data.listTag or &amp;#039;ul&amp;#039;)&lt;br /&gt;
	list&lt;br /&gt;
		:attr{start = data.start, type = data.type}&lt;br /&gt;
		:css{&lt;br /&gt;
			[&amp;#039;counter-reset&amp;#039;] = data.counterReset,&lt;br /&gt;
			[&amp;#039;list-style-type&amp;#039;] = data.listStyleType&lt;br /&gt;
		}&lt;br /&gt;
	if data.listStyle then&lt;br /&gt;
		list:cssText(data.listStyle)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list items&lt;br /&gt;
	for _, t in ipairs(data.items or {}) do&lt;br /&gt;
		local item = list:tag(&amp;#039;li&amp;#039;)&lt;br /&gt;
		if data.itemStyle then&lt;br /&gt;
			item:cssText(data.itemStyle)&lt;br /&gt;
		end&lt;br /&gt;
		if t.style then&lt;br /&gt;
			item:cssText(t.style)&lt;br /&gt;
		end&lt;br /&gt;
		item&lt;br /&gt;
			:attr{value = t.value}&lt;br /&gt;
			:wikitext(t.content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return data.templatestyles .. tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderTrackingCategories(args)&lt;br /&gt;
	local isDeprecated = false -- Tracks deprecated parameters.&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = tostring(k)&lt;br /&gt;
		if k:find(&amp;#039;^item_style%d+$&amp;#039;) or k:find(&amp;#039;^item_value%d+$&amp;#039;) then&lt;br /&gt;
			isDeprecated = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	if isDeprecated then&lt;br /&gt;
		ret = ret .. &amp;#039;[[Category:Pages using module:list with deprecated parameters]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeList(listType, args)&lt;br /&gt;
	if not listType or not listTypes[listType] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;bad argument #1 to &amp;#039;makeList&amp;#039; (&amp;#039;%s&amp;#039; is not a valid list type)&amp;quot;,&lt;br /&gt;
			tostring(listType)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	checkType(&amp;#039;makeList&amp;#039;, 2, args, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local data = p.makeListData(listType, args)&lt;br /&gt;
	local list = p.renderList(data)&lt;br /&gt;
	local trackingCategories = p.renderTrackingCategories(args)&lt;br /&gt;
	return list .. trackingCategories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for listType in pairs(listTypes) do&lt;br /&gt;
	p[listType] = function (frame)&lt;br /&gt;
		local mArguments = require(&amp;#039;Module:Arguments&amp;#039;)&lt;br /&gt;
		local origArgs = mArguments.getArgs(frame, {&lt;br /&gt;
			frameOnly = ((frame and frame.args and frame.args.frameonly or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039;),&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
			if not value or not mw.ustring.find(value, &amp;#039;%S&amp;#039;) then return nil end&lt;br /&gt;
			if mw.ustring.find(value, &amp;#039;^%s*[%*#;:]&amp;#039;) then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return value:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		})&lt;br /&gt;
		-- Copy all the arguments to a new table, for faster indexing.&lt;br /&gt;
		local args = {}&lt;br /&gt;
		for k, v in pairs(origArgs) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		return p.makeList(listType, args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:List</comments>
		</item>
		<item>
			<title>Module:String</title>
			<link>https://wiki.852r.org/index.php?title=Module:String&amp;diff=3836&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:String&amp;diff=3836&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:String&quot; title=&quot;Module:String&quot;&gt;Module:String&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
&lt;br /&gt;
This module is intended to provide access to basic string functions.&lt;br /&gt;
&lt;br /&gt;
Most of the functions provided here can be invoked with named parameters,&lt;br /&gt;
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will&lt;br /&gt;
automatically remove any leading or trailing whitespace from the parameter.&lt;br /&gt;
Depending on the intended use, it may be advantageous to either preserve or&lt;br /&gt;
remove such whitespace.&lt;br /&gt;
&lt;br /&gt;
Global options&lt;br /&gt;
    ignore_errors: If set to &amp;#039;true&amp;#039; or 1, any error condition will result in&lt;br /&gt;
        an empty string being returned rather than an error message.&lt;br /&gt;
&lt;br /&gt;
    error_category: If an error occurs, specifies the name of a category to&lt;br /&gt;
        include with the error message.  The default category is&lt;br /&gt;
        [Category:Errors reported by Module String].&lt;br /&gt;
&lt;br /&gt;
    no_category: If set to &amp;#039;true&amp;#039; or 1, no category will be added if an error&lt;br /&gt;
        is generated.&lt;br /&gt;
&lt;br /&gt;
Unit tests for this module are available at Module:String/tests.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local str = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
len&lt;br /&gt;
&lt;br /&gt;
This function returns the length of the target string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|len|target_string|}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|len|s=target_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string whose length to report&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.&lt;br /&gt;
]]&lt;br /&gt;
function str.len( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&amp;#039;s&amp;#039;} )&lt;br /&gt;
	local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	return mw.ustring.len( s )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
sub&lt;br /&gt;
&lt;br /&gt;
This function returns a substring of the target string at specified indices.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|sub|target_string|start_index|end_index}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to return a subset of&lt;br /&gt;
    i: The first index of the substring to return, defaults to 1.&lt;br /&gt;
    j: The last index of the string to return, defaults to the last character.&lt;br /&gt;
&lt;br /&gt;
The first character of the string is assigned an index of 1.  If either i or j&lt;br /&gt;
is a negative value, it is interpreted the same as selecting a character by&lt;br /&gt;
counting from the end of the string.  Hence, a value of -1 is the same as&lt;br /&gt;
selecting the last character of the string.&lt;br /&gt;
&lt;br /&gt;
If the requested indices are out of range for the given string, an error is&lt;br /&gt;
reported.&lt;br /&gt;
]]&lt;br /&gt;
function str.sub( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, { &amp;#039;s&amp;#039;, &amp;#039;i&amp;#039;, &amp;#039;j&amp;#039; } )&lt;br /&gt;
	local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local i = tonumber( new_args[&amp;#039;i&amp;#039;] ) or 1&lt;br /&gt;
	local j = tonumber( new_args[&amp;#039;j&amp;#039;] ) or -1&lt;br /&gt;
&lt;br /&gt;
	local len = mw.ustring.len( s )&lt;br /&gt;
&lt;br /&gt;
	-- Convert negatives for range checking&lt;br /&gt;
	if i &amp;lt; 0 then&lt;br /&gt;
		i = len + i + 1&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; 0 then&lt;br /&gt;
		j = len + j + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if i &amp;gt; len or j &amp;gt; len or i &amp;lt; 1 or j &amp;lt; 1 then&lt;br /&gt;
		return str._error( &amp;#039;String subset index out of range&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; i then&lt;br /&gt;
		return str._error( &amp;#039;String subset indices out of order&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( s, i, j )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function implements that features of {{str sub old}} and is kept in order&lt;br /&gt;
to maintain these older templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.sublength( frame )&lt;br /&gt;
	local i = tonumber( frame.args.i ) or 0&lt;br /&gt;
	local len = tonumber( frame.args.len )&lt;br /&gt;
	return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
_match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern. It is exported for use in other modules&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
strmatch = require(&amp;quot;Module:String&amp;quot;)._match&lt;br /&gt;
sresult = strmatch( s, pattern, start, match, plain, nomatch )&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* http://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This sub-routine is exported for use in other modules&lt;br /&gt;
function str._match( s, pattern, start, match_index, plain_flag, nomatch )&lt;br /&gt;
	if s == &amp;#039;&amp;#039; then&lt;br /&gt;
		return str._error( &amp;#039;Target string is empty&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
		return str._error( &amp;#039;Pattern string is empty&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	start = tonumber(start) or 1&lt;br /&gt;
	if math.abs(start) &amp;lt; 1 or math.abs(start) &amp;gt; mw.ustring.len( s ) then&lt;br /&gt;
		return str._error( &amp;#039;Requested start is out of range&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if match_index == 0 then&lt;br /&gt;
		return str._error( &amp;#039;Match index is out of range&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if plain_flag then&lt;br /&gt;
		pattern = str._escapePattern( pattern )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
	if match_index == 1 then&lt;br /&gt;
		-- Find first match is simple case&lt;br /&gt;
		result = mw.ustring.match( s, pattern, start )&lt;br /&gt;
	else&lt;br /&gt;
		if start &amp;gt; 1 then&lt;br /&gt;
			s = mw.ustring.sub( s, start )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local iterator = mw.ustring.gmatch(s, pattern)&lt;br /&gt;
		if match_index &amp;gt; 0 then&lt;br /&gt;
			-- Forward search&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				match_index = match_index - 1&lt;br /&gt;
				if match_index == 0 then&lt;br /&gt;
					result = w&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- Reverse search&lt;br /&gt;
			local result_table = {}&lt;br /&gt;
			local count = 1&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				result_table[count] = w&lt;br /&gt;
				count = count + 1&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			result = result_table[ count + match_index ]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if result == nil then&lt;br /&gt;
		if nomatch == nil then&lt;br /&gt;
			return str._error( &amp;#039;Match not found&amp;#039; )&lt;br /&gt;
		else&lt;br /&gt;
			return nomatch&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return result&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index&lt;br /&gt;
    |match=match_number|plain=plain_flag|nomatch=nomatch_output}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from each string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
If the match_number or start_index are out of range for the string being queried, then&lt;br /&gt;
this function generates an error.  An error is also generated if no match is found.&lt;br /&gt;
If one adds the parameter ignore_errors=true, then the error will be suppressed and&lt;br /&gt;
an empty string will be returned on any failure.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* http://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This is the entry point for #invoke:String|match&lt;br /&gt;
function str.match( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&amp;#039;s&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;start&amp;#039;, &amp;#039;match&amp;#039;, &amp;#039;plain&amp;#039;, &amp;#039;nomatch&amp;#039;} )&lt;br /&gt;
	local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local start = tonumber( new_args[&amp;#039;start&amp;#039;] ) or 1&lt;br /&gt;
	local plain_flag = str._getBoolean( new_args[&amp;#039;plain&amp;#039;] or false )&lt;br /&gt;
	local pattern = new_args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local match_index = math.floor( tonumber(new_args[&amp;#039;match&amp;#039;]) or 1 )&lt;br /&gt;
	local nomatch = new_args[&amp;#039;nomatch&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
	return str._match( s, pattern, start, match_index, plain_flag, nomatch )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
pos&lt;br /&gt;
&lt;br /&gt;
This function returns a single character from the target string at position pos.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|pos|target_string|index_value}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|target=target_string|pos=index_value}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    target: The string to search&lt;br /&gt;
    pos: The index for the character to return&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
The first character has an index value of 1.&lt;br /&gt;
&lt;br /&gt;
If one requests a negative value, this function will select a character by counting backwards&lt;br /&gt;
from the end of the string.  In other words pos = -1 is the same as asking for the last character.&lt;br /&gt;
&lt;br /&gt;
A requested value of zero, or a value greater than the length of the string returns an error.&lt;br /&gt;
]]&lt;br /&gt;
function str.pos( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&amp;#039;target&amp;#039;, &amp;#039;pos&amp;#039;} )&lt;br /&gt;
	local target_str = new_args[&amp;#039;target&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local pos = tonumber( new_args[&amp;#039;pos&amp;#039;] ) or 0&lt;br /&gt;
&lt;br /&gt;
	if pos == 0 or math.abs(pos) &amp;gt; mw.ustring.len( target_str ) then&lt;br /&gt;
		return str._error( &amp;#039;String index out of range&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( target_str, pos, pos )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
str_find&lt;br /&gt;
&lt;br /&gt;
This function duplicates the behavior of {{str_find}}, including all of its quirks.&lt;br /&gt;
This is provided in order to support existing templates, but is NOT RECOMMENDED for&lt;br /&gt;
new code and templates.  New code is recommended to use the &amp;quot;find&amp;quot; function instead.&lt;br /&gt;
&lt;br /&gt;
Returns the first index in &amp;quot;source&amp;quot; that is a match to &amp;quot;target&amp;quot;.  Indexing is 1-based,&lt;br /&gt;
and the function returns -1 if the &amp;quot;target&amp;quot; string is not present in &amp;quot;source&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Important Note: If the &amp;quot;target&amp;quot; string is empty / missing, this function returns a&lt;br /&gt;
value of &amp;quot;1&amp;quot;, which is generally unexpected behavior, and must be accounted for&lt;br /&gt;
separatetly.&lt;br /&gt;
]]&lt;br /&gt;
function str.str_find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&amp;#039;source&amp;#039;, &amp;#039;target&amp;#039;} )&lt;br /&gt;
	local source_str = new_args[&amp;#039;source&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local target_str = new_args[&amp;#039;target&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if target_str == &amp;#039;&amp;#039; then&lt;br /&gt;
		return 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, target_str, 1, true )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = -1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
find&lt;br /&gt;
&lt;br /&gt;
This function allows one to search for a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    target: The string or pattern to find within source&lt;br /&gt;
    start: The index within the source string to start the search, defaults to 1&lt;br /&gt;
    plain: Boolean flag indicating that target should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the parameter.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
This function returns the first index &amp;gt;= &amp;quot;start&amp;quot; where &amp;quot;target&amp;quot; can be found&lt;br /&gt;
within &amp;quot;source&amp;quot;.  Indices are 1-based.  If &amp;quot;target&amp;quot; is not found, then this&lt;br /&gt;
function returns 0.  If either &amp;quot;source&amp;quot; or &amp;quot;target&amp;quot; are missing / empty, this&lt;br /&gt;
function also returns 0.&lt;br /&gt;
&lt;br /&gt;
This function should be safe for UTF-8 strings.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&amp;#039;source&amp;#039;, &amp;#039;target&amp;#039;, &amp;#039;start&amp;#039;, &amp;#039;plain&amp;#039; } )&lt;br /&gt;
	local source_str = new_args[&amp;#039;source&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local pattern = new_args[&amp;#039;target&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local start_pos = tonumber(new_args[&amp;#039;start&amp;#039;]) or 1&lt;br /&gt;
	local plain = new_args[&amp;#039;plain&amp;#039;] or true&lt;br /&gt;
&lt;br /&gt;
	if source_str == &amp;#039;&amp;#039; or pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	plain = str._getBoolean( plain )&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, pattern, start_pos, plain )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
replace&lt;br /&gt;
&lt;br /&gt;
This function allows one to replace a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|&lt;br /&gt;
   count=replacement_count|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    pattern: The string or pattern to find within source&lt;br /&gt;
    replace: The replacement text&lt;br /&gt;
    count: The number of occurences to replace, defaults to all.&lt;br /&gt;
    plain: Boolean flag indicating that pattern should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&amp;#039;source&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;replace&amp;#039;, &amp;#039;count&amp;#039;, &amp;#039;plain&amp;#039; } )&lt;br /&gt;
	local source_str = new_args[&amp;#039;source&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local pattern = new_args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local replace = new_args[&amp;#039;replace&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local count = tonumber( new_args[&amp;#039;count&amp;#039;] )&lt;br /&gt;
	local plain = new_args[&amp;#039;plain&amp;#039;] or true&lt;br /&gt;
&lt;br /&gt;
	if source_str == &amp;#039;&amp;#039; or pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
		return source_str&lt;br /&gt;
	end&lt;br /&gt;
	plain = str._getBoolean( plain )&lt;br /&gt;
&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern( pattern )&lt;br /&gt;
		replace = string.gsub( replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot; ) --Only need to escape replacement sequences.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
&lt;br /&gt;
	if count ~= nil then&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace, count )&lt;br /&gt;
	else&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    simple function to pipe string.rep to templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.rep( frame )&lt;br /&gt;
	local repetitions = tonumber( frame.args[2] )&lt;br /&gt;
	if not repetitions then&lt;br /&gt;
		return str._error( &amp;#039;function rep expects a number as second parameter, received &amp;quot;&amp;#039; .. ( frame.args[2] or &amp;#039;&amp;#039; ) .. &amp;#039;&amp;quot;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return string.rep( frame.args[1] or &amp;#039;&amp;#039;, repetitions )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
escapePattern&lt;br /&gt;
&lt;br /&gt;
This function escapes special characters from a Lua string pattern. See [1]&lt;br /&gt;
for details on how patterns work.&lt;br /&gt;
&lt;br /&gt;
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|escapePattern|pattern_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    pattern_string: The pattern string to escape.&lt;br /&gt;
]]&lt;br /&gt;
function str.escapePattern( frame )&lt;br /&gt;
	local pattern_str = frame.args[1]&lt;br /&gt;
	if not pattern_str then&lt;br /&gt;
		return str._error( &amp;#039;No pattern string specified&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	local result = str._escapePattern( pattern_str )&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
count&lt;br /&gt;
This function counts the number of occurrences of one string in another.&lt;br /&gt;
]]&lt;br /&gt;
function str.count(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {&amp;#039;source&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;plain&amp;#039;})&lt;br /&gt;
	local source = args.source or &amp;#039;&amp;#039;&lt;br /&gt;
	local pattern = args.pattern or &amp;#039;&amp;#039;&lt;br /&gt;
	local plain = str._getBoolean(args.plain or true)&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern(pattern)&lt;br /&gt;
	end&lt;br /&gt;
	local _, count = mw.ustring.gsub(source, pattern, &amp;#039;&amp;#039;)&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
endswith&lt;br /&gt;
This function determines whether a string ends with another string.&lt;br /&gt;
]]&lt;br /&gt;
function str.endswith(frame)&lt;br /&gt;
	local args = str._getParameters(frame.args, {&amp;#039;source&amp;#039;, &amp;#039;pattern&amp;#039;})&lt;br /&gt;
	local source = args.source or &amp;#039;&amp;#039;&lt;br /&gt;
	local pattern = args.pattern or &amp;#039;&amp;#039;&lt;br /&gt;
	if pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
		-- All strings end with the empty string.&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
join&lt;br /&gt;
&lt;br /&gt;
Join all non empty arguments together; the first argument is the separator.&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|join|sep|one|two|three}}&lt;br /&gt;
]]&lt;br /&gt;
function str.join(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	local sep&lt;br /&gt;
	for _, v in ipairs( frame.args ) do&lt;br /&gt;
		if sep then&lt;br /&gt;
			if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				table.insert(args, v)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			sep = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( args, sep or &amp;#039;&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- findpagetext returns the position of a piece of text in a page&lt;br /&gt;
-- First positional parameter or |text is the search text&lt;br /&gt;
-- Optional parameter |title is the page title, defaults to current page&lt;br /&gt;
-- Optional parameter |plain is either true for plain search (default) or false for Lua pattern search&lt;br /&gt;
-- Optional parameter |nomatch is the return value when no match is found; default is nil&lt;br /&gt;
function str._findpagetext(args)&lt;br /&gt;
	-- process parameters&lt;br /&gt;
	local nomatch = args.nomatch or &amp;quot;&amp;quot;&lt;br /&gt;
	if nomatch == &amp;quot;&amp;quot; then nomatch = nil end&lt;br /&gt;
	--&lt;br /&gt;
	local text = mw.text.trim(args[1] or args.text or &amp;quot;&amp;quot;)&lt;br /&gt;
	if text == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	--&lt;br /&gt;
	local title = args.title or &amp;quot;&amp;quot;&lt;br /&gt;
	local titleobj&lt;br /&gt;
	if title == &amp;quot;&amp;quot; then&lt;br /&gt;
		titleobj = mw.title.getCurrentTitle()&lt;br /&gt;
	else&lt;br /&gt;
		titleobj = mw.title.new(title)&lt;br /&gt;
	end&lt;br /&gt;
	--&lt;br /&gt;
	local plain = args.plain or &amp;quot;&amp;quot;&lt;br /&gt;
	if plain:sub(1, 1) == &amp;quot;f&amp;quot; then plain = false else plain = true end&lt;br /&gt;
	-- get the page content and look for &amp;#039;text&amp;#039; - return position or nomatch&lt;br /&gt;
	local content = titleobj and titleobj:getContent()&lt;br /&gt;
	return content and mw.ustring.find(content, text, 1, plain) or nomatch&lt;br /&gt;
end&lt;br /&gt;
function str.findpagetext(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	for k, v in pairs(pargs) do&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	if not (args[1] or args.text) then return nil end&lt;br /&gt;
	-- just the first value&lt;br /&gt;
	return (str._findpagetext(args))&lt;br /&gt;
end&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that populates the argument list given that user may need to use a mix of&lt;br /&gt;
named and unnamed parameters.  This is relevant because named parameters are not&lt;br /&gt;
identical to unnamed parameters due to string trimming, and when dealing with strings&lt;br /&gt;
we sometimes want to either preserve or remove that whitespace depending on the application.&lt;br /&gt;
]]&lt;br /&gt;
function str._getParameters( frame_args, arg_list )&lt;br /&gt;
	local new_args = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	local value&lt;br /&gt;
&lt;br /&gt;
	for _, arg in ipairs( arg_list ) do&lt;br /&gt;
		value = frame_args[arg]&lt;br /&gt;
		if value == nil then&lt;br /&gt;
			value = frame_args[index]&lt;br /&gt;
			index = index + 1&lt;br /&gt;
		end&lt;br /&gt;
		new_args[arg] = value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return new_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function to handle error messages.&lt;br /&gt;
]]&lt;br /&gt;
function str._error( error_str )&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local error_category = frame.args.error_category or &amp;#039;Errors reported by Module String&amp;#039;&lt;br /&gt;
	local ignore_errors = frame.args.ignore_errors or false&lt;br /&gt;
	local no_category = frame.args.no_category or false&lt;br /&gt;
&lt;br /&gt;
	if str._getBoolean(ignore_errors) then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local error_str = &amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;String Module Error: &amp;#039; .. error_str .. &amp;#039;&amp;lt;/strong&amp;gt;&amp;#039;&lt;br /&gt;
	if error_category ~= &amp;#039;&amp;#039; and not str._getBoolean( no_category ) then&lt;br /&gt;
		error_str = &amp;#039;[[Category:&amp;#039; .. error_category .. &amp;#039;]]&amp;#039; .. error_str&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return error_str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper Function to interpret boolean strings&lt;br /&gt;
]]&lt;br /&gt;
function str._getBoolean( boolean_str )&lt;br /&gt;
	local boolean_value&lt;br /&gt;
&lt;br /&gt;
	if type( boolean_str ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		boolean_str = boolean_str:lower()&lt;br /&gt;
		if boolean_str == &amp;#039;false&amp;#039; or boolean_str == &amp;#039;no&amp;#039; or boolean_str == &amp;#039;0&amp;#039;&lt;br /&gt;
				or boolean_str == &amp;#039;&amp;#039; then&lt;br /&gt;
			boolean_value = false&lt;br /&gt;
		else&lt;br /&gt;
			boolean_value = true&lt;br /&gt;
		end&lt;br /&gt;
	elseif type( boolean_str ) == &amp;#039;boolean&amp;#039; then&lt;br /&gt;
		boolean_value = boolean_str&lt;br /&gt;
	else&lt;br /&gt;
		error( &amp;#039;No boolean value found&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return boolean_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that escapes all pattern characters so that they will be treated&lt;br /&gt;
as plain text.&lt;br /&gt;
]]&lt;br /&gt;
function str._escapePattern( pattern_str )&lt;br /&gt;
	return ( string.gsub( pattern_str, &amp;quot;[%(%)%.%%%+%-%*%?%[%^%$%]]&amp;quot;, &amp;quot;%%%0&amp;quot; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return str&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:String</comments>
		</item>
		<item>
			<title>Module:Check for unknown parameters</title>
			<link>https://wiki.852r.org/index.php?title=Module:Check_for_unknown_parameters&amp;diff=3834&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Module:Check_for_unknown_parameters&amp;diff=3834&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Check_for_unknown_parameters&quot; title=&quot;Module:Check for unknown parameters&quot;&gt;Module:Check for unknown parameters&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module may be used to compare the arguments passed to the parent&lt;br /&gt;
-- with a list of arguments, returning a specified result if an argument is&lt;br /&gt;
-- not on the list&lt;br /&gt;
&lt;br /&gt;
require (&amp;#039;strict&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local pushpin_map_params = {&lt;br /&gt;
	&amp;#039;coordinates&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_caption&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_relief&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_label&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_label_position&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_label_size&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_map&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_mark&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_mark_size&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_alt&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_background&amp;#039;,&lt;br /&gt;
	&amp;#039;pushpin_map_size&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local mapframe_params = {&lt;br /&gt;
	&amp;#039;coord&amp;#039;,&lt;br /&gt;
	&amp;#039;coordinates&amp;#039;,&lt;br /&gt;
	&amp;#039;id&amp;#039;,&lt;br /&gt;
	&amp;#039;qid&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-area_km2&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-area_mi2&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-caption&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-coord&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-coordinates&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-custom&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-frame-coord&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-frame-coordinates&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-frame-height&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-frame-width&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-geomask&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-geomask-fill&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-geomask-fill-opacity&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-geomask-stroke-color&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-geomask-stroke-colour&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-geomask-stroke-width&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-height&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-id&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-length_km&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-length_mi&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-line&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-line-stroke-color&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-line-stroke-colour&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-marker&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-marker-color&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-marker-colour&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-point&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-population&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-shape&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-shape-fill&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-shape-fill-opacity&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-shape-stroke-color&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-shape-stroke-colour&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-stroke-color&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-stroke-colour&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-stroke-width&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-switcher&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-type&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-width&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-wikidata&amp;#039;,&lt;br /&gt;
	&amp;#039;mapframe-zoom&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
	return s:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match(&amp;#039;%S&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function clean(text)&lt;br /&gt;
	-- Return text cleaned for display and truncated if too long.&lt;br /&gt;
	-- Strip markers are replaced with dummy text representing the original wikitext.&lt;br /&gt;
	local pos, truncated&lt;br /&gt;
	local function truncate(text)&lt;br /&gt;
		if truncated then&lt;br /&gt;
			return &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.len(text) &amp;gt; 25 then&lt;br /&gt;
			truncated = true&lt;br /&gt;
			text = mw.ustring.sub(text, 1, 25) .. &amp;#039;...&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		return mw.text.nowiki(text)&lt;br /&gt;
	end&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for before, tag, remainder in text:gmatch(&amp;#039;([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()&amp;#039;) do&lt;br /&gt;
		pos = remainder&lt;br /&gt;
		table.insert(parts, truncate(before) .. &amp;#039;&amp;amp;lt;&amp;#039; .. tag .. &amp;#039;&amp;amp;gt;...&amp;amp;lt;/&amp;#039; .. tag .. &amp;#039;&amp;amp;gt;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(parts, truncate(text:sub(pos or 1)))&lt;br /&gt;
	return table.concat(parts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._check(args, pargs)&lt;br /&gt;
	if type(args) ~= &amp;quot;table&amp;quot; or type(pargs) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		-- TODO: error handling&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- create the list of known args, regular expressions, and the return string&lt;br /&gt;
	local knownargs = {}&lt;br /&gt;
	&lt;br /&gt;
	if isnotempty(args[&amp;#039;mapframe_args&amp;#039;]) then&lt;br /&gt;
		for _, v in ipairs(mapframe_params) do&lt;br /&gt;
    		knownargs[v] = 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if isnotempty(args[&amp;#039;pushpin_map_args&amp;#039;]) then&lt;br /&gt;
		for _, v in ipairs(pushpin_map_params) do&lt;br /&gt;
    		knownargs[v] = 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local regexps = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if type(k) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			v = trim(v)&lt;br /&gt;
			knownargs[v] = 1&lt;br /&gt;
		elseif k:find(&amp;#039;^regexp[1-9][0-9]*$&amp;#039;) then&lt;br /&gt;
			table.insert(regexps, &amp;#039;^&amp;#039; .. v .. &amp;#039;$&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- loop over the parent args, and make sure they are on the list&lt;br /&gt;
	local ignoreblank = isnotempty(args[&amp;#039;ignoreblank&amp;#039;])&lt;br /&gt;
	local showblankpos = isnotempty(args[&amp;#039;showblankpositional&amp;#039;])&lt;br /&gt;
	local values = {}&lt;br /&gt;
	for k, v in pairs(pargs) do&lt;br /&gt;
		if type(k) == &amp;#039;string&amp;#039; and knownargs[k] == nil then&lt;br /&gt;
			local knownflag = false&lt;br /&gt;
			for _, regexp in ipairs(regexps) do&lt;br /&gt;
				if mw.ustring.match(k, regexp) then&lt;br /&gt;
					knownflag = true&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not knownflag and ( not ignoreblank or isnotempty(v) )  then&lt;br /&gt;
				table.insert(values, clean(k))&lt;br /&gt;
			end&lt;br /&gt;
		elseif type(k) == &amp;#039;number&amp;#039; and knownargs[tostring(k)] == nil then&lt;br /&gt;
			local knownflag = false&lt;br /&gt;
			for _, regexp in ipairs(regexps) do&lt;br /&gt;
				if mw.ustring.match(tostring(k), regexp) then&lt;br /&gt;
					knownflag = true&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not knownflag and ( showblankpos or isnotempty(v) ) then&lt;br /&gt;
				table.insert(values, k .. &amp;#039; = &amp;#039; .. clean(v))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- add results to the output tables&lt;br /&gt;
	local res = {}&lt;br /&gt;
	if #values &amp;gt; 0 then&lt;br /&gt;
		local unknown_text = args[&amp;#039;unknown&amp;#039;] or &amp;#039;Found _VALUE_, &amp;#039;&lt;br /&gt;
&lt;br /&gt;
		if mw.getCurrentFrame():preprocess( &amp;quot;{{REVISIONID}}&amp;quot; ) == &amp;quot;&amp;quot; then&lt;br /&gt;
			local preview_text = args[&amp;#039;preview&amp;#039;]&lt;br /&gt;
			if isnotempty(preview_text) then&lt;br /&gt;
				preview_text = require(&amp;#039;Module:If preview&amp;#039;)._warning({preview_text})&lt;br /&gt;
			elseif preview_text == nil then&lt;br /&gt;
				preview_text = unknown_text&lt;br /&gt;
			end&lt;br /&gt;
			unknown_text = preview_text&lt;br /&gt;
		end&lt;br /&gt;
		for _, v in pairs(values) do&lt;br /&gt;
			-- Fix odd bug for | = which gets stripped to the empty string and&lt;br /&gt;
			-- breaks category links&lt;br /&gt;
			if v == &amp;#039;&amp;#039; then v = &amp;#039; &amp;#039; end&lt;br /&gt;
&lt;br /&gt;
			-- avoid error with v = &amp;#039;example%2&amp;#039; (&amp;quot;invalid capture index&amp;quot;)&lt;br /&gt;
			local r = unknown_text:gsub(&amp;#039;_VALUE_&amp;#039;, {_VALUE_ = v})&lt;br /&gt;
			table.insert(res, r)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(res)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.check(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	return p._check(args, pargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:18 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Module_talk:Check_for_unknown_parameters</comments>
		</item>
		<item>
			<title>Template:Short description/lowercasecheck</title>
			<link>https://wiki.852r.org/index.php?title=Template:Short_description/lowercasecheck&amp;diff=3832&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Short_description/lowercasecheck&amp;diff=3832&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Short_description/lowercasecheck&quot; title=&quot;Template:Short description/lowercasecheck&quot;&gt;Template:Short description/lowercasecheck&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{#ifeq:&amp;lt;!--test first character for lower-case letter--&amp;gt;{{#invoke:string|find|1={{{1|}}}|2=^%l|plain=false}}|1&lt;br /&gt;
|&amp;lt;!-- first character is a lower case letter; test against whitelist&lt;br /&gt;
--&amp;gt;{{#switch: {{First word|{{{1|}}}}}&amp;lt;!--begin whitelist--&amp;gt;&lt;br /&gt;
|c. &amp;lt;!--for circa--&amp;gt;&lt;br /&gt;
|gTLD&lt;br /&gt;
|iMac&lt;br /&gt;
|iOS&lt;br /&gt;
|iOS,&lt;br /&gt;
|iPad&lt;br /&gt;
|iPhone&lt;br /&gt;
|iTunes&lt;br /&gt;
|macOS&lt;br /&gt;
|none&lt;br /&gt;
|pH&lt;br /&gt;
|pH-dependent=&amp;lt;!-- end whitelist; short description starts with an allowed lower-case string; whitelist matched; do nothing --&amp;gt; &lt;br /&gt;
|#default=&amp;lt;!-- apply category to track lower-case short descriptions --&amp;gt;{{main other|[[Category:Pages with lower-case short description|{{trim|{{{1|}}}}}]]}}{{Testcases other|{{red|CATEGORY APPLIED}}}}&amp;lt;!-- end whitelist test --&amp;gt;}}&lt;br /&gt;
|&amp;lt;!-- short description does not start with lower-case letter; do nothing; end lower-case test --&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:17 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Short_description/lowercasecheck</comments>
		</item>
		<item>
			<title>Template:Main other</title>
			<link>https://wiki.852r.org/index.php?title=Template:Main_other&amp;diff=3830&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Main_other&amp;diff=3830&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Main_other&quot; title=&quot;Template:Main other&quot;&gt;Template:Main other&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{safesubst:&amp;lt;noinclude/&amp;gt;#switch:&lt;br /&gt;
  &amp;lt;noinclude&amp;gt;&amp;lt;!-- If no or empty &amp;quot;demospace&amp;quot; parameter then detect namespace --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
  {{safesubst:&amp;lt;noinclude/&amp;gt;#if:{{{demospace|}}} &lt;br /&gt;
  | {{safesubst:&amp;lt;noinclude/&amp;gt;lc: {{{demospace}}} }}    &amp;lt;noinclude&amp;gt;&amp;lt;!-- Use lower case &amp;quot;demospace&amp;quot; --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
  | {{safesubst:&amp;lt;noinclude/&amp;gt;#ifeq:{{safesubst:&amp;lt;noinclude/&amp;gt;NAMESPACE}}|{{safesubst:&amp;lt;noinclude/&amp;gt;ns:0}}&lt;br /&gt;
    | main&lt;br /&gt;
    | other&lt;br /&gt;
    }} &lt;br /&gt;
  }}&lt;br /&gt;
| main     = {{{1|}}}&lt;br /&gt;
| other&lt;br /&gt;
| #default = {{{2|}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:17 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Main_other</comments>
		</item>
		<item>
			<title>Template:Short description</title>
			<link>https://wiki.852r.org/index.php?title=Template:Short_description&amp;diff=3828&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.852r.org/index.php?title=Template:Short_description&amp;diff=3828&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php/User:Jasper&quot; class=&quot;mw-redirect mw-userlink&quot; title=&quot;User:Jasper&quot;&gt;&lt;bdi&gt;Jasper&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Short_description&quot; title=&quot;Template:Short description&quot;&gt;Template:Short description&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{#ifeq:{{lc:{{{1|}}}}}|none|{{SHORTDESC:|{{{2|}}}}}&amp;lt;nowiki/&amp;gt;&amp;lt;!--Prevents whitespace issues when used with adjacent newlines--&amp;gt;|&amp;lt;div class=&amp;quot;shortdescription nomobile noexcerpt noprint searchaux&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;{{{1|}}}{{SHORTDESC:{{{1|}}}|{{{2|}}}}}&amp;lt;/div&amp;gt;}}&amp;lt;includeonly&amp;gt;{{#ifeq:{{{pagetype}}}|Disambiguation pages||{{#ifeq:{{pagetype |defaultns = all |user=exclude}}|exclude||{{#ifeq:{{#switch: {{NAMESPACENUMBER}} | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 100 | 101 | 118 | 119 | 828 | 829 | = exclude|#default=}}|exclude||[[Category:{{{pagetype|{{pagetype |defaultns = extended |plural=y}}}}} with short description]]}}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;!-- Start tracking&lt;br /&gt;
--&amp;gt;{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using short description with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Short description]] with unknown parameter &amp;quot;_VALUE_&amp;quot;|ignoreblank=y| 1 | 2 | pagetype | bot |plural }}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifexpr: {{#invoke:String|len|{{{1|}}}}}&amp;gt;100 | [[Category:{{{pagetype|{{pagetype |defaultns = extended |plural=y}}}}} with long short description]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;includeonly&amp;gt;{{#if:{{{1|}}}||[[Category:Pages with empty short description]]}}&amp;lt;/includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{Short description/lowercasecheck|{{{1|}}}}}&amp;lt;!-- &lt;br /&gt;
--&amp;gt;{{Main other |{{SDcat |sd={{{1|}}} }} }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Thu, 06 Aug 2026 10:46:17 GMT</pubDate>
			<dc:creator>Jasper</dc:creator>
			<comments>https://wiki.852r.org/index.php/Template_talk:Short_description</comments>
		</item>
</channel></rss>