<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>WikiName  - Recent changes [en]</title>
		<link>https://test.eciton.co.uk/index.php/Special:RecentChanges</link>
		<description>Track the most recent changes to the wiki in this feed.</description>
		<language>en</language>
		<generator>MediaWiki 1.46.2</generator>
		<lastBuildDate>Sat, 10 Oct 2026 00:09:24 GMT</lastBuildDate>
		<item>
			<title>Template:Cite book</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Cite_book&amp;diff=120&amp;oldid=55</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Cite_book&amp;diff=120&amp;oldid=55</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&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 17:47, 9 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-multi&quot; lang=&quot;en&quot;&gt;(8 intermediate revisions by the same user not shown)&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 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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{#&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;invoke&lt;/del&gt;:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;citation/CS1&lt;/del&gt;|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;citation&lt;/del&gt;&lt;/div&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;if&lt;/ins&gt;:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{{last|}}}|{{{last}}},}}{{#if:{{{first|}}}|&amp;amp;nbsp;{{{first}}}}}{{#if:{{{date|}}}|&amp;amp;nbsp;({{{date}}}).}} {{#if:{{{title|}}}|&amp;amp;nbsp;&#039;&#039;{{{title}}}&#039;&#039;.}} {{#if:{{{location|}}}|&amp;amp;nbsp;{{{location}}}:}}{{#if:{{{publisher|}}}|&amp;amp;nbsp;{{{publisher}}}.}}{{#if:{{{page|}}}|&amp;amp;nbsp; p.{{{page}}}. }}{{#if:{{{pages|}}}&lt;/ins&gt;|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;pp.{{{pages}}}.}}{{#if:{{{quote&lt;/ins&gt;|}}&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}|&amp;amp;nbsp;Quote:&quot;{&lt;/ins&gt;{{&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;quote}}}&quot;.&lt;/ins&gt;}}{{&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#if:{{{isbn|}}}&lt;/ins&gt;|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;ISBN&amp;amp;nbsp;{{{isbn}}}.&lt;/ins&gt;}}{{&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#if:{{{url|}&lt;/ins&gt;}}&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&amp;amp;nbsp;https://{&lt;/ins&gt;{{&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;url}}}&lt;/ins&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;CitationClass=book&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;documentation&lt;/del&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;collapse top&lt;/del&gt;|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;TemplateData&lt;/del&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Cite book/TemplateData&lt;/del&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;collapse bottom&lt;/del&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Fri, 09 Oct 2026 21:47:02 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Cite_book</comments>
		</item>
		<item>
			<title>Module:Citation/CS1/COinS</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/COinS&amp;diff=111&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/COinS&amp;diff=111&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Citation/CS1/COinS&quot; title=&quot;Module:Citation/CS1/COinS&quot;&gt;Module:Citation/CS1/COinS&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Citation/CS1/COinS&quot; class=&quot;extiw&quot; title=&quot;en:Module:Citation/CS1/COinS&quot;&gt;en:Module:Citation/CS1/COinS&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local has_accept_as_written, is_set, in_array, remove_wiki_link, strip_apostrophe_markup;	-- functions in Module:Citation/CS1/Utilities&lt;br /&gt;
&lt;br /&gt;
local cfg;																		-- table of configuration tables that are defined in Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ C O I N S _ T I T L E &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Makes a title for COinS from Title and / or ScriptTitle (or any other name-script pairs)&lt;br /&gt;
&lt;br /&gt;
Apostrophe markup (bold, italics) is stripped from each value so that the COinS metadata isn&amp;#039;t corrupted with strings&lt;br /&gt;
of %27%27...&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_coins_title (title, script)&lt;br /&gt;
	title = has_accept_as_written (title);&lt;br /&gt;
	if is_set (title) then&lt;br /&gt;
		title = strip_apostrophe_markup (title);								-- strip any apostrophe markup&lt;br /&gt;
	else&lt;br /&gt;
		title = &amp;#039;&amp;#039;;																-- if not set, make sure title is an empty string&lt;br /&gt;
	end&lt;br /&gt;
	if is_set (script) then&lt;br /&gt;
		script = script:gsub (&amp;#039;^%l%l%s*:%s*&amp;#039;, &amp;#039;&amp;#039;);								-- remove language prefix if present (script value may now be empty string)&lt;br /&gt;
		script = strip_apostrophe_markup (script);								-- strip any apostrophe markup&lt;br /&gt;
	else&lt;br /&gt;
		script = &amp;#039;&amp;#039;;															-- if not set, make sure script is an empty string&lt;br /&gt;
	end&lt;br /&gt;
	if is_set (title) and is_set (script) then&lt;br /&gt;
		script = &amp;#039; &amp;#039; .. script;													-- add a space before we concatenate&lt;br /&gt;
	end&lt;br /&gt;
	return title .. script;														-- return the concatenation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E S C A P E _ L U A _ M A G I C _ C H A R S &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns a string where all of Lua&amp;#039;s magic characters have been escaped.  This is important because functions like&lt;br /&gt;
string.gsub() treat their pattern and replace strings as patterns, not literal strings.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function escape_lua_magic_chars (argument)&lt;br /&gt;
	argument = argument:gsub(&amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot;);										-- replace % with %%&lt;br /&gt;
	argument = argument:gsub(&amp;quot;([%^%$%(%)%.%[%]%*%+%-%?])&amp;quot;, &amp;quot;%%%1&amp;quot;);				-- replace all other Lua magic pattern characters&lt;br /&gt;
	return argument;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ C O I N S _ P A G E S &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Extract page numbers from external wikilinks in any of the |page=, |pages=, or |at= parameters for use in COinS.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_coins_pages (pages)&lt;br /&gt;
	local pattern;&lt;br /&gt;
	if not is_set (pages) then return pages; end								-- if no page numbers then we&amp;#039;re done&lt;br /&gt;
	&lt;br /&gt;
	while true do&lt;br /&gt;
		pattern = pages:match(&amp;quot;%[(%w*:?//[^ ]+%s+)[%w%d].*%]&amp;quot;);					-- pattern is the opening bracket, the URL and following space(s): &amp;quot;[url &amp;quot;&lt;br /&gt;
		if nil == pattern then break; end										-- no more URLs&lt;br /&gt;
		pattern = escape_lua_magic_chars (pattern);								-- pattern is not a literal string; escape Lua&amp;#039;s magic pattern characters&lt;br /&gt;
		pages = pages:gsub(pattern, &amp;quot;&amp;quot;);										-- remove as many instances of pattern as possible&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	pages = pages:gsub(&amp;quot;[%[%]]&amp;quot;, &amp;quot;&amp;quot;);											-- remove the brackets&lt;br /&gt;
	pages = pages:gsub(&amp;quot;–&amp;quot;, &amp;quot;-&amp;quot; );												-- replace endashes with hyphens&lt;br /&gt;
	pages = pages:gsub(&amp;quot;&amp;amp;%w+;&amp;quot;, &amp;quot;-&amp;quot; );											-- and replace HTML entities (&amp;amp;ndash; etc.) with hyphens; do we need to replace numerical entities like &amp;amp;#32; and the like?&lt;br /&gt;
	pages = pages:gsub (&amp;#039;%b&amp;lt;&amp;gt;&amp;#039;, &amp;#039;&amp;#039;);											-- remove html-like tags; spans are added to &amp;lt;Pages&amp;gt; by utilities.hyphen_to_dash() which should not appear in COinS metadata&lt;br /&gt;
	return pages;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; C O I N S _ R E P L A C E _ M A T H _ S T R I P M A R K E R &amp;gt;------------------&lt;br /&gt;
&lt;br /&gt;
There are three options for math markup rendering that depend on the editor&amp;#039;s math preference settings.  These&lt;br /&gt;
settings are at [[Special:Preferences#mw-prefsection-rendering]] and are&lt;br /&gt;
	PNG images&lt;br /&gt;
	TeX source&lt;br /&gt;
	MathML with SVG or PNG fallback&lt;br /&gt;
&lt;br /&gt;
All three are heavy with HTML and CSS which doesn&amp;#039;t belong in the metadata.&lt;br /&gt;
&lt;br /&gt;
Without this function, the metadata saved in the raw wikitext contained the rendering determined by the settings&lt;br /&gt;
of the last editor to save the page.&lt;br /&gt;
&lt;br /&gt;
This function gets the rendered form of an equation according to the editor&amp;#039;s preference before the page is saved.  It&lt;br /&gt;
then searches the rendering for the text equivalent of the rendered equation and replaces the rendering with that so&lt;br /&gt;
that the page is saved without extraneous HTML/CSS markup and with a reasonably readable text form of the equation.&lt;br /&gt;
&lt;br /&gt;
When a replacement is made, this function returns true and the value with replacement; otherwise false and the initial&lt;br /&gt;
value.  To replace multipe equations it is necessary to call this function from within a loop.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function coins_replace_math_stripmarker (value)&lt;br /&gt;
	local stripmarker = cfg.stripmarkers[&amp;#039;math&amp;#039;];&lt;br /&gt;
	local rendering = value:match (stripmarker);								-- is there a math stripmarker&lt;br /&gt;
&lt;br /&gt;
	if not rendering then														-- when value doesn&amp;#039;t have a math stripmarker, abandon this test&lt;br /&gt;
		return false, value;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	rendering = mw.text.unstripNoWiki (rendering);								-- convert stripmarker into rendered value (or nil? &amp;#039;&amp;#039;? when math render error)&lt;br /&gt;
	&lt;br /&gt;
	if rendering:match (&amp;#039;alt=&amp;quot;[^&amp;quot;]+&amp;quot;&amp;#039;) then										-- if PNG math option&lt;br /&gt;
		rendering = rendering:match (&amp;#039;alt=&amp;quot;([^&amp;quot;]+)&amp;quot;&amp;#039;);							-- extract just the math text&lt;br /&gt;
	elseif rendering:match (&amp;#039;$%s+.+%s+%$&amp;#039;) then									-- if TeX math option; $ is legit character that is escapes as \$&lt;br /&gt;
		rendering = rendering:match (&amp;#039;$%s+(.+)%s+%$&amp;#039;)							-- extract just the math text&lt;br /&gt;
	elseif rendering:match (&amp;#039;&amp;lt;annotation[^&amp;gt;]+&amp;gt;.+&amp;lt;/annotation&amp;gt;&amp;#039;) then			-- if MathML math option&lt;br /&gt;
		rendering = rendering:match (&amp;#039;&amp;lt;annotation[^&amp;gt;]+&amp;gt;(.+)&amp;lt;/annotation&amp;gt;&amp;#039;)		-- extract just the math text&lt;br /&gt;
	else&lt;br /&gt;
		return false, value;													-- had math stripmarker but not one of the three defined forms&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return true, value:gsub (stripmarker, rendering, 1);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C O I N S _ C L E A N U P &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Cleanup parameter values for the metadata by removing or replacing invisible characters and certain HTML entities.&lt;br /&gt;
&lt;br /&gt;
2015-12-10: there is a bug in mw.text.unstripNoWiki ().  It replaces math stripmarkers with the appropriate content&lt;br /&gt;
when it shouldn&amp;#039;t.  See https://phabricator.wikimedia.org/T121085 and Wikipedia_talk:Lua#stripmarkers_and_mw.text.unstripNoWiki.28.29&lt;br /&gt;
&lt;br /&gt;
TODO: move the replacement patterns and replacement values into a table in /Configuration similar to the invisible&lt;br /&gt;
characters table?&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function coins_cleanup (value)&lt;br /&gt;
	local replaced = true;														-- default state to get the do loop running&lt;br /&gt;
&lt;br /&gt;
	while replaced do															-- loop until all math stripmarkers replaced&lt;br /&gt;
		replaced, value = coins_replace_math_stripmarker (value);				-- replace math stripmarker with text representation of the equation&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	value = value:gsub (cfg.stripmarkers[&amp;#039;math&amp;#039;], &amp;quot;MATH RENDER ERROR&amp;quot;);			-- one or more couldn&amp;#039;t be replaced; insert vague error message&lt;br /&gt;
	&lt;br /&gt;
	value = mw.text.unstripNoWiki (value);										-- replace nowiki stripmarkers with their content&lt;br /&gt;
	value = value:gsub (&amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot; style=&amp;quot;padding%-left:0%.1em;&amp;quot;&amp;gt;&amp;amp;#39;(s?)&amp;lt;/span&amp;gt;&amp;#039;, &amp;quot;&amp;#039;%1&amp;quot;);	-- replace {{&amp;#039;}} or {{&amp;#039;s}} with simple apostrophe or apostrophe-s&lt;br /&gt;
	value = value:gsub (&amp;#039;&amp;amp;nbsp;&amp;#039;, &amp;#039; &amp;#039;);											-- replace &amp;amp;nbsp; entity with plain space&lt;br /&gt;
	value = value:gsub (&amp;#039;\226\128\138&amp;#039;, &amp;#039; &amp;#039;);									-- replace hair space with plain space&lt;br /&gt;
	if not mw.ustring.find (value, cfg.indic_script) then						-- don&amp;#039;t remove zero-width joiner characters from indic script&lt;br /&gt;
		value = value:gsub (&amp;#039;&amp;amp;zwj;&amp;#039;, &amp;#039;&amp;#039;);										-- remove &amp;amp;zwj; entities&lt;br /&gt;
		value = mw.ustring.gsub (value, &amp;#039;[\226\128\141\226\128\139\194\173]&amp;#039;, &amp;#039;&amp;#039;);	-- remove zero-width joiner, zero-width space, soft hyphen&lt;br /&gt;
	end&lt;br /&gt;
	value = value:gsub (&amp;#039;[\009\010\013 ]+&amp;#039;, &amp;#039; &amp;#039;);								-- replace horizontal tab, line feed, carriage return with plain space&lt;br /&gt;
	return value;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C O I N S &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
COinS metadata (see &amp;lt;http://ocoins.info/&amp;gt;) allows automated tools to parse the citation information.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function COinS(data, class)&lt;br /&gt;
	if &amp;#039;table&amp;#039; ~= type(data) or nil == next(data) then&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs (data) do													-- spin through all of the metadata parameter values&lt;br /&gt;
		if &amp;#039;ID_list&amp;#039; ~= k and &amp;#039;Authors&amp;#039; ~= k then								-- except the ID_list and Author tables (author nowiki stripmarker done when Author table processed)&lt;br /&gt;
			data[k] = coins_cleanup (v);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ctx_ver = &amp;quot;Z39.88-2004&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	-- treat table strictly as an array with only set values.&lt;br /&gt;
	local OCinSoutput = setmetatable( {}, {&lt;br /&gt;
		__newindex = function(self, key, value)&lt;br /&gt;
			if is_set(value) then&lt;br /&gt;
				rawset( self, #self+1, table.concat{ key, &amp;#039;=&amp;#039;, mw.uri.encode( remove_wiki_link( value ) ) } );&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	if in_array (class, {&amp;#039;arxiv&amp;#039;, &amp;#039;biorxiv&amp;#039;, &amp;#039;citeseerx&amp;#039;, &amp;#039;medrxiv&amp;#039;, &amp;#039;ssrn&amp;#039;, &amp;#039;journal&amp;#039;, &amp;#039;news&amp;#039;, &amp;#039;magazine&amp;#039;}) or&lt;br /&gt;
		(in_array (class, {&amp;#039;conference&amp;#039;, &amp;#039;interview&amp;#039;, &amp;#039;map&amp;#039;, &amp;#039;press release&amp;#039;, &amp;#039;web&amp;#039;}) and is_set(data.Periodical)) or&lt;br /&gt;
		(&amp;#039;citation&amp;#039; == class and is_set(data.Periodical) and not is_set (data.Encyclopedia)) then&lt;br /&gt;
			OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:journal&amp;quot;;			-- journal metadata identifier&lt;br /&gt;
			if in_array (class, {&amp;#039;arxiv&amp;#039;, &amp;#039;biorxiv&amp;#039;, &amp;#039;citeseerx&amp;#039;, &amp;#039;medrxiv&amp;#039;, &amp;#039;ssrn&amp;#039;}) then	-- set genre according to the type of citation template we are rendering&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;preprint&amp;quot;;							-- cite arxiv, cite biorxiv, cite citeseerx, cite medrxiv, cite ssrn&lt;br /&gt;
			elseif &amp;#039;conference&amp;#039; == class then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;conference&amp;quot;;						-- cite conference (when Periodical set)&lt;br /&gt;
			elseif &amp;#039;web&amp;#039; == class then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;unknown&amp;quot;;							-- cite web (when Periodical set)&lt;br /&gt;
			else&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;article&amp;quot;;							-- journal and other &amp;#039;periodical&amp;#039; articles&lt;br /&gt;
			end&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.jtitle&amp;quot;] = data.Periodical;						-- journal only&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Title;								-- &amp;#039;periodical&amp;#039; article titles&lt;br /&gt;
&lt;br /&gt;
																				-- these used only for periodicals&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.ssn&amp;quot;] = data.Season;								-- keywords: winter, spring, summer, fall&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.quarter&amp;quot;] = data.Quarter;							-- single digits 1-&amp;gt;first quarter, etc.&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.chron&amp;quot;] = data.Chron;								-- free-form date components&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.volume&amp;quot;] = data.Volume;							-- does not apply to books&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.issue&amp;quot;] = data.Issue;&lt;br /&gt;
			OCinSoutput[&amp;#039;rft.artnum&amp;#039;] = data.ArticleNumber;						-- {{cite journal}} only&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.pages&amp;quot;] = data.Pages;								-- also used in book metadata&lt;br /&gt;
&lt;br /&gt;
	elseif &amp;#039;thesis&amp;#039; ~= class then												-- all others except cite thesis are treated as &amp;#039;book&amp;#039; metadata; genre distinguishes&lt;br /&gt;
		OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:book&amp;quot;;					-- book metadata identifier&lt;br /&gt;
		if &amp;#039;report&amp;#039; == class or &amp;#039;techreport&amp;#039; == class then						-- cite report and cite techreport&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;report&amp;quot;;&lt;br /&gt;
		elseif &amp;#039;conference&amp;#039; == class then										-- cite conference when Periodical not set&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;conference&amp;quot;;&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Chapter;							-- conference paper as chapter in proceedings (book)&lt;br /&gt;
		elseif in_array (class, {&amp;#039;book&amp;#039;, &amp;#039;citation&amp;#039;, &amp;#039;encyclopaedia&amp;#039;, &amp;#039;interview&amp;#039;, &amp;#039;map&amp;#039;}) then&lt;br /&gt;
			if is_set (data.Chapter) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;bookitem&amp;quot;;&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Chapter;						-- book chapter, encyclopedia article, interview in a book, or map title&lt;br /&gt;
			else&lt;br /&gt;
				if &amp;#039;map&amp;#039; == class or &amp;#039;interview&amp;#039; == class then&lt;br /&gt;
					OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;#039;unknown&amp;#039;;						-- standalone map or interview&lt;br /&gt;
				else&lt;br /&gt;
					OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;#039;book&amp;#039;;							-- book and encyclopedia&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else	-- {&amp;#039;audio-visual&amp;#039;, &amp;#039;AV-media-notes&amp;#039;, &amp;#039;DVD-notes&amp;#039;, &amp;#039;episode&amp;#039;, &amp;#039;interview&amp;#039;, &amp;#039;mailinglist&amp;#039;, &amp;#039;map&amp;#039;, &amp;#039;newsgroup&amp;#039;, &amp;#039;podcast&amp;#039;, &amp;#039;press release&amp;#039;, &amp;#039;serial&amp;#039;, &amp;#039;sign&amp;#039;, &amp;#039;speech&amp;#039;, &amp;#039;web&amp;#039;}&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;unknown&amp;quot;;&lt;br /&gt;
		end&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.btitle&amp;quot;] = data.Title;									-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.place&amp;quot;] = data.PublicationPlace;						-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.series&amp;quot;] = data.Series;								-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.pages&amp;quot;] = data.Pages;									-- book, journal&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.edition&amp;quot;] = data.Edition;								-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.pub&amp;quot;] = data.PublisherName;							-- book and dissertation&lt;br /&gt;
		&lt;br /&gt;
	else																		-- cite thesis&lt;br /&gt;
		OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:dissertation&amp;quot;;			-- dissertation metadata identifier&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.title&amp;quot;] = data.Title;									-- dissertation (also patent but that is not yet supported)&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.degree&amp;quot;] = data.Degree;								-- dissertation only&lt;br /&gt;
		OCinSoutput[&amp;#039;rft.inst&amp;#039;] = data.PublisherName;							-- book and dissertation&lt;br /&gt;
	end&lt;br /&gt;
	-- NB. Not currently supported are &amp;quot;info:ofi/fmt:kev:mtx:patent&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:dc&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:sch_svc&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:ctx&amp;quot;&lt;br /&gt;
																				-- and now common parameters (as much as possible)&lt;br /&gt;
	OCinSoutput[&amp;quot;rft.date&amp;quot;] = data.Date;										-- book, journal, dissertation&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs( data.ID_list ) do										-- what to do about these? For now assume that they are common to all?&lt;br /&gt;
		if k == &amp;#039;ISBN&amp;#039; then v = v:gsub( &amp;quot;[^-0-9X]&amp;quot;, &amp;quot;&amp;quot; ); end&lt;br /&gt;
		local id = cfg.id_handlers[k].COinS;&lt;br /&gt;
		if string.sub( id or &amp;quot;&amp;quot;, 1, 4 ) == &amp;#039;info&amp;#039; then							-- for ids that are in the info:registry&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat{ id, &amp;quot;/&amp;quot;, v };&lt;br /&gt;
		elseif string.sub (id or &amp;quot;&amp;quot;, 1, 3 ) == &amp;#039;rft&amp;#039; then						-- for isbn, issn, eissn, etc. that have defined COinS keywords&lt;br /&gt;
			OCinSoutput[ id ] = v;&lt;br /&gt;
		elseif &amp;#039;url&amp;#039; == id then													-- for urls that are assembled in ~/Identifiers; |asin= and |ol=&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat ({data.ID_list[k], &amp;quot;#id-name=&amp;quot;, cfg.id_handlers[k].label});&lt;br /&gt;
		elseif id then															-- when cfg.id_handlers[k].COinS is not nil so urls created here&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat{ cfg.id_handlers[k].prefix, v, cfg.id_handlers[k].suffix or &amp;#039;&amp;#039;, &amp;quot;#id-name=&amp;quot;, cfg.id_handlers[k].label };	-- others; provide a URL and indicate identifier name as #fragment (human-readable, but transparent to browsers)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local last, first;&lt;br /&gt;
	for k, v in ipairs( data.Authors ) do&lt;br /&gt;
		last, first = coins_cleanup (v.last), coins_cleanup (v.first or &amp;#039;&amp;#039;);	-- replace any nowiki stripmarkers, non-printing or invisible characters&lt;br /&gt;
		if k == 1 then															-- for the first author name only&lt;br /&gt;
			if is_set(last) and is_set(first) then								-- set these COinS values if |first= and |last= specify the first author name&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.aulast&amp;quot;] = last;								-- book, journal, dissertation&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.aufirst&amp;quot;] = first;								-- book, journal, dissertation&lt;br /&gt;
			elseif is_set(last) then &lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = last;									-- book, journal, dissertation -- otherwise use this form for the first name&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- for all other authors&lt;br /&gt;
			if is_set(last) and is_set(first) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = table.concat{ last, &amp;quot;, &amp;quot;, first };		-- book, journal, dissertation&lt;br /&gt;
			elseif is_set(last) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = last;									-- book, journal, dissertation&lt;br /&gt;
			end&lt;br /&gt;
			-- TODO: At present we do not report &amp;quot;et al.&amp;quot;. Add anything special if this condition applies?&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	OCinSoutput.rft_id = data.URL;&lt;br /&gt;
	OCinSoutput.rfr_id = table.concat{ &amp;quot;info:sid/&amp;quot;, string.match (mw.site.server, &amp;quot;[^/]*$&amp;quot; ), &amp;quot;:&amp;quot;, data.RawPage };&lt;br /&gt;
&lt;br /&gt;
	-- TODO: Add optional extra info:&lt;br /&gt;
	-- rfr_dat=#REVISION&amp;lt;version&amp;gt; (referrer private data)&lt;br /&gt;
	-- ctx_id=&amp;lt;data.RawPage&amp;gt;#&amp;lt;ref&amp;gt; (identifier for the context object)&lt;br /&gt;
	-- ctx_tim=&amp;lt;ts&amp;gt; (timestamp in format yyyy-mm-ddThh:mm:ssTZD or yyyy-mm-dd)&lt;br /&gt;
	-- ctx_enc=info:ofi/enc:UTF-8 (character encoding)&lt;br /&gt;
	&lt;br /&gt;
	OCinSoutput = setmetatable( OCinSoutput, nil );&lt;br /&gt;
&lt;br /&gt;
	-- sort with version string always first, and combine.&lt;br /&gt;
	-- table.sort( OCinSoutput );&lt;br /&gt;
	table.insert( OCinSoutput, 1, &amp;quot;ctx_ver=&amp;quot; .. ctx_ver ); -- such as &amp;quot;Z39.88-2004&amp;quot;&lt;br /&gt;
	return table.concat(OCinSoutput, &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local cfg table and imported functions table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
&lt;br /&gt;
	has_accept_as_written = utilities_page_ptr.has_accept_as_written;			-- import functions from selected Module:Citation/CS1/Utilities module&lt;br /&gt;
	is_set = utilities_page_ptr.is_set;&lt;br /&gt;
	in_array = utilities_page_ptr.in_array;&lt;br /&gt;
	remove_wiki_link = utilities_page_ptr.remove_wiki_link;&lt;br /&gt;
	strip_apostrophe_markup = utilities_page_ptr.strip_apostrophe_markup;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	make_coins_title = make_coins_title,&lt;br /&gt;
	get_coins_pages = get_coins_pages,&lt;br /&gt;
	COinS = COinS,&lt;br /&gt;
	set_selected_modules = set_selected_modules,&lt;br /&gt;
	}&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:42:30 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Citation/CS1/COinS</comments>
		</item>
		<item>
			<title>Module:Citation/CS1/Utilities</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Utilities&amp;diff=109&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Utilities&amp;diff=109&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Citation/CS1/Utilities&quot; title=&quot;Module:Citation/CS1/Utilities&quot;&gt;Module:Citation/CS1/Utilities&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Citation/CS1/Utilities&quot; class=&quot;extiw&quot; title=&quot;en:Module:Citation/CS1/Utilities&quot;&gt;en:Module:Citation/CS1/Utilities&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local z = {&lt;br /&gt;
	error_cats_t = {};															-- for categorizing citations that contain errors&lt;br /&gt;
	error_ids_t = {};															-- list of error identifiers; used to prevent duplication of certain errors; local to this module&lt;br /&gt;
	error_msgs_t = {};															-- sequence table of error messages&lt;br /&gt;
	maint_cats_t = {};															-- for categorizing citations that aren&amp;#039;t erroneous per se, but could use a little work&lt;br /&gt;
	prop_cats_t = {};															-- for categorizing citations based on certain properties, language of source for instance&lt;br /&gt;
	prop_keys_t = {};															-- for adding classes to the citation&amp;#039;s &amp;lt;cite&amp;gt; tag&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local cfg;																		-- table of tables imported from selected Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ S E T &amp;gt;------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns true if argument is set; false otherwise. Argument is &amp;#039;set&amp;#039; when it exists (not nil) or when it is not an empty string.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_set (var)&lt;br /&gt;
	return not (var == nil or var == &amp;#039;&amp;#039;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I N _ A R R A Y &amp;gt;--------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Whether needle is in haystack&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function in_array (needle, haystack)&lt;br /&gt;
	if needle == nil then&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	for n, v in ipairs (haystack) do&lt;br /&gt;
		if v == needle then&lt;br /&gt;
			return n;&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;
--[[--------------------------&amp;lt; H A S _ A C C E P T _ A S _ W R I T T E N &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;str&amp;gt; is wholly wrapped in accept-as-written markup, return &amp;lt;str&amp;gt; without markup and true; return &amp;lt;str&amp;gt; and false else&lt;br /&gt;
&lt;br /&gt;
with allow_empty = false, &amp;lt;str&amp;gt; must have at least one character inside the markup&lt;br /&gt;
with allow_empty = true, &amp;lt;str&amp;gt; the markup frame can be empty like (()) to distinguish an empty template parameter from the specific condition &amp;quot;has no applicable value&amp;quot; in citation-context.&lt;br /&gt;
&lt;br /&gt;
After further evaluation the two cases might be merged at a later stage, but should be kept separated for now.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function has_accept_as_written (str, allow_empty)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return str, false;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local count;&lt;br /&gt;
&lt;br /&gt;
	if true == allow_empty then&lt;br /&gt;
		str, count = str:gsub (&amp;#039;^%(%((.*)%)%)$&amp;#039;, &amp;#039;%1&amp;#039;); 						-- allows (()) to be an empty set&lt;br /&gt;
	else&lt;br /&gt;
		str, count = str:gsub (&amp;#039;^%(%((.+)%)%)$&amp;#039;, &amp;#039;%1&amp;#039;);&lt;br /&gt;
	end&lt;br /&gt;
	return str, 0 ~= count;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S U B S T I T U T E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Populates numbered arguments in a message string using an argument table. &amp;lt;args&amp;gt; may be a single string or a&lt;br /&gt;
sequence table of multiple strings.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function substitute (msg, args)&lt;br /&gt;
	return args and mw.message.newRawMessage (msg, args):plain() or msg;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E R R O R _ C O M M E N T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Wraps error messages with CSS markup according to the state of hidden. &amp;lt;content&amp;gt; may be a single string or a&lt;br /&gt;
sequence table of multiple strings.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function error_comment (content, hidden)&lt;br /&gt;
	return substitute (hidden and cfg.presentation[&amp;#039;hidden-error&amp;#039;] or cfg.presentation[&amp;#039;visible-error&amp;#039;], content);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H Y P H E N _ T O _ D A S H &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Converts a hyphen, endash, emdash to endash under certain conditions.  The hyphen/en/em must separate&lt;br /&gt;
like items; unlike items are returned unmodified.  These forms are modified:&lt;br /&gt;
	letter - letter (A-B)&lt;br /&gt;
	digit - digit (4-5)&lt;br /&gt;
	digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5)&lt;br /&gt;
	letterdigit - letterdigit (A1-A5) (an optional separator between letter and&lt;br /&gt;
		digit is supported – a.1-a.5 or a-1-a-5)&lt;br /&gt;
	digitletter - digitletter (5a-5d) (an optional separator between letter and&lt;br /&gt;
		digit is supported – 5.a-5.d or 5-a-5-d)&lt;br /&gt;
&lt;br /&gt;
any other forms are returned unmodified.&lt;br /&gt;
&lt;br /&gt;
str may be a comma- or semicolon-separated list of page ranges with/without single pages&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function hyphen_to_dash (str)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return str;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	str = str:gsub (&amp;quot;(%(%(.-%)%))&amp;quot;, function(m) return m:gsub(&amp;quot;,&amp;quot;, &amp;quot;，&amp;quot;):gsub(&amp;quot;;&amp;quot;, &amp;quot;；&amp;quot;) end) -- replace commas and semicolons in accept-as-written markup with similar unicode characters so they&amp;#039;ll be ignored during the split	&lt;br /&gt;
	str = str:gsub (&amp;#039;&amp;amp;[nm]dash;&amp;#039;, {[&amp;#039;&amp;amp;ndash;&amp;#039;] = &amp;#039;–&amp;#039;, [&amp;#039;&amp;amp;mdash;&amp;#039;] = &amp;#039;—&amp;#039;});		-- replace &amp;amp;mdash; and &amp;amp;ndash; entities with their characters; semicolon mucks up the text.split&lt;br /&gt;
	str = str:gsub (&amp;#039;&amp;amp;#45;&amp;#039;, &amp;#039;-&amp;#039;);												-- replace HTML numeric entity with hyphen character&lt;br /&gt;
	str = str:gsub (&amp;#039;&amp;amp;nbsp;&amp;#039;, &amp;#039; &amp;#039;);												-- replace &amp;amp;nbsp; entity with generic keyboard space character&lt;br /&gt;
	&lt;br /&gt;
	local out = {};&lt;br /&gt;
	local list = mw.text.split (str, &amp;#039;%s*[,;]%s*&amp;#039;);								-- split str at comma or semicolon separators if there are any&lt;br /&gt;
&lt;br /&gt;
	local accept;																-- boolean&lt;br /&gt;
&lt;br /&gt;
	for _, item in ipairs (list) do												-- for each item in the list&lt;br /&gt;
		item, accept = has_accept_as_written (item);							-- remove accept-this-as-written markup when it wraps all of item&lt;br /&gt;
		if not accept and mw.ustring.match (item, &amp;#039;^%w*[%.%-]?%w+%s*[—–-]%s*%w*[%.%-]?%w+$&amp;#039;) then	-- if pagination uses &amp;lt;hyphen|dot&amp;gt; separators with hyphen/endash/emdash &amp;lt;range separator&amp;gt;&lt;br /&gt;
			if mw.ustring.match (item, &amp;#039;^%a+[%.%-]%d+%s*[—–-]%s*%a+[%.%-]%d+$&amp;#039;) or		-- letter&amp;lt;hyphen|dot&amp;gt;digit &amp;lt;range separator&amp;gt; letter&amp;lt;hyphen|dot&amp;gt;digit (requires &amp;lt;hyphen|dot&amp;gt; separator between letter and digit)&lt;br /&gt;
				mw.ustring.match (item, &amp;#039;^%d+[%.%-]%a+%s*[—–-]%s*%d+[%.%-]%a+$&amp;#039;) or		-- digit&amp;lt;hyphen|dot&amp;gt;letter &amp;lt;range separator&amp;gt; digit&amp;lt;hyphen|dot&amp;gt;letter (requires &amp;lt;hyphen|dot&amp;gt; separator between digit and letter)&lt;br /&gt;
				mw.ustring.match (item, &amp;#039;^%d+[%.%-]%d+%s*[—–-]%s*%d+[%.%-]%d+$&amp;#039;) then	-- digit&amp;lt;hyphen|dot&amp;gt;digit &amp;lt;range separator&amp;gt; digit&amp;lt;hyphen|dot&amp;gt;digit (requires &amp;lt;hyphen|dot&amp;gt; separator between digit and digit)&lt;br /&gt;
					item = mw.ustring.gsub (item, &amp;#039;(%w*[%.%-]%w+)%s*[—–-]%s*(%w*[%.%-]%w+)&amp;#039;, &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%1 –&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%2&amp;lt;/span&amp;gt;&amp;#039;);	-- replace &amp;lt;range separator&amp;gt;, with spaced endash&lt;br /&gt;
&lt;br /&gt;
			elseif mw.ustring.match (item, &amp;#039;^%d+%a+%s*[—–-]%s*%d+%a+$&amp;#039;) or		-- digitletter &amp;lt;range separator&amp;gt; digitletter&lt;br /&gt;
				mw.ustring.match (item, &amp;#039;^%a+%d+%s*[—–-]%s*%a+%d+$&amp;#039;) or			-- letterdigit &amp;lt;range separator&amp;gt; letterdigit&lt;br /&gt;
				mw.ustring.match (item, &amp;#039;^%d+%s*[—–-]%s*%d+$&amp;#039;) or				-- digit &amp;lt;range separator&amp;gt; digit&lt;br /&gt;
				mw.ustring.match (item, &amp;#039;^%a+%s*[—–-]%s*%a+$&amp;#039;) then				-- letter&amp;lt;range separator&amp;gt; letter&lt;br /&gt;
					item = mw.ustring.gsub (item, &amp;#039;(%w+)%s*[—–-]%s*(%w+)&amp;#039;, &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%1–&amp;lt;/span&amp;gt;%2&amp;#039;);	-- replace &amp;lt;range separator&amp;gt; with endash, remove extraneous space characters&lt;br /&gt;
&lt;br /&gt;
			else&lt;br /&gt;
	--			item = mw.ustring.gsub (item, &amp;#039;%s*[—–-]%s*&amp;#039;, &amp;#039;–&amp;#039;);				-- disabled; here when &amp;#039;unlike&amp;#039; items so return &amp;lt;item&amp;gt; as is&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert (out, item);												-- add the (possibly modified) item to the output table&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local temp_str;																-- concatenate the output table into a comma separated string&lt;br /&gt;
	temp_str, accept = has_accept_as_written (table.concat (out, &amp;#039;, &amp;#039;));		-- remove accept-this-as-written markup when it wraps all of concatenated out&lt;br /&gt;
	if accept then&lt;br /&gt;
		temp_str = has_accept_as_written (str);									-- when global markup removed, return original str; do it this way to suppress boolean second return value&lt;br /&gt;
		return temp_str:gsub(&amp;quot;，&amp;quot;, &amp;quot;,&amp;quot;):gsub(&amp;quot;；&amp;quot;, &amp;quot;;&amp;quot;);&lt;br /&gt;
	else&lt;br /&gt;
		return temp_str:gsub(&amp;quot;，&amp;quot;, &amp;quot;,&amp;quot;):gsub(&amp;quot;；&amp;quot;, &amp;quot;;&amp;quot;);						-- else, return assembled temp_str&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; M A K E _ W I K I L I N K &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only&lt;br /&gt;
link is provided (or link and display are the same), returns a wikilink in the form [[L]]; if neither are&lt;br /&gt;
provided or link is omitted, returns an empty string.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function make_wikilink (link, display)&lt;br /&gt;
	if not is_set (link) then return &amp;#039;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
	if is_set (display) and link ~= display then			&lt;br /&gt;
		return table.concat ({&amp;#039;[[&amp;#039;, link, &amp;#039;|&amp;#039;, display, &amp;#039;]]&amp;#039;});			&lt;br /&gt;
	else&lt;br /&gt;
		return table.concat ({&amp;#039;[[&amp;#039;, link, &amp;#039;]]&amp;#039;});&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ M E S S A G E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets an error message using the ~/Configuration error_conditions{} table along with arguments supplied in the function&lt;br /&gt;
call, inserts the resulting message in z.error_msgs_t{} sequence table, and returns the error message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error_id&amp;gt; – key value for appropriate error handler in ~/Configuration error_conditions{} table &lt;br /&gt;
&amp;lt;arguments&amp;gt; – may be a single string or a sequence table of multiple strings to be subsititued into error_conditions[error_id].message&lt;br /&gt;
&amp;lt;raw&amp;gt; – boolean&lt;br /&gt;
	true –	causes this function to return the error message not wrapped in visible-error, hidden-error span tag;&lt;br /&gt;
			returns error_conditions[error_id].hidden as a second return value&lt;br /&gt;
			does not add message to z.error_msgs_t sequence table&lt;br /&gt;
	false, nil – adds message wrapped in visible-error, hidden-error span tag to z.error_msgs_t&lt;br /&gt;
			returns the error message wrapped in visible-error, hidden-error span tag; there is no second return value&lt;br /&gt;
&amp;lt;prefix&amp;gt; – string to be prepended to &amp;lt;message&amp;gt;									-- TODO: remove support for these unused(?) arguments?&lt;br /&gt;
&amp;lt;suffix&amp;gt; – string to be appended to &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: change z.error_cats_t and z.maint_cats_t to have the form cat_name = true?  this to avoid dups without having to have an extra table&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local added_maint_cats = {}														-- list of maintenance categories that have been added to z.maint_cats_t; TODO: figure out how to delete this table&lt;br /&gt;
&lt;br /&gt;
local function set_message (error_id, arguments, raw, prefix, suffix)&lt;br /&gt;
	local error_state = cfg.error_conditions[error_id];&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;
	&lt;br /&gt;
	if error_state == nil then&lt;br /&gt;
		error (cfg.messages[&amp;#039;undefined_error&amp;#039;] .. &amp;#039;: &amp;#039; .. error_id);			-- because missing error handler in Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
	elseif is_set (error_state.category) then&lt;br /&gt;
		if error_state.message then												-- when error_state.message defined, this is an error message&lt;br /&gt;
			table.insert (z.error_cats_t, error_state.category);&lt;br /&gt;
		else&lt;br /&gt;
			if not added_maint_cats[error_id] then&lt;br /&gt;
				added_maint_cats[error_id] = true;								-- note that we&amp;#039;ve added this category&lt;br /&gt;
				table.insert (z.maint_cats_t, substitute (error_state.category, arguments));	-- make cat name then add to table&lt;br /&gt;
			end&lt;br /&gt;
			return;																-- because no message, nothing more to do&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local message = substitute (error_state.message, arguments);&lt;br /&gt;
&lt;br /&gt;
	message = table.concat (&lt;br /&gt;
		{&lt;br /&gt;
		message,&lt;br /&gt;
		&amp;#039; (&amp;#039;,&lt;br /&gt;
		make_wikilink (&lt;br /&gt;
			table.concat (&lt;br /&gt;
				{&lt;br /&gt;
				cfg.messages[&amp;#039;help page link&amp;#039;],&lt;br /&gt;
				&amp;#039;#&amp;#039;,&lt;br /&gt;
				error_state.anchor&lt;br /&gt;
				}),&lt;br /&gt;
			cfg.messages[&amp;#039;help page label&amp;#039;]),&lt;br /&gt;
		&amp;#039;)&amp;#039;&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	z.error_ids_t[error_id] = true;&lt;br /&gt;
	if z.error_ids_t[&amp;#039;err_citation_missing_title&amp;#039;] and							-- if missing-title error already noted&lt;br /&gt;
		in_array (error_id, {&amp;#039;err_bare_url_missing_title&amp;#039;, &amp;#039;err_trans_missing_title&amp;#039;}) then		-- and this error is one of these&lt;br /&gt;
			return &amp;#039;&amp;#039;, false;													-- don&amp;#039;t bother because one flavor of missing title is sufficient&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	message = table.concat ({prefix, message, suffix});&lt;br /&gt;
&lt;br /&gt;
	if true == raw then&lt;br /&gt;
		return message, error_state.hidden;										-- return message not wrapped in visible-error, hidden-error span tag&lt;br /&gt;
	end		&lt;br /&gt;
&lt;br /&gt;
	message = error_comment (message, error_state.hidden);						-- wrap message in visible-error, hidden-error span tag&lt;br /&gt;
	table.insert (z.error_msgs_t, message);										-- add it to the messages sequence table&lt;br /&gt;
	return message;																-- and done; return value generally not used but is used as a flag in various functions of ~/Identifiers&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; I S _ A L I A S _ U S E D &amp;gt;-----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
This function is used by select_one() to determine if one of a list of alias parameters is in the argument list&lt;br /&gt;
provided by the template.&lt;br /&gt;
&lt;br /&gt;
Input:&lt;br /&gt;
	args – pointer to the arguments table from calling template&lt;br /&gt;
	alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration&lt;br /&gt;
	index – for enumerated parameters, identifies which one&lt;br /&gt;
	enumerated – true/false flag used to choose how enumerated aliases are examined&lt;br /&gt;
	value – value associated with an alias that has previously been selected; nil if not yet selected&lt;br /&gt;
	selected – the alias that has previously been selected; nil if not yet selected&lt;br /&gt;
	error_list – list of aliases that are duplicates of the alias already selected&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
	value – value associated with alias we selected or that was previously selected or nil if an alias not yet selected&lt;br /&gt;
	selected – the alias we selected or the alias that was previously selected or nil if an alias not yet selected&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_alias_used (args, alias, index, enumerated, value, selected, error_list)&lt;br /&gt;
	if enumerated then															-- is this a test for an enumerated parameters?&lt;br /&gt;
		alias = alias:gsub (&amp;#039;#&amp;#039;, index);										-- replace &amp;#039;#&amp;#039; with the value in index&lt;br /&gt;
	else&lt;br /&gt;
		alias = alias:gsub (&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;);											-- remove &amp;#039;#&amp;#039; if it exists&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (args[alias]) then												-- alias is in the template&amp;#039;s argument list&lt;br /&gt;
		if value ~= nil and selected ~= alias then								-- if we have already selected one of the aliases&lt;br /&gt;
			local skip;&lt;br /&gt;
			for _, v in ipairs (error_list) do									-- spin through the error list to see if we&amp;#039;ve added this alias&lt;br /&gt;
				if v == alias then&lt;br /&gt;
					skip = true;&lt;br /&gt;
					break;														-- has been added so stop looking &lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not skip then													-- has not been added so&lt;br /&gt;
				table.insert (error_list, alias);								-- add error alias to the error list&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			value = args[alias];												-- not yet selected an alias, so select this one&lt;br /&gt;
			selected = alias;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return value, selected;														-- return newly selected alias, or previously selected alias&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ M A I N T _ C A T &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Adds a category to z.maint_cats_t using names from the configuration file with additional text if any.&lt;br /&gt;
To prevent duplication, the added_maint_cats table lists the categories by key that have been added to z.maint_cats_t.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function add_maint_cat (key, arguments)&lt;br /&gt;
	if not added_maint_cats [key] then&lt;br /&gt;
		added_maint_cats [key] = true;											-- note that we&amp;#039;ve added this category&lt;br /&gt;
		table.insert (z.maint_cats_t, substitute (cfg.maint_cats [key], arguments));	-- make name then add to table&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ P R O P _ C A T &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Adds a category to z.prop_cats_t using names from the configuration file with additional text if any.&lt;br /&gt;
&lt;br /&gt;
foreign_lang_source and foreign_lang_source_2 keys have a language code appended to them so that multiple languages&lt;br /&gt;
may be categorized but multiples of the same language are not categorized.&lt;br /&gt;
&lt;br /&gt;
added_prop_cats is a table declared in page scope variables above&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local added_prop_cats = {};														-- list of property categories that have been added to z.prop_cats_t&lt;br /&gt;
&lt;br /&gt;
local function add_prop_cat (key, arguments, key_modifier)&lt;br /&gt;
	local key_modified = key .. ((key_modifier and key_modifier) or &amp;#039;&amp;#039;);		-- modify &amp;lt;key&amp;gt; with &amp;lt;key_modifier&amp;gt; if present and not nil&lt;br /&gt;
	&lt;br /&gt;
	if not added_prop_cats [key_modified] then&lt;br /&gt;
		added_prop_cats [key_modified] = true;									-- note that we&amp;#039;ve added this category&lt;br /&gt;
		table.insert (z.prop_cats_t, substitute (cfg.prop_cats [key], arguments));	-- make name then add to table&lt;br /&gt;
		table.insert (z.prop_keys_t, &amp;#039;cs1-prop-&amp;#039; .. key);						-- convert key to class for use in the citation&amp;#039;s &amp;lt;cite&amp;gt; tag&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S A F E _ F O R _ I T A L I C S &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Protects a string that will be wrapped in wiki italic markup &amp;#039;&amp;#039; ... &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Note: We cannot use &amp;lt;i&amp;gt; for italics, as the expected behavior for italics specified by &amp;#039;&amp;#039;...&amp;#039;&amp;#039; in the title is that&lt;br /&gt;
they will be inverted (i.e. unitalicized) in the resulting references.  In addition, &amp;lt;i&amp;gt; and &amp;#039;&amp;#039; tend to interact&lt;br /&gt;
poorly under Mediawiki&amp;#039;s HTML tidy.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function safe_for_italics (str)&lt;br /&gt;
	if not is_set (str) then return str end&lt;br /&gt;
&lt;br /&gt;
	if str:sub (1, 1) == &amp;quot;&amp;#039;&amp;quot; then str = &amp;quot;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot; .. str; end&lt;br /&gt;
	if str:sub (-1, -1) == &amp;quot;&amp;#039;&amp;quot; then str = str .. &amp;quot;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;; end&lt;br /&gt;
	&lt;br /&gt;
	return str:gsub (&amp;#039;\n&amp;#039;, &amp;#039; &amp;#039;);												-- Remove newlines as they break italics.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; W R A P _ S T Y L E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Applies styling to various parameters.  Supplied string is wrapped using a message_list configuration taking one&lt;br /&gt;
argument; protects italic styled parameters.  Additional text taken from citation_config.presentation - the reason&lt;br /&gt;
this function is similar to but separate from wrap_msg().&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function wrap_style (key, str)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	elseif in_array (key, {&amp;#039;italic-title&amp;#039;, &amp;#039;trans-italic-title&amp;#039;}) then&lt;br /&gt;
		str = safe_for_italics (str);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return substitute (cfg.presentation[key], {str});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ S E P _ L I S T &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
make a separated list of items using provided separators.&lt;br /&gt;
	&amp;lt;sep_list&amp;gt; - typically &amp;#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;&amp;#039;&lt;br /&gt;
	&amp;lt;sep_list_pair&amp;gt; - typically &amp;#039;&amp;lt;space&amp;gt;and&amp;lt;space&amp;gt;&amp;#039;&lt;br /&gt;
	&amp;lt;sep_list_end&amp;gt; - typically &amp;#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;and&amp;lt;space&amp;gt;&amp;#039; or &amp;#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;&amp;amp;&amp;lt;space&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
defaults to cfg.presentation[&amp;#039;sep_list&amp;#039;], cfg.presentation[&amp;#039;sep_list_pair&amp;#039;], and cfg.presentation[&amp;#039;sep_list_end&amp;#039;]&lt;br /&gt;
if &amp;lt;sep_list_end&amp;gt; is specified, &amp;lt;sep_list&amp;gt; and &amp;lt;sep_list_pair&amp;gt; must also be supplied&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_sep_list (count, list_seq, sep_list, sep_list_pair, sep_list_end)&lt;br /&gt;
	local list = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if not sep_list then														-- set the defaults&lt;br /&gt;
		sep_list = cfg.presentation[&amp;#039;sep_list&amp;#039;];&lt;br /&gt;
		sep_list_pair = cfg.presentation[&amp;#039;sep_list_pair&amp;#039;];&lt;br /&gt;
		sep_list_end = cfg.presentation[&amp;#039;sep_list_end&amp;#039;];&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if 2 &amp;gt;= count then&lt;br /&gt;
		list = table.concat (list_seq, sep_list_pair);							-- insert separator between two items; returns list_seq[1] then only one item&lt;br /&gt;
	elseif 2 &amp;lt; count then&lt;br /&gt;
		list = table.concat (list_seq, sep_list, 1, count - 1);					-- concatenate all but last item with plain list separator&lt;br /&gt;
		list = table.concat ({list, list_seq[count]}, sep_list_end);			-- concatenate last item onto end of &amp;lt;list&amp;gt; with final separator&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E L E C T _ O N E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Chooses one matching parameter from a list of parameters to consider.  The list of parameters to consider is just&lt;br /&gt;
names.  For parameters that may be enumerated, the position of the numerator in the parameter name is identified&lt;br /&gt;
by the &amp;#039;#&amp;#039; so |author-last1= and |author1-last= are represented as &amp;#039;author-last#&amp;#039; and &amp;#039;author#-last&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Because enumerated parameter |&amp;lt;param&amp;gt;1= is an alias of |&amp;lt;param&amp;gt;= we must test for both possibilities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generates an error if more than one match is present.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function select_one (args, aliases_list, error_condition, index)&lt;br /&gt;
	local value = nil;															-- the value assigned to the selected parameter&lt;br /&gt;
	local selected = &amp;#039;&amp;#039;;														-- the name of the parameter we have chosen&lt;br /&gt;
	local error_list = {};&lt;br /&gt;
&lt;br /&gt;
	if index ~= nil then index = tostring(index); end&lt;br /&gt;
&lt;br /&gt;
	for _, alias in ipairs (aliases_list) do									-- for each alias in the aliases list&lt;br /&gt;
		if alias:match (&amp;#039;#&amp;#039;) then												-- if this alias can be enumerated&lt;br /&gt;
			if &amp;#039;1&amp;#039; == index then												-- when index is 1 test for enumerated and non-enumerated aliases&lt;br /&gt;
				value, selected = is_alias_used (args, alias, index, false, value, selected, error_list);	-- first test for non-enumerated alias&lt;br /&gt;
			end&lt;br /&gt;
			value, selected = is_alias_used (args, alias, index, true, value, selected, error_list);	-- test for enumerated alias&lt;br /&gt;
		else&lt;br /&gt;
			value, selected = is_alias_used (args, alias, index, false, value, selected, error_list);	-- test for non-enumerated alias&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if #error_list &amp;gt; 0 and &amp;#039;none&amp;#039; ~= error_condition then						-- for cases where this code is used outside of extract_names()&lt;br /&gt;
		for i, v in ipairs (error_list) do&lt;br /&gt;
			error_list[i] = wrap_style (&amp;#039;parameter&amp;#039;, v);&lt;br /&gt;
		end&lt;br /&gt;
		table.insert (error_list, wrap_style (&amp;#039;parameter&amp;#039;, selected));&lt;br /&gt;
		set_message (error_condition, {make_sep_list (#error_list, error_list)});&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return value, selected;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; R E M O V E _ W I K I _ L I N K &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Gets the display text from a wikilink like [[A|B]] or [[B]] gives B&lt;br /&gt;
&lt;br /&gt;
The str:gsub() returns either A|B froma [[A|B]] or B from [[B]] or B from B (no wikilink markup).&lt;br /&gt;
&lt;br /&gt;
In l(), l:gsub() removes the link and pipe (if they exist); the second :gsub() trims whitespace from the label&lt;br /&gt;
if str was wrapped in wikilink markup.  Presumably, this is because without wikimarkup in str, there is no match&lt;br /&gt;
in the initial gsub, the replacement function l() doesn&amp;#039;t get called.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function remove_wiki_link (str)&lt;br /&gt;
	return (str:gsub (&amp;quot;%[%[([^%[%]]*)%]%]&amp;quot;, function(l)&lt;br /&gt;
		return l:gsub (&amp;quot;^[^|]*|(.*)$&amp;quot;, &amp;quot;%1&amp;quot; ):gsub (&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
	end));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; I S _ W I K I L I N K &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines if str is a wikilink, extracts, and returns the wikilink type, link text, and display text parts.&lt;br /&gt;
If str is a complex wikilink ([[L|D]]):&lt;br /&gt;
	returns wl_type 2 and D and L from [[L|D]];&lt;br /&gt;
if str is a simple wikilink ([[D]])&lt;br /&gt;
	returns wl_type 1 and D from [[D]] and L as empty string;&lt;br /&gt;
if not a wikilink:&lt;br /&gt;
	returns wl_type 0, str as D, and L as empty string.&lt;br /&gt;
&lt;br /&gt;
trims leading and trailing whitespace and pipes from L and D ([[L|]] and [[|D]] are accepted by MediaWiki and&lt;br /&gt;
treated like [[D]]; while [[|D|]] is not accepted by MediaWiki, here, we accept it and return D without the pipes).&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function is_wikilink (str)&lt;br /&gt;
	local D, L&lt;br /&gt;
	local wl_type = 2;															-- assume that str is a complex wikilink [[L|D]]&lt;br /&gt;
&lt;br /&gt;
	if not str:match (&amp;#039;^%[%[[^%]]+%]%]$&amp;#039;) then									-- is str some sort of a wikilink (must have some sort of content)&lt;br /&gt;
		return 0, str, &amp;#039;&amp;#039;;														-- not a wikilink; return wl_type as 0, str as D, and empty string as L&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	L, D = str:match (&amp;#039;^%[%[([^|]+)|([^%]]+)%]%]$&amp;#039;);							-- get L and D from [[L|D]] &lt;br /&gt;
&lt;br /&gt;
	if not is_set (D) then														-- if no separate display&lt;br /&gt;
		D = str:match (&amp;#039;^%[%[([^%]]*)|*%]%]$&amp;#039;);									-- get D from [[D]] or [[D|]]&lt;br /&gt;
		wl_type = 1; &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	D = mw.text.trim (D, &amp;#039;%s|&amp;#039;);												-- trim white space and pipe characters &lt;br /&gt;
	return wl_type, D, L or &amp;#039;&amp;#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S T R I P _ A P O S T R O P H E _ M A R K U P &amp;gt;--------------------------------&lt;br /&gt;
&lt;br /&gt;
Strip wiki italic and bold markup from argument so that it doesn&amp;#039;t contaminate COinS metadata.&lt;br /&gt;
This function strips common patterns of apostrophe markup.  We presume that editors who have taken the time to&lt;br /&gt;
markup a title have, as a result, provided valid markup. When they don&amp;#039;t, some single apostrophes are left behind.&lt;br /&gt;
&lt;br /&gt;
Returns the argument without wiki markup and a number; the number is more-or-less meaningless except as a flag&lt;br /&gt;
to indicate that markup was replaced; do not rely on it as an indicator of how many of any kind of markup was&lt;br /&gt;
removed; returns the argument and nil when no markup removed&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function strip_apostrophe_markup (argument)&lt;br /&gt;
	if not is_set (argument) then&lt;br /&gt;
		return argument, nil;													-- no argument, nothing to do&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nil == argument:find ( &amp;quot;&amp;#039;&amp;#039;&amp;quot;, 1, true ) then								-- Is there at least one double apostrophe?  If not, exit.&lt;br /&gt;
		return argument, nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local flag;&lt;br /&gt;
	while true do&lt;br /&gt;
		if argument:find (&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, 1, true) then								-- bold italic (5)&lt;br /&gt;
			argument, flag = argument:gsub (&amp;quot;%&amp;#039;%&amp;#039;%&amp;#039;%&amp;#039;%&amp;#039;&amp;quot;, &amp;quot;&amp;quot;);					-- remove all instances of it&lt;br /&gt;
		elseif argument:find (&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, 1, true) then								-- italic start and end without content (4)&lt;br /&gt;
			argument, flag=argument:gsub (&amp;quot;%&amp;#039;%&amp;#039;%&amp;#039;%&amp;#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		elseif argument:find (&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, 1, true) then								-- bold (3)&lt;br /&gt;
			argument, flag=argument:gsub (&amp;quot;%&amp;#039;%&amp;#039;%&amp;#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		elseif argument:find (&amp;quot;&amp;#039;&amp;#039;&amp;quot;, 1, true) then								-- italic (2)&lt;br /&gt;
			argument, flag = argument:gsub (&amp;quot;%&amp;#039;%&amp;#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		else&lt;br /&gt;
			break;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return argument, flag;														-- done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local cfg table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T S &amp;gt;----------------------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	add_maint_cat = add_maint_cat,												-- exported functions&lt;br /&gt;
	add_prop_cat = add_prop_cat,&lt;br /&gt;
	error_comment = error_comment,&lt;br /&gt;
	has_accept_as_written = has_accept_as_written,&lt;br /&gt;
	hyphen_to_dash = hyphen_to_dash,&lt;br /&gt;
	in_array = in_array,&lt;br /&gt;
	is_set = is_set,&lt;br /&gt;
	is_wikilink = is_wikilink,&lt;br /&gt;
	make_sep_list = make_sep_list,&lt;br /&gt;
	make_wikilink = make_wikilink,&lt;br /&gt;
	remove_wiki_link = remove_wiki_link,&lt;br /&gt;
	safe_for_italics = safe_for_italics,&lt;br /&gt;
	select_one = select_one,&lt;br /&gt;
	set_message = set_message,&lt;br /&gt;
	set_selected_modules = set_selected_modules,&lt;br /&gt;
	strip_apostrophe_markup = strip_apostrophe_markup,&lt;br /&gt;
	substitute = substitute,&lt;br /&gt;
	wrap_style = wrap_style,&lt;br /&gt;
&lt;br /&gt;
	z = z,																		-- exported table&lt;br /&gt;
	}&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:42:07 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Citation/CS1/Utilities</comments>
		</item>
		<item>
			<title>Module:Citation/CS1/Identifiers</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Identifiers&amp;diff=107&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Identifiers&amp;diff=107&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Citation/CS1/Identifiers&quot; title=&quot;Module:Citation/CS1/Identifiers&quot;&gt;Module:Citation/CS1/Identifiers&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Citation/CS1/Identifiers&quot; class=&quot;extiw&quot; title=&quot;en:Module:Citation/CS1/Identifiers&quot;&gt;en:Module:Citation/CS1/Identifiers&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;a href=&quot;https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Identifiers&amp;amp;diff=107&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:41:46 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Citation/CS1/Identifiers</comments>
		</item>
		<item>
			<title>Module:Citation/CS1/Date validation</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Date_validation&amp;diff=105&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Date_validation&amp;diff=105&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Citation/CS1/Date_validation&quot; title=&quot;Module:Citation/CS1/Date validation&quot;&gt;Module:Citation/CS1/Date validation&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Citation/CS1/Date_validation&quot; class=&quot;extiw&quot; title=&quot;en:Module:Citation/CS1/Date validation&quot;&gt;en:Module:Citation/CS1/Date validation&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;a href=&quot;https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Date_validation&amp;amp;diff=105&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:41:14 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Citation/CS1/Date_validation</comments>
		</item>
		<item>
			<title>Template:&#039;</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:%27&amp;diff=103&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:%27&amp;diff=103&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:%27&quot; class=&quot;mw-redirect&quot; title=&quot;Template:&amp;#039;&quot;&gt;Template:&amp;#039;&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Template:%27&quot; class=&quot;extiw&quot; title=&quot;en:Template:&amp;#039;&quot;&gt;en:Template:&amp;#039;&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#REDIRECT [[Template:Apostrophe]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:44 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:%27</comments>
		</item>
		<item>
			<title>Module:Citation/CS1/Whitelist</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Whitelist&amp;diff=101&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Whitelist&amp;diff=101&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Citation/CS1/Whitelist&quot; title=&quot;Module:Citation/CS1/Whitelist&quot;&gt;Module:Citation/CS1/Whitelist&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Citation/CS1/Whitelist&quot; class=&quot;extiw&quot; title=&quot;en:Module:Citation/CS1/Whitelist&quot;&gt;en:Module:Citation/CS1/Whitelist&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[--------------------------&amp;lt; S U P P O R T E D   P A R A M E T E R S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Because a steady-state signal conveys no useful information, whitelist.basic_arguments[] list items can have three values:&lt;br /&gt;
	true - these parameters are valid and supported parameters&lt;br /&gt;
	false - these parameters are deprecated but still supported&lt;br /&gt;
	tracked - these parameters are valid and supported parameters tracked in an eponymous properties category&lt;br /&gt;
	nil - these parameters are no longer supported. remove entirely&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local basic_arguments_t = {&lt;br /&gt;
	[&amp;#039;accessdate&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;access-date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;agency&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;archivedate&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;archive-date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;archive-format&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;archiveurl&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;archive-url&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;article&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;article-format&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;article-number&amp;#039;] = true,													-- {{cite journal}}, {{cite conference}}; {{citation}} when |journal= has a value&lt;br /&gt;
	[&amp;#039;article-url&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;article-url-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;arxiv&amp;#039;] = true,															-- cite arxiv; here because allowed in cite ... as identifier&lt;br /&gt;
	[&amp;#039;asin&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ASIN&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;asin-tld&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;at&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;authorlink&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;bibcode&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;bibcode-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;biorxiv&amp;#039;] = true,															-- cite biorxiv; here because allowed in cite ... as identifier&lt;br /&gt;
	[&amp;#039;chapter&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;chapter-format&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;chapter-url&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;chapter-url-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;citeseerx&amp;#039;] = false,														-- cite citeseerx; here because allowed in cite ... as identifier&lt;br /&gt;
	[&amp;#039;collaboration&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contribution&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contribution-format&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contribution-url&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contribution-url-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;department&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;df&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;dictionary&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;display-authors&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;display-contributors&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;display-editors&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;display-interviewers&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;display-subjects&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;display-translators&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;doi&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;DOI&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;doi-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;doi-broken-date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;edition&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;eissn&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;EISSN&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;encyclopaedia&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;encyclopedia&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;entry&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;entry-format&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;entry-url&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;entry-url-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;eprint&amp;#039;] = true,															-- cite arxiv; here because allowed in cite ... as identifier&lt;br /&gt;
	[&amp;#039;first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;format&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;hdl&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;HDL&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;hdl-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;host&amp;#039;] = true,															-- unique to certain templates?&lt;br /&gt;
	[&amp;#039;id&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ID&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;institution&amp;#039;] = true,														-- constrain to cite thesis?&lt;br /&gt;
	[&amp;#039;interviewer&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;isbn&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ISBN&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ismn&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ISMN&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;issn&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ISSN&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;issue&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;jfm&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;JFM&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;journal&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;jstor&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;JSTOR&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;jstor-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;lang&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;language&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;lccn&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;LCCN&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;location&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;magazine&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;medium&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;medrxiv&amp;#039;] = true,															-- cite medrxiv; here because allowed in cite ... as identifier&lt;br /&gt;
	[&amp;#039;minutes&amp;#039;] = true,															-- constrain to cite AV media and podcast?&lt;br /&gt;
	[&amp;#039;mode&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;mr&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;MR&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;name-list-style&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;newspaper&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;no-pp&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;no-tracking&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;number&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;oclc&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;OCLC&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ol&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;OL&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ol-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;orig-date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;origyear&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;orig-year&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;osti&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;OSTI&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;osti-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;others&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;p&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;page&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;pages&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;periodical&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;place&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;pmc&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;PMC&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;pmc-embargo-date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;pmid&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;PMID&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;postscript&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;pp&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;publication-date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;publication-place&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;publisher&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;quotation&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;quote&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;quote-page&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;quote-pages&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ref&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;rfc&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;RFC&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;sbn&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;SBN&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;scale&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-article&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-chapter&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-contribution&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-encyclopaedia&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-encyclopedia&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-entry&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-journal&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-magazine&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-newspaper&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-periodical&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-quote&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-section&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-title&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-website&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-work&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;section&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;section-format&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;section-url&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;section-url-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;series&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ssrn&amp;#039;] = true,															-- cite ssrn; these three here because allowed in cite ... as identifier&lt;br /&gt;
	[&amp;#039;SSRN&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ssrn-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;s2cid&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;S2CID&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;s2cid-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;template-doc-demo&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;time&amp;#039;] = true,															-- constrain to cite av media and podcast?&lt;br /&gt;
	[&amp;#039;time-caption&amp;#039;] = true,													-- constrain to cite av media and podcast?&lt;br /&gt;
	[&amp;#039;title&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;title-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;title-note&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-last&amp;#039;] = true,	&lt;br /&gt;
	[&amp;#039;translator-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-article&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-chapter&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-contribution&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-encyclopaedia&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-encyclopedia&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-entry&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-journal&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-magazine&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-newspaper&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-periodical&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-quote&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-section&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-title&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-website&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-work&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;type&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;url&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;URL&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;url-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;url-status&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;vauthors&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;veditors&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;version&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;via&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;volume&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;website&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;work&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;year&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;zbl&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ZBL&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local numbered_arguments_t = {&lt;br /&gt;
	[&amp;#039;author#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-link#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;authorlink#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-mask#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor#-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor#-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor#-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor#-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-link#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor#-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor-mask#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;contributor#-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor#-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor#-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor#-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor#-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-link#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor#-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor-mask#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;editor#-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;host#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer#-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer#-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer#-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer#-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-link#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer#-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer-mask#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;interviewer#-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject#-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject#-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject#-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-link#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject#-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-mask#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject#-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject-surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;subject#-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-link#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-mask#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-mask&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P R E P R I N T   S U P P O R T E D   P A R A M E T E R S &amp;gt;--------------------&lt;br /&gt;
&lt;br /&gt;
Cite arXiv, cite biorxiv, cite citeseerx, cite medrxiv, and cite ssrn are preprint templates that use the limited&lt;br /&gt;
set of parameters defined in the limited_basic_arguments and limited_numbered_arguments tables.  Those lists are&lt;br /&gt;
supplemented with a template-specific list of parameters that are required by the particular template and may be&lt;br /&gt;
exclusive to one of the preprint templates.  Some of these parameters may also be available to the general cs1|2&lt;br /&gt;
templates.&lt;br /&gt;
&lt;br /&gt;
Same conventions for true/false/tracked/nil as above.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local preprint_arguments_t = {&lt;br /&gt;
	arxiv = {&lt;br /&gt;
		[&amp;#039;arxiv&amp;#039;] = true,														-- cite arxiv and arxiv identifiers&lt;br /&gt;
		[&amp;#039;class&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;eprint&amp;#039;] = true,														-- cite arxiv and arxiv identifiers&lt;br /&gt;
		},&lt;br /&gt;
	biorxiv = {&lt;br /&gt;
		[&amp;#039;biorxiv&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	citeseerx = {&lt;br /&gt;
		[&amp;#039;citeseerx&amp;#039;] = false,&lt;br /&gt;
		},&lt;br /&gt;
	medrxiv = {&lt;br /&gt;
		[&amp;#039;medrxiv&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	ssrn = {&lt;br /&gt;
		[&amp;#039;ssrn&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;SSRN&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;ssrn-access&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L I M I T E D   S U P P O R T E D   P A R A M E T E R S &amp;gt;----------------------&lt;br /&gt;
&lt;br /&gt;
cite arxiv, cite biorxiv, cite citeseerx, cite medrxiv, and cite ssrn templates are preprint templates so are&lt;br /&gt;
allowed only a limited subset of parameters allowed to all other cs1|2 templates.  The limited subset is defined&lt;br /&gt;
here.&lt;br /&gt;
&lt;br /&gt;
This list of parameters also used by {{cite document}}&lt;br /&gt;
&lt;br /&gt;
Same conventions for true/false/tracked/nil as above.&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local limited_basic_arguments_t = {&lt;br /&gt;
	[&amp;#039;at&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;authorlink&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;collaboration&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;df&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;display-authors&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;language&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;mode&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;name-list-style&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;no-tracking&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;p&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;page&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;pages&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;postscript&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;pp&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;quotation&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;quote&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ref&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;template-doc-demo&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;title&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-title&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;vauthors&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;year&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local limited_numbered_arguments_t = {&lt;br /&gt;
	[&amp;#039;author#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-link#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;authorlink#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author-mask#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;author#-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;surname#&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; U N I Q U E _ A R G U M E N T S &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Some templates have unique parameters.  Those templates and their unique parameters are listed here. Keys in this&lt;br /&gt;
table are the template&amp;#039;s CitationClass parameter value&lt;br /&gt;
&lt;br /&gt;
Same conventions for true/false/tracked/nil as above.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local unique_arguments_t = {&lt;br /&gt;
	[&amp;#039;audio-visual&amp;#039;] = {&lt;br /&gt;
		[&amp;#039;people&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript-url&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	conference = {&lt;br /&gt;
		[&amp;#039;book-title&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference-url&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;event&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	episode = {&lt;br /&gt;
		[&amp;#039;airdate&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;air-date&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;credits&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;episode-link&amp;#039;] = true,												-- alias of |title-link=&lt;br /&gt;
		[&amp;#039;network&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;people&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;season&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-link&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-no&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-number&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;station&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript-url&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	mailinglist = {&lt;br /&gt;
		[&amp;#039;mailing-list&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	map = {&lt;br /&gt;
		[&amp;#039;cartography&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;inset&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;map&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;map-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;map-url&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;map-url-access&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;script-map&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sections&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sheet&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sheets&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;trans-map&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	newsgroup = {&lt;br /&gt;
		[&amp;#039;message-id&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;newsgroup&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	report = {&lt;br /&gt;
		[&amp;#039;docket&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	serial = {&lt;br /&gt;
		[&amp;#039;airdate&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;air-date&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;credits&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;episode&amp;#039;] = true,														-- cite serial only TODO: make available to cite episode?&lt;br /&gt;
		[&amp;#039;episode-link&amp;#039;] = true,												-- alias of |title-link=&lt;br /&gt;
		[&amp;#039;network&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;people&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-link&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;station&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	speech = {&lt;br /&gt;
		[&amp;#039;conference&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference-url&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;event&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	thesis = {&lt;br /&gt;
		[&amp;#039;degree&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;docket&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C I T E _ D O C U M E N T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Special case for cite document.  This template takes the limited basic and limited enumerated parameters plus&lt;br /&gt;
others that are apply only to standalone published sources that cannot be cited any other way; no url, book,&lt;br /&gt;
periodical, etc parameters; limited support for name lists and named identifiers.&lt;br /&gt;
&lt;br /&gt;
when validating parameters in {{cite document}} templates, the basic and &lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local document_arguments_t = {&lt;br /&gt;
	[&amp;#039;bibcode&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;bibcode-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;doi&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;DOI&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;doi-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;doi-broken-date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;hdl&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;HDL&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;hdl-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;id&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ID&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;jfm&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;JFM&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;lang&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;location&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;mr&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;MR&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;no-pp&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;orig-date&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;origyear&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;orig-year&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;osti&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;OSTI&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;osti-access&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;place&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;publisher&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;quote-page&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;quote-pages&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-quote&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;script-title&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;title-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-mask&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;trans-quote&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;type&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;zbl&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ZBL&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local document_numbered_arguments_t = {&lt;br /&gt;
	[&amp;#039;translator#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-first#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-first&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-given#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-given&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-last#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-last&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-surname#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-surname&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-link#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-link&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator-mask#&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;translator#-mask&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L I S T _ C O M B I N E &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
makes one table from a list of tables.  &amp;lt;lists_t&amp;gt; is a sequence of tables to be combined&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function list_combine (lists_t)&lt;br /&gt;
	local out_t = {};&lt;br /&gt;
&lt;br /&gt;
	for _, list_t in ipairs (lists_t) do										-- for each list in &amp;lt;lists_t&amp;gt;&lt;br /&gt;
		for k, v in pairs (list_t) do											-- extract each k/v pair&lt;br /&gt;
			out_t[k] = v;														-- add to &amp;lt;out_t&amp;gt;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out_t;																-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; T E M P L A T E _ L I S T _ G E T &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
gets a list of the templates from table t&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function template_list_get (t)&lt;br /&gt;
	local out_t = {};															-- a table for output&lt;br /&gt;
	for k, _ in pairs (t) do													-- spin through the table and collect the keys&lt;br /&gt;
		table.insert (out_t, k)													-- add each key to the output table&lt;br /&gt;
	end&lt;br /&gt;
	return out_t;																-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   T A B L E S &amp;gt;------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	preprint_arguments_t = preprint_arguments_t,&lt;br /&gt;
	preprint_template_list_t = template_list_get (preprint_arguments_t),		-- make a template list from preprint_arguments{} table&lt;br /&gt;
	unique_arguments_t = unique_arguments_t,&lt;br /&gt;
	unique_param_template_list_t = template_list_get (unique_arguments_t),		-- make a template list from unique_arguments{} table&lt;br /&gt;
	&lt;br /&gt;
	document_parameters_t = list_combine ({limited_basic_arguments_t, limited_numbered_arguments_t, document_arguments_t, document_numbered_arguments_t});&lt;br /&gt;
	common_parameters_t = list_combine ({basic_arguments_t, numbered_arguments_t});&lt;br /&gt;
	limited_parameters_t = list_combine ({limited_basic_arguments_t, limited_numbered_arguments_t});&lt;br /&gt;
	};&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:44 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Citation/CS1/Whitelist</comments>
		</item>
		<item>
			<title>Module:Documentation/config</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Documentation/config&amp;diff=99&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Documentation/config&amp;diff=99&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&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; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Documentation/config&quot; class=&quot;extiw&quot; title=&quot;en:Module:Documentation/config&quot;&gt;en:Module:Documentation/config&lt;/a&gt; (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>Fri, 09 Oct 2026 19:40:02 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Documentation/config</comments>
		</item>
		<item>
			<title>Module:Documentation</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Documentation&amp;diff=97&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Documentation&amp;diff=97&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&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; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Documentation&quot; class=&quot;extiw&quot; title=&quot;en:Module:Documentation&quot;&gt;en:Module:Documentation&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;a href=&quot;https://test.eciton.co.uk/index.php?title=Module:Documentation&amp;amp;diff=97&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:02 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Documentation</comments>
		</item>
		<item>
			<title>Template:Pipe</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Pipe&amp;diff=95&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Pipe&amp;diff=95&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Pipe&quot; title=&quot;Template:Pipe&quot;&gt;Template:Pipe&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Template:Pipe&quot; class=&quot;extiw&quot; title=&quot;en:Template:Pipe&quot;&gt;en:Template:Pipe&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;amp;#124;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Pipe</comments>
		</item>
		<item>
			<title>Template:Pp</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Pp&amp;diff=93&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Pp&amp;diff=93&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Pp&quot; class=&quot;mw-redirect&quot; title=&quot;Template:Pp&quot;&gt;Template:Pp&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Template:Pp&quot; class=&quot;extiw&quot; title=&quot;en:Template:Pp&quot;&gt;en:Template:Pp&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;#REDIRECT [[Template:Protected page]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
{{R from template shortcut}}&lt;br /&gt;
}}&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Pp</comments>
		</item>
		<item>
			<title>Template:Ombox</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Ombox&amp;diff=91&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Ombox&amp;diff=91&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Ombox&quot; title=&quot;Template:Ombox&quot;&gt;Template:Ombox&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Template:Ombox&quot; class=&quot;extiw&quot; title=&quot;en:Template:Ombox&quot;&gt;en:Template:Ombox&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{#invoke:Message box|ombox}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Ombox</comments>
		</item>
		<item>
			<title>Module:Protection banner</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Protection_banner&amp;diff=89&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Protection_banner&amp;diff=89&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Protection_banner&quot; class=&quot;mw-redirect&quot; title=&quot;Module:Protection banner&quot;&gt;Module:Protection banner&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Protection_banner&quot; class=&quot;extiw&quot; title=&quot;en:Module:Protection banner&quot;&gt;en:Module:Protection banner&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;return require [[Module:Protected page]]&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Protection_banner</comments>
		</item>
		<item>
			<title>Module:File link</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:File_link&amp;diff=87&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:File_link&amp;diff=87&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:File_link&quot; title=&quot;Module:File link&quot;&gt;Module:File link&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:File_link&quot; class=&quot;extiw&quot; title=&quot;en:Module:File link&quot;&gt;en:Module:File link&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module provides a library for formatting file wikilinks.&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local checkType = require(&amp;#039;libraryUtil&amp;#039;).checkType&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	checkType(&amp;#039;_main&amp;#039;, 1, args, &amp;#039;table&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our&lt;br /&gt;
	-- own function to get the right error level.&lt;br /&gt;
	local function checkArg(key, val, level)&lt;br /&gt;
		if type(val) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&amp;quot;type error in &amp;#039;%s&amp;#039; parameter of &amp;#039;_main&amp;#039; (expected string, got %s)&amp;quot;,&lt;br /&gt;
				key, type(val)&lt;br /&gt;
			), level)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret = {}&lt;br /&gt;
&lt;br /&gt;
	-- Adds a positional parameter to the buffer.&lt;br /&gt;
	local function addPositional(key)&lt;br /&gt;
		local val = args[key]&lt;br /&gt;
		if not val then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		checkArg(key, val, 4)&lt;br /&gt;
		ret[#ret + 1] = val&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Adds a named parameter to the buffer. We assume that the parameter name&lt;br /&gt;
	-- is the same as the argument key.&lt;br /&gt;
	local function addNamed(key)&lt;br /&gt;
		local val = args[key]&lt;br /&gt;
		if not val then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		checkArg(key, val, 4)&lt;br /&gt;
		ret[#ret + 1] = key .. &amp;#039;=&amp;#039; .. val&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Filename&lt;br /&gt;
	checkArg(&amp;#039;file&amp;#039;, args.file, 3)&lt;br /&gt;
	ret[#ret + 1] = &amp;#039;File:&amp;#039; .. args.file&lt;br /&gt;
&lt;br /&gt;
	-- Format&lt;br /&gt;
	if args.format then&lt;br /&gt;
		checkArg(&amp;#039;format&amp;#039;, args.format)&lt;br /&gt;
		if args.formatfile then&lt;br /&gt;
			checkArg(&amp;#039;formatfile&amp;#039;, args.formatfile)&lt;br /&gt;
			ret[#ret + 1] = args.format .. &amp;#039;=&amp;#039; .. args.formatfile&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = args.format&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Border&lt;br /&gt;
	if yesno(args.border) then&lt;br /&gt;
		ret[#ret + 1] = &amp;#039;border&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	addPositional(&amp;#039;location&amp;#039;)&lt;br /&gt;
	addPositional(&amp;#039;alignment&amp;#039;)&lt;br /&gt;
	addPositional(&amp;#039;size&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;upright&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;link&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;alt&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;page&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;class&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;lang&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;start&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;end&amp;#039;)&lt;br /&gt;
	addNamed(&amp;#039;thumbtime&amp;#039;)&lt;br /&gt;
	addPositional(&amp;#039;caption&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	return string.format(&amp;#039;[[%s]]&amp;#039;, table.concat(ret, &amp;#039;|&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local origArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = &amp;#039;Template:File link&amp;#039;&lt;br /&gt;
	})&lt;br /&gt;
	if not origArgs.file then&lt;br /&gt;
		error(&amp;quot;&amp;#039;file&amp;#039; parameter missing from [[Template:File link]]&amp;quot;, 0)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Copy the arguments that were passed to a new table to avoid looking up&lt;br /&gt;
	-- every possible parameter in the frame object.&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for k, v in pairs(origArgs) do&lt;br /&gt;
		-- Make _BLANK a special argument to add a blank parameter. For use in&lt;br /&gt;
		-- conditional templates etc. it is useful for blank arguments to be&lt;br /&gt;
		-- ignored, but we still need a way to specify them so that we can do&lt;br /&gt;
		-- things like [[File:Example.png|link=]].&lt;br /&gt;
		if v == &amp;#039;_BLANK&amp;#039; then&lt;br /&gt;
			v = &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:File_link</comments>
		</item>
		<item>
			<title>Module:Effective protection level</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Effective_protection_level&amp;diff=85&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Effective_protection_level&amp;diff=85&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&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; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Effective_protection_level&quot; class=&quot;extiw&quot; title=&quot;en:Module:Effective protection level&quot;&gt;en:Module:Effective protection level&lt;/a&gt; (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>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Effective_protection_level</comments>
		</item>
		<item>
			<title>Module:Effective protection expiry</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Effective_protection_expiry&amp;diff=83&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Effective_protection_expiry&amp;diff=83&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Effective_protection_expiry&quot; title=&quot;Module:Effective protection expiry&quot;&gt;Module:Effective protection expiry&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Effective_protection_expiry&quot; class=&quot;extiw&quot; title=&quot;en:Module:Effective protection expiry&quot;&gt;en:Module:Effective protection expiry&lt;/a&gt; (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;
&lt;br /&gt;
-- Returns the expiry of a restriction of an action on a given title, or unknown if it cannot be known.&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 stabilitySettings = mw.ext.FlaggedRevs.getStabilitySettings(title)&lt;br /&gt;
		return stabilitySettings and stabilitySettings.expiry or &amp;#039;unknown&amp;#039;&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; then&lt;br /&gt;
		error( &amp;#039;First parameter must be one of edit, move, create, upload, autoreview&amp;#039;, 2 )&lt;br /&gt;
	end&lt;br /&gt;
	local rawExpiry = mw.getCurrentFrame():callParserFunction(&amp;#039;PROTECTIONEXPIRY&amp;#039;, action, pagename)&lt;br /&gt;
	if rawExpiry == &amp;#039;infinity&amp;#039; then&lt;br /&gt;
		return &amp;#039;infinity&amp;#039;&lt;br /&gt;
	elseif rawExpiry == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;unknown&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		local year, month, day, hour, minute, second = rawExpiry:match(&lt;br /&gt;
			&amp;#039;^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
		if year then&lt;br /&gt;
			return string.format(&lt;br /&gt;
				&amp;#039;%s-%s-%sT%s:%s:%s&amp;#039;,&lt;br /&gt;
				year, month, day, hour, minute, second&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;#039;internal error in Module:Effective protection expiry; malformed expiry timestamp&amp;#039;)&lt;br /&gt;
		end&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>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Effective_protection_expiry</comments>
		</item>
		<item>
			<title>Template:Namespace detect</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Namespace_detect&amp;diff=81&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Namespace_detect&amp;diff=81&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Namespace_detect&quot; title=&quot;Template:Namespace detect&quot;&gt;Template:Namespace detect&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Template:Namespace_detect&quot; class=&quot;extiw&quot; title=&quot;en:Template:Namespace detect&quot;&gt;en:Template:Namespace detect&lt;/a&gt; (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;#invoke:Namespace detect|main}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Namespace_detect</comments>
		</item>
		<item>
			<title>Template:Plain link</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Plain_link&amp;diff=79&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Plain_link&amp;diff=79&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Plain_link&quot; title=&quot;Template:Plain link&quot;&gt;Template:Plain link&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Template:Plain_link&quot; class=&quot;extiw&quot; title=&quot;en:Template:Plain link&quot;&gt;en:Template:Plain link&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot; {{SAFESUBST:&amp;lt;noinclude /&amp;gt;#if:{{{title|}}}|title=&amp;quot;{{{title}}}&amp;quot;}}&amp;gt;{{SAFESUBST:&amp;lt;noinclude /&amp;gt;#if:{{{2|{{{NAME|{{{name|}}}}}}}}}&lt;br /&gt;
 |[{{{1|{{{URL|{{{url}}}}}}}}} {{{2|{{{NAME|{{{name|}}}}}}}}}]&lt;br /&gt;
 |[{{{1|{{{URL|{{{url}}}}}}}}}]&lt;br /&gt;
}}&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>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Plain_link</comments>
		</item>
		<item>
			<title>Module:String</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:String&amp;diff=77&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:String&amp;diff=77&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&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; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:String&quot; class=&quot;extiw&quot; title=&quot;en:Module:String&quot;&gt;en:Module:String&lt;/a&gt; (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>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:String</comments>
		</item>
		<item>
			<title>Module:Check for unknown parameters</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Check_for_unknown_parameters&amp;diff=75&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Check_for_unknown_parameters&amp;diff=75&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&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; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Check_for_unknown_parameters&quot; class=&quot;extiw&quot; title=&quot;en:Module:Check for unknown parameters&quot;&gt;en:Module:Check for unknown parameters&lt;/a&gt; (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>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Check_for_unknown_parameters</comments>
		</item>
		<item>
			<title>Module:Namespace detect/config</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Namespace_detect/config&amp;diff=73&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Namespace_detect/config&amp;diff=73&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Namespace_detect/config&quot; title=&quot;Module:Namespace detect/config&quot;&gt;Module:Namespace detect/config&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Namespace_detect/config&quot; class=&quot;extiw&quot; title=&quot;en:Module:Namespace detect/config&quot;&gt;en:Module:Namespace detect/config&lt;/a&gt; (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;
--                    Namespace detect configuration data                     --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module stores configuration data for Module:Namespace detect. Here    --&lt;br /&gt;
-- you can localise the module to your wiki&amp;#039;s language.                       --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To activate a configuration item, you need to uncomment it. This means     --&lt;br /&gt;
-- that you need to remove the text &amp;quot;-- &amp;quot; at the start of the line.           --&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;
--                              Parameter names                               --&lt;br /&gt;
-- These configuration items specify custom parameter names. Values added     --&lt;br /&gt;
-- here will work in addition to the default English parameter names.         --&lt;br /&gt;
-- To add one extra name, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.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;
-- cfg.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;
---- This parameter displays content for the main namespace:&lt;br /&gt;
-- cfg.main = &amp;#039;main&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter displays in talk namespaces:&lt;br /&gt;
-- cfg.talk = &amp;#039;talk&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter displays content for &amp;quot;other&amp;quot; namespaces (namespaces for which&lt;br /&gt;
---- parameters have not been specified):&lt;br /&gt;
-- cfg.other = &amp;#039;other&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter makes talk pages behave as though they are the corresponding&lt;br /&gt;
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].&lt;br /&gt;
---- Edit that module to change the default values of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc.&lt;br /&gt;
-- cfg.subjectns = &amp;#039;subjectns&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter sets a demonstration namespace:&lt;br /&gt;
-- cfg.demospace = &amp;#039;demospace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter sets a specific page to compare:&lt;br /&gt;
cfg.demopage = &amp;#039;page&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           Table configuration                              --&lt;br /&gt;
-- These configuration items allow customisation of the &amp;quot;table&amp;quot; function,     --&lt;br /&gt;
-- used to generate a table of possible parameters in the module              --&lt;br /&gt;
-- documentation.                                                             --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---- The header for the namespace column in the wikitable containing the list of&lt;br /&gt;
---- possible subject-space parameters.&lt;br /&gt;
-- cfg.wikitableNamespaceHeader = &amp;#039;Namespace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- The header for the wikitable containing the list of possible subject-space&lt;br /&gt;
---- parameters.&lt;br /&gt;
-- cfg.wikitableAliasesHeader = &amp;#039;Aliases&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                        End of 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>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Namespace_detect/config</comments>
		</item>
		<item>
			<title>Module:Namespace detect/data</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Namespace_detect/data&amp;diff=71&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Namespace_detect/data&amp;diff=71&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Namespace_detect/data&quot; title=&quot;Module:Namespace detect/data&quot;&gt;Module:Namespace detect/data&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Namespace_detect/data&quot; class=&quot;extiw&quot; title=&quot;en:Module:Namespace detect/data&quot;&gt;en:Module:Namespace detect/data&lt;/a&gt; (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;
--                          Namespace detect data                             --&lt;br /&gt;
-- This module holds data for [[Module:Namespace detect]] to be loaded per    --&lt;br /&gt;
-- page, rather than per #invoke, for performance reasons.                    --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = require(&amp;#039;Module:Namespace detect/config&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local function addKey(t, key, defaultKey)&lt;br /&gt;
	if key ~= defaultKey then&lt;br /&gt;
		t[#t + 1] = key&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get a table of parameters to query for each default parameter name.&lt;br /&gt;
-- This allows wikis to customise parameter names in the cfg table while&lt;br /&gt;
-- ensuring that default parameter names will always work. The cfg table&lt;br /&gt;
-- values can be added as a string, or as an array of strings.&lt;br /&gt;
&lt;br /&gt;
local defaultKeys = {&lt;br /&gt;
	&amp;#039;main&amp;#039;,&lt;br /&gt;
	&amp;#039;talk&amp;#039;,&lt;br /&gt;
	&amp;#039;other&amp;#039;,&lt;br /&gt;
	&amp;#039;subjectns&amp;#039;,&lt;br /&gt;
	&amp;#039;demospace&amp;#039;,&lt;br /&gt;
	&amp;#039;demopage&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local argKeys = {}&lt;br /&gt;
for i, defaultKey in ipairs(defaultKeys) do&lt;br /&gt;
	argKeys[defaultKey] = {defaultKey}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for defaultKey, t in pairs(argKeys) do&lt;br /&gt;
	local cfgValue = cfg[defaultKey]&lt;br /&gt;
	local cfgValueType = type(cfgValue)&lt;br /&gt;
	if cfgValueType == &amp;#039;string&amp;#039; then&lt;br /&gt;
		addKey(t, cfgValue, defaultKey)&lt;br /&gt;
	elseif cfgValueType == &amp;#039;table&amp;#039; then&lt;br /&gt;
		for i, key in ipairs(cfgValue) do&lt;br /&gt;
			addKey(t, key, defaultKey)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	cfg[defaultKey] = nil -- Free the cfg value as we don&amp;#039;t need it any more.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getParamMappings()&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Returns a table of how parameter names map to namespace names. The keys&lt;br /&gt;
	-- are the actual namespace names, in lower case, and the values are the&lt;br /&gt;
	-- possible parameter names for that namespace, also in lower case. The&lt;br /&gt;
	-- table entries are structured like this:&lt;br /&gt;
	-- {&lt;br /&gt;
	--   [&amp;#039;&amp;#039;] = {&amp;#039;main&amp;#039;},&lt;br /&gt;
	--   [&amp;#039;wikipedia&amp;#039;] = {&amp;#039;wikipedia&amp;#039;, &amp;#039;project&amp;#039;, &amp;#039;wp&amp;#039;},&lt;br /&gt;
	--   ...&lt;br /&gt;
	-- }&lt;br /&gt;
	--]]&lt;br /&gt;
	local mappings = {}&lt;br /&gt;
	local mainNsName = mw.site.subjectNamespaces[0].name&lt;br /&gt;
	mainNsName = mw.ustring.lower(mainNsName)&lt;br /&gt;
	mappings[mainNsName] = mw.clone(argKeys.main)&lt;br /&gt;
	mappings[&amp;#039;talk&amp;#039;] = mw.clone(argKeys.talk)&lt;br /&gt;
	for nsid, ns in pairs(mw.site.subjectNamespaces) do&lt;br /&gt;
		if nsid ~= 0 then -- Exclude main namespace.&lt;br /&gt;
			local nsname = mw.ustring.lower(ns.name)&lt;br /&gt;
			local canonicalName = mw.ustring.lower(ns.canonicalName)&lt;br /&gt;
			mappings[nsname] = {nsname}&lt;br /&gt;
			if canonicalName ~= nsname then&lt;br /&gt;
				table.insert(mappings[nsname], canonicalName)&lt;br /&gt;
			end&lt;br /&gt;
			for _, alias in ipairs(ns.aliases) do&lt;br /&gt;
				table.insert(mappings[nsname], mw.ustring.lower(alias))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return mappings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	argKeys = argKeys,&lt;br /&gt;
	cfg = cfg,&lt;br /&gt;
	mappings = getParamMappings()&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:01 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Namespace_detect/data</comments>
		</item>
		<item>
			<title>Module:Namespace detect</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Namespace_detect&amp;diff=69&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Namespace_detect&amp;diff=69&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Namespace_detect&quot; title=&quot;Module:Namespace detect&quot;&gt;Module:Namespace detect&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Namespace_detect&quot; class=&quot;extiw&quot; title=&quot;en:Module:Namespace detect&quot;&gt;en:Module:Namespace detect&lt;/a&gt; (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;
--                                                                            --&lt;br /&gt;
--                            NAMESPACE DETECT                                --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module implements the {{namespace detect}} template in Lua, with a    --&lt;br /&gt;
-- few improvements: all namespaces and all namespace aliases are supported,  --&lt;br /&gt;
-- and namespace names are detected automatically for the local wiki. The     --&lt;br /&gt;
-- module can also use the corresponding subject namespace value if it is     --&lt;br /&gt;
-- used on a talk page. Parameter names can be configured for different wikis --&lt;br /&gt;
-- by altering the values in the &amp;quot;cfg&amp;quot; table in                               --&lt;br /&gt;
-- Module:Namespace detect/config.                                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
local data = mw.loadData(&amp;#039;Module:Namespace detect/data&amp;#039;)&lt;br /&gt;
local argKeys = data.argKeys&lt;br /&gt;
local cfg = data.cfg&lt;br /&gt;
local mappings = data.mappings&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local mArguments -- Lazily initialise Module:Arguments&lt;br /&gt;
local mTableTools -- Lazily initilalise Module:TableTools&lt;br /&gt;
local ustringLower = mw.ustring.lower&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function fetchValue(t1, t2)&lt;br /&gt;
	-- Fetches a value from the table t1 for the first key in array t2 where&lt;br /&gt;
	-- a non-nil value of t1 exists.&lt;br /&gt;
	for i, key in ipairs(t2) do&lt;br /&gt;
		local value = t1[key]&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;
end&lt;br /&gt;
&lt;br /&gt;
local function equalsArrayValue(t, value)&lt;br /&gt;
	-- Returns true if value equals a value in the array t. Otherwise&lt;br /&gt;
	-- returns false.&lt;br /&gt;
	for i, arrayValue in ipairs(t) do&lt;br /&gt;
		if value == arrayValue 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.getPageObject(page)&lt;br /&gt;
	-- Get the page object, passing the function through pcall in case of&lt;br /&gt;
	-- errors, e.g. being over the expensive function count limit.&lt;br /&gt;
	if page then&lt;br /&gt;
		local success, pageObject = pcall(mw.title.new, page)&lt;br /&gt;
		if success then&lt;br /&gt;
			return pageObject&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Provided for backward compatibility with other modules&lt;br /&gt;
function p.getParamMappings()&lt;br /&gt;
	return mappings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getNamespace(args)&lt;br /&gt;
	-- This function gets the namespace name from the page object.&lt;br /&gt;
	local page = fetchValue(args, argKeys.demopage)&lt;br /&gt;
	if page == &amp;#039;&amp;#039; then&lt;br /&gt;
		page = nil&lt;br /&gt;
	end&lt;br /&gt;
	local demospace = fetchValue(args, argKeys.demospace)&lt;br /&gt;
	if demospace == &amp;#039;&amp;#039; then&lt;br /&gt;
		demospace = nil&lt;br /&gt;
	end&lt;br /&gt;
	local subjectns = fetchValue(args, argKeys.subjectns)&lt;br /&gt;
	local ret&lt;br /&gt;
	if demospace then&lt;br /&gt;
		-- Handle &amp;quot;demospace = main&amp;quot; properly.&lt;br /&gt;
		if equalsArrayValue(argKeys.main, ustringLower(demospace)) then&lt;br /&gt;
			ret = mw.site.namespaces[0].name&lt;br /&gt;
		else&lt;br /&gt;
			ret = demospace&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local pageObject = p.getPageObject(page)&lt;br /&gt;
		if pageObject then&lt;br /&gt;
			if pageObject.isTalkPage then&lt;br /&gt;
				-- Get the subject namespace if the option is set,&lt;br /&gt;
				-- otherwise use &amp;quot;talk&amp;quot;.&lt;br /&gt;
				if yesno(subjectns) then&lt;br /&gt;
					ret = mw.site.namespaces[pageObject.namespace].subject.name&lt;br /&gt;
				else&lt;br /&gt;
					ret = &amp;#039;talk&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				ret = pageObject.nsText&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return nil -- return nil if the page object doesn&amp;#039;t exist.&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret:gsub(&amp;#039;_&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
	return ustringLower(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	-- Check the parameters stored in the mappings table for any matches.&lt;br /&gt;
	local namespace = getNamespace(args) or &amp;#039;other&amp;#039; -- &amp;quot;other&amp;quot; avoids nil table keys&lt;br /&gt;
	local params = mappings[namespace] or {}&lt;br /&gt;
	local ret = fetchValue(args, params)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- If there were no matches, return parameters for other namespaces.&lt;br /&gt;
	-- This happens if there was no text specified for the namespace that&lt;br /&gt;
	-- was detected or if the demospace parameter is not a valid&lt;br /&gt;
	-- namespace. Note that the parameter for the detected namespace must be&lt;br /&gt;
	-- completely absent for this to happen, not merely blank.&lt;br /&gt;
	--]]&lt;br /&gt;
	if ret == nil then&lt;br /&gt;
		ret = fetchValue(args, argKeys.other)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	mArguments = require(&amp;#039;Module:Arguments&amp;#039;)&lt;br /&gt;
	local args = mArguments.getArgs(frame, {removeBlanks = false})&lt;br /&gt;
	local ret = p._main(args)&lt;br /&gt;
	return ret or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.table(frame)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Create a wikitable of all subject namespace parameters, for&lt;br /&gt;
	-- documentation purposes. The talk parameter is optional, in case it&lt;br /&gt;
	-- needs to be excluded in the documentation.&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	-- Load modules and initialise variables.&lt;br /&gt;
	mTableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
	local namespaces = mw.site.namespaces&lt;br /&gt;
	local cfg = data.cfg&lt;br /&gt;
	local useTalk = type(frame) == &amp;#039;table&amp;#039; &lt;br /&gt;
		and type(frame.args) == &amp;#039;table&amp;#039; &lt;br /&gt;
		and yesno(frame.args.talk) -- Whether to use the talk parameter.&lt;br /&gt;
	&lt;br /&gt;
	-- Get the header names.&lt;br /&gt;
	local function checkValue(value, default)&lt;br /&gt;
		if type(value) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			return value&lt;br /&gt;
		else&lt;br /&gt;
			return default&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local nsHeader = checkValue(cfg.wikitableNamespaceHeader, &amp;#039;Namespace&amp;#039;)&lt;br /&gt;
	local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, &amp;#039;Aliases&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- Put the namespaces in order.&lt;br /&gt;
	local mappingsOrdered = {}&lt;br /&gt;
	for nsname, params in pairs(mappings) do&lt;br /&gt;
		if useTalk or nsname ~= &amp;#039;talk&amp;#039; then&lt;br /&gt;
			local nsid = namespaces[nsname].id&lt;br /&gt;
			-- Add 1, as the array must start with 1; nsid 0 would be lost otherwise.&lt;br /&gt;
			nsid = nsid + 1 &lt;br /&gt;
			mappingsOrdered[nsid] = params&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)&lt;br /&gt;
&lt;br /&gt;
	-- Build the table.&lt;br /&gt;
	local ret = &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n! &amp;#039; .. nsHeader&lt;br /&gt;
		.. &amp;#039;\n! &amp;#039; .. aliasesHeader&lt;br /&gt;
	for i, params in ipairs(mappingsOrdered) do&lt;br /&gt;
		for j, param in ipairs(params) do&lt;br /&gt;
			if j == 1 then&lt;br /&gt;
				ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
					.. &amp;#039;\n| &amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
					.. &amp;#039;\n| &amp;#039;&lt;br /&gt;
			elseif j == 2 then&lt;br /&gt;
				ret = ret .. &amp;#039;&amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				ret = ret .. &amp;#039;, &amp;lt;code&amp;gt;&amp;#039; .. param .. &amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. &amp;#039;\n|-&amp;#039;&lt;br /&gt;
		.. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:00 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Namespace_detect</comments>
		</item>
		<item>
			<title>Module:Redirect</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Redirect&amp;diff=67&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Redirect&amp;diff=67&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Redirect&quot; title=&quot;Module:Redirect&quot;&gt;Module:Redirect&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Redirect&quot; class=&quot;extiw&quot; title=&quot;en:Module:Redirect&quot;&gt;en:Module:Redirect&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module provides functions for getting the target of a redirect page.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Gets a mw.title object, using pcall to avoid generating script errors if we&lt;br /&gt;
-- are over the expensive function count limit (among other possible causes).&lt;br /&gt;
local function getTitle(...)&lt;br /&gt;
	local success, titleObj = pcall(mw.title.new, ...)&lt;br /&gt;
	if success then&lt;br /&gt;
		return titleObj&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gets the name of a page that a redirect leads to, or nil if it isn&amp;#039;t a&lt;br /&gt;
-- redirect.&lt;br /&gt;
function p.getTargetFromText(text)&lt;br /&gt;
	local target = string.match(&lt;br /&gt;
		text,&lt;br /&gt;
		&amp;quot;^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]&amp;quot;&lt;br /&gt;
	) or string.match(&lt;br /&gt;
		text,&lt;br /&gt;
		&amp;quot;^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]&amp;quot;&lt;br /&gt;
	)&lt;br /&gt;
	return target and mw.uri.decode(target, &amp;#039;PATH&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gets the target of a redirect. If the page specified is not a redirect,&lt;br /&gt;
-- returns nil.&lt;br /&gt;
function p.getTarget(page, fulltext)&lt;br /&gt;
	-- Get the title object. Both page names and title objects are allowed&lt;br /&gt;
	-- as input.&lt;br /&gt;
	local titleObj&lt;br /&gt;
	if type(page) == &amp;#039;string&amp;#039; or type(page) == &amp;#039;number&amp;#039; then&lt;br /&gt;
		titleObj = getTitle(page)&lt;br /&gt;
	elseif type(page) == &amp;#039;table&amp;#039; and type(page.getContent) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		titleObj = page&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;bad argument #1 to &amp;#039;getTarget&amp;#039;&amp;quot;&lt;br /&gt;
				.. &amp;quot; (string, number, or title object expected, got %s)&amp;quot;,&lt;br /&gt;
			type(page)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	if not titleObj then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local targetTitle = titleObj.redirectTarget&lt;br /&gt;
	if targetTitle then&lt;br /&gt;
		if fulltext then&lt;br /&gt;
			return targetTitle.fullText&lt;br /&gt;
		else&lt;br /&gt;
			return targetTitle.prefixedText&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Given a single page name determines what page it redirects to and returns the&lt;br /&gt;
-- target page name, or the passed page name when not a redirect. The passed&lt;br /&gt;
-- page name can be given as plain text or as a page link.&lt;br /&gt;
--&lt;br /&gt;
-- Returns page name as plain text, or when the bracket parameter is given, as a&lt;br /&gt;
-- page link. Returns an error message when page does not exist or the redirect&lt;br /&gt;
-- target cannot be determined for some reason.&lt;br /&gt;
--]]&lt;br /&gt;
function p.luaMain(rname, bracket, fulltext)&lt;br /&gt;
	if type(rname) ~= &amp;quot;string&amp;quot; or not rname:find(&amp;quot;%S&amp;quot;) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	bracket = bracket and &amp;quot;[[%s]]&amp;quot; or &amp;quot;%s&amp;quot;&lt;br /&gt;
	rname = rname:match(&amp;quot;%[%[(.+)%]%]&amp;quot;) or rname&lt;br /&gt;
	local target = p.getTarget(rname, fulltext)&lt;br /&gt;
	local ret = target or rname&lt;br /&gt;
	ret = getTitle(ret)&lt;br /&gt;
	if ret then&lt;br /&gt;
		if fulltext then&lt;br /&gt;
			ret = ret.fullText&lt;br /&gt;
		else&lt;br /&gt;
			ret = ret.prefixedText&lt;br /&gt;
		end&lt;br /&gt;
		return bracket:format(ret)&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Provides access to the luaMain function from wikitext.&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {frameOnly = true})&lt;br /&gt;
	return p.luaMain(args[1], args.bracket, args.fulltext) or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns true if the specified page is a redirect, and false otherwise.&lt;br /&gt;
function p.luaIsRedirect(page)&lt;br /&gt;
	local titleObj = getTitle(page)&lt;br /&gt;
	if not titleObj then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	if titleObj.isRedirect then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Provides access to the luaIsRedirect function from wikitext, returning &amp;#039;yes&amp;#039;&lt;br /&gt;
-- if the specified page is a redirect, and the blank string otherwise.&lt;br /&gt;
function p.isRedirect(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {frameOnly = true})&lt;br /&gt;
	if p.luaIsRedirect(args[1]) then&lt;br /&gt;
		return &amp;#039;yes&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;
return p&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:00 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Redirect</comments>
		</item>
		<item>
			<title>Module:Message box/configuration</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Message_box/configuration&amp;diff=65&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Message_box/configuration&amp;diff=65&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Message_box/configuration&quot; title=&quot;Module:Message box/configuration&quot;&gt;Module:Message box/configuration&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Message_box/configuration&quot; class=&quot;extiw&quot; title=&quot;en:Module:Message box/configuration&quot;&gt;en:Module:Message box/configuration&lt;/a&gt; (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;
--                          Message box configuration                         --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module contains configuration data for [[Module:Message box]].        --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	ambox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;ambox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;ambox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;ambox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;ambox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;ambox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;ambox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Semi-protection-shackle-keyhole.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;ambox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                     = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		allowBlankParams            = {&amp;#039;talk&amp;#039;, &amp;#039;sect&amp;#039;, &amp;#039;date&amp;#039;, &amp;#039;issue&amp;#039;, &amp;#039;fix&amp;#039;, &amp;#039;subst&amp;#039;, &amp;#039;hidden&amp;#039;},&lt;br /&gt;
		allowSmall                  = true,&lt;br /&gt;
		smallParam                  = &amp;#039;left&amp;#039;,&lt;br /&gt;
		smallClass                  = &amp;#039;mbox-small-left&amp;#039;,&lt;br /&gt;
		substCheck                  = true,&lt;br /&gt;
		classes                     = {&amp;#039;metadata&amp;#039;, &amp;#039;ambox&amp;#039;},&lt;br /&gt;
		imageEmptyCell              = true,&lt;br /&gt;
		imageCheckBlank             = true,&lt;br /&gt;
		imageSmallSize              = &amp;#039;20x20px&amp;#039;,&lt;br /&gt;
		imageCellDiv                = true,&lt;br /&gt;
		useCollapsibleTextFields    = true,&lt;br /&gt;
		imageRightNone              = true,&lt;br /&gt;
		sectionDefault              = &amp;#039;article&amp;#039;,&lt;br /&gt;
		allowMainspaceCategories    = true,&lt;br /&gt;
		templateCategory            = &amp;#039;Article message templates&amp;#039;,&lt;br /&gt;
	        templateCategoryRequireName = true,&lt;br /&gt;
		templateErrorCategory       = &amp;#039;Article message templates with missing parameters&amp;#039;,&lt;br /&gt;
		templateErrorParamsToCheck  = {&amp;#039;issue&amp;#039;, &amp;#039;fix&amp;#039;, &amp;#039;subst&amp;#039;},&lt;br /&gt;
		removalNotice               = &amp;#039;&amp;lt;small&amp;gt;[[Help:Maintenance template removal|Learn how and when to remove this message]]&amp;lt;/small&amp;gt;&amp;#039;,&lt;br /&gt;
		templatestyles              = &amp;#039;Module:Message box/ambox.css&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	cmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;cmbox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;cmbox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;cmbox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;cmbox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;cmbox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;cmbox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Semi-protection-shackle-keyhole.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;cmbox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&amp;#039;cmbox&amp;#039;},&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		templatestyles       = &amp;#039;Module:Message box/cmbox.css&amp;#039;,&lt;br /&gt;
		div_structure        = true,&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	fmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			warning = {&lt;br /&gt;
				class = &amp;#039;fmbox-warning&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			editnotice = {&lt;br /&gt;
				class = &amp;#039;fmbox-editnotice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			system = {&lt;br /&gt;
				class = &amp;#039;fmbox-system&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &amp;#039;system&amp;#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&amp;#039;fmbox&amp;#039;},&lt;br /&gt;
		imageEmptyCell       = false,&lt;br /&gt;
		imageRightNone       = false,&lt;br /&gt;
		templatestyles       = &amp;#039;Module:Message box/fmbox.css&amp;#039;,&lt;br /&gt;
		div_structure        = true,&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	imbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;imbox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;imbox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;imbox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;imbox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;imbox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;imbox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Semi-protection-shackle-keyhole.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			license = {&lt;br /&gt;
				class = &amp;#039;imbox-license licensetpl&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Imbox-license.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			[&amp;quot;license-related&amp;quot;] = {&lt;br /&gt;
				class = &amp;#039;imbox-license&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Imbox-license.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			featured = {&lt;br /&gt;
				class = &amp;#039;imbox-featured&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Cscr-featured.svg&amp;#039;,&lt;br /&gt;
				imageNeedsLink = true&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;imbox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&amp;#039;imbox&amp;#039;},&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		below                = true,&lt;br /&gt;
		templateCategory     = &amp;#039;File message boxes&amp;#039;,&lt;br /&gt;
		templatestyles       = &amp;#039;Module:Message box/imbox.css&amp;#039;,&lt;br /&gt;
		div_structure        = true,&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	ombox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;ombox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;ombox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;ombox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;ombox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;ombox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;ombox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Semi-protection-shackle-keyhole.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;ombox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&amp;#039;ombox&amp;#039;},&lt;br /&gt;
		allowSmall           = true,&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		imageRightNone       = true,&lt;br /&gt;
		templatestyles       = &amp;#039;Module:Message box/ombox.css&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	tmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;tmbox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;tmbox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;tmbox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;tmbox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;tmbox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;tmbox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Semi-protection-shackle-keyhole.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;tmbox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&amp;#039;tmbox&amp;#039;},&lt;br /&gt;
		allowSmall           = true,&lt;br /&gt;
		imageRightNone       = true,&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		templateCategory     = &amp;#039;Talk message boxes&amp;#039;,&lt;br /&gt;
		templatestyles       = &amp;#039;Module:Message box/tmbox.css&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:00 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Message_box/configuration</comments>
		</item>
		<item>
			<title>Module:Message box</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Message_box&amp;diff=63&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Message_box&amp;diff=63&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Message_box&quot; title=&quot;Module:Message box&quot;&gt;Module:Message box&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Message_box&quot; class=&quot;extiw&quot; title=&quot;en:Module:Message box&quot;&gt;en:Module:Message box&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local getArgs&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
local CONFIG_MODULE = &amp;#039;Module:Message box/configuration&amp;#039;&lt;br /&gt;
local DEMOSPACES = {talk = &amp;#039;tmbox&amp;#039;, image = &amp;#039;imbox&amp;#039;, file = &amp;#039;imbox&amp;#039;, category = &amp;#039;cmbox&amp;#039;, article = &amp;#039;ambox&amp;#039;, main = &amp;#039;ambox&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getTitleObject(...)&lt;br /&gt;
	-- Get the title object, passing the function through pcall&lt;br /&gt;
	-- in case we are over the expensive function count limit.&lt;br /&gt;
	local success, title = pcall(mw.title.new, ...)&lt;br /&gt;
	if success then&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function union(t1, t2)&lt;br /&gt;
	-- Returns the union of two arrays.&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for i, v in ipairs(t1) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for i, v in ipairs(t2) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k in pairs(vals) do&lt;br /&gt;
		table.insert(ret, k)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(ret)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArgNums(args, prefix)&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = mw.ustring.match(tostring(k), &amp;#039;^&amp;#039; .. prefix .. &amp;#039;([1-9]%d*)$&amp;#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			table.insert(nums, tonumber(num))&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;
-- Box class definition&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local MessageBox = {}&lt;br /&gt;
MessageBox.__index = MessageBox&lt;br /&gt;
&lt;br /&gt;
function MessageBox.new(boxType, args, cfg)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	local obj = {}&lt;br /&gt;
&lt;br /&gt;
	-- Set the title object and the namespace.&lt;br /&gt;
	obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set the config for our box type.&lt;br /&gt;
	obj.cfg = cfg[boxType]&lt;br /&gt;
	if not obj.cfg then&lt;br /&gt;
		local ns = obj.title.namespace&lt;br /&gt;
		-- boxType is &amp;quot;mbox&amp;quot; or invalid input&lt;br /&gt;
		if args.demospace and args.demospace ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			-- implement demospace parameter of mbox&lt;br /&gt;
			local demospace = string.lower(args.demospace)&lt;br /&gt;
			if DEMOSPACES[demospace] then&lt;br /&gt;
				-- use template from DEMOSPACES&lt;br /&gt;
				obj.cfg = cfg[DEMOSPACES[demospace]]&lt;br /&gt;
			elseif string.find( demospace, &amp;#039;talk&amp;#039; ) then&lt;br /&gt;
				-- demo as a talk page&lt;br /&gt;
				obj.cfg = cfg.tmbox&lt;br /&gt;
			else&lt;br /&gt;
				-- default to ombox&lt;br /&gt;
				obj.cfg = cfg.ombox&lt;br /&gt;
			end&lt;br /&gt;
		elseif ns == 0 then&lt;br /&gt;
			obj.cfg = cfg.ambox -- main namespace&lt;br /&gt;
		elseif ns == 6 then&lt;br /&gt;
			obj.cfg = cfg.imbox -- file namespace&lt;br /&gt;
		elseif ns == 14 then&lt;br /&gt;
			obj.cfg = cfg.cmbox -- category namespace&lt;br /&gt;
		else&lt;br /&gt;
			local nsTable = mw.site.namespaces[ns]&lt;br /&gt;
			if nsTable and nsTable.isTalk then&lt;br /&gt;
				obj.cfg = cfg.tmbox -- any talk namespace&lt;br /&gt;
			else&lt;br /&gt;
				obj.cfg = cfg.ombox -- other namespaces or invalid input&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the arguments, and remove all blank arguments except for the ones&lt;br /&gt;
	-- listed in cfg.allowBlankParams.&lt;br /&gt;
	do&lt;br /&gt;
		local newArgs = {}&lt;br /&gt;
		for k, v in pairs(args) do&lt;br /&gt;
			if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				newArgs[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for i, param in ipairs(obj.cfg.allowBlankParams or {}) do&lt;br /&gt;
			newArgs[param] = args[param]&lt;br /&gt;
		end&lt;br /&gt;
		obj.args = newArgs&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define internal data structure.&lt;br /&gt;
	obj.categories = {}&lt;br /&gt;
	obj.classes = {}&lt;br /&gt;
	-- For lazy loading of [[Module:Category handler]].&lt;br /&gt;
	obj.hasCategories = false&lt;br /&gt;
&lt;br /&gt;
	return setmetatable(obj, MessageBox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addCat(ns, cat, sort)&lt;br /&gt;
	if not cat then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if sort then&lt;br /&gt;
		cat = string.format(&amp;#039;[[Category:%s|%s]]&amp;#039;, cat, sort)&lt;br /&gt;
	else&lt;br /&gt;
		cat = string.format(&amp;#039;[[Category:%s]]&amp;#039;, cat)&lt;br /&gt;
	end&lt;br /&gt;
	self.hasCategories = true&lt;br /&gt;
	self.categories[ns] = self.categories[ns] or {}&lt;br /&gt;
	table.insert(self.categories[ns], cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(self.classes, class)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setParameters()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Get type data.&lt;br /&gt;
	self.type = args.type&lt;br /&gt;
	local typeData = cfg.types[self.type]&lt;br /&gt;
	self.invalidTypeError = cfg.showInvalidTypeError&lt;br /&gt;
		and self.type&lt;br /&gt;
		and not typeData&lt;br /&gt;
	typeData = typeData or cfg.types[cfg.default]&lt;br /&gt;
	self.typeClass = typeData.class&lt;br /&gt;
	self.typeImage = typeData.image&lt;br /&gt;
	self.typeImageNeedsLink = typeData.imageNeedsLink&lt;br /&gt;
&lt;br /&gt;
	-- Find if the box has been wrongly substituted.&lt;br /&gt;
	self.isSubstituted = cfg.substCheck and args.subst == &amp;#039;SUBST&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	-- Find whether we are using a small message box.&lt;br /&gt;
	self.isSmall = cfg.allowSmall and (&lt;br /&gt;
		cfg.smallParam and args.small == cfg.smallParam&lt;br /&gt;
		or not cfg.smallParam and yesno(args.small)&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	-- Set the below row.&lt;br /&gt;
	self.below = cfg.below and args.below&lt;br /&gt;
	&lt;br /&gt;
	-- Add attributes, classes and styles.&lt;br /&gt;
	self.id = args.id&lt;br /&gt;
	self.name = args.name&lt;br /&gt;
	if self.name then&lt;br /&gt;
		self:addClass(&amp;#039;box-&amp;#039; .. string.gsub(self.name,&amp;#039; &amp;#039;,&amp;#039;_&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
	if yesno(args.plainlinks) ~= false then&lt;br /&gt;
		self:addClass(&amp;#039;plainlinks&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if self.below then&lt;br /&gt;
		self:addClass(&amp;#039;mbox-with-below&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	for _, class in ipairs(cfg.classes or {}) do&lt;br /&gt;
		self:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self:addClass(cfg.smallClass or &amp;#039;mbox-small&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	self:addClass(self.typeClass)&lt;br /&gt;
	self:addClass(args.class)&lt;br /&gt;
	self.style = args.style&lt;br /&gt;
	self.attrs = args.attrs&lt;br /&gt;
&lt;br /&gt;
	-- Set text style.&lt;br /&gt;
	self.textstyle = args.textstyle&lt;br /&gt;
&lt;br /&gt;
	-- Set image classes.&lt;br /&gt;
	self.imageRightClass = args.imagerightclass or args.imageclass&lt;br /&gt;
	self.imageLeftClass = args.imageleftclass or args.imageclass&lt;br /&gt;
&lt;br /&gt;
	-- Find if we are on the template page or not. This functionality is only&lt;br /&gt;
	-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory&lt;br /&gt;
	-- and cfg.templateCategoryRequireName are set.&lt;br /&gt;
	self.useCollapsibleTextFields = cfg.useCollapsibleTextFields&lt;br /&gt;
	if self.useCollapsibleTextFields&lt;br /&gt;
		or cfg.templateCategory&lt;br /&gt;
		and cfg.templateCategoryRequireName&lt;br /&gt;
	then&lt;br /&gt;
		if self.name then&lt;br /&gt;
			local templateName = mw.ustring.match(&lt;br /&gt;
				self.name,&lt;br /&gt;
				&amp;#039;^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$&amp;#039;&lt;br /&gt;
			) or self.name&lt;br /&gt;
			templateName = &amp;#039;Template:&amp;#039; .. templateName&lt;br /&gt;
			self.templateTitle = getTitleObject(templateName)&lt;br /&gt;
		end&lt;br /&gt;
		self.isTemplatePage = self.templateTitle&lt;br /&gt;
			and mw.title.equals(self.title, self.templateTitle)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Process data for collapsible text fields. At the moment these are only&lt;br /&gt;
	-- used in {{ambox}}.&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- Get the self.issue value.&lt;br /&gt;
		if self.isSmall and args.smalltext then&lt;br /&gt;
			self.issue = args.smalltext&lt;br /&gt;
		else&lt;br /&gt;
			local sect&lt;br /&gt;
			if args.sect == &amp;#039;&amp;#039; then&lt;br /&gt;
				sect = &amp;#039;This &amp;#039; .. (cfg.sectionDefault or &amp;#039;page&amp;#039;)&lt;br /&gt;
			elseif type(args.sect) == &amp;#039;string&amp;#039; then&lt;br /&gt;
				sect = &amp;#039;This &amp;#039; .. args.sect&lt;br /&gt;
			end&lt;br /&gt;
			local issue = args.issue&lt;br /&gt;
			issue = type(issue) == &amp;#039;string&amp;#039; and issue ~= &amp;#039;&amp;#039; and issue or nil&lt;br /&gt;
			local text = args.text&lt;br /&gt;
			text = type(text) == &amp;#039;string&amp;#039; and text or nil&lt;br /&gt;
			local issues = {}&lt;br /&gt;
			table.insert(issues, sect)&lt;br /&gt;
			table.insert(issues, issue)&lt;br /&gt;
			table.insert(issues, text)&lt;br /&gt;
			self.issue = table.concat(issues, &amp;#039; &amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get the self.talk value.&lt;br /&gt;
		local talk = args.talk&lt;br /&gt;
		-- Show talk links on the template page or template subpages if the talk&lt;br /&gt;
		-- parameter is blank.&lt;br /&gt;
		if talk == &amp;#039;&amp;#039;&lt;br /&gt;
			and self.templateTitle&lt;br /&gt;
			and (&lt;br /&gt;
				mw.title.equals(self.templateTitle, self.title)&lt;br /&gt;
				or self.title:isSubpageOf(self.templateTitle)&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			talk = &amp;#039;#&amp;#039;&lt;br /&gt;
		elseif talk == &amp;#039;&amp;#039; then&lt;br /&gt;
			talk = nil&lt;br /&gt;
		end&lt;br /&gt;
		if talk then&lt;br /&gt;
			-- If the talk value is a talk page, make a link to that page. Else&lt;br /&gt;
			-- assume that it&amp;#039;s a section heading, and make a link to the talk&lt;br /&gt;
			-- page of the current page with that section heading.&lt;br /&gt;
			local talkTitle = getTitleObject(talk)&lt;br /&gt;
			local talkArgIsTalkPage = true&lt;br /&gt;
			if not talkTitle or not talkTitle.isTalkPage then&lt;br /&gt;
				talkArgIsTalkPage = false&lt;br /&gt;
				talkTitle = getTitleObject(&lt;br /&gt;
					self.title.text,&lt;br /&gt;
					mw.site.namespaces[self.title.namespace].talk.id&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
			if talkTitle and talkTitle.exists then&lt;br /&gt;
                local talkText&lt;br /&gt;
                if self.isSmall then&lt;br /&gt;
                    local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. (talk == &amp;#039;#&amp;#039; and &amp;#039;&amp;#039; or &amp;#039;#&amp;#039;) .. talk)&lt;br /&gt;
                    talkText = string.format(&amp;#039;([[%s|talk]])&amp;#039;, talkLink)&lt;br /&gt;
                else&lt;br /&gt;
                    talkText = &amp;#039;Relevant discussion may be found on&amp;#039;&lt;br /&gt;
                    if talkArgIsTalkPage then&lt;br /&gt;
                        talkText = string.format(&lt;br /&gt;
                            &amp;#039;%s [[%s|%s]].&amp;#039;,&lt;br /&gt;
                            talkText,&lt;br /&gt;
                            talk,&lt;br /&gt;
                            talkTitle.prefixedText&lt;br /&gt;
                        )&lt;br /&gt;
                    else&lt;br /&gt;
                        talkText = string.format(&lt;br /&gt;
                            &amp;#039;%s the [[%s&amp;#039; .. (talk == &amp;#039;#&amp;#039; and &amp;#039;&amp;#039; or &amp;#039;#&amp;#039;) .. &amp;#039;%s|talk page]].&amp;#039;,&lt;br /&gt;
                            talkText,&lt;br /&gt;
                            talkTitle.prefixedText,&lt;br /&gt;
                            talk&lt;br /&gt;
                        )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
				self.talk = talkText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get other values.&lt;br /&gt;
		self.fix = args.fix ~= &amp;#039;&amp;#039; and args.fix or nil&lt;br /&gt;
		local date&lt;br /&gt;
		if args.date and args.date ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			date = args.date&lt;br /&gt;
		elseif args.date == &amp;#039;&amp;#039; and self.isTemplatePage then&lt;br /&gt;
			date = lang:formatDate(&amp;#039;F Y&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if date then&lt;br /&gt;
			self.date = string.format(&amp;quot; &amp;lt;span class=&amp;#039;date-container&amp;#039;&amp;gt;&amp;lt;i&amp;gt;(&amp;lt;span class=&amp;#039;date&amp;#039;&amp;gt;%s&amp;lt;/span&amp;gt;)&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;, date)&lt;br /&gt;
		end&lt;br /&gt;
		self.info = args.info&lt;br /&gt;
		if yesno(args.removalnotice) then&lt;br /&gt;
			self.removalNotice = cfg.removalNotice&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the non-collapsible text field. At the moment this is used by all box&lt;br /&gt;
	-- types other than ambox, and also by ambox when small=yes.&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self.text = args.smalltext or args.text&lt;br /&gt;
	else&lt;br /&gt;
		self.text = args.text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- General image settings.&lt;br /&gt;
	self.imageCellDiv = not self.isSmall and cfg.imageCellDiv&lt;br /&gt;
	self.imageEmptyCell = cfg.imageEmptyCell&lt;br /&gt;
&lt;br /&gt;
	-- Left image settings.&lt;br /&gt;
	local imageLeft = self.isSmall and args.smallimage or args.image&lt;br /&gt;
	if cfg.imageCheckBlank and imageLeft ~= &amp;#039;blank&amp;#039; and imageLeft ~= &amp;#039;none&amp;#039;&lt;br /&gt;
		or not cfg.imageCheckBlank and imageLeft ~= &amp;#039;none&amp;#039;&lt;br /&gt;
	then&lt;br /&gt;
		self.imageLeft = imageLeft&lt;br /&gt;
		if not imageLeft then&lt;br /&gt;
			local imageSize = self.isSmall&lt;br /&gt;
				and (cfg.imageSmallSize or &amp;#039;30x30px&amp;#039;)&lt;br /&gt;
				or &amp;#039;40x40px&amp;#039;&lt;br /&gt;
			self.imageLeft = string.format(&amp;#039;[[File:%s|%s%s|alt=]]&amp;#039;, self.typeImage&lt;br /&gt;
				or &amp;#039;Information icon4.svg&amp;#039;, imageSize, self.typeImageNeedsLink and &amp;quot;&amp;quot; or &amp;quot;|link=&amp;quot; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Right image settings.&lt;br /&gt;
	local imageRight = self.isSmall and args.smallimageright or args.imageright&lt;br /&gt;
	if not (cfg.imageRightNone and imageRight == &amp;#039;none&amp;#039;) then&lt;br /&gt;
		self.imageRight = imageRight&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- set templatestyles&lt;br /&gt;
	self.base_templatestyles = cfg.templatestyles&lt;br /&gt;
	self.templatestyles = args.templatestyles&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setMainspaceCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	if not cfg.allowMainspaceCategories then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for _, prefix in ipairs{&amp;#039;cat&amp;#039;, &amp;#039;category&amp;#039;, &amp;#039;all&amp;#039;} do&lt;br /&gt;
		args[prefix .. &amp;#039;1&amp;#039;] = args[prefix]&lt;br /&gt;
		nums = union(nums, getArgNums(args, prefix))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- The following is roughly equivalent to the old {{Ambox/category}}.&lt;br /&gt;
	local date = args.date&lt;br /&gt;
	date = type(date) == &amp;#039;string&amp;#039; and date&lt;br /&gt;
	local preposition = &amp;#039;from&amp;#039;&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		local mainCat = args[&amp;#039;cat&amp;#039; .. tostring(num)]&lt;br /&gt;
			or args[&amp;#039;category&amp;#039; .. tostring(num)]&lt;br /&gt;
		local allCat = args[&amp;#039;all&amp;#039; .. tostring(num)]&lt;br /&gt;
		mainCat = type(mainCat) == &amp;#039;string&amp;#039; and mainCat&lt;br /&gt;
		allCat = type(allCat) == &amp;#039;string&amp;#039; and allCat&lt;br /&gt;
		if mainCat and date and date ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local catTitle = string.format(&amp;#039;%s %s %s&amp;#039;, mainCat, preposition, date)&lt;br /&gt;
			self:addCat(0, catTitle)&lt;br /&gt;
			catTitle = getTitleObject(&amp;#039;Category:&amp;#039; .. catTitle)&lt;br /&gt;
			if not catTitle or not catTitle.exists then&lt;br /&gt;
				self:addCat(0, &amp;#039;Articles with invalid date parameter in template&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif mainCat and (not date or date == &amp;#039;&amp;#039;) then&lt;br /&gt;
			self:addCat(0, mainCat)&lt;br /&gt;
		end&lt;br /&gt;
		if allCat then&lt;br /&gt;
			self:addCat(0, allCat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setTemplateCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Add template categories.&lt;br /&gt;
	if cfg.templateCategory then&lt;br /&gt;
		if cfg.templateCategoryRequireName then&lt;br /&gt;
			if self.isTemplatePage then&lt;br /&gt;
				self:addCat(10, cfg.templateCategory)&lt;br /&gt;
			end&lt;br /&gt;
		elseif not self.title.isSubpage then&lt;br /&gt;
			self:addCat(10, cfg.templateCategory)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add template error categories.&lt;br /&gt;
	if cfg.templateErrorCategory then&lt;br /&gt;
		local templateErrorCategory = cfg.templateErrorCategory&lt;br /&gt;
		local templateCat, templateSort&lt;br /&gt;
		if not self.name and not self.title.isSubpage then&lt;br /&gt;
			templateCat = templateErrorCategory&lt;br /&gt;
		elseif self.isTemplatePage then&lt;br /&gt;
			local paramsToCheck = cfg.templateErrorParamsToCheck or {}&lt;br /&gt;
			local count = 0&lt;br /&gt;
			for i, param in ipairs(paramsToCheck) do&lt;br /&gt;
				if not args[param] then&lt;br /&gt;
					count = count + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if count &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = tostring(count)&lt;br /&gt;
			end&lt;br /&gt;
			if self.categoryNums and #self.categoryNums &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = &amp;#039;C&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addCat(10, templateCat, templateSort)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setAllNamespaceCategories()&lt;br /&gt;
	-- Set categories for all namespaces.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		local allSort = (self.title.namespace == 0 and &amp;#039;Main:&amp;#039; or &amp;#039;&amp;#039;) .. self.title.prefixedText&lt;br /&gt;
		self:addCat(&amp;#039;all&amp;#039;, &amp;#039;Wikipedia message box parameter needs fixing&amp;#039;, allSort)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSubstituted then&lt;br /&gt;
		self:addCat(&amp;#039;all&amp;#039;, &amp;#039;Pages with incorrectly substituted templates&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setCategories()&lt;br /&gt;
	if self.title.namespace == 0 then&lt;br /&gt;
		self:setMainspaceCategories()&lt;br /&gt;
	elseif self.title.namespace == 10 then&lt;br /&gt;
		self:setTemplateCategories()&lt;br /&gt;
	end&lt;br /&gt;
	self:setAllNamespaceCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:renderCategories()&lt;br /&gt;
	if not self.hasCategories then&lt;br /&gt;
		-- No categories added, no need to pass them to Category handler so,&lt;br /&gt;
		-- if it was invoked, it would return the empty string.&lt;br /&gt;
		-- So we shortcut and return the empty string.&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- Convert category tables to strings and pass them through&lt;br /&gt;
	-- [[Module:Category handler]].&lt;br /&gt;
	return require(&amp;#039;Module:Category handler&amp;#039;)._main{&lt;br /&gt;
		main = table.concat(self.categories[0] or {}),&lt;br /&gt;
		template = table.concat(self.categories[10] or {}),&lt;br /&gt;
		all = table.concat(self.categories.all or {}),&lt;br /&gt;
		nocat = self.args.nocat,&lt;br /&gt;
		page = self.args.page&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:exportDiv()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
	-- Add the subst check error.&lt;br /&gt;
	if self.isSubstituted and self.name then&lt;br /&gt;
		root:tag(&amp;#039;b&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;error&amp;#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&amp;#039;Template &amp;lt;code&amp;gt;%s[[Template:%s|%s]]%s&amp;lt;/code&amp;gt; has been incorrectly substituted.&amp;#039;,&lt;br /&gt;
				mw.text.nowiki(&amp;#039;{{&amp;#039;), self.name, self.name, mw.text.nowiki(&amp;#039;}}&amp;#039;)&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	root:wikitext(frame:extensionTag{&lt;br /&gt;
		name = &amp;#039;templatestyles&amp;#039;,&lt;br /&gt;
		args = { src = self.base_templatestyles },&lt;br /&gt;
	})&lt;br /&gt;
	-- Add support for a single custom templatestyles sheet. Undocumented as&lt;br /&gt;
	-- need should be limited and many templates using mbox are substed; we&lt;br /&gt;
	-- don&amp;#039;t want to spread templatestyles sheets around to arbitrary places&lt;br /&gt;
	if self.templatestyles then&lt;br /&gt;
		root:wikitext(frame:extensionTag{&lt;br /&gt;
			name = &amp;#039;templatestyles&amp;#039;,&lt;br /&gt;
			args = { src = self.templatestyles },&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Create the box.&lt;br /&gt;
	local mbox = root:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
	mbox:attr(&amp;#039;id&amp;#039;, self.id or nil)&lt;br /&gt;
	for i, class in ipairs(self.classes or {}) do&lt;br /&gt;
		mbox:addClass(class or nil)&lt;br /&gt;
	end&lt;br /&gt;
	mbox&lt;br /&gt;
		:cssText(self.style or nil)&lt;br /&gt;
&lt;br /&gt;
	if self.attrs then&lt;br /&gt;
		mbox:attr(self.attrs)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local flex_container&lt;br /&gt;
	if self.below then&lt;br /&gt;
		-- we need to wrap the flex components (`image(right)` and `text`) in their&lt;br /&gt;
		-- own container div to support the `below` parameter&lt;br /&gt;
		flex_container = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		flex_container:addClass(&amp;#039;mbox-flex&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		-- the mbox itself is the parent, so we need no HTML flex_container&lt;br /&gt;
		flex_container = mw.html.create()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the left-hand image.&lt;br /&gt;
	if self.imageLeft then&lt;br /&gt;
		local imageLeftCell = flex_container:tag(&amp;#039;div&amp;#039;):addClass(&amp;#039;mbox-image&amp;#039;)&lt;br /&gt;
		imageLeftCell&lt;br /&gt;
			:addClass(self.imageLeftClass)&lt;br /&gt;
			:wikitext(self.imageLeft or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the text.&lt;br /&gt;
	local textCell = flex_container:tag(&amp;#039;div&amp;#039;):addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- The message box uses advanced text parameters that allow things to be&lt;br /&gt;
		-- collapsible. At the moment, only ambox uses this.&lt;br /&gt;
		textCell:cssText(self.textstyle or nil)&lt;br /&gt;
		local textCellDiv = textCell:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
		textCellDiv&lt;br /&gt;
			:addClass(&amp;#039;mbox-text-span&amp;#039;)&lt;br /&gt;
			:wikitext(self.issue or nil)&lt;br /&gt;
		if (self.talk or self.fix) then&lt;br /&gt;
			textCellDiv:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:wikitext(self.talk and (&amp;#039; &amp;#039; .. self.talk) or nil)&lt;br /&gt;
				:wikitext(self.fix and (&amp;#039; &amp;#039; .. self.fix) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		textCellDiv:wikitext(self.date and (&amp;#039; &amp;#039; .. self.date) or nil)&lt;br /&gt;
		if self.info and not self.isSmall then&lt;br /&gt;
			textCellDiv&lt;br /&gt;
				:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:wikitext(self.info and (&amp;#039; &amp;#039; .. self.info) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		if self.removalNotice then&lt;br /&gt;
			textCellDiv:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;i&amp;#039;)&lt;br /&gt;
					:wikitext(string.format(&amp;quot; (%s)&amp;quot;, self.removalNotice))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Default text formatting - anything goes.&lt;br /&gt;
		textCell&lt;br /&gt;
			:cssText(self.textstyle or nil)&lt;br /&gt;
			:wikitext(self.text or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the right-hand image.&lt;br /&gt;
	if self.imageRight then&lt;br /&gt;
		local imageRightCell = flex_container:tag(&amp;#039;div&amp;#039;):addClass(&amp;#039;mbox-imageright&amp;#039;)&lt;br /&gt;
		imageRightCell&lt;br /&gt;
			:addClass(self.imageRightClass)&lt;br /&gt;
			:wikitext(self.imageRight or nil)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	mbox:node(flex_container)&lt;br /&gt;
&lt;br /&gt;
	-- Add the below row.&lt;br /&gt;
	if self.below then&lt;br /&gt;
		mbox:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-text mbox-below&amp;#039;)&lt;br /&gt;
			:cssText(self.textstyle or nil)&lt;br /&gt;
			:wikitext(self.below or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add error message for invalid type parameters.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		root:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-invalid-type&amp;#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&amp;#039;This message box is using an invalid &amp;quot;type=%s&amp;quot; parameter and needs fixing.&amp;#039;,&lt;br /&gt;
				self.type or &amp;#039;&amp;#039;&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add categories.&lt;br /&gt;
	root:wikitext(self:renderCategories() or nil)&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:export()&lt;br /&gt;
&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
	-- Add the subst check error.&lt;br /&gt;
	if self.isSubstituted and self.name then&lt;br /&gt;
		root:tag(&amp;#039;b&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;error&amp;#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&amp;#039;Template &amp;lt;code&amp;gt;%s[[Template:%s|%s]]%s&amp;lt;/code&amp;gt; has been incorrectly substituted.&amp;#039;,&lt;br /&gt;
				mw.text.nowiki(&amp;#039;{{&amp;#039;), self.name, self.name, mw.text.nowiki(&amp;#039;}}&amp;#039;)&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	root:wikitext(frame:extensionTag{&lt;br /&gt;
		name = &amp;#039;templatestyles&amp;#039;,&lt;br /&gt;
		args = { src = self.base_templatestyles },&lt;br /&gt;
	})&lt;br /&gt;
	-- Add support for a single custom templatestyles sheet. Undocumented as&lt;br /&gt;
	-- need should be limited and many templates using mbox are substed; we&lt;br /&gt;
	-- don&amp;#039;t want to spread templatestyles sheets around to arbitrary places&lt;br /&gt;
	if self.templatestyles then&lt;br /&gt;
		root:wikitext(frame:extensionTag{&lt;br /&gt;
			name = &amp;#039;templatestyles&amp;#039;,&lt;br /&gt;
			args = { src = self.templatestyles },&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Create the box table.&lt;br /&gt;
	local boxTable = root:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
	boxTable:attr(&amp;#039;id&amp;#039;, self.id or nil)&lt;br /&gt;
	for i, class in ipairs(self.classes or {}) do&lt;br /&gt;
		boxTable:addClass(class or nil)&lt;br /&gt;
	end&lt;br /&gt;
	boxTable&lt;br /&gt;
		:cssText(self.style or nil)&lt;br /&gt;
		:attr(&amp;#039;role&amp;#039;, &amp;#039;presentation&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if self.attrs then&lt;br /&gt;
		boxTable:attr(self.attrs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the left-hand image.&lt;br /&gt;
	local row = boxTable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	if self.imageLeft then&lt;br /&gt;
		local imageLeftCell = row:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-image&amp;#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageLeftCell so that the image&lt;br /&gt;
			-- is inside it. Divs use style=&amp;quot;width: 52px;&amp;quot;, which limits the&lt;br /&gt;
			-- image width to 52px. If any images in a div are wider than that,&lt;br /&gt;
			-- they may overlap with the text or cause other display problems.&lt;br /&gt;
			imageLeftCell = imageLeftCell:tag(&amp;#039;div&amp;#039;):addClass(&amp;#039;mbox-image-div&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageLeftCell&lt;br /&gt;
			:addClass(self.imageLeftClass)&lt;br /&gt;
			:wikitext(self.imageLeft or nil)&lt;br /&gt;
	elseif self.imageEmptyCell then&lt;br /&gt;
		-- Some message boxes define an empty cell if no image is specified, and&lt;br /&gt;
		-- some don&amp;#039;t. The old template code in templates where empty cells are&lt;br /&gt;
		-- specified gives the following hint: &amp;quot;No image. Cell with some width&lt;br /&gt;
		-- or padding necessary for text cell to have 100% width.&amp;quot;&lt;br /&gt;
		row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-empty-cell&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the text.&lt;br /&gt;
	local textCell = row:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- The message box uses advanced text parameters that allow things to be&lt;br /&gt;
		-- collapsible. At the moment, only ambox uses this.&lt;br /&gt;
		textCell:cssText(self.textstyle or nil)&lt;br /&gt;
		local textCellDiv = textCell:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
		textCellDiv&lt;br /&gt;
			:addClass(&amp;#039;mbox-text-span&amp;#039;)&lt;br /&gt;
			:wikitext(self.issue or nil)&lt;br /&gt;
		if (self.talk or self.fix) then&lt;br /&gt;
			textCellDiv:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:wikitext(self.talk and (&amp;#039; &amp;#039; .. self.talk) or nil)&lt;br /&gt;
				:wikitext(self.fix and (&amp;#039; &amp;#039; .. self.fix) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		textCellDiv:wikitext(self.date and (&amp;#039; &amp;#039; .. self.date) or nil)&lt;br /&gt;
		if self.info and not self.isSmall then&lt;br /&gt;
			textCellDiv&lt;br /&gt;
				:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:wikitext(self.info and (&amp;#039; &amp;#039; .. self.info) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		if self.removalNotice then&lt;br /&gt;
			textCellDiv:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;i&amp;#039;)&lt;br /&gt;
					:wikitext(string.format(&amp;quot; (%s)&amp;quot;, self.removalNotice))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Default text formatting - anything goes.&lt;br /&gt;
		textCell&lt;br /&gt;
			:cssText(self.textstyle or nil)&lt;br /&gt;
			:wikitext(self.text or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the right-hand image.&lt;br /&gt;
	if self.imageRight then&lt;br /&gt;
		local imageRightCell = row:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-imageright&amp;#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageRightCell so that the image&lt;br /&gt;
			-- is inside it.&lt;br /&gt;
			imageRightCell = imageRightCell:tag(&amp;#039;div&amp;#039;):addClass(&amp;#039;mbox-image-div&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageRightCell&lt;br /&gt;
			:addClass(self.imageRightClass)&lt;br /&gt;
			:wikitext(self.imageRight or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the below row.&lt;br /&gt;
	if self.below then&lt;br /&gt;
		boxTable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, self.imageRight and &amp;#039;3&amp;#039; or &amp;#039;2&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
				:cssText(self.textstyle or nil)&lt;br /&gt;
				:wikitext(self.below or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add error message for invalid type parameters.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		root:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-invalid-type&amp;#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&amp;#039;This message box is using an invalid &amp;quot;type=%s&amp;quot; parameter and needs fixing.&amp;#039;,&lt;br /&gt;
				self.type or &amp;#039;&amp;#039;&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add categories.&lt;br /&gt;
	root:wikitext(self:renderCategories() or nil)&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&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, mt = {}, {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- For testing.&lt;br /&gt;
	return {&lt;br /&gt;
		MessageBox = MessageBox&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(boxType, args, cfgTables)&lt;br /&gt;
	local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))&lt;br /&gt;
	box:setParameters()&lt;br /&gt;
	box:setCategories()&lt;br /&gt;
	-- DIV MIGRATION CONDITIONAL&lt;br /&gt;
	if box.cfg.div_structure then&lt;br /&gt;
		return box:exportDiv()&lt;br /&gt;
	end&lt;br /&gt;
	-- END DIV MIGRATION CONDITIONAL&lt;br /&gt;
	return box:export()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mt.__index(t, k)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		if not getArgs then&lt;br /&gt;
			getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
		end&lt;br /&gt;
		return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return setmetatable(p, mt)&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:00 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Message_box</comments>
		</item>
		<item>
			<title>Template:Mbox</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Mbox&amp;diff=61&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Mbox&amp;diff=61&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Mbox&quot; title=&quot;Template:Mbox&quot;&gt;Template:Mbox&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Template:Mbox&quot; class=&quot;extiw&quot; title=&quot;en:Template:Mbox&quot;&gt;en:Template:Mbox&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{#invoke:Message box|mbox}}&amp;lt;noinclude&amp;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>Fri, 09 Oct 2026 19:40:00 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Mbox</comments>
		</item>
		<item>
			<title>Module:Arguments</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Arguments&amp;diff=59&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Arguments&amp;diff=59&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Arguments&quot; title=&quot;Module:Arguments&quot;&gt;Module:Arguments&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Arguments&quot; class=&quot;extiw&quot; title=&quot;en:Module:Arguments&quot;&gt;en:Module:Arguments&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&amp;#039;t have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		val = val:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
		if val == &amp;#039;&amp;#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return val:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		if val:find(&amp;#039;%S&amp;#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &amp;#039;string&amp;#039; or tp == &amp;#039;number&amp;#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&amp;#039;getArgs&amp;#039;, 1, frame, &amp;#039;table&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;getArgs&amp;#039;, 2, options, &amp;#039;table&amp;#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame&amp;#039;s availability. If we weren&amp;#039;t&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &amp;#039;table&amp;#039; and type(frame.getParent) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame&amp;#039;s title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&amp;#039;/sandbox$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &amp;#039;table&amp;#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn&amp;#039;t set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don&amp;#039;t have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &amp;#039;function&amp;#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &amp;#039;valueFunc&amp;#039;&amp;quot;&lt;br /&gt;
					.. &amp;#039;(function expected, got &amp;#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &amp;#039;)&amp;#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are &amp;#039;s&amp;#039; (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &amp;#039;h&amp;#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &amp;#039;s&amp;#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&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;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &amp;#039;h&amp;#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;#039;could not write to argument table key &amp;quot;&amp;#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &amp;#039;&amp;quot;; the table is read-only&amp;#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;#039;could not write to argument table key &amp;quot;&amp;#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &amp;#039;&amp;quot;; overwriting existing arguments is not permitted&amp;#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn&amp;#039;t looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &amp;#039;h&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &amp;#039;string&amp;#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won&amp;#039;t cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:00 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Arguments</comments>
		</item>
		<item>
			<title>Module:Citation/CS1/Configuration</title>
			<link>https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Configuration&amp;diff=57&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Configuration&amp;diff=57&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Module:Citation/CS1/Configuration&quot; title=&quot;Module:Citation/CS1/Configuration&quot;&gt;Module:Citation/CS1/Configuration&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Module:Citation/CS1/Configuration&quot; class=&quot;extiw&quot; title=&quot;en:Module:Citation/CS1/Configuration&quot;&gt;en:Module:Citation/CS1/Configuration&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;a href=&quot;https://test.eciton.co.uk/index.php?title=Module:Citation/CS1/Configuration&amp;amp;diff=57&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:40:00 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Module_talk:Citation/CS1/Configuration</comments>
		</item>
		<item>
			<title>Template:Cite book</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Cite_book&amp;diff=55&amp;oldid=49</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Cite_book&amp;diff=55&amp;oldid=49</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&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 15:35, 9 October 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 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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{#&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;if&lt;/del&gt;:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{{last&lt;/del&gt;|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}}}&lt;/del&gt;|&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{{last&lt;/del&gt;}}&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;},}}{{#if:&lt;/del&gt;{{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{first|}&lt;/del&gt;}}&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&amp;amp;nbsp;{&lt;/del&gt;{{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;first}}}}}{{#if:{{{date&lt;/del&gt;|}}&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}|&amp;amp;nbsp;(&lt;/del&gt;{{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{date}}}).&lt;/del&gt;}} {{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#if:{{{title|}}}|&amp;amp;nbsp;&#039;&#039;{{{title}}}&#039;&#039;.}} {{#if:{{{location|}}}|&amp;amp;nbsp;{{{location}}}:}}{{#if:{{{publisher|}}}|&amp;amp;nbsp;{{{publisher}}}.}}{{#if:{{{page|}}}|&amp;amp;nbsp; p.{{{page}}}. }}{{#if:{{{pages|}}}|&amp;amp;nbsp;pp.{{{pages}}}.}}{{#if:{{{quote|}}}|&amp;amp;nbsp;Quote:&quot;{{{quote}}}&quot;.}}{{#if:{{{isbn|}}}|&amp;amp;nbsp;ISBN&amp;amp;nbsp;{{{isbn}}}.}}{{#if:{{{url|}}}|&amp;amp;nbsp;https://{{{url}}}&lt;/del&gt;}}&lt;/div&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;invoke&lt;/ins&gt;:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;citation/CS1&lt;/ins&gt;|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;citation&lt;/ins&gt;&lt;/div&gt;&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;CitationClass=book&lt;/ins&gt;&lt;/div&gt;&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;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;/ins&gt;&lt;/div&gt;&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;documentation&lt;/ins&gt;}}&lt;/div&gt;&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;collapse top&lt;/ins&gt;|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;TemplateData&lt;/ins&gt;}}&lt;/div&gt;&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;Cite book/TemplateData&lt;/ins&gt;}}&lt;/div&gt;&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;collapse bottom&lt;/ins&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:35:15 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Cite_book</comments>
		</item>
		<item>
			<title>Template:Nowrap</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Nowrap&amp;diff=52&amp;oldid=0</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Nowrap&amp;diff=52&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Nowrap&quot; title=&quot;Template:Nowrap&quot;&gt;Template:Nowrap&lt;/a&gt; from &lt;a href=&quot;https://en.wikipedia.org/wiki/Template:Nowrap&quot; class=&quot;extiw&quot; title=&quot;en:Template:Nowrap&quot;&gt;en:Template:Nowrap&lt;/a&gt; (1 revision)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;{{{1}}}&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc page; interwikis go to Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:21:57 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Nowrap</comments>
		</item>
		<item>
			<title>Template:Cite book</title>
			<link>https://test.eciton.co.uk/index.php?title=Template:Cite_book&amp;diff=49&amp;oldid=37</link>
			<guid isPermaLink="false">https://test.eciton.co.uk/index.php?title=Template:Cite_book&amp;diff=49&amp;oldid=37</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/index.php?title=User:AdminUno&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;mw-userlink new&quot; title=&quot;User:AdminUno (page does not exist)&quot;&gt;&lt;bdi&gt;AdminUno&lt;/bdi&gt;&lt;/a&gt; imported &lt;a href=&quot;/index.php/Template:Cite_book&quot; title=&quot;Template:Cite book&quot;&gt;Template:Cite book&lt;/a&gt; by file upload (1 revision)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&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 15:20, 9 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-multi&quot; lang=&quot;en&quot;&gt;(10 intermediate revisions by the same user not shown)&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 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: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{#if:{{{last|}}}|{{{last}}}, }}{{#if:{{{first|}}}| {{{first}}}}}{{#if:{{{date|}}}|({{{date}}}). }} {{#if:{{{title|}}}| &#039;&#039;{{{title}}}&#039;&#039;. }} {{#if:{{{location|}}}| {{{location}}}:}}{{#if:{{{publisher|}}}| {{{publisher}}}. }}{{#if:{{{page|}}}| p. {{{page}}}. }}{{#if:{{{pages|}}}| pp. {{{pages}}}. }}{{#if:{{{quote|}}}| Quote:&quot;{{{quote}}}&quot;. }}{{#if:{{{isbn|}}}| ISBN {{{isbn}}}. }}{{#if:{{{url|}}}|https://{{{url}}}}}&lt;/div&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;{{#if:{{{last|}}}|{{{last}}},}}{{#if:{{{first|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;{{{first}}}}}{{#if:{{{date|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;({{{date}}}).}} {{#if:{{{title|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;&#039;&#039;{{{title}}}&#039;&#039;.}} {{#if:{{{location|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;{{{location}}}:}}{{#if:{{{publisher|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;{{{publisher}}}.}}{{#if:{{{page|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp; &lt;/ins&gt;p.{{{page}}}. }}{{#if:{{{pages|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;pp.{{{pages}}}.}}{{#if:{{{quote|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;Quote:&quot;{{{quote}}}&quot;.}}{{#if:{{{isbn|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;ISBN&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;{{{isbn}}}.}}{{#if:{{{url|}}}|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;amp;nbsp;&lt;/ins&gt;https://{{{url}}}}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Fri, 09 Oct 2026 19:20:47 GMT</pubDate>
			<dc:creator>AdminUno</dc:creator>
			<comments>https://test.eciton.co.uk/index.php/Template_talk:Cite_book</comments>
		</item>
</channel></rss>