<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-CA">
	<id>https://covtlepedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AExtension</id>
	<title>Module:Extension - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://covtlepedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AExtension"/>
	<link rel="alternate" type="text/html" href="https://covtlepedia.org/w/index.php?title=Module:Extension&amp;action=history"/>
	<updated>2026-04-04T04:13:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://covtlepedia.org/w/index.php?title=Module:Extension&amp;diff=541&amp;oldid=prev</id>
		<title>Johanna: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://covtlepedia.org/w/index.php?title=Module:Extension&amp;diff=541&amp;oldid=prev"/>
		<updated>2025-10-10T14:20:41Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-CA&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:20, 10 October 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en-CA&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Johanna</name></author>
	</entry>
	<entry>
		<id>https://covtlepedia.org/w/index.php?title=Module:Extension&amp;diff=540&amp;oldid=prev</id>
		<title>MediaWiki&gt;Tactica: Add new &quot;ai&quot; type for AI related extensions.</title>
		<link rel="alternate" type="text/html" href="https://covtlepedia.org/w/index.php?title=Module:Extension&amp;diff=540&amp;oldid=prev"/>
		<updated>2025-10-05T15:05:30Z</updated>

		<summary type="html">&lt;p&gt;Add new &amp;quot;ai&amp;quot; type for AI related extensions.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local lang = mw.language.getContentLanguage()&lt;br /&gt;
local translation = mw.getCurrentFrame():callParserFunction{name=&amp;#039;#translation&amp;#039;, args=&amp;quot;1&amp;quot;}&lt;br /&gt;
local addr = {&lt;br /&gt;
	GNU = &amp;#039;//www.gnu.org/licenses/&amp;#039;,&lt;br /&gt;
	OSI = &amp;#039;//opensource.org/licenses/&amp;#039;,&lt;br /&gt;
	CC  = &amp;#039;//creativecommons.org/licenses/&amp;#039;,&lt;br /&gt;
	Mozilla = &amp;#039;//www.mozilla.org/&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
local cats = {&lt;br /&gt;
	GPL    = &amp;#039;GPL licensed extensions&amp;#039;,&lt;br /&gt;
	FDL    = &amp;#039;FDL licensed extensions&amp;#039;,&lt;br /&gt;
	LGPL   = &amp;#039;LGPL licensed extensions&amp;#039;,&lt;br /&gt;
	AGPL   = &amp;#039;AGPL licensed extensions&amp;#039;,&lt;br /&gt;
	MIT    = &amp;#039;MIT licensed extensions&amp;#039;,&lt;br /&gt;
	ISC    = &amp;#039;ISC licensed extensions&amp;#039;,&lt;br /&gt;
	BSD    = &amp;#039;BSD licensed extensions&amp;#039;,&lt;br /&gt;
	MPL    = &amp;#039;MPL licensed extensions&amp;#039;,&lt;br /&gt;
	WTFPL  = &amp;#039;WTFPL licensed extensions&amp;#039;,&lt;br /&gt;
	Apache = &amp;#039;Apache licensed extensions&amp;#039;,&lt;br /&gt;
	PD     = &amp;#039;Public domain licensed extensions&amp;#039;,&lt;br /&gt;
	CC     = &amp;#039;Creative Commons licensed extensions&amp;#039;,&lt;br /&gt;
	ECL    = &amp;#039;Educational Community licensed extensions&amp;#039;,&lt;br /&gt;
	Unlicense = &amp;#039;The Unlicense licensed extensions&amp;#039;,&lt;br /&gt;
	BLANK  = &amp;#039;Extensions with no license specified&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
local licenses = {&lt;br /&gt;
	[&amp;#039;AGPL-3.0&amp;#039;]     = { addr.GNU .. &amp;#039;agpl-3.0.html&amp;#039;, &amp;#039;GNU Affero General Public License 3.0&amp;#039;, &amp;#039;AGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;AGPL-3.0-only&amp;#039;]     = { addr.GNU .. &amp;#039;agpl-3.0.html&amp;#039;, &amp;#039;GNU Affero General Public License 3.0&amp;#039;, &amp;#039;AGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;AGPL-3.0-or-later&amp;#039;] = { addr.GNU .. &amp;#039;agpl-3.0.html&amp;#039;, &amp;#039;GNU Affero General Public License 3.0 or later&amp;#039;, &amp;#039;AGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;Apache-2.0&amp;#039;]   = { &amp;#039;//www.apache.org/licenses/LICENSE-2.0&amp;#039;, &amp;#039;Apache License 2.0&amp;#039;, &amp;#039;Apache&amp;#039; },&lt;br /&gt;
	[&amp;#039;BSD-2-Clause&amp;#039;] = { addr.OSI .. &amp;#039;BSD-2-Clause&amp;#039;, &amp;#039;BSD 2-clause &amp;quot;Simplified&amp;quot; License&amp;#039;, &amp;#039;BSD&amp;#039; },&lt;br /&gt;
	[&amp;#039;BSD-3-Clause&amp;#039;] = { addr.OSI .. &amp;#039;BSD-3-Clause&amp;#039;, &amp;#039;BSD 3-clause &amp;quot;Modified&amp;quot; License&amp;#039;, &amp;#039;BSD&amp;#039; },&lt;br /&gt;
	[&amp;#039;BSD-4-Clause&amp;#039;] = { addr.GNU .. &amp;#039;license-list.html#OriginalBSD&amp;#039;, &amp;#039;BSD 4-clause &amp;quot;Original&amp;quot; License&amp;#039;, &amp;#039;BSD&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-3.0&amp;#039;]    = { addr.CC .. &amp;#039;by/3.0/&amp;#039;, &amp;#039;Creative Commons Attribution 3.0&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-3.0-US&amp;#039;] = { addr.CC .. &amp;#039;by/3.0/us/&amp;#039;, &amp;#039;Creative Commons Attribution 3.0 United States&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-NC-3.0&amp;#039;] = { addr.CC .. &amp;#039;by-nc/3.0/&amp;#039;, &amp;#039;Creative Commons Attribution NonCommercial 3.0&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-NC-SA-2.5&amp;#039;] = { addr.CC .. &amp;#039;by-nc-sa/2.5/&amp;#039;, &amp;#039;Creative Commons Attribution NonCommercial Share Alike 2.5&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-NC-SA-3.0&amp;#039;] = { addr.CC .. &amp;#039;by-nc-sa/3.0/&amp;#039;, &amp;#039;Creative Commons Attribution NonCommercial Share Alike 3.0&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-NC-SA-4.0&amp;#039;] = { addr.CC .. &amp;#039;by-nc-sa/4.0/&amp;#039;, &amp;#039;Creative Commons Attribution NonCommercial Share Alike 4.0&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-SA-2.0&amp;#039;] = { addr.CC .. &amp;#039;by-sa/2.0/&amp;#039;, &amp;#039;Creative Commons Attribution Share Alike 2.0&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-SA-2.0-UK&amp;#039;] = { addr.CC .. &amp;#039;by-sa/2.0/uk/&amp;#039;, &amp;#039;Creative Commons Attribution Share Alike 2.0 England and Wales&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-SA-2.5&amp;#039;] = { addr.CC .. &amp;#039;by-sa/2.5/&amp;#039;, &amp;#039;Creative Commons Attribution Share Alike 2.5&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-SA-3.0&amp;#039;] = { addr.CC .. &amp;#039;by-sa/3.0/&amp;#039;, &amp;#039;Creative Commons Attribution Share Alike 3.0&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC-BY-SA-4.0&amp;#039;] = { addr.CC .. &amp;#039;by-sa/4.0/&amp;#039;, &amp;#039;Creative Commons Attribution Share Alike 4.0&amp;#039;, &amp;#039;CC&amp;#039; },&lt;br /&gt;
	[&amp;#039;CC0-1.0&amp;#039;]      = { &amp;#039;//creativecommons.org/publicdomain/zero/1.0/&amp;#039;, &amp;#039;Creative Commons Zero v1.0 Universal&amp;#039;, &amp;#039;PD&amp;#039; },&lt;br /&gt;
	[&amp;#039;ECL-2.0&amp;#039;]      = { &amp;#039;&amp;#039;, &amp;#039;[[wikipedia:Educational Community License|Educational Community License 2.0]]&amp;#039;, &amp;#039;ECL&amp;#039; },&lt;br /&gt;
	[&amp;#039;FDL&amp;#039;]          = { addr.GNU .. &amp;#039;fdl.html&amp;#039;, &amp;#039;GNU Free Documentation License&amp;#039;, &amp;#039;FDL&amp;#039; },&lt;br /&gt;
	[&amp;#039;GPL-2.0&amp;#039;]      = { addr.GNU .. &amp;#039;old-licenses/gpl-2.0-standalone.html&amp;#039;, &amp;#039;GNU General Public License 2.0&amp;#039;, &amp;#039;GPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;GPL-2.0-only&amp;#039;] = { addr.GNU .. &amp;#039;old-licenses/gpl-2.0-standalone.html&amp;#039;, &amp;#039;GNU General Public License 2.0 only&amp;#039;, &amp;#039;GPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;GPL-2.0-or-later&amp;#039;] = { addr.GNU .. &amp;#039;old-licenses/gpl-2.0-standalone.html&amp;#039;, &amp;#039;GNU General Public License 2.0 or later&amp;#039;, &amp;#039;GPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;GPL-3.0&amp;#039;]      = { addr.GNU .. &amp;#039;gpl-3.0-standalone.html&amp;#039;, &amp;#039;GNU General Public License 3.0&amp;#039;, &amp;#039;GPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;GPL-3.0-only&amp;#039;] = { addr.GNU .. &amp;#039;gpl-3.0-standalone.html&amp;#039;, &amp;#039;GNU General Public License 3.0 only&amp;#039;, &amp;#039;GPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;GPL-3.0-or-later&amp;#039;] = { addr.GNU .. &amp;#039;gpl-3.0-standalone.html&amp;#039;, &amp;#039;GNU General Public License 3.0 or later&amp;#039;, &amp;#039;GPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;ISC&amp;#039;]          = { addr.OSI .. &amp;#039;ISC&amp;#039;, &amp;#039;ISC License&amp;#039;, &amp;#039;ISC&amp;#039; },&lt;br /&gt;
	[&amp;#039;LGPL-2.0-only&amp;#039;] = { addr.GNU .. &amp;#039;old-licenses/lgpl-2.0-standalone.html&amp;#039;, &amp;#039;GNU Library General Public License v2 only&amp;#039;, &amp;#039;LGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;LGPL-2.1&amp;#039;]     = { addr.GNU .. &amp;#039;old-licenses/lgpl-2.1-standalone.html&amp;#039;, &amp;#039;GNU Lesser General Public License 2.1&amp;#039;, &amp;#039;LGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;LGPL-2.1-only&amp;#039;] = { addr.GNU .. &amp;#039;old-licenses/lgpl-2.1-standalone.html&amp;#039;, &amp;#039;GNU Lesser General Public License 2.1 only&amp;#039;, &amp;#039;LGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;LGPL-2.1-or-later&amp;#039;] = { addr.GNU .. &amp;#039;old-licenses/lgpl-2.1-standalone.html&amp;#039;, &amp;#039;GNU Lesser General Public License 2.1 or later&amp;#039;, &amp;#039;LGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;LGPL-3.0&amp;#039;]     = { addr.GNU .. &amp;#039;lgpl-3.0-standalone.html&amp;#039;, &amp;#039;GNU Lesser General Public License 3.0&amp;#039;, &amp;#039;LGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;LGPL-3.0-only&amp;#039;] = { addr.GNU .. &amp;#039;lgpl-3.0-standalone.html&amp;#039;, &amp;#039;GNU Lesser General Public License 3.0 only&amp;#039;, &amp;#039;LGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;LGPL-3.0-or-later&amp;#039;] = { addr.GNU .. &amp;#039;lgpl-3.0-standalone.html&amp;#039;, &amp;#039;GNU Lesser General Public License 3.0 or later&amp;#039;, &amp;#039;LGPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;MIT&amp;#039;]          = { addr.OSI .. &amp;#039;mit-license.php&amp;#039;, &amp;#039;MIT License&amp;#039;, &amp;#039;MIT&amp;#039; },&lt;br /&gt;
	[&amp;#039;MPL-1.0&amp;#039;]      = { addr.Mozilla .. &amp;#039;MPL/1.0/&amp;#039;, &amp;#039;Mozilla Public License 1.0&amp;#039;, &amp;#039;MPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;MPL-2.0&amp;#039;]      = { addr.Mozilla .. &amp;#039;MPL/2.0/&amp;#039;, &amp;#039;Mozilla Public License 2.0&amp;#039;, &amp;#039;MPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;PD&amp;#039;]           = { &amp;#039;&amp;#039;, &amp;#039;[[wikipedia:Public domain|Public domain]]&amp;#039;, &amp;#039;PD&amp;#039; },&lt;br /&gt;
	[&amp;#039;Unlicense&amp;#039;]    = { &amp;#039;https://unlicense.org/&amp;#039;, &amp;#039;The Unlicense&amp;#039;, &amp;#039;Unlicense&amp;#039; },&lt;br /&gt;
	[&amp;#039;WTFPL&amp;#039;]        = { &amp;#039;http://www.wtfpl.net&amp;#039;, &amp;#039;WTFPL 2.0&amp;#039;, &amp;#039;WTFPL&amp;#039; },&lt;br /&gt;
	[&amp;#039;Zlib&amp;#039;]         = { addr.OSI .. &amp;#039;Zlib&amp;#039;, &amp;#039;zlib License&amp;#039; },&lt;br /&gt;
	[&amp;#039;unspecified&amp;#039;]  = { &amp;#039;&amp;#039;, &amp;#039;No license specified&amp;#039;, &amp;#039;BLANK&amp;#039;}&lt;br /&gt;
}&lt;br /&gt;
local types = {&lt;br /&gt;
	ai                  = { &amp;#039;[[w:Artificial intelligence|Artificial intelligence]]&amp;#039;,  &amp;#039;Artificial intelligence extensions&amp;#039; },&lt;br /&gt;
	ajax                = { &amp;#039;[[w:AJAX|Ajax]]&amp;#039;,                                        &amp;#039;Ajax extensions&amp;#039; },&lt;br /&gt;
	api                 = { &amp;#039;[[API:Action API|API]]&amp;#039;,                                 &amp;#039;API extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;beta feature&amp;#039;]    = { &amp;#039;[[Beta Features|Beta Feature]]&amp;#039;,                         &amp;#039;Beta Feature extensions&amp;#039; },&lt;br /&gt;
	contenthandler      = { &amp;#039;[[Manual:ContentHandler|ContentHandler]]&amp;#039;,               &amp;#039;ContentHandler extensions&amp;#039; },&lt;br /&gt;
	database            = { &amp;#039;[[Manual:Database layout|Database]]&amp;#039;,                    &amp;#039;Database extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;data extraction&amp;#039;] = { &amp;#039;Data extraction&amp;#039;,                                        &amp;#039;Data extraction extensions&amp;#039; },&lt;br /&gt;
	example             = { &amp;#039;Example&amp;#039;,                                                &amp;#039;Extension examples&amp;#039; },&lt;br /&gt;
	[&amp;#039;extended syntax&amp;#039;] = { &amp;#039;[[Manual:Extending wiki markup|Extended syntax]]&amp;#039;,       &amp;#039;Extended syntax extensions&amp;#039; },&lt;br /&gt;
	filerepo            = { &amp;#039;File repository&amp;#039;,                                        &amp;#039;File repository extensions&amp;#039; },&lt;br /&gt;
	hook                = { &amp;#039;[[Manual:Hooks|Hook]]&amp;#039;,                                  &amp;#039;Hook extensions&amp;#039; },&lt;br /&gt;
	interface           = { &amp;#039;User interface&amp;#039;,                                         &amp;#039;User interface extensions&amp;#039; },&lt;br /&gt;
	link                = { &amp;#039;[[Manual:Extending wiki markup|Link markup]]&amp;#039;,           &amp;#039;Link markup extensions&amp;#039; },&lt;br /&gt;
	media               = { &amp;#039;Media&amp;#039;,                                                  &amp;#039;Media handling extensions&amp;#039; },&lt;br /&gt;
	mywiki              = { &amp;#039;[[Manual:Personalization|MyWiki]]&amp;#039;,                      &amp;#039;Personalization extensions&amp;#039; },&lt;br /&gt;
	notify              = { &amp;#039;Notify&amp;#039;,                                                 &amp;#039;Notification extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;page action&amp;#039;]     = { &amp;#039;[[Manual:Parameters to index.php#Actions|Page action]]&amp;#039;, &amp;#039;Page action extensions&amp;#039; },&lt;br /&gt;
	parser              = { &amp;#039;[[Manual:Extending wiki markup|Parser extension]]&amp;#039;,      &amp;#039;Parser extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;parser function&amp;#039;] = { &amp;#039;[[Manual:Parser functions|Parser function]]&amp;#039;,            &amp;#039;Parser function extensions&amp;#039; },&lt;br /&gt;
	php                 = { &amp;#039;PHP&amp;#039;,                                                    &amp;#039;PHP extensions&amp;#039; },&lt;br /&gt;
	search              = { &amp;#039;Search&amp;#039;,                                                 &amp;#039;Search extensions&amp;#039; },&lt;br /&gt;
	skin                = { &amp;#039;[[Manual:Skins|Skin]]&amp;#039;,                                  &amp;#039;Skin extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;special page&amp;#039;]    = { &amp;#039;[[Manual:Special pages|Special page]]&amp;#039;,                  &amp;#039;Special page extensions&amp;#039; },&lt;br /&gt;
	locale              = { &amp;#039;[[Manual:Localization|Locale]]&amp;#039;,                         &amp;#039;Internationalization extensions&amp;#039; },&lt;br /&gt;
	tag                 = { &amp;#039;[[Manual:Tag extensions|Tag]]&amp;#039;,                          &amp;#039;Tag extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;user access&amp;#039;]     = { &amp;#039;[[Manual:Security|User access]]&amp;#039;,                        &amp;#039;User access extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;user identity&amp;#039;]   = { &amp;#039;[[Manual:Security|User identity]]&amp;#039;,                      &amp;#039;User identity extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;user rights&amp;#039;]     = { &amp;#039;[[Manual:Security|User rights]]&amp;#039;,                        &amp;#039;User rights extensions&amp;#039; },&lt;br /&gt;
	[&amp;#039;user activity&amp;#039;]   = { &amp;#039;[[Manual:Security|User activity]]&amp;#039;,                      &amp;#039;User activity extensions&amp;#039; },&lt;br /&gt;
	variable            = { &amp;#039;[[Manual:Variables|Variable]]&amp;#039;,                          &amp;#039;Variable extensions&amp;#039; },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local typeAliases = {&lt;br /&gt;
	db = &amp;#039;database&amp;#039;,&lt;br /&gt;
	pfunc = &amp;#039;parser function&amp;#039;,&lt;br /&gt;
	special = &amp;#039;special page&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function setI18n( from, to, index )&lt;br /&gt;
	for n, v in pairs( from ) do&lt;br /&gt;
		if to[n] then&lt;br /&gt;
			to[n][index] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function cat( title )&lt;br /&gt;
	return &amp;#039;[[Category:&amp;#039; .. title .. &amp;#039;]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tcat( title )&lt;br /&gt;
	return cat( title .. translation )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getType( str, str2 )&lt;br /&gt;
	local str = mw.ustring.lower( str )&lt;br /&gt;
	if typeAliases[str] then&lt;br /&gt;
		str = typeAliases[str]&lt;br /&gt;
	end&lt;br /&gt;
	local cnf = types[str]&lt;br /&gt;
	local res&lt;br /&gt;
	if cnf then&lt;br /&gt;
		res = cnf[1] .. &amp;#039;[[Category:&amp;#039; .. cnf[2] .. translation .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		if str == &amp;#039;_missing_&amp;#039; then&lt;br /&gt;
			res = tcat( &amp;#039;Extensions with invalid or missing type&amp;#039; )&lt;br /&gt;
		elseif str == &amp;#039;_demomode_&amp;#039; then&lt;br /&gt;
			if str2 then&lt;br /&gt;
				res = lang:ucfirst( str2 )&lt;br /&gt;
			else&lt;br /&gt;
				res = &amp;quot;&amp;#039;&amp;#039;unknown&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			res = ( str or &amp;#039;\&amp;#039;\&amp;#039;unknown\&amp;#039;\&amp;#039;&amp;#039; ) ..&lt;br /&gt;
				&amp;#039; [[Special:MyLanguage/Template:Extension#type|(\&amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;invalid type\&amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;)]]&amp;#039; ..&lt;br /&gt;
				tcat( &amp;#039;Extensions with invalid or missing type&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getExtData()&lt;br /&gt;
	local pg&lt;br /&gt;
	local pframe = mw.getCurrentFrame():getParent()&lt;br /&gt;
	if pframe and pframe.args.repo then&lt;br /&gt;
		pg = pframe.args.repo&lt;br /&gt;
	else&lt;br /&gt;
		pg = mw.title.getCurrentTitle().rootPageTitle:partialUrl() -- need to get rid of translation subpage.&lt;br /&gt;
	end&lt;br /&gt;
    local dataTitle = mw.title.new( &amp;#039;ExtensionJson/&amp;#039; .. pg .. &amp;#039;.json&amp;#039;, &amp;#039;Module&amp;#039; )&lt;br /&gt;
    if dataTitle and dataTitle.exists and dataTitle.contentModel == &amp;#039;json&amp;#039; then&lt;br /&gt;
		return mw.loadJsonData( dataTitle.prefixedText )[&amp;#039;master&amp;#039;]&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPopularityData()&lt;br /&gt;
	local pg&lt;br /&gt;
	local pframe = mw.getCurrentFrame():getParent()&lt;br /&gt;
	if pframe and pframe.args.repo then&lt;br /&gt;
		pg = pframe.args.repo&lt;br /&gt;
	else&lt;br /&gt;
		pg = mw.title.getCurrentTitle().rootPageTitle:partialUrl() -- need to get rid of translation subpage.&lt;br /&gt;
	end&lt;br /&gt;
    type = &amp;#039;extensions&amp;#039;&lt;br /&gt;
    if mw.title.getCurrentTitle().rootPageTitle:inNamespace( &amp;#039;skin&amp;#039; ) then&lt;br /&gt;
        type =&amp;quot;skins&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
	return mw.loadJsonData( &amp;#039;Template:Extension/popularity.json&amp;#039; )[type][pg]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLicenseString (str)&lt;br /&gt;
	str = mw.text.trim(str)&lt;br /&gt;
	if str == &amp;quot;&amp;quot; or str == nil then&lt;br /&gt;
		local data = getExtData()&lt;br /&gt;
		if data and data[&amp;quot;license-name&amp;quot;] then&lt;br /&gt;
			str = data[&amp;quot;license-name&amp;quot;]&lt;br /&gt;
		else&lt;br /&gt;
			str = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
local function getLicenseCategory( str )&lt;br /&gt;
	str = getLicenseString(str)&lt;br /&gt;
	if mw.ustring.sub( str, -1 ) == &amp;#039;+&amp;#039; then&lt;br /&gt;
		str = mw.ustring.sub( str, 1, -2 )&lt;br /&gt;
	end&lt;br /&gt;
	local cnf = licenses[str]&lt;br /&gt;
	if cnf then&lt;br /&gt;
		if #cnf &amp;gt; 2 then&lt;br /&gt;
			return tcat( cats[cnf[3]] )&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return tcat( &amp;#039;Extensions with unknown license&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getFormattedLicense( str, orlatertext )&lt;br /&gt;
	local orlater = &amp;#039;&amp;#039;&lt;br /&gt;
	local license = getLicenseString(str)&lt;br /&gt;
	if mw.ustring.sub( license, -1 ) == &amp;#039;+&amp;#039; then&lt;br /&gt;
		license = mw.ustring.sub( license, 1, -2 )&lt;br /&gt;
		orlater = orlatertext&lt;br /&gt;
	end&lt;br /&gt;
	local cnf = licenses[license]&lt;br /&gt;
	if cnf then&lt;br /&gt;
		return (cnf[1] ~= &amp;#039;&amp;#039; and (&amp;#039;[&amp;#039; .. cnf[1] .. &amp;#039; &amp;#039; .. cnf[2] .. &amp;#039;]&amp;#039;) or cnf[2]) .. orlater&lt;br /&gt;
	else&lt;br /&gt;
		return license&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.getTypes( frame )&lt;br /&gt;
	setI18n( frame.args, types, 1 )&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local types = {}&lt;br /&gt;
	local params = {&lt;br /&gt;
		args.type1 or args[&amp;#039;type&amp;#039;] or &amp;#039;missing&amp;#039;,&lt;br /&gt;
		args.type2,&lt;br /&gt;
		args.type3,&lt;br /&gt;
		args.type4,&lt;br /&gt;
		args.type5,&lt;br /&gt;
		args.type6,&lt;br /&gt;
	}&lt;br /&gt;
	for _, param in ipairs( params ) do&lt;br /&gt;
		if param == nil or mw.text.trim( param ) == &amp;#039;&amp;#039; then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		local param = mw.text.trim( param )&lt;br /&gt;
		if args.templatemode == &amp;#039;nocats&amp;#039; then&lt;br /&gt;
			table.insert( types, getType( &amp;#039;_demomode_&amp;#039;, param ) )&lt;br /&gt;
		else&lt;br /&gt;
			table.insert( types, getType( param ) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat( types, &amp;#039;, &amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getType( frame )&lt;br /&gt;
	setI18n( frame.args, types, 1 )&lt;br /&gt;
	return getType( frame.args[1] )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getLicenseCategory( frame )&lt;br /&gt;
	return getLicenseCategory( frame.args[1] )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getFormattedLicense( frame )&lt;br /&gt;
	setI18n( frame.args, licenses, 2 )&lt;br /&gt;
	return getFormattedLicense( frame.args[1], frame.args[&amp;#039;+&amp;#039;] or &amp;#039; or later&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Return if the extension does schema updates&lt;br /&gt;
-- Only answer yes. For now be silent on no or unknown, as its unclear&lt;br /&gt;
-- if this info should be in infobox if the answer is not yes.&lt;br /&gt;
function p.getNeedsUpdates( frame )&lt;br /&gt;
	local data = getExtData()&lt;br /&gt;
	if data ~= nil and data.Hooks ~= nil and data.Hooks.LoadExtensionSchemaUpdates ~= nil then&lt;br /&gt;
		return &amp;#039;yes&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getVersion( frame )&lt;br /&gt;
	&lt;br /&gt;
    if frame.args[1] ~= nil and mw.text.trim(frame.args[1]) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    	return frame.args[1]&lt;br /&gt;
    end&lt;br /&gt;
    local data = getExtData()&lt;br /&gt;
    if data ~= nil and data.version ~= nil then&lt;br /&gt;
    	return data.version&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- --&lt;br /&gt;
-- Get the requires.MediaWiki value from extension.json&lt;br /&gt;
-- @link https://www.mediawiki.org/wiki/Manual:Extension.json/Schema#requires&lt;br /&gt;
-- --&lt;br /&gt;
function p.getMediaWikiRequirement( frame )&lt;br /&gt;
	-- If the first arg is given, it&amp;#039;ll be the manual override value.&lt;br /&gt;
    if frame.args[1] ~= nil and mw.text.trim( frame.args[1] ) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    	return frame.args[1] .. tcat( &amp;#039;Extensions with manual MediaWiki version&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
    -- If the compatibility policy is rel or ltsrel, then don&amp;#039;t display something&lt;br /&gt;
    -- here because it likely disagrees with the compatibility policy.&lt;br /&gt;
    if frame.args[2] ~= nil and mw.ustring.find( frame.args[2], &amp;#039;rel&amp;#039; ) then&lt;br /&gt;
    	return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
	-- Otherwise, look it up from extension.json.&lt;br /&gt;
	local data = getExtData()&lt;br /&gt;
	if data and data.requires and data.requires.MediaWiki then&lt;br /&gt;
		return data.requires.MediaWiki&lt;br /&gt;
	end&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	if pargs.templatemode == &amp;quot;nocats&amp;quot; then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- If neither are given, just categorize.&lt;br /&gt;
    return tcat( &amp;#039;Extensions without MediaWiki version&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getPHPRequirement( frame )&lt;br /&gt;
	-- If the first arg is given, it&amp;#039;ll be the manual override value.&lt;br /&gt;
    if frame.args[1] ~= nil and mw.text.trim( frame.args[1] ) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    	return frame.args[1]&lt;br /&gt;
    end&lt;br /&gt;
	-- Otherwise, look it up from extension.json.&lt;br /&gt;
	local data = getExtData()&lt;br /&gt;
    -- unclear if we should somehow return other platform requirements&lt;br /&gt;
	if data and data.requires and data.requires.platform and data.requires.platform.php then&lt;br /&gt;
		return data.requires.platform.php&lt;br /&gt;
	end&lt;br /&gt;
	-- Return nothing if unknown&lt;br /&gt;
	return&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- --&lt;br /&gt;
-- Get the Composer name for the extension, with relevant categories.&lt;br /&gt;
-- --&lt;br /&gt;
function p.getComposerName( frame )&lt;br /&gt;
	local name = nil&lt;br /&gt;
	local hasManualName = false&lt;br /&gt;
	-- If the first arg is given, it&amp;#039;ll be the manual override value.&lt;br /&gt;
    if frame.args[1] ~= nil and mw.text.trim( frame.args[1] ) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    	name = frame.args[1]&lt;br /&gt;
    	hasManualName = true&lt;br /&gt;
    end&lt;br /&gt;
	-- Otherwise, look it up from extension.json.&lt;br /&gt;
	local data = getExtData()&lt;br /&gt;
	local hasComposerName = false&lt;br /&gt;
	if data and data.composer then&lt;br /&gt;
		name = data.composer&lt;br /&gt;
		hasComposerName = true&lt;br /&gt;
	end&lt;br /&gt;
	-- Tracking category for possibly mis-configured packages.&lt;br /&gt;
	if hasManualName and not hasComposerName then&lt;br /&gt;
		cat( &amp;#039;Extensions without name in composer.json&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if name ~= nil then&lt;br /&gt;
		return &amp;#039;[https://packagist.org/packages/&amp;#039; .. name .. &amp;#039; &amp;#039; .. name .. &amp;#039;]&amp;#039;&lt;br /&gt;
			.. tcat( &amp;#039;Extensions supporting Composer&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getHooks(frame)&lt;br /&gt;
	local hookOutput = frame.args.header&lt;br /&gt;
	local hooks = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	local pframe = frame:getParent()&lt;br /&gt;
	local foundLocalHooks = false&lt;br /&gt;
	while true do&lt;br /&gt;
		local argument = pframe.args[&amp;quot;hook&amp;quot; .. index]&lt;br /&gt;
		if argument and mw.text.trim(argument) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			hooks[#hooks + 1] = mw.text.trim(argument)&lt;br /&gt;
			foundLocalHooks = true&lt;br /&gt;
		else&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		index = index + 1&lt;br /&gt;
	end&lt;br /&gt;
	if not foundLocalHooks then&lt;br /&gt;
		local data = getExtData()&lt;br /&gt;
		if data == nil or data.Hooks == nil then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		for hook, _ in pairs(data.Hooks) do&lt;br /&gt;
			hooks[#hooks + 1] = hook&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(hooks)&lt;br /&gt;
	end&lt;br /&gt;
	local first = true&lt;br /&gt;
	for _, hook in ipairs(hooks) do&lt;br /&gt;
		if first then&lt;br /&gt;
			first = false&lt;br /&gt;
		else&lt;br /&gt;
			hookOutput = hookOutput .. frame.args.delim&lt;br /&gt;
		end&lt;br /&gt;
		hookOutput = hookOutput .. frame:expandTemplate{title=&amp;quot;Extension/HookInUse&amp;quot;,args={hook,templatemode=pframe.args.templatemode}}&lt;br /&gt;
	end&lt;br /&gt;
	return hookOutput .. frame.args.footer&lt;br /&gt;
end&lt;br /&gt;
function p.getParameters(frame)&lt;br /&gt;
	local data = getExtData()&lt;br /&gt;
	if data == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local config = data.config&lt;br /&gt;
	if config == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local prefix = &amp;quot;wg&amp;quot;&lt;br /&gt;
	local skip_prefix = false&lt;br /&gt;
	if data.manifest_version and data.manifest_version &amp;gt;= 2 then&lt;br /&gt;
		if data.config_prefix then&lt;br /&gt;
			prefix = data.config_prefix&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if config._prefix then&lt;br /&gt;
			prefix = config._prefix&lt;br /&gt;
			skip_prefix = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for key, v in pairs(config) do&lt;br /&gt;
        local wrapper = &amp;#039;&amp;lt;span class=&amp;quot;configvariable&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        if type( v ) == &amp;#039;table&amp;#039; and v.description ~= nil then&lt;br /&gt;
        	local desc = v.description&lt;br /&gt;
        	if type(desc) == &amp;#039;table&amp;#039; then&lt;br /&gt;
        		-- Shallow clone in order to make the table library happy with mw.loadData&lt;br /&gt;
        		desc = require(&amp;quot;Module:TableTools&amp;quot;).shallowClone(desc)&lt;br /&gt;
        		desc = table.concat(desc, &amp;quot; &amp;quot;)&lt;br /&gt;
        	end&lt;br /&gt;
            wrapper = &amp;#039;&amp;lt;span class=&amp;quot;configvariable&amp;quot; title=&amp;quot;&amp;#039; .. mw.text.nowiki( desc ) .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
		if key ~= &amp;#039;_prefix&amp;#039; or not skip_prefix then&lt;br /&gt;
			out = out .. &amp;quot;* &amp;quot; .. wrapper .. &amp;quot;$&amp;quot; .. prefix .. key .. &amp;quot;&amp;lt;/span&amp;gt;\n&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by Template:ParameterList&lt;br /&gt;
function p.makeParametersList(frame)&lt;br /&gt;
	local data = getExtData()&lt;br /&gt;
	if data == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local config = data.config&lt;br /&gt;
	if config == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local prefix = &amp;quot;wg&amp;quot;&lt;br /&gt;
	local skip_prefix = false&lt;br /&gt;
	if data.manifest_version and data.manifest_version &amp;gt;= 2 then&lt;br /&gt;
		if data.config_prefix then&lt;br /&gt;
			prefix = data.config_prefix&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if config._prefix then&lt;br /&gt;
			prefix = config._prefix&lt;br /&gt;
			skip_prefix = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for key, v in pairs(config) do&lt;br /&gt;
        local wrapper = &amp;#039;&amp;lt;code class=&amp;quot;configvariablevar&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		local desc = nil&lt;br /&gt;
        if type( v ) == &amp;#039;table&amp;#039; and v.description ~= nil then&lt;br /&gt;
        	desc = v.description&lt;br /&gt;
        	if type(desc) == &amp;#039;table&amp;#039; then&lt;br /&gt;
        		-- Shallow clone in order to make the table library happy with mw.loadData&lt;br /&gt;
        		desc = require(&amp;quot;Module:TableTools&amp;quot;).shallowClone(desc)&lt;br /&gt;
        		desc = table.concat(desc, &amp;quot; &amp;quot;)&lt;br /&gt;
        	end&lt;br /&gt;
        end&lt;br /&gt;
		if key ~= &amp;#039;_prefix&amp;#039; or not skip_prefix then&lt;br /&gt;
			out = out .. &amp;quot;; &amp;quot; .. wrapper .. &amp;quot;$&amp;quot; .. prefix .. key .. &amp;quot;&amp;lt;/code&amp;gt;\n&amp;quot;&lt;br /&gt;
			if desc then&lt;br /&gt;
				out = out .. &amp;quot;:&amp;quot; .. mw.text.nowiki( desc ) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getRights(frame)&lt;br /&gt;
	local data = getExtData()&lt;br /&gt;
	if data == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local rights = data.AvailableRights&lt;br /&gt;
	if rights == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, right in ipairs(rights) do&lt;br /&gt;
		out = out .. &amp;quot;* &amp;quot; .. right .. &amp;quot;\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
function p.unmaintained(frame)&lt;br /&gt;
	local content = mw.title.getCurrentTitle():getContent()&lt;br /&gt;
	if not content:find(&amp;quot;{{[uU]nmaintained extension&amp;quot;) and not content:find(&amp;quot;{{TNT|[uU]nmaintained extension&amp;quot;) &lt;br /&gt;
		and not content:find(&amp;quot;{{User:Jeroen[ _]De[ _]Dauw/unmaintained&amp;quot;) then&lt;br /&gt;
		local args = {}&lt;br /&gt;
		local pargs = frame:getParent().args&lt;br /&gt;
		if pargs.templatemode == &amp;quot;nocats&amp;quot; then&lt;br /&gt;
			args.nocat = &amp;quot;yes&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		args.alternative = pargs.alternative&lt;br /&gt;
		return frame:expandTemplate{title=&amp;quot;Unmaintained extension&amp;quot;,args=args}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
function p.maintenanceLinks(frame)&lt;br /&gt;
	local base = frame:expandTemplate{title=&amp;quot;translatable&amp;quot;}&lt;br /&gt;
	if base == mw.title.getCurrentTitle().prefixedText then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local content = mw.title.new(base):getContent()&lt;br /&gt;
	-- Check if the source page was archived or not&lt;br /&gt;
	if content:find(&amp;quot;{{[aA]rchived ?[Ee]xtension&amp;quot;) or content:find(&amp;quot;{{TNT|[Aa]rchived ?[Ee]xtension&amp;quot;) then&lt;br /&gt;
		return &amp;quot;&amp;lt;span style=&amp;#039;display:none&amp;#039;&amp;gt;[[Template:Extension/archived]]&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	--Check if the source page was deleted or not&lt;br /&gt;
	elseif content:find(&amp;quot;{{[dD]eleted extension security warning&amp;quot;) then&lt;br /&gt;
		return &amp;quot;&amp;lt;span style=&amp;#039;display:none&amp;#039;&amp;gt;[[Template:Extension/vulnerabilities]]&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
function p.isOnGerrit(frame)&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if not title:inNamespace(&amp;quot;Extension&amp;quot;) and not title:inNamespace(&amp;quot;Skin&amp;quot;) then&lt;br /&gt;
		return &amp;quot;n/a&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local base = frame:expandTemplate{title=&amp;quot;translatable&amp;quot;}&lt;br /&gt;
	local content = mw.title.new(base):getContent()&lt;br /&gt;
	if content:find(&amp;quot;{{Not on Gerrit&amp;quot;) then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if content:find(&amp;quot;{{WikimediaDownload&amp;quot;) or content:find(&amp;quot;TNT|WikimediaDownload&amp;quot;) or content:find(&amp;quot;|repo%s*=&amp;quot;) then&lt;br /&gt;
		return &amp;quot;yes&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- --&lt;br /&gt;
-- Get a category if the extension isn&amp;#039;t in Module:ExtensionJson.&lt;br /&gt;
--&lt;br /&gt;
function p.getExtensionJsonCategory( frame )&lt;br /&gt;
	if getExtData() == nil then&lt;br /&gt;
		return tcat( &amp;#039;Extensions not in ExtensionJson&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --&lt;br /&gt;
-- Turn 1 into 1st. Probably bad for i18n.&lt;br /&gt;
local function getOrdinal(n)&lt;br /&gt;
    if n % 10 == 1 and n ~= 11 then&lt;br /&gt;
        return n .. &amp;quot;&amp;lt;sup&amp;gt;st&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if n % 10 == 2 and n ~= 12 then&lt;br /&gt;
        return n .. &amp;quot;&amp;lt;sup&amp;gt;nd&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if n % 10 == 3 and n ~= 13 then&lt;br /&gt;
        return n .. &amp;quot;&amp;lt;sup&amp;gt;rd&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return n .. &amp;quot;&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- --&lt;br /&gt;
-- Get number of downloads this quarter&lt;br /&gt;
function p.getDownloads( frame )&lt;br /&gt;
    local data = getPopularityData()&lt;br /&gt;
    if data == nil or data.downloads == nil then&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local num = data.downloads[&amp;#039;13w&amp;#039;];&lt;br /&gt;
    if num == 0 then&lt;br /&gt;
    	return &amp;quot;0&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    local out = mw.getContentLanguage():formatNum( num )&lt;br /&gt;
    out = out .. &amp;quot; (Ranked &amp;quot; .. getOrdinal( data.downloadsRank[&amp;#039;13w&amp;#039;] ) .. &amp;quot;)&amp;quot;&lt;br /&gt;
    return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- --&lt;br /&gt;
-- Get number of downloads this quarter&lt;br /&gt;
function p.getPublicSites( frame )&lt;br /&gt;
    local data = getPopularityData()&lt;br /&gt;
    if data == nil or data.siteCount == nil then&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local out = mw.getContentLanguage():formatNum( data.siteCount )&lt;br /&gt;
    out = out .. &amp;quot; (Ranked &amp;quot; .. getOrdinal( data.siteCountRank ) .. &amp;quot;)&amp;quot;&lt;br /&gt;
    return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- --&lt;br /&gt;
-- Get sites using this skin as default skin&lt;br /&gt;
function p.getPublicSitesSkinDefault( frame )&lt;br /&gt;
    local data = getPopularityData()&lt;br /&gt;
    if data == nil or data.siteCountDefault == nil then&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local out = mw.getContentLanguage():formatNum( data.siteCountDefault )&lt;br /&gt;
    return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.getAuthor( frame )&lt;br /&gt;
    if frame.args[1] ~= nil and mw.text.trim(frame.args[1]) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    	return frame.args[1]&lt;br /&gt;
    end&lt;br /&gt;
    local data = getExtData()&lt;br /&gt;
    if data ~= nil and data.author ~= nil then&lt;br /&gt;
        if type(data.author)==&amp;quot;table&amp;quot; then&lt;br /&gt;
            res = &amp;#039;&amp;#039;&lt;br /&gt;
            for k, v in ipairs( data.author ) do&lt;br /&gt;
                if res ~= &amp;#039;&amp;#039; then&lt;br /&gt;
                    res = res .. &amp;#039;, &amp;#039;&lt;br /&gt;
                end&lt;br /&gt;
                res = res .. v&lt;br /&gt;
            end&lt;br /&gt;
            return res&lt;br /&gt;
        else&lt;br /&gt;
    	    return data.author&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getDownload( frame )&lt;br /&gt;
    local data = getExtData()&lt;br /&gt;
    if data ~= nil then&lt;br /&gt;
        repo_url=data.repository&lt;br /&gt;
        if repo_url == nil then&lt;br /&gt;
            repo_url=data.url&lt;br /&gt;
        end&lt;br /&gt;
        if repo_url == nil then&lt;br /&gt;
            error(&amp;quot;AutoDownload: no repo URL&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
        account, repo=string.match(repo_url, &amp;quot;^https://github.com/([^/]+)/([^/]+)/?$&amp;quot;)&lt;br /&gt;
        if account then&lt;br /&gt;
            return frame:expandTemplate{ title = &amp;quot;GithubDownload&amp;quot;, args = {account, repo:gsub(&amp;quot;%.git&amp;quot;,&amp;quot;&amp;quot;)}}&lt;br /&gt;
        end&lt;br /&gt;
        account, repo=string.match(repo_url, &amp;quot;^https://gitlab.com/(.+)/([^/]+)/?$&amp;quot;)&lt;br /&gt;
        if account then&lt;br /&gt;
            return frame:expandTemplate{ title = &amp;quot;GitlabDownload&amp;quot;, args = {account, repo:gsub(&amp;quot;%.git&amp;quot;,&amp;quot;&amp;quot;)}}&lt;br /&gt;
        end&lt;br /&gt;
        account, repo=string.match(repo_url, &amp;quot;^https://bitbucket.org/([^/]+)/([^/]+)/?$&amp;quot;)&lt;br /&gt;
        if account then&lt;br /&gt;
            return frame:expandTemplate{ title = &amp;quot;BitbucketDownload&amp;quot;, args = {account, repo:gsub(&amp;quot;%.git&amp;quot;,&amp;quot;&amp;quot;)}}&lt;br /&gt;
        end&lt;br /&gt;
        repo=string.match(repo_url, &amp;quot;^https://gerrit.wikimedia.org/r/mediawiki/extensions/([^/]+)/?$&amp;quot;)&lt;br /&gt;
        if repo then&lt;br /&gt;
            return frame:expandTemplate{ title = &amp;quot;WikimediaDownload&amp;quot;, args = {repo}}&lt;br /&gt;
        end&lt;br /&gt;
        return repo_url&lt;br /&gt;
    end&lt;br /&gt;
    error(&amp;quot;AutoDownload: Could not find ExtensionJson data&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>MediaWiki&gt;Tactica</name></author>
	</entry>
</feed>