<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://schoolwiki.sc07.club/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Grant</id>
	<title>School Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://schoolwiki.sc07.club/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Grant"/>
	<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/wiki/Special:Contributions/Grant"/>
	<updated>2026-05-26T12:43:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=CS2130:Section_1.5&amp;diff=118</id>
		<title>CS2130:Section 1.5</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=CS2130:Section_1.5&amp;diff=118"/>
		<updated>2024-02-29T01:07:30Z</updated>

		<summary type="html">&lt;p&gt;Grant: WIP: matricies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Matricies ==&lt;br /&gt;
&lt;br /&gt;
=== Addition ===&lt;br /&gt;
Each matrix must be the same size (width &amp;amp; height must be the same)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix} 1 &amp;amp; 2 \\ 3 &amp;amp; 4 \end{bmatrix}&lt;br /&gt;
+&lt;br /&gt;
\begin{bmatrix} 0 &amp;amp; -1 \\ 2 &amp;amp; -2 \end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix} 1 &amp;amp; 1 \\ 5 &amp;amp; 2 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiplication ===&lt;br /&gt;
&amp;lt;math&amp;gt;M[a,b] \times N[c,d]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b = c&amp;lt;/math&amp;gt; (M&#039;s height equals N&#039;s width)&lt;br /&gt;
&lt;br /&gt;
Resulting dimensions will be &amp;lt;math&amp;gt;[a,d]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix} 1 &amp;amp; 2 \\ 3 &amp;amp; 4 \end{bmatrix}&lt;br /&gt;
\times&lt;br /&gt;
\begin{bmatrix} 0 &amp;amp; -1 \\ 2 &amp;amp; -2 \end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix} (1*0)+(2*2) &amp;amp; (1*-1)+(2*-2) \\ (3*0)+(4*2) &amp;amp; (3*-1)+(4*-2) \end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix} 4 &amp;amp; -5 \\ 8 &amp;amp; -11 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=CS2130:Main_Page&amp;diff=117</id>
		<title>CS2130:Main Page</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=CS2130:Main_Page&amp;diff=117"/>
		<updated>2024-02-29T00:54:06Z</updated>

		<summary type="html">&lt;p&gt;Grant: + notoc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__notoc__&lt;br /&gt;
&lt;br /&gt;
== Sections ==&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 1.1 &amp;amp; 1.2|Section 1.1 &amp;amp; 1.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 5.1|Section 5.1]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 5.2|Section 5.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 1.3|Section 1.3]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 1.4|Section 1.4]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 2.1|Section 2.1]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 2.2|Section 2.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 6.5|Section 6.5]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 6.6|Section 6.6]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 3.1|Section 3.1]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 3.2|Section 3.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 3.3|Section 3.3]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 3.4|Section 3.4]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 1.5|Section 1.5]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 4.2|Section 4.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 4.3|Section 4.3]] ===&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=CS2130:Main_Page&amp;diff=116</id>
		<title>CS2130:Main Page</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=CS2130:Main_Page&amp;diff=116"/>
		<updated>2024-02-29T00:53:44Z</updated>

		<summary type="html">&lt;p&gt;Grant: + missing sections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sections ==&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 1.1 &amp;amp; 1.2|Section 1.1 &amp;amp; 1.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 5.1|Section 5.1]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 5.2|Section 5.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 1.3|Section 1.3]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 1.4|Section 1.4]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 2.1|Section 2.1]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 2.2|Section 2.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 6.5|Section 6.5]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 6.6|Section 6.6]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 3.1|Section 3.1]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 3.2|Section 3.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 3.3|Section 3.3]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 3.4|Section 3.4]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 1.5|Section 1.5]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 4.2|Section 4.2]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[CS2130:Section 4.3|Section 4.3]] ===&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Article_Todo&amp;diff=115</id>
		<title>Template:Article Todo</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Article_Todo&amp;diff=115"/>
		<updated>2024-01-25T00:50:26Z</updated>

		<summary type="html">&lt;p&gt;Grant: Created page with &amp;quot;{{ambox|type=notice|text=TODO|smalltext={{{text}}}}}  &amp;lt;noinclude&amp;gt; &amp;lt;templatedata&amp;gt; { 	&amp;quot;params&amp;quot;: { 		&amp;quot;text&amp;quot;: { 			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;, 			&amp;quot;required&amp;quot;: true 		} 	}, 	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot; } &amp;lt;/templatedata&amp;gt; &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ambox|type=notice|text=TODO|smalltext={{{text}}}}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;text&amp;quot;: {&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Ambox/doc&amp;diff=114</id>
		<title>Template:Ambox/doc</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Ambox/doc&amp;diff=114"/>
		<updated>2024-01-24T01:56:32Z</updated>

		<summary type="html">&lt;p&gt;Grant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TemplateData ==&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;This is the specialized version of the {{mbox}} or “multi namespace message box” meta-template.&amp;quot;,&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;block&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;type&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;speedy&amp;quot;,&lt;br /&gt;
				&amp;quot;delete&amp;quot;,&lt;br /&gt;
				&amp;quot;content&amp;quot;,&lt;br /&gt;
				&amp;quot;style&amp;quot;,&lt;br /&gt;
				&amp;quot;notice&amp;quot;,&lt;br /&gt;
				&amp;quot;move&amp;quot;,&lt;br /&gt;
				&amp;quot;protection&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;notice&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;image&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image (left)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;Depends on the “type” parameter.&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;imageright&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image (right)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;style&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;CSS Style&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;textstyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Text CSS Style&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;text&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;small&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small?&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;{{{small|}}}&amp;quot;,&lt;br /&gt;
				&amp;quot;left&amp;quot;,&lt;br /&gt;
				&amp;quot;yes&amp;quot;,&lt;br /&gt;
				&amp;quot;1&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smallimage&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Image (left)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{image}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smallimageright&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Image (right)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{imageright}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smalltext&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Text&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{text}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=CS2130:Section_5.2&amp;diff=113</id>
		<title>CS2130:Section 5.2</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=CS2130:Section_5.2&amp;diff=113"/>
		<updated>2024-01-24T01:40:55Z</updated>

		<summary type="html">&lt;p&gt;Grant: work in progress&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Symbols ==&lt;br /&gt;
[[File:Floor-vs-ceiling.svg|thumb]]&lt;br /&gt;
&lt;br /&gt;
=== Ceiling ===&lt;br /&gt;
&amp;lt;math&amp;gt;\lceil x \rceil&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Round up&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\lceil 5.999 \rceil = 6 &amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\lceil 3.001 \rceil = 4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Floor ===&lt;br /&gt;
&amp;lt;math&amp;gt;\lfloor x \rfloor&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Round down&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\lfloor 5.999 \rfloor = 5&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\lfloor 3.001 \rfloor = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
=== Modulus ===&lt;br /&gt;
&amp;lt;math&amp;gt;%&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Integer remainder from division&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;7 % 3 = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Min ===&lt;br /&gt;
&amp;lt;math&amp;gt;\min(x,y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gives the lowest number out of the two given&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\min(1,2) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Max ===&lt;br /&gt;
&amp;lt;math&amp;gt;\max(1,2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gives the highest number out of the two given&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\max(1,2) = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== A Hash ==&lt;br /&gt;
For the purpose of this class, a hash is effectively a modulus&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=File:Floor-vs-ceiling.svg&amp;diff=112</id>
		<title>File:Floor-vs-ceiling.svg</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=File:Floor-vs-ceiling.svg&amp;diff=112"/>
		<updated>2024-01-24T01:30:47Z</updated>

		<summary type="html">&lt;p&gt;Grant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=MediaWiki:Sidebar&amp;diff=111</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=MediaWiki:Sidebar&amp;diff=111"/>
		<updated>2024-01-24T01:18:59Z</updated>

		<summary type="html">&lt;p&gt;Grant: Add CS2130 to sidebar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
* Classes&lt;br /&gt;
** CS2130:Main Page|CS2130&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=CS2130:Section_5.1&amp;diff=110</id>
		<title>CS2130:Section 5.1</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=CS2130:Section_5.1&amp;diff=110"/>
		<updated>2024-01-24T01:16:27Z</updated>

		<summary type="html">&lt;p&gt;Grant: add images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is a function? ==&lt;br /&gt;
Unlike previous math classes, the &#039;&#039;&#039;Vertical Line Test&#039;&#039;&#039; is not used in this course&lt;br /&gt;
&lt;br /&gt;
=== Terms ===&lt;br /&gt;
&lt;br /&gt;
* Domain - Inputs of a function&lt;br /&gt;
* Range - Outputs of a function&lt;br /&gt;
&lt;br /&gt;
=== Types of functions ===&lt;br /&gt;
&#039;&#039;Todo: add graphics to go along with these functions&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Into ====&lt;br /&gt;
[[File:Into-set.svg|thumb|150x150px|A visual representation of the Into function]]&lt;br /&gt;
Everything in A is used, and goes to only one element in B&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
==== Onto ====&lt;br /&gt;
[[File:Onto-set.svg|thumb|150x150px|A visual representation of the Onto function]]&lt;br /&gt;
Everything in B is used&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
==== 1-to-1 ====&lt;br /&gt;
[[File:1-to-1-set.svg|thumb|150x150px|A visual representation to the 1-to-1 function]]&lt;br /&gt;
Any element in B can go to &amp;lt;u&amp;gt;at most&amp;lt;/u&amp;gt; one element in A&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
==== Invertible ====&lt;br /&gt;
&#039;&#039;Also known as a bijection&#039;&#039;&lt;br /&gt;
[[File:Bijection-set.svg|thumb|150x150px|A visual representation of the Invertible/Bijection function]]&lt;br /&gt;
Both 1-to-1 &amp;amp; onto&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Symbols ==&lt;br /&gt;
&lt;br /&gt;
=== Negation ===&lt;br /&gt;
&amp;lt;math&amp;gt;\overline{A}&amp;lt;/math&amp;gt; = &amp;lt;math&amp;gt;U - A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Unsure if this is the correct name&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Everything in the Universe except what is inside A&lt;br /&gt;
&lt;br /&gt;
=== Count Of ===&lt;br /&gt;
&amp;lt;math&amp;gt;|A|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Count of elements inside A&lt;br /&gt;
&lt;br /&gt;
=== Union ===&lt;br /&gt;
&amp;lt;math&amp;gt;A \bigcup B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A combination of both sets&lt;br /&gt;
&lt;br /&gt;
=== Intersection ===&lt;br /&gt;
&amp;lt;math&amp;gt;A \bigcap B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A set containing what is in both sets&lt;br /&gt;
&lt;br /&gt;
=== Element ===&lt;br /&gt;
&amp;lt;math&amp;gt;1 \in B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; is an element of &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Subset ===&lt;br /&gt;
&amp;lt;math&amp;gt;\{1\} \subseteq B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1 is a subset of &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&lt;br /&gt;
# The total number of subsets a set can have is equivalent to &amp;lt;math&amp;gt;2^{|A|}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Symmetric Difference ===&lt;br /&gt;
&amp;lt;math&amp;gt;A \oplus B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Everything in &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; but not in &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Effectively a unique filter&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
&amp;lt;math&amp;gt;A \oplus B = (A \bigcup B) - (A \bigcap B) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empty Set ===&lt;br /&gt;
&amp;lt;math&amp;gt;\varnothing&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An empty set&lt;br /&gt;
&lt;br /&gt;
===== Notes =====&lt;br /&gt;
&lt;br /&gt;
# An &#039;&#039;&#039;Empty Set&#039;&#039;&#039; is a &#039;&#039;&#039;Subset&#039;&#039;&#039; of any set, but not an element of every set&lt;br /&gt;
# An &#039;&#039;&#039;Empty Set&#039;&#039;&#039; is only an element of a set if explicitly a part of the set (you won&#039;t see this)&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=File:Bijection-set.svg&amp;diff=109</id>
		<title>File:Bijection-set.svg</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=File:Bijection-set.svg&amp;diff=109"/>
		<updated>2024-01-24T01:14:22Z</updated>

		<summary type="html">&lt;p&gt;Grant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=File:1-to-1-set.svg&amp;diff=108</id>
		<title>File:1-to-1-set.svg</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=File:1-to-1-set.svg&amp;diff=108"/>
		<updated>2024-01-24T01:14:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=File:Onto-set.svg&amp;diff=107</id>
		<title>File:Onto-set.svg</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=File:Onto-set.svg&amp;diff=107"/>
		<updated>2024-01-24T01:13:55Z</updated>

		<summary type="html">&lt;p&gt;Grant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Clear&amp;diff=106</id>
		<title>Template:Clear</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Clear&amp;diff=106"/>
		<updated>2024-01-24T01:08:23Z</updated>

		<summary type="html">&lt;p&gt;Grant: Created page with &amp;quot;&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=File:Into-set.svg&amp;diff=105</id>
		<title>File:Into-set.svg</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=File:Into-set.svg&amp;diff=105"/>
		<updated>2024-01-24T01:05:25Z</updated>

		<summary type="html">&lt;p&gt;Grant: Grant uploaded a new version of File:Into-set.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=File:Into-set.svg&amp;diff=104</id>
		<title>File:Into-set.svg</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=File:Into-set.svg&amp;diff=104"/>
		<updated>2024-01-24T01:03:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Yesno&amp;diff=103</id>
		<title>Module:Yesno</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Yesno&amp;diff=103"/>
		<updated>2024-01-23T03:28:21Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Function allowing for consistent treatment of boolean-like wikitext input.&lt;br /&gt;
-- It works similarly to the template {{yesno}}.&lt;br /&gt;
&lt;br /&gt;
return function (val, default)&lt;br /&gt;
	-- If your wiki uses non-ascii characters for any of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc., you&lt;br /&gt;
	-- should replace &amp;quot;val:lower()&amp;quot; with &amp;quot;mw.ustring.lower(val)&amp;quot; in the&lt;br /&gt;
	-- following line.&lt;br /&gt;
	val = type(val) == &#039;string&#039; and val:lower() or val&lt;br /&gt;
	if val == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif val == true &lt;br /&gt;
		or val == &#039;yes&#039;&lt;br /&gt;
		or val == &#039;y&#039;&lt;br /&gt;
		or val == &#039;true&#039;&lt;br /&gt;
		or val == &#039;t&#039;&lt;br /&gt;
		or val == &#039;on&#039;&lt;br /&gt;
		or tonumber(val) == 1&lt;br /&gt;
	then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif val == false&lt;br /&gt;
		or val == &#039;no&#039;&lt;br /&gt;
		or val == &#039;n&#039;&lt;br /&gt;
		or val == &#039;false&#039;&lt;br /&gt;
		or val == &#039;f&#039;&lt;br /&gt;
		or val == &#039;off&#039;&lt;br /&gt;
		or tonumber(val) == 0&lt;br /&gt;
	then&lt;br /&gt;
		return false&lt;br /&gt;
	else&lt;br /&gt;
		return default&lt;br /&gt;
	end&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Namespace_detect/data&amp;diff=101</id>
		<title>Module:Namespace detect/data</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Namespace_detect/data&amp;diff=101"/>
		<updated>2024-01-23T03:28:21Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&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(&#039;Module:Namespace detect/config&#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;
	&#039;main&#039;,&lt;br /&gt;
	&#039;talk&#039;,&lt;br /&gt;
	&#039;other&#039;,&lt;br /&gt;
	&#039;subjectns&#039;,&lt;br /&gt;
	&#039;demospace&#039;,&lt;br /&gt;
	&#039;demopage&#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 == &#039;string&#039; then&lt;br /&gt;
		addKey(t, cfgValue, defaultKey)&lt;br /&gt;
	elseif cfgValueType == &#039;table&#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&#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;
	--   [&#039;&#039;] = {&#039;main&#039;},&lt;br /&gt;
	--   [&#039;wikipedia&#039;] = {&#039;wikipedia&#039;, &#039;project&#039;, &#039;wp&#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[&#039;talk&#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;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Namespace_detect/config&amp;diff=99</id>
		<title>Module:Namespace detect/config</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Namespace_detect/config&amp;diff=99"/>
		<updated>2024-01-23T03:28:20Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&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&#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&#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 = &#039;parameter name&#039;                                                 --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To add multiple names, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = {&#039;parameter name 1&#039;, &#039;parameter name 2&#039;, &#039;parameter name 3&#039;}     --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
---- This parameter displays content for the main namespace:&lt;br /&gt;
-- cfg.main = &#039;main&#039;&lt;br /&gt;
 &lt;br /&gt;
---- This parameter displays in talk namespaces:&lt;br /&gt;
-- cfg.talk = &#039;talk&#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 = &#039;other&#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 = &#039;subjectns&#039;&lt;br /&gt;
 &lt;br /&gt;
---- This parameter sets a demonstration namespace:&lt;br /&gt;
-- cfg.demospace = &#039;demospace&#039;&lt;br /&gt;
 &lt;br /&gt;
---- This parameter sets a specific page to compare:&lt;br /&gt;
cfg.demopage = &#039;page&#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 = &#039;Namespace&#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 = &#039;Aliases&#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&#039;t edit this line.&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Namespace_detect&amp;diff=97</id>
		<title>Module:Namespace detect</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Namespace_detect&amp;diff=97"/>
		<updated>2024-01-23T03:28:20Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&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(&#039;Module:Namespace detect/data&#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(&#039;Module:Yesno&#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 == &#039;&#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 == &#039;&#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 = &#039;talk&#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&#039;t exist.&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret:gsub(&#039;_&#039;, &#039; &#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 &#039;other&#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(&#039;Module:Arguments&#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 &#039;&#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(&#039;Module:TableTools&#039;)&lt;br /&gt;
	local namespaces = mw.site.namespaces&lt;br /&gt;
	local cfg = data.cfg&lt;br /&gt;
	local useTalk = type(frame) == &#039;table&#039; &lt;br /&gt;
		and type(frame.args) == &#039;table&#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) == &#039;string&#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, &#039;Namespace&#039;)&lt;br /&gt;
	local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, &#039;Aliases&#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 ~= &#039;talk&#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 = &#039;{| class=&amp;quot;wikitable&amp;quot;&#039;&lt;br /&gt;
		.. &#039;\n|-&#039;&lt;br /&gt;
		.. &#039;\n! &#039; .. nsHeader&lt;br /&gt;
		.. &#039;\n! &#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 .. &#039;\n|-&#039;&lt;br /&gt;
					.. &#039;\n| &amp;lt;code&amp;gt;&#039; .. param .. &#039;&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
					.. &#039;\n| &#039;&lt;br /&gt;
			elseif j == 2 then&lt;br /&gt;
				ret = ret .. &#039;&amp;lt;code&amp;gt;&#039; .. param .. &#039;&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
			else&lt;br /&gt;
				ret = ret .. &#039;, &amp;lt;code&amp;gt;&#039; .. param .. &#039;&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ret = ret .. &#039;\n|-&#039;&lt;br /&gt;
		.. &#039;\n|}&#039;&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/tmbox.css&amp;diff=95</id>
		<title>Module:Message box/tmbox.css</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/tmbox.css&amp;diff=95"/>
		<updated>2024-01-23T03:28:19Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * {{tmbox}} (talk page message box) styles&lt;br /&gt;
 *&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-enwp-boxes.css&lt;br /&gt;
 * @revision 2021-07-15&lt;br /&gt;
 */&lt;br /&gt;
table.tmbox {&lt;br /&gt;
	margin: 4px 10%;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	/* Default &amp;quot;notice&amp;quot; gray-brown */&lt;br /&gt;
	border: 1px solid #c0c090;&lt;br /&gt;
	background-color: #f8eaba;&lt;br /&gt;
	min-width: 80%;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tmbox.mbox-small {&lt;br /&gt;
	/* reset the min-width of tmbox above */&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * For tmboxes inside other templates. &amp;quot;body.mediawiki&amp;quot; ensures that&lt;br /&gt;
 * this declaration overrides other styles (including mbox-small above)&lt;br /&gt;
 */&lt;br /&gt;
body.mediawiki .mbox-inside .tmbox {&lt;br /&gt;
	margin: 2px 0;&lt;br /&gt;
	/* For Safari and Opera */&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mbox-inside .tmbox.mbox-small {&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;small&amp;quot; tmboxes should not be small when also &amp;quot;nested&amp;quot;,&lt;br /&gt;
	 * so reset styles that are set in &amp;quot;.tmbox.mbox-small&amp;quot; below.&lt;br /&gt;
	 */&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* An empty narrow cell */&lt;br /&gt;
td.mbox-empty-cell {&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The message body cell(s) */&lt;br /&gt;
th.mbox-text, td.mbox-text {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* 0.9em left/right */&lt;br /&gt;
	padding: 0.25em 0.9em;&lt;br /&gt;
	/* Make all mboxes the same width regardless of text length */&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The left image cell */&lt;br /&gt;
td.mbox-image {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* 0.9em left, 0px right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.9em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The right image cell */&lt;br /&gt;
td.mbox-imageright {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* 0px left, 0.9em right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.9em 2px 0;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.tmbox-speedy {&lt;br /&gt;
	/* Pink */&lt;br /&gt;
	background-color: #fee7e6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.tmbox-delete,&lt;br /&gt;
table.tmbox-speedy {&lt;br /&gt;
	/* Red */&lt;br /&gt;
	border-color: #b32424;&lt;br /&gt;
	border-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.tmbox-content {&lt;br /&gt;
	/* Orange */&lt;br /&gt;
	border-color: #f28500;&lt;br /&gt;
	border-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.tmbox-style {&lt;br /&gt;
	/* Yellow */&lt;br /&gt;
	border-color: #fc3;&lt;br /&gt;
	border-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.tmbox-move {&lt;br /&gt;
	/* Purple */&lt;br /&gt;
	border-color: #9932cc;&lt;br /&gt;
	border-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.tmbox-protection,&lt;br /&gt;
table.tmbox-notice {&lt;br /&gt;
	/* Gray-brown */&lt;br /&gt;
	border-color: #c0c090;&lt;br /&gt;
	border-width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * {{tmbox|small=1}} styles&lt;br /&gt;
 *&lt;br /&gt;
 * These &amp;quot;.mbox-small&amp;quot; classes must be placed after all other&lt;br /&gt;
 * &amp;quot;.tmbox&amp;quot; classes. &amp;quot;html body.mediawiki .tmbox&amp;quot;&lt;br /&gt;
 * is so they apply only to talk page message boxes.&lt;br /&gt;
 *&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-enwp-boxes.css&lt;br /&gt;
 * @revision 2021-07-15&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
html body.mediawiki .tmbox.mbox-small {&lt;br /&gt;
	clear: right;&lt;br /&gt;
	float: right;&lt;br /&gt;
	margin: 4px 0 4px 1em;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/ombox.css&amp;diff=93</id>
		<title>Module:Message box/ombox.css</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/ombox.css&amp;diff=93"/>
		<updated>2024-01-23T03:28:19Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * {{ombox}} (other pages message box) styles&lt;br /&gt;
 *&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-enwp-boxes.css&lt;br /&gt;
 * @revision 2021-07-15&lt;br /&gt;
 */&lt;br /&gt;
table.ombox {&lt;br /&gt;
	margin: 4px 10%;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	/* Default &amp;quot;notice&amp;quot; gray */&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	background-color: #f8f9fa;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* An empty narrow cell */&lt;br /&gt;
.ombox td.mbox-empty-cell {&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The message body cell(s) */&lt;br /&gt;
.ombox th.mbox-text,&lt;br /&gt;
.ombox td.mbox-text {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* 0.9em left/right */&lt;br /&gt;
	padding: 0.25em 0.9em;&lt;br /&gt;
	/* Make all mboxes the same width regardless of text length */&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The left image cell */&lt;br /&gt;
.ombox td.mbox-image {&lt;br /&gt;
	border: none;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	/* 0.9em left, 0px right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The right image cell */&lt;br /&gt;
.ombox td.mbox-imageright {&lt;br /&gt;
	border: none;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	/* 0px left, 0.9em right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.9em 2px 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ombox-notice {&lt;br /&gt;
	/* Gray */&lt;br /&gt;
	border-color: #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ombox-speedy {&lt;br /&gt;
	/* Pink */&lt;br /&gt;
	background-color: #fee7e6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ombox-speedy,&lt;br /&gt;
table.ombox-delete {&lt;br /&gt;
	/* Red */&lt;br /&gt;
	border-color: #b32424;&lt;br /&gt;
	border-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ombox-content {&lt;br /&gt;
	/* Orange */&lt;br /&gt;
	border-color: #f28500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ombox-style {&lt;br /&gt;
	/* Yellow */&lt;br /&gt;
	border-color: #fc3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ombox-move {&lt;br /&gt;
	/* Purple */&lt;br /&gt;
	border-color: #9932cc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ombox-protection {&lt;br /&gt;
	/* Gray-gold */&lt;br /&gt;
	border-color: #a2a9b1;&lt;br /&gt;
	border-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * {{ombox|small=1}} styles&lt;br /&gt;
 *&lt;br /&gt;
 * These &amp;quot;.mbox-small&amp;quot; classes must be placed after all other&lt;br /&gt;
 * &amp;quot;.ombox&amp;quot; classes. &amp;quot;html body.mediawiki .ombox&amp;quot;&lt;br /&gt;
 * is so they apply only to other page message boxes.&lt;br /&gt;
 *&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-enwp-boxes.css&lt;br /&gt;
 * @revision 2021-07-15&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
html body.mediawiki .ombox.mbox-small {&lt;br /&gt;
	clear: right;&lt;br /&gt;
	float: right;&lt;br /&gt;
	margin: 4px 0 4px 1em;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/imbox.css&amp;diff=91</id>
		<title>Module:Message box/imbox.css</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/imbox.css&amp;diff=91"/>
		<updated>2024-01-23T03:28:18Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * {{imbox}} (image message box) styles&lt;br /&gt;
 *&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-enwp-boxes.css&lt;br /&gt;
 * @revision 2021-07-15&lt;br /&gt;
 */&lt;br /&gt;
table.imbox {&lt;br /&gt;
	margin: 4px 10%;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	/* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
	border: 3px solid #36c;&lt;br /&gt;
	background-color: #fbfbfb;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For imboxes inside imbox-text cells. */&lt;br /&gt;
.imbox .mbox-text .imbox {&lt;br /&gt;
	/* 0.9 - 0.5 = 0.4em left/right.        */&lt;br /&gt;
	margin: 0 -0.5em;&lt;br /&gt;
	/* Fix for webkit to force 100% width.  */&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For imboxes inside other templates.  */&lt;br /&gt;
.mbox-inside .imbox {&lt;br /&gt;
	margin: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* An empty narrow cell */&lt;br /&gt;
.imbox td.mbox-empty-cell {&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The message body cell(s) */&lt;br /&gt;
.imbox th.mbox-text,&lt;br /&gt;
.imbox td.mbox-text {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* 0.9em left/right */&lt;br /&gt;
	padding: 0.25em 0.9em;&lt;br /&gt;
	/* Make all mboxes the same width regardless of text length */&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The left image cell */&lt;br /&gt;
.imbox td.mbox-image {&lt;br /&gt;
	/* 0.9em left, 0px right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The right image cell */&lt;br /&gt;
.imbox td.mbox-imageright {&lt;br /&gt;
	/* 0px left, 0.9em right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.9em 2px 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-notice {&lt;br /&gt;
	/* Blue */&lt;br /&gt;
	border-color: #36c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-speedy {&lt;br /&gt;
	/* Pink */&lt;br /&gt;
	background-color: #fee7e6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-delete,&lt;br /&gt;
table.imbox-speedy {&lt;br /&gt;
	/* Red */&lt;br /&gt;
	border-color: #b32424;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-content {&lt;br /&gt;
	/* Orange */&lt;br /&gt;
	border-color: #f28500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-style {&lt;br /&gt;
	/* Yellow */&lt;br /&gt;
	border-color: #fc3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-move {&lt;br /&gt;
	/* Purple */&lt;br /&gt;
	border-color: #9932cc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-protection {&lt;br /&gt;
	/* Gray-gold */&lt;br /&gt;
	border-color: #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-license {&lt;br /&gt;
	/* Dark gray */&lt;br /&gt;
	border-color: #88a;&lt;br /&gt;
	/* Light gray */&lt;br /&gt;
	background-color: #f7f8ff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.imbox-featured {&lt;br /&gt;
	/* Brown-gold */&lt;br /&gt;
	border-color: #cba135;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/fmbox.css&amp;diff=89</id>
		<title>Module:Message box/fmbox.css</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/fmbox.css&amp;diff=89"/>
		<updated>2024-01-23T03:28:17Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */&lt;br /&gt;
th.mbox-text, td.mbox-text {   /* The message body cell(s) */&lt;br /&gt;
	padding: 0.25em 0.9em;     /* 0.9em left/right */&lt;br /&gt;
}&lt;br /&gt;
td.mbox-image {                /* The left image cell */&lt;br /&gt;
	padding: 2px 0 2px 0.9em;  /* 0.9em left, 0px right */&lt;br /&gt;
}&lt;br /&gt;
td.mbox-imageright {           /* The right image cell */&lt;br /&gt;
	padding: 2px 0.9em 2px 0;  /* 0px left, 0.9em right */&lt;br /&gt;
}&lt;br /&gt;
/* Footer and header message box styles */&lt;br /&gt;
table.fmbox {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    border: 1px solid #a2a9b1;&lt;br /&gt;
    background-color: #f8f9fa;     /* Default &amp;quot;system&amp;quot; gray */&lt;br /&gt;
    box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-system {&lt;br /&gt;
    background-color: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-warning {&lt;br /&gt;
    border: 1px solid #bb7070;  /* Dark pink */&lt;br /&gt;
    background-color: #ffdbdb;  /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-editnotice {&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/configuration&amp;diff=87</id>
		<title>Module:Message box/configuration</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/configuration&amp;diff=87"/>
		<updated>2024-01-23T03:28:17Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&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 = &#039;ambox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;ambox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			warning = { -- alias for content&lt;br /&gt;
				class = &#039;ambox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;ambox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;ambox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;ambox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;ambox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;ambox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                     = &#039;notice&#039;,&lt;br /&gt;
		allowBlankParams            = {&#039;talk&#039;, &#039;sect&#039;, &#039;date&#039;, &#039;issue&#039;, &#039;fix&#039;, &#039;subst&#039;, &#039;hidden&#039;},&lt;br /&gt;
		allowSmall                  = true,&lt;br /&gt;
		smallParam                  = &#039;left&#039;,&lt;br /&gt;
		smallClass                  = &#039;mbox-small-left&#039;,&lt;br /&gt;
		substCheck                  = true,&lt;br /&gt;
		classes                     = {&#039;metadata&#039;, &#039;plainlinks&#039;, &#039;ambox&#039;},&lt;br /&gt;
		imageEmptyCell              = true,&lt;br /&gt;
		imageCheckBlank             = true,&lt;br /&gt;
		imageSmallSize              = &#039;20x20px&#039;,&lt;br /&gt;
		imageCellDiv                = true,&lt;br /&gt;
		useCollapsibleTextFields    = true,&lt;br /&gt;
		imageRightNone              = true,&lt;br /&gt;
		sectionDefault              = &#039;article&#039;,&lt;br /&gt;
		allowMainspaceCategories    = true,&lt;br /&gt;
		templateCategory            = &#039;Article message templates&#039;,&lt;br /&gt;
	        templateCategoryRequireName = true,&lt;br /&gt;
		templateErrorCategory       = nil,&lt;br /&gt;
		templateErrorParamsToCheck  = {&#039;issue&#039;, &#039;fix&#039;, &#039;subst&#039;}&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	cmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;cmbox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;cmbox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;cmbox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;cmbox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;cmbox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;cmbox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;cmbox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			caution = {&lt;br /&gt;
				class = &#039;cmbox-style&#039;,&lt;br /&gt;
				image = &#039;Ambox warning yellow.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;notice&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;plainlinks&#039;, &#039;cmbox&#039;},&lt;br /&gt;
		imageEmptyCell       = true&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	fmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			warning = {&lt;br /&gt;
				class = &#039;fmbox-warning&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			editnotice = {&lt;br /&gt;
				class = &#039;fmbox-editnotice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			system = {&lt;br /&gt;
				class = &#039;fmbox-system&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;system&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;plainlinks&#039;, &#039;fmbox&#039;},&lt;br /&gt;
		imageEmptyCell       = false,&lt;br /&gt;
		imageRightNone       = false&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	imbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;imbox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;imbox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;imbox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;imbox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;imbox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;imbox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			license = {&lt;br /&gt;
				class = &#039;imbox-license licensetpl&#039;,&lt;br /&gt;
				image = &#039;Imbox license.png&#039; -- @todo We need an SVG version of this&lt;br /&gt;
			},&lt;br /&gt;
			featured = {&lt;br /&gt;
				class = &#039;imbox-featured&#039;,&lt;br /&gt;
				image = &#039;Cscr-featured.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;imbox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;notice&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;imbox&#039;},&lt;br /&gt;
		usePlainlinksParam   = true,&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		below                = true,&lt;br /&gt;
		templateCategory     = &#039;File message boxes&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	ombox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;ombox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;ombox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			warning = { -- alias for content&lt;br /&gt;
				class = &#039;ombox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;ombox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;ombox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;ombox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;ombox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;ombox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			critical = {&lt;br /&gt;
				class = &#039;mbox-critical&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;notice&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;plainlinks&#039;, &#039;ombox&#039;},&lt;br /&gt;
		allowSmall           = true,&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		imageRightNone       = true&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	tmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;tmbox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;tmbox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;tmbox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;tmbox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;tmbox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;tmbox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;tmbox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;notice&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;plainlinks&#039;, &#039;tmbox&#039;},&lt;br /&gt;
		allowSmall           = true,&lt;br /&gt;
		imageRightNone       = true,&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		imageEmptyCellStyle  = true,&lt;br /&gt;
		templateCategory     = &#039;Talk message boxes&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/cmbox.css&amp;diff=85</id>
		<title>Module:Message box/cmbox.css</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/cmbox.css&amp;diff=85"/>
		<updated>2024-01-23T03:28:16Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * {{cmbox}} (category message box) styles&lt;br /&gt;
 *&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-enwp-boxes.css&lt;br /&gt;
 * @revision 2021-07-15&lt;br /&gt;
 */&lt;br /&gt;
table.cmbox {&lt;br /&gt;
	margin: 3px 10%;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	/* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
	background-color: #dfe8ff;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* An empty narrow cell */&lt;br /&gt;
.cmbox td.mbox-empty-cell {&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The message body cell(s) */&lt;br /&gt;
.cmbox th.mbox-text,&lt;br /&gt;
.cmbox td.mbox-text {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* 0.9em left/right */&lt;br /&gt;
	padding: 0.25em 0.9em;&lt;br /&gt;
	/* Make all mboxes the same width regardless of text length */&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The left image cell */&lt;br /&gt;
.cmbox td.mbox-image {&lt;br /&gt;
	/* 0.9em left, 0px right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The right image cell */&lt;br /&gt;
.cmbox td.mbox-imageright {&lt;br /&gt;
	/* 0px left, 0.9em right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.9em 2px 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.cmbox-notice {&lt;br /&gt;
	/* Blue */&lt;br /&gt;
	background-color: #d8e8ff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.cmbox-speedy {&lt;br /&gt;
	margin-top: 4px;&lt;br /&gt;
	margin-bottom: 4px;&lt;br /&gt;
	/* Red */&lt;br /&gt;
	border: 4px solid #b32424;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.cmbox-delete,&lt;br /&gt;
table.cmbox-speedy {&lt;br /&gt;
	/* Pink */&lt;br /&gt;
	background-color: #ffdbdb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.cmbox-content {&lt;br /&gt;
	/* Orange */&lt;br /&gt;
	background-color: #ffe7ce;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.cmbox-style {&lt;br /&gt;
	/* Yellow */&lt;br /&gt;
	background-color: #fff9db;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.cmbox-move {&lt;br /&gt;
	/* Purple */&lt;br /&gt;
	background-color: #e4d8ff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.cmbox-protection {&lt;br /&gt;
	/* Gray-gold */&lt;br /&gt;
	background-color: #efefe1;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/ambox.css&amp;diff=83</id>
		<title>Module:Message box/ambox.css</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box/ambox.css&amp;diff=83"/>
		<updated>2024-01-23T03:28:16Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * {{ambox}} (article message box) styles&lt;br /&gt;
 *&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-enwp-boxes.css&lt;br /&gt;
 * @revision 2021-07-15&lt;br /&gt;
 */&lt;br /&gt;
table.ambox {&lt;br /&gt;
	/* 10% = Will not overlap with other elements */&lt;br /&gt;
	margin: 0 10%;&lt;br /&gt;
	/* Prevent overflow in narrow screens (&amp;lt;=850px) in the Timeless skin.&lt;br /&gt;
	   See [[Skin:Timeless#Less than 851 pixels]]&lt;br /&gt;
	   and https://phabricator.wikimedia.org/source/Timeless/browse/REL1_39/resources/screen-mobile.less$268 */&lt;br /&gt;
	width: unset;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	/* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
	border-left: 10px solid #36c;&lt;br /&gt;
	background-color: #fbfbfb;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Single border between stacked boxes. */&lt;br /&gt;
table.ambox + table.ambox,&lt;br /&gt;
table.ambox + link + table.ambox,&lt;br /&gt;
table.ambox + style + table.ambox {&lt;br /&gt;
	margin-top: -1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* An empty narrow cell */&lt;br /&gt;
.ambox td.mbox-empty-cell {&lt;br /&gt;
	border: none;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	width: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The message body cell(s) */&lt;br /&gt;
.ambox th.mbox-text,&lt;br /&gt;
.ambox td.mbox-text {&lt;br /&gt;
	border: none;&lt;br /&gt;
	/* 0.5em left/right */&lt;br /&gt;
	padding: 0.25em 0.5em;&lt;br /&gt;
	/* Make all mboxes the same width regardless of text length */&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The left image cell */&lt;br /&gt;
.ambox td.mbox-image {&lt;br /&gt;
	/* 0.5em left, 0px right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0 2px 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The right image cell */&lt;br /&gt;
.ambox td.mbox-imageright {&lt;br /&gt;
	/* 0px left, 0.5em right */&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	padding: 2px 0.5em 2px 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ambox-notice {&lt;br /&gt;
	/* Blue */&lt;br /&gt;
	border-left-color: #36c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ambox-speedy {&lt;br /&gt;
	/* Pink */&lt;br /&gt;
	background-color: #fee7e6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ambox-delete,&lt;br /&gt;
table.ambox-speedy {&lt;br /&gt;
	/* Red */&lt;br /&gt;
	border-left-color: #b32424;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ambox-content {&lt;br /&gt;
	/* Orange */&lt;br /&gt;
	border-left-color: #f28500;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ambox-style {&lt;br /&gt;
	/* Yellow */&lt;br /&gt;
	border-left-color: #fc3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ambox-move {&lt;br /&gt;
	/* Purple */&lt;br /&gt;
	border-left-color: #9932cc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.ambox-protection {&lt;br /&gt;
	/* Gray-gold */&lt;br /&gt;
	border-left-color: #a2a9b1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * {{ambox|small=1}} styles&lt;br /&gt;
 *&lt;br /&gt;
 * These &amp;quot;.mbox-small&amp;quot; classes must be placed after all other&lt;br /&gt;
 * &amp;quot;.ambox&amp;quot; classes. &amp;quot;html body.mediawiki .ambox&amp;quot;&lt;br /&gt;
 * is so they override both &amp;quot;table.ambox + table.ambox&amp;quot;&lt;br /&gt;
 * and &amp;quot;table.ambox + link + table.ambox&amp;quot; above.&lt;br /&gt;
 *&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-enwp-boxes.css&lt;br /&gt;
 * @revision 2021-07-15&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
html body.mediawiki .ambox.mbox-small {&lt;br /&gt;
	clear: right;&lt;br /&gt;
	float: right;&lt;br /&gt;
	margin: 4px 0 4px 1em;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For the &amp;quot;small=left&amp;quot; option. */&lt;br /&gt;
html body.mediawiki .ambox.mbox-small-left {&lt;br /&gt;
	margin: 4px 1em 4px 0;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	width: 238px;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	line-height: 1.25em;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box&amp;diff=81</id>
		<title>Module:Message box</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Message_box&amp;diff=81"/>
		<updated>2024-01-23T03:28:15Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This is a meta-module for producing message box templates, including&lt;br /&gt;
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.&lt;br /&gt;
&lt;br /&gt;
-- Load necessary modules.&lt;br /&gt;
require(&#039;strict&#039;)&lt;br /&gt;
local getArgs&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Get a language object for formatDate and ucfirst.&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
-- Define constants&lt;br /&gt;
local CONFIG_MODULE = &#039;Module:Message box/configuration&#039;&lt;br /&gt;
local DEMOSPACES = {talk = &#039;tmbox&#039;, image = &#039;imbox&#039;, file = &#039;imbox&#039;, category = &#039;cmbox&#039;, article = &#039;ambox&#039;, main = &#039;ambox&#039;}&lt;br /&gt;
local TEMPLATE_STYLES = &#039;Module:Message box/%s.css&#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), &#039;^&#039; .. prefix .. &#039;([1-9]%d*)$&#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;
	obj.boxType = boxType&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 ~= &#039;&#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;
				obj.boxType = DEMOSPACES[demospace]&lt;br /&gt;
			elseif string.find( demospace, &#039;talk&#039; ) then&lt;br /&gt;
				-- demo as a talk page&lt;br /&gt;
				obj.cfg = cfg.tmbox&lt;br /&gt;
				obj.boxType = &#039;tmbox&#039;&lt;br /&gt;
			else&lt;br /&gt;
				-- default to ombox&lt;br /&gt;
				obj.cfg = cfg.ombox&lt;br /&gt;
				obj.boxType = &#039;ombox&#039;&lt;br /&gt;
			end&lt;br /&gt;
		elseif ns == 0 then&lt;br /&gt;
			obj.cfg = cfg.ambox -- main namespace&lt;br /&gt;
			obj.boxType = &#039;ambox&#039;&lt;br /&gt;
		elseif ns == 6 then&lt;br /&gt;
			obj.cfg = cfg.imbox -- file namespace&lt;br /&gt;
			obj.boxType = &#039;imbox&#039;&lt;br /&gt;
		elseif ns == 14 then&lt;br /&gt;
			obj.cfg = cfg.cmbox -- category namespace&lt;br /&gt;
			obj.boxType = &#039;cmbox&#039;&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;
				obj.boxType = &#039;tmbox&#039;&lt;br /&gt;
			else&lt;br /&gt;
				obj.cfg = cfg.ombox -- other namespaces or invalid input&lt;br /&gt;
				obj.boxType = &#039;ombox&#039;&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 ~= &#039;&#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(&#039;[[Category:%s|%s]]&#039;, cat, sort)&lt;br /&gt;
	else&lt;br /&gt;
		cat = string.format(&#039;[[Category:%s]]&#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;
	self.classes[class] = 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:removeClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	self.classes[class] = nil&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;
&lt;br /&gt;
	-- Find if the box has been wrongly substituted.&lt;br /&gt;
	self.isSubstituted = cfg.substCheck and args.subst == &#039;SUBST&#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;
	-- Add attributes, classes and styles.&lt;br /&gt;
	self.id = args.id&lt;br /&gt;
	self.name = args.name&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.name then&lt;br /&gt;
		self:addClass(&#039;box-&#039; .. string.gsub(self.name,&#039; &#039;,&#039;_&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	local plainlinks = yesno(args.plainlinks)&lt;br /&gt;
	if plainlinks == true then&lt;br /&gt;
		self:addClass(&#039;plainlinks&#039;)&lt;br /&gt;
	elseif plainlinks == false then&lt;br /&gt;
		self:removeClass(&#039;plainlinks&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self:addClass(cfg.smallClass or &#039;mbox-small&#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;
	-- 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;
				&#039;^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$&#039;&lt;br /&gt;
			) or self.name&lt;br /&gt;
			templateName = &#039;Template:&#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 == &#039;&#039; then&lt;br /&gt;
				sect = &#039;This &#039; .. (cfg.sectionDefault or &#039;page&#039;)&lt;br /&gt;
			elseif type(args.sect) == &#039;string&#039; then&lt;br /&gt;
				sect = &#039;This &#039; .. args.sect&lt;br /&gt;
			end&lt;br /&gt;
			local issue = args.issue&lt;br /&gt;
			issue = type(issue) == &#039;string&#039; and issue ~= &#039;&#039; and issue or nil&lt;br /&gt;
			local text = args.text&lt;br /&gt;
			text = type(text) == &#039;string&#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, &#039; &#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 == &#039;&#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 = &#039;#&#039;&lt;br /&gt;
		elseif talk == &#039;&#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&#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 = &#039;Relevant discussion may be found on&#039;&lt;br /&gt;
				if talkArgIsTalkPage then&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						&#039;%s [[%s|%s]].&#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;
						&#039;%s the [[%s#%s|talk page]].&#039;,&lt;br /&gt;
						talkText,&lt;br /&gt;
						talkTitle.prefixedText,&lt;br /&gt;
						talk&lt;br /&gt;
					)&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 ~= &#039;&#039; and args.fix or nil&lt;br /&gt;
		local date&lt;br /&gt;
		if args.date and args.date ~= &#039;&#039; then&lt;br /&gt;
			date = args.date&lt;br /&gt;
		elseif args.date == &#039;&#039; and self.isTemplatePage then&lt;br /&gt;
			date = lang:formatDate(&#039;F Y&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if date then&lt;br /&gt;
			self.date = string.format(&amp;quot; &amp;lt;small class=&#039;date-container&#039;&amp;gt;&#039;&#039;(&amp;lt;span class=&#039;date&#039;&amp;gt;%s&amp;lt;/span&amp;gt;)&#039;&#039;&amp;lt;/small&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;
	-- Set the below row.&lt;br /&gt;
	self.below = cfg.below and args.below&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;
	if cfg.imageEmptyCellStyle then&lt;br /&gt;
		self.imageEmptyCellStyle = &#039;border:none;padding:0px;width:1px&#039;&lt;br /&gt;
	end&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 ~= &#039;blank&#039; and imageLeft ~= &#039;none&#039;&lt;br /&gt;
		or not cfg.imageCheckBlank and imageLeft ~= &#039;none&#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 &#039;30x30px&#039;)&lt;br /&gt;
				or &#039;40x40px&#039;&lt;br /&gt;
			self.imageLeft = string.format(&#039;[[File:%s|%s|link=|alt=]]&#039;, self.typeImage&lt;br /&gt;
				or &#039;Imbox notice.png&#039;, imageSize)&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 == &#039;none&#039;) then&lt;br /&gt;
		self.imageRight = imageRight&lt;br /&gt;
	end&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{&#039;cat&#039;, &#039;category&#039;, &#039;all&#039;} do&lt;br /&gt;
		args[prefix .. &#039;1&#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) == &#039;string&#039; and date&lt;br /&gt;
	local preposition = &#039;from&#039;&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		local mainCat = args[&#039;cat&#039; .. tostring(num)]&lt;br /&gt;
			or args[&#039;category&#039; .. tostring(num)]&lt;br /&gt;
		local allCat = args[&#039;all&#039; .. tostring(num)]&lt;br /&gt;
		mainCat = type(mainCat) == &#039;string&#039; and mainCat&lt;br /&gt;
		allCat = type(allCat) == &#039;string&#039; and allCat&lt;br /&gt;
		if mainCat and date and date ~= &#039;&#039; then&lt;br /&gt;
			local catTitle = string.format(&#039;%s %s %s&#039;, mainCat, preposition, date)&lt;br /&gt;
			self:addCat(0, catTitle)&lt;br /&gt;
			catTitle = getTitleObject(&#039;Category:&#039; .. catTitle)&lt;br /&gt;
			if not catTitle or not catTitle.exists then&lt;br /&gt;
				self:addCat(0, &#039;Articles with invalid date parameter in template&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif mainCat and (not date or date == &#039;&#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 = &#039;C&#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.isSubstituted then&lt;br /&gt;
		self:addCat(&#039;all&#039;, &#039;Pages with incorrectly substituted templates&#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(&#039;Module:Category handler&#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:export()&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(&#039;b&#039;)&lt;br /&gt;
			:addClass(&#039;error&#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&#039;Template &amp;lt;code&amp;gt;%s[[Template:%s|%s]]%s&amp;lt;/code&amp;gt; has been incorrectly substituted.&#039;,&lt;br /&gt;
				mw.text.nowiki(&#039;{{&#039;), self.name, self.name, mw.text.nowiki(&#039;}}&#039;)&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add TemplateStyles&lt;br /&gt;
	root:wikitext(mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;,&lt;br /&gt;
		args = { src = TEMPLATE_STYLES:format(self.boxType) },&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	-- Create the box table.&lt;br /&gt;
	local boxTable&lt;br /&gt;
	-- Check for fmbox because not all interface messages have mw-parser-output&lt;br /&gt;
	-- which is necessary for TemplateStyles. Add the wrapper class if it is and&lt;br /&gt;
	-- then start the actual mbox, else start the mbox.&lt;br /&gt;
	if self.boxType == &#039;fmbox&#039; then&lt;br /&gt;
		boxTable = root:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(&#039;mw-parser-output&#039;)&lt;br /&gt;
			:tag(&#039;table&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		boxTable = root:tag(&#039;table&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	boxTable:attr(&#039;id&#039;, self.id or nil)&lt;br /&gt;
	for class, _ in pairs(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(&#039;role&#039;, &#039;presentation&#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(&#039;tr&#039;)&lt;br /&gt;
	if self.imageLeft then&lt;br /&gt;
		local imageLeftCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-image&#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(&#039;div&#039;):css(&#039;width&#039;, &#039;52px&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageLeftCell: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&#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(&#039;td&#039;)&lt;br /&gt;
			:addClass(&#039;mbox-empty-cell&#039;)&lt;br /&gt;
			:cssText(self.imageEmptyCellStyle or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the text.&lt;br /&gt;
	local textCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-text&#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(&#039;div&#039;)&lt;br /&gt;
		textCellDiv&lt;br /&gt;
			:addClass(&#039;mbox-text-span&#039;)&lt;br /&gt;
			:wikitext(self.issue or nil)&lt;br /&gt;
		if (self.talk or self.fix) and not self.isSmall then&lt;br /&gt;
			textCellDiv:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:wikitext(self.talk and (&#039; &#039; .. self.talk) or nil)&lt;br /&gt;
				:wikitext(self.fix and (&#039; &#039; .. self.fix) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		textCellDiv:wikitext(self.date and (&#039; &#039; .. self.date) or nil)&lt;br /&gt;
		if self.info and not self.isSmall then&lt;br /&gt;
			textCellDiv&lt;br /&gt;
				:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:wikitext(self.info and (&#039; &#039; .. self.info) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		if self.removalNotice then&lt;br /&gt;
			textCellDiv:tag(&#039;small&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:tag(&#039;i&#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(&#039;td&#039;):addClass(&#039;mbox-imageright&#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(&#039;div&#039;):css(&#039;width&#039;, &#039;52px&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageRightCell&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(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:attr(&#039;colspan&#039;, self.imageRight and &#039;3&#039; or &#039;2&#039;)&lt;br /&gt;
				:addClass(&#039;mbox-text&#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(&#039;div&#039;)&lt;br /&gt;
			:css(&#039;text-align&#039;, &#039;center&#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&#039;This message box is using an invalid &amp;quot;type=%s&amp;quot; parameter and needs fixing.&#039;,&lt;br /&gt;
				self.type or &#039;&#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;
	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(&#039;Module:Arguments&#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;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler/shared&amp;diff=79</id>
		<title>Module:Category handler/shared</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler/shared&amp;diff=79"/>
		<updated>2024-01-23T03:28:15Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module contains shared functions used by [[Module:Category handler]]&lt;br /&gt;
-- and its submodules.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.matchesBlacklist(page, blacklist)&lt;br /&gt;
	for i, pattern in ipairs(blacklist) do&lt;br /&gt;
		local match = mw.ustring.match(page, pattern)&lt;br /&gt;
		if match then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getParamMappings(useLoadData)&lt;br /&gt;
	local dataPage = &#039;Module:Namespace detect/data&#039;&lt;br /&gt;
	if useLoadData then&lt;br /&gt;
		return mw.loadData(dataPage).mappings&lt;br /&gt;
	else&lt;br /&gt;
		return require(dataPage).mappings&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getNamespaceParameters(titleObj, mappings)&lt;br /&gt;
	-- We don&#039;t use title.nsText for the namespace name because it adds&lt;br /&gt;
	-- underscores.&lt;br /&gt;
	local mappingsKey&lt;br /&gt;
	if titleObj.isTalkPage then&lt;br /&gt;
		mappingsKey = &#039;talk&#039;&lt;br /&gt;
	else&lt;br /&gt;
		mappingsKey = mw.site.namespaces[titleObj.namespace].name&lt;br /&gt;
	end&lt;br /&gt;
	mappingsKey = mw.ustring.lower(mappingsKey)&lt;br /&gt;
	return mappings[mappingsKey] or {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler/data&amp;diff=77</id>
		<title>Module:Category handler/data</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler/data&amp;diff=77"/>
		<updated>2024-01-23T03:28:14Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module assembles data to be passed to [[Module:Category handler]] using&lt;br /&gt;
-- mw.loadData. This includes the configuration data and whether the current&lt;br /&gt;
-- page matches the title blacklist.&lt;br /&gt;
&lt;br /&gt;
local data = require(&#039;Module:Category handler/config&#039;)&lt;br /&gt;
local mShared = require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
local blacklist = require(&#039;Module:Category handler/blacklist&#039;)&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(&lt;br /&gt;
	title.prefixedText,&lt;br /&gt;
	blacklist&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(&lt;br /&gt;
	title,&lt;br /&gt;
	mShared.getParamMappings()&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
return data&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler/config&amp;diff=75</id>
		<title>Module:Category handler/config</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler/config&amp;diff=75"/>
		<updated>2024-01-23T03:28:14Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--            [[Module:Category handler]] configuration data                  --&lt;br /&gt;
--       Language-specific parameter names and values can be set here.        --&lt;br /&gt;
--       For blacklist config, see [[Module:Category handler/blacklist]].     --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Don&#039;t edit this line.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                       Start configuration data                             --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter names                               --&lt;br /&gt;
-- These configuration items specify custom parameter names.                  --&lt;br /&gt;
-- To add one extra name, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- foo = &#039;parameter name&#039;,                                                    --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To add multiple names, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- foo = {&#039;parameter name 1&#039;, &#039;parameter name 2&#039;, &#039;parameter name 3&#039;},        --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.parameters = {&lt;br /&gt;
	&lt;br /&gt;
	-- The nocat and categories parameter suppress&lt;br /&gt;
	-- categorisation. They are used with Module:Yesno, and work as follows:&lt;br /&gt;
	--&lt;br /&gt;
	-- cfg.nocat:&lt;br /&gt;
	-- Result of yesno()                        Effect&lt;br /&gt;
	-- true                                     Categorisation is suppressed&lt;br /&gt;
	-- false                                    Categorisation is allowed, and&lt;br /&gt;
	--                                          the blacklist check is skipped&lt;br /&gt;
	-- nil                                      Categorisation is allowed&lt;br /&gt;
	--&lt;br /&gt;
	-- cfg.categories:&lt;br /&gt;
	-- Result of yesno()                        Effect&lt;br /&gt;
	-- true                                     Categorisation is allowed, and&lt;br /&gt;
	--                                          the blacklist check is skipped&lt;br /&gt;
	-- false                                    Categorisation is suppressed&lt;br /&gt;
	-- nil                                      Categorisation is allowed&lt;br /&gt;
	nocat = &#039;nocat&#039;,&lt;br /&gt;
	categories = &#039;categories&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name for the legacy &amp;quot;category2&amp;quot; parameter. This skips the&lt;br /&gt;
	-- blacklist if set to the cfg.category2Yes value, and suppresses&lt;br /&gt;
	-- categorisation if present but equal to anything other than&lt;br /&gt;
	-- cfg.category2Yes or cfg.category2Negative.&lt;br /&gt;
	category2 = &#039;category2&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- cfg.subpage is the parameter name to specify how to behave on subpages.&lt;br /&gt;
	subpage = &#039;subpage&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter for data to return in all namespaces.&lt;br /&gt;
	all = &#039;all&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name for data to return if no data is specified for the&lt;br /&gt;
	-- namespace that is detected.&lt;br /&gt;
	other = &#039;other&#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name used to specify a page other than the current page;&lt;br /&gt;
	-- used for testing and demonstration.&lt;br /&gt;
	demopage = &#039;page&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter values                              --&lt;br /&gt;
-- These are set values that can be used with certain parameters. Only one    --&lt;br /&gt;
-- value can be specified, like this:                                         --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = &#039;value name&#039;                                                     --                                               --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- The following settings are used with the cfg.category2 parameter. Setting&lt;br /&gt;
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2&lt;br /&gt;
-- is present but equal to anything other than cfg.category2Yes or&lt;br /&gt;
-- cfg.category2Negative then it supresses cateogrisation.&lt;br /&gt;
cfg.category2Yes = &#039;yes&#039;&lt;br /&gt;
cfg.category2Negative = &#039;¬&#039;&lt;br /&gt;
&lt;br /&gt;
-- The following settings are used with the cfg.subpage parameter.&lt;br /&gt;
-- cfg.subpageNo is the value to specify to not categorise on subpages;&lt;br /&gt;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.&lt;br /&gt;
cfg.subpageNo = &#039;no&#039;&lt;br /&gt;
cfg.subpageOnly = &#039;only&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           Default namespaces                               --&lt;br /&gt;
-- This is a table of namespaces to categorise by default. The keys are the   --&lt;br /&gt;
-- namespace numbers.                                                         --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.defaultNamespaces = {&lt;br /&gt;
	[  0] = true, -- main&lt;br /&gt;
	[  6] = true, -- file&lt;br /&gt;
	[ 12] = true, -- help&lt;br /&gt;
	[ 14] = true, -- category&lt;br /&gt;
	[100] = true, -- portal&lt;br /&gt;
	[108] = true, -- book&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                                Wrappers                                    --&lt;br /&gt;
-- This is a wrapper template or a list of wrapper templates to be passed to  --&lt;br /&gt;
-- [[Module:Arguments]].                                                      --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.wrappers = &#039;Template:Category handler&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           End configuration data                           --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return cfg -- Don&#039;t edit this line.&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler/blacklist&amp;diff=73</id>
		<title>Module:Category handler/blacklist</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler/blacklist&amp;diff=73"/>
		<updated>2024-01-23T03:28:13Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module contains the blacklist used by [[Module:Category handler]].&lt;br /&gt;
-- Pages that match Lua patterns in this list will not be categorised unless&lt;br /&gt;
-- categorisation is explicitly requested.&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
    &#039;/[aA]rchive&#039; -- Don&#039;t categorise archives.&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler&amp;diff=71</id>
		<title>Module:Category handler</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Category_handler&amp;diff=71"/>
		<updated>2024-01-23T03:28:13Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--                              CATEGORY HANDLER                              --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--      This module implements the {{category handler}} template in Lua,      --&lt;br /&gt;
--      with a few improvements: all namespaces and all namespace aliases     --&lt;br /&gt;
--      are supported, and namespace names are detected automatically for     --&lt;br /&gt;
--      the local wiki. This module requires [[Module:Namespace detect]]      --&lt;br /&gt;
--      and [[Module:Yesno]] to be available on the local wiki. It can be     --&lt;br /&gt;
--      configured for different wikis by altering the values in              --&lt;br /&gt;
--      [[Module:Category handler/config]], and pages can be blacklisted      --&lt;br /&gt;
--      from categorisation by using [[Module:Category handler/blacklist]].   --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Load required modules&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily load things we don&#039;t always need&lt;br /&gt;
local mShared, mappings&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function trimWhitespace(s, removeBlanks)&lt;br /&gt;
	if type(s) ~= &#039;string&#039; then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	s = s:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	if removeBlanks then&lt;br /&gt;
		if s ~= &#039;&#039; then&lt;br /&gt;
			return s&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- CategoryHandler class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local CategoryHandler = {}&lt;br /&gt;
CategoryHandler.__index = CategoryHandler&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler.new(data, args)&lt;br /&gt;
	local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)&lt;br /&gt;
	&lt;br /&gt;
	-- Set the title object&lt;br /&gt;
	do&lt;br /&gt;
		local pagename = obj:parameter(&#039;demopage&#039;)&lt;br /&gt;
		local success, titleObj&lt;br /&gt;
		if pagename then&lt;br /&gt;
			success, titleObj = pcall(mw.title.new, pagename)&lt;br /&gt;
		end&lt;br /&gt;
		if success and titleObj then&lt;br /&gt;
			obj.title = titleObj&lt;br /&gt;
			if titleObj == mw.title.getCurrentTitle() then&lt;br /&gt;
				obj._usesCurrentTitle = true&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			obj.title = mw.title.getCurrentTitle()&lt;br /&gt;
			obj._usesCurrentTitle = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set suppression parameter values&lt;br /&gt;
	for _, key in ipairs{&#039;nocat&#039;, &#039;categories&#039;} do&lt;br /&gt;
		local value = obj:parameter(key)&lt;br /&gt;
		value = trimWhitespace(value, true)&lt;br /&gt;
		obj[&#039;_&#039; .. key] = yesno(value)&lt;br /&gt;
	end&lt;br /&gt;
	do&lt;br /&gt;
		local subpage = obj:parameter(&#039;subpage&#039;)&lt;br /&gt;
		local category2 = obj:parameter(&#039;category2&#039;)&lt;br /&gt;
		if type(subpage) == &#039;string&#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(subpage)&lt;br /&gt;
		end&lt;br /&gt;
		if type(category2) == &#039;string&#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(category2)&lt;br /&gt;
		end&lt;br /&gt;
		obj._subpage = trimWhitespace(subpage, true)&lt;br /&gt;
		obj._category2 = trimWhitespace(category2) -- don&#039;t remove blank values&lt;br /&gt;
	end&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:parameter(key)&lt;br /&gt;
	local parameterNames = self._data.parameters[key]&lt;br /&gt;
	local pntype = type(parameterNames)&lt;br /&gt;
	if pntype == &#039;string&#039; or pntype == &#039;number&#039; then&lt;br /&gt;
		return self._args[parameterNames]&lt;br /&gt;
	elseif pntype == &#039;table&#039; then&lt;br /&gt;
		for _, name in ipairs(parameterNames) do&lt;br /&gt;
			local value = self._args[name]&lt;br /&gt;
			if value ~= nil then&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;invalid config key &amp;quot;%s&amp;quot;&#039;,&lt;br /&gt;
			tostring(key)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressedByArguments()&lt;br /&gt;
	return&lt;br /&gt;
		-- See if a category suppression argument has been set.&lt;br /&gt;
		self._nocat == true&lt;br /&gt;
		or self._categories == false&lt;br /&gt;
		or (&lt;br /&gt;
			self._category2&lt;br /&gt;
			and self._category2 ~= self._data.category2Yes&lt;br /&gt;
			and self._category2 ~= self._data.category2Negative&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		-- Check whether we are on a subpage, and see if categories are&lt;br /&gt;
		-- suppressed based on our subpage status.&lt;br /&gt;
		or self._subpage == self._data.subpageNo and self.title.isSubpage&lt;br /&gt;
		or self._subpage == self._data.subpageOnly and not self.title.isSubpage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:shouldSkipBlacklistCheck()&lt;br /&gt;
	-- Check whether the category suppression arguments indicate we&lt;br /&gt;
	-- should skip the blacklist check.&lt;br /&gt;
	return self._nocat == false&lt;br /&gt;
		or self._categories == true&lt;br /&gt;
		or self._category2 == self._data.category2Yes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:matchesBlacklist()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleMatchesBlacklist&lt;br /&gt;
	else&lt;br /&gt;
		mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
		return mShared.matchesBlacklist(&lt;br /&gt;
			self.title.prefixedText,&lt;br /&gt;
			mw.loadData(&#039;Module:Category handler/blacklist&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressed()&lt;br /&gt;
	-- Find if categories are suppressed by either the arguments or by&lt;br /&gt;
	-- matching the blacklist.&lt;br /&gt;
	return self:isSuppressedByArguments()&lt;br /&gt;
		or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getNamespaceParameters()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleNamespaceParameters&lt;br /&gt;
	else&lt;br /&gt;
		if not mappings then&lt;br /&gt;
			mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
			mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
		end&lt;br /&gt;
		return mShared.getNamespaceParameters(&lt;br /&gt;
			self.title,&lt;br /&gt;
			mappings&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:namespaceParametersExist()&lt;br /&gt;
	-- Find whether any namespace parameters have been specified.&lt;br /&gt;
	-- We use the order &amp;quot;all&amp;quot; --&amp;gt; namespace params --&amp;gt; &amp;quot;other&amp;quot; as this is what&lt;br /&gt;
	-- the old template did.&lt;br /&gt;
	if self:parameter(&#039;all&#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	if not mappings then&lt;br /&gt;
		mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
		mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
	end&lt;br /&gt;
	for ns, params in pairs(mappings) do&lt;br /&gt;
		for i, param in ipairs(params) do&lt;br /&gt;
			if self._args[param] then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if self:parameter(&#039;other&#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getCategories()&lt;br /&gt;
	local params = self:getNamespaceParameters()&lt;br /&gt;
	local nsCategory&lt;br /&gt;
	for i, param in ipairs(params) do&lt;br /&gt;
		local value = self._args[param]&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			nsCategory = value&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if nsCategory ~= nil or self:namespaceParametersExist() then&lt;br /&gt;
		-- Namespace parameters exist - advanced usage.&lt;br /&gt;
		if nsCategory == nil then&lt;br /&gt;
			nsCategory = self:parameter(&#039;other&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local ret = {self:parameter(&#039;all&#039;)}&lt;br /&gt;
		local numParam = tonumber(nsCategory)&lt;br /&gt;
		if numParam and numParam &amp;gt;= 1 and math.floor(numParam) == numParam then&lt;br /&gt;
			-- nsCategory is an integer&lt;br /&gt;
			ret[#ret + 1] = self._args[numParam]&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = nsCategory&lt;br /&gt;
		end&lt;br /&gt;
		if #ret &amp;lt; 1 then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return table.concat(ret)&lt;br /&gt;
		end&lt;br /&gt;
	elseif self._data.defaultNamespaces[self.title.namespace] then&lt;br /&gt;
		-- Namespace parameters don&#039;t exist, simple usage.&lt;br /&gt;
		return self._args[1]&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- Used for testing purposes.&lt;br /&gt;
	return {&lt;br /&gt;
		CategoryHandler = CategoryHandler&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, data)&lt;br /&gt;
	data = data or mw.loadData(&#039;Module:Category handler/data&#039;)&lt;br /&gt;
	local handler = CategoryHandler.new(data, args)&lt;br /&gt;
	if handler:isSuppressed() then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return handler:getCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, data)&lt;br /&gt;
	data = data or mw.loadData(&#039;Module:Category handler/data&#039;)&lt;br /&gt;
	local args = require(&#039;Module:Arguments&#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = data.wrappers,&lt;br /&gt;
		valueFunc = function (k, v)&lt;br /&gt;
			v = trimWhitespace(v)&lt;br /&gt;
			if type(k) == &#039;number&#039; then&lt;br /&gt;
				if v ~= &#039;&#039; then&lt;br /&gt;
					return v&lt;br /&gt;
				else&lt;br /&gt;
					return nil&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args, data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Module:Arguments&amp;diff=69</id>
		<title>Module:Arguments</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Module:Arguments&amp;diff=69"/>
		<updated>2024-01-23T03:28:13Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&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(&#039;libraryUtil&#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&#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) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#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) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#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) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#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 == &#039;string&#039; or tp == &#039;number&#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(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#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&#039;s availability. If we weren&#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) == &#039;table&#039; and type(frame.getParent) == &#039;function&#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&#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(&#039;/sandbox$&#039;, &#039;&#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) == &#039;table&#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&#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&#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) ~= &#039;function&#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &#039;valueFunc&#039;&amp;quot;&lt;br /&gt;
					.. &#039;(function expected, got &#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &#039;)&#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 &#039;s&#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] ~= &#039;h&#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &#039;s&#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) == &#039;string&#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] = &#039;h&#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) == &#039;string&#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;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; the table is read-only&#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;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; overwriting existing arguments is not permitted&#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&#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] = &#039;h&#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) ~= &#039;string&#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&#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;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Tmbox/doc&amp;diff=67</id>
		<title>Template:Tmbox/doc</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Tmbox/doc&amp;diff=67"/>
		<updated>2024-01-23T03:28:12Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TemplateData ==&lt;br /&gt;
{{Mbox/TemplateData}}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Tmbox&amp;diff=65</id>
		<title>Template:Tmbox</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Tmbox&amp;diff=65"/>
		<updated>2024-01-23T03:28:12Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Message box|tmbox}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Tlx&amp;diff=63</id>
		<title>Template:Tlx</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Tlx&amp;diff=63"/>
		<updated>2024-01-23T03:28:12Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{((}}[[Template:{{{1}}}|{{{1}}}]]{{))}}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Ombox/doc&amp;diff=61</id>
		<title>Template:Ombox/doc</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Ombox/doc&amp;diff=61"/>
		<updated>2024-01-23T03:28:12Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TemplateData ==&lt;br /&gt;
{{Mbox/TemplateData}}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Ombox&amp;diff=59</id>
		<title>Template:Ombox</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Ombox&amp;diff=59"/>
		<updated>2024-01-23T03:28:12Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Message box|ombox}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Mbox/doc&amp;diff=57</id>
		<title>Template:Mbox/doc</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Mbox/doc&amp;diff=57"/>
		<updated>2024-01-23T03:28:12Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== TemplateData ===&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;This is the {{mbox}} or “multi namespace message box” meta-template.&amp;quot;,&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;block&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;demospace&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Demo Namespace&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;main&amp;quot;,&lt;br /&gt;
				&amp;quot;talk&amp;quot;,&lt;br /&gt;
				&amp;quot;file&amp;quot;,&lt;br /&gt;
				&amp;quot;category&amp;quot;,&lt;br /&gt;
				&amp;quot;other&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;type&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;speedy&amp;quot;,&lt;br /&gt;
				&amp;quot;delete&amp;quot;,&lt;br /&gt;
				&amp;quot;content&amp;quot;,&lt;br /&gt;
				&amp;quot;style&amp;quot;,&lt;br /&gt;
				&amp;quot;notice&amp;quot;,&lt;br /&gt;
				&amp;quot;move&amp;quot;,&lt;br /&gt;
				&amp;quot;protection&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;notice&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;image&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image (left)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;Depends on the “type” parameter.&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;imageright&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image (right)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;style&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;CSS Style&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;textstyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Text CSS Style&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;text&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;small&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small?&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;{{{small|}}}&amp;quot;,&lt;br /&gt;
				&amp;quot;left&amp;quot;,&lt;br /&gt;
				&amp;quot;yes&amp;quot;,&lt;br /&gt;
				&amp;quot;1&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smallimage&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Image (left)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{image}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smallimageright&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Image (right)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{imageright}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smalltext&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Text&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{text}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Message boxes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Template&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| {{tlx|ambox}}&lt;br /&gt;
| Article message box, identifies problems or issues with the article&lt;br /&gt;
|-&lt;br /&gt;
| {{tlx|cmbox}}&lt;br /&gt;
| Category message box, {{tlx|ambox}} for categories&lt;br /&gt;
|-&lt;br /&gt;
| {{tlx|imbox}}&lt;br /&gt;
| Image message box, {{tlx|ambox}} for file (image) pages&lt;br /&gt;
|-&lt;br /&gt;
| {{tlx|ombox}}&lt;br /&gt;
| Other pages message box, {{tlx|ambox}} for pages of the types User, Wikipedia, MediaWiki, Template, Help, Portal and any new future namespaces&lt;br /&gt;
|-&lt;br /&gt;
| {{tlx|tmbox}}&lt;br /&gt;
| Talk page message box, {{tlx|ambox}} for talk pages&lt;br /&gt;
|-&lt;br /&gt;
! colspan = 2 | The following templates are not called by Mbox&lt;br /&gt;
|-&lt;br /&gt;
| {{tlx|fmbox}}&lt;br /&gt;
| used in system messages&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Mbox/TemplateData&amp;diff=55</id>
		<title>Template:Mbox/TemplateData</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Mbox/TemplateData&amp;diff=55"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;This is the specialized version of the {{mbox}} or “multi namespace message box” meta-template.&amp;quot;,&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;block&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;type&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Type&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;speedy&amp;quot;,&lt;br /&gt;
				&amp;quot;delete&amp;quot;,&lt;br /&gt;
				&amp;quot;content&amp;quot;,&lt;br /&gt;
				&amp;quot;style&amp;quot;,&lt;br /&gt;
				&amp;quot;notice&amp;quot;,&lt;br /&gt;
				&amp;quot;move&amp;quot;,&lt;br /&gt;
				&amp;quot;protection&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;notice&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;image&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image (left)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;Depends on the “type” parameter.&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;imageright&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Image (right)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;style&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;CSS Style&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;textstyle&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Text CSS Style&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;text&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;small&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small?&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;{{{small|}}}&amp;quot;,&lt;br /&gt;
				&amp;quot;left&amp;quot;,&lt;br /&gt;
				&amp;quot;yes&amp;quot;,&lt;br /&gt;
				&amp;quot;1&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;boolean&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smallimage&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Image (left)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{image}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smallimageright&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Image (right)&amp;quot;,&lt;br /&gt;
			&amp;quot;suggestedvalues&amp;quot;: [&lt;br /&gt;
				&amp;quot;none&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{imageright}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;smalltext&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Small Text&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;{{{text}}}&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;content&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Mbox&amp;diff=53</id>
		<title>Template:Mbox</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Mbox&amp;diff=53"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Message box|mbox}}&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;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Imbox/doc&amp;diff=51</id>
		<title>Template:Imbox/doc</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Imbox/doc&amp;diff=51"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TemplateData ==&lt;br /&gt;
{{Mbox/TemplateData}}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Imbox&amp;diff=49</id>
		<title>Template:Imbox</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Imbox&amp;diff=49"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Message box|imbox}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Fmbox/doc&amp;diff=47</id>
		<title>Template:Fmbox/doc</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Fmbox/doc&amp;diff=47"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TemplateData ==&lt;br /&gt;
{{Mbox/TemplateData}}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Fmbox&amp;diff=45</id>
		<title>Template:Fmbox</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Fmbox&amp;diff=45"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Message box|fmbox}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Documentation&amp;diff=43</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Documentation&amp;diff=43"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{/doc}}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Cmbox/doc&amp;diff=41</id>
		<title>Template:Cmbox/doc</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Cmbox/doc&amp;diff=41"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TemplateData ==&lt;br /&gt;
{{Mbox/TemplateData}}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Cmbox&amp;diff=39</id>
		<title>Template:Cmbox</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Cmbox&amp;diff=39"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Message box|cmbox}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Ambox/doc&amp;diff=37</id>
		<title>Template:Ambox/doc</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Ambox/doc&amp;diff=37"/>
		<updated>2024-01-23T03:28:11Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TemplateData ==&lt;br /&gt;
{{Mbox/TemplateData}}&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.sc07.club/w/index.php?title=Template:Ambox&amp;diff=35</id>
		<title>Template:Ambox</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.sc07.club/w/index.php?title=Template:Ambox&amp;diff=35"/>
		<updated>2024-01-23T03:28:10Z</updated>

		<summary type="html">&lt;p&gt;Grant: 1 revision imported: Add message boxes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Message box|ambox}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Grant</name></author>
	</entry>
</feed>