<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/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://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AExtension"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Module:Extension&amp;action=history"/>
	<updated>2026-04-06T03:11:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=Module:Extension&amp;diff=2220&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;local lang = mw.language.getContentLanguage() local translation = mw.getCurrentFrame():callParserFunction{name='#translation', args=&quot;1&quot;} local addr = { 	GNU = '//www.gnu.org/l...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Module:Extension&amp;diff=2220&amp;oldid=prev"/>
		<updated>2021-05-04T12:16:39Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local lang = mw.language.getContentLanguage() local translation = mw.getCurrentFrame():callParserFunction{name=&amp;#039;#translation&amp;#039;, args=&amp;quot;1&amp;quot;} local addr = { 	GNU = &amp;#039;//www.gnu.org/l...&amp;quot;&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='#translation', args=&amp;quot;1&amp;quot;}&lt;br /&gt;
local addr = {&lt;br /&gt;
	GNU = '//www.gnu.org/licenses/',&lt;br /&gt;
	OSI = '//opensource.org/licenses/',&lt;br /&gt;
	CC  = '//creativecommons.org/licenses/',&lt;br /&gt;
	Mozilla = '//www.mozilla.org/'&lt;br /&gt;
}&lt;br /&gt;
local cats = {&lt;br /&gt;
	GPL    = 'GPL licensed extensions',&lt;br /&gt;
	FDL    = 'FDL licensed extensions',&lt;br /&gt;
	LGPL   = 'LGPL licensed extensions',&lt;br /&gt;
	AGPL   = 'AGPL licensed extensions',&lt;br /&gt;
	MIT    = 'MIT licensed extensions',&lt;br /&gt;
	ISC    = 'ISC licensed extensions',&lt;br /&gt;
	BSD    = 'BSD licensed extensions',&lt;br /&gt;
	MPL    = 'MPL licensed extensions',&lt;br /&gt;
	WTFPL  = 'WTFPL licensed extensions',&lt;br /&gt;
	Apache = 'Apache licensed extensions',&lt;br /&gt;
	PD     = 'Public domain licensed extensions',&lt;br /&gt;
	CC     = 'Creative Commons licensed extensions',&lt;br /&gt;
	ECL    = 'Educational Community licensed extensions',&lt;br /&gt;
	BLANK  = 'Extensions with no license specified'&lt;br /&gt;
}&lt;br /&gt;
local licenses = {&lt;br /&gt;
	['GPL-2.0']      = { addr.GNU .. 'old-licenses/gpl-2.0-standalone.html', 'GNU General Public License 2.0', 'GPL' },&lt;br /&gt;
	['GPL-2.0-only'] = { addr.GNU .. 'old-licenses/gpl-2.0-standalone.html', 'GNU General Public License 2.0 only', 'GPL' },&lt;br /&gt;
	['GPL-2.0-or-later'] = { addr.GNU .. 'old-licenses/gpl-2.0-standalone.html', 'GNU General Public License 2.0 or later', 'GPL' },&lt;br /&gt;
	['GPL-3.0']      = { addr.GNU .. 'gpl-3.0-standalone.html', 'GNU General Public License 3.0', 'GPL' },&lt;br /&gt;
	['GPL-3.0-only'] = { addr.GNU .. 'gpl-3.0-standalone.html', 'GNU General Public License 3.0 only', 'GPL' },&lt;br /&gt;
	['GPL-3.0-or-later'] = { addr.GNU .. 'gpl-3.0-standalone.html', 'GNU General Public License 3.0 or later', 'GPL' },&lt;br /&gt;
	['AGPL-3.0']     = { addr.GNU .. 'agpl-3.0.html', 'GNU Affero General Public License 3.0', 'AGPL' },&lt;br /&gt;
	['AGPL-3.0-or-later'] = { addr.GNU .. 'agpl-3.0.html', 'GNU Affero General Public License 3.0 or later', 'AGPL' },&lt;br /&gt;
	['LGPL-2.1']     = { addr.GNU .. 'old-licenses/lgpl-2.1-standalone.html', 'GNU Lesser General Public License 2.1', 'LGPL' },&lt;br /&gt;
	['LGPL-2.1-only'] = { addr.GNU .. 'old-licenses/lgpl-2.1-standalone.html', 'GNU Lesser General Public License 2.1 only', 'LGPL' },&lt;br /&gt;
	['LGPL-2.1-or-later'] = { addr.GNU .. 'old-licenses/lgpl-2.1-standalone.html', 'GNU Lesser General Public License 2.1 or later', 'LGPL' },&lt;br /&gt;
	['LGPL-3.0']     = { addr.GNU .. 'lgpl-3.0-standalone.html', 'GNU Lesser General Public License 3.0', 'LGPL' },&lt;br /&gt;
	['LGPL-3.0-only'] = { addr.GNU .. 'lgpl-3.0-standalone.html', 'GNU Lesser General Public License 3.0 only', 'LGPL' },&lt;br /&gt;
	['LGPL-3.0-or-later'] = { addr.GNU .. 'lgpl-3.0-standalone.html', 'GNU Lesser General Public License 3.0 or later', 'LGPL' },&lt;br /&gt;
	['FDL']          = { addr.GNU .. 'fdl.html', 'GNU Free Documentation License', 'FDL' },&lt;br /&gt;
	['MIT']          = { addr.OSI .. 'mit-license.php', 'MIT License', 'MIT' },&lt;br /&gt;
	['ISC']          = { addr.OSI .. 'ISC', 'ISC License', 'ISC' },&lt;br /&gt;
	['BSD-2-Clause'] = { addr.OSI .. 'BSD-2-Clause', 'BSD 2-clause &amp;quot;Simplified&amp;quot; License', 'BSD' },&lt;br /&gt;
	['BSD-3-Clause'] = { addr.OSI .. 'BSD-3-Clause', 'BSD 3-clause &amp;quot;Modified&amp;quot; License', 'BSD' },&lt;br /&gt;
	['BSD-4-Clause'] = { addr.GNU .. 'license-list.html#OriginalBSD', 'BSD 4-clause &amp;quot;Original&amp;quot; License', 'BSD' },&lt;br /&gt;
	['MPL-1.0']      = { addr.Mozilla .. 'MPL/1.0/', 'Mozilla Public License 1.0', 'MPL' },&lt;br /&gt;
	['MPL-2.0']      = { addr.Mozilla .. 'MPL/2.0/', 'Mozilla Public License 2.0', 'MPL' },&lt;br /&gt;
	['WTFPL']        = { 'http://www.wtfpl.net', 'WTFPL 2.0', 'WTFPL' },&lt;br /&gt;
	['Apache-2.0']   = { '//www.apache.org/licenses/LICENSE-2.0', 'Apache License 2.0', 'Apache' },&lt;br /&gt;
	['Zlib']         = { addr.OSI .. 'Zlib', 'zlib License' },&lt;br /&gt;
	['CC0-1.0']      = { '//creativecommons.org/publicdomain/zero/1.0/', 'Creative Commons Zero v1.0 Universal', 'PD' },&lt;br /&gt;
	['CC-BY-3.0']    = { addr.CC .. 'by/3.0/', 'Creative Commons Attribution 3.0', 'CC' },&lt;br /&gt;
	['CC-BY-SA-2.0'] = { addr.CC .. 'by-sa/2.0/', 'Creative Commons Attribution Share Alike 2.0', 'CC' },&lt;br /&gt;
	['CC-BY-SA-2.5'] = { addr.CC .. 'by-sa/2.5/', 'Creative Commons Attribution Share Alike 2.5', 'CC' },&lt;br /&gt;
	['CC-BY-NC-SA-2.5'] = { addr.CC .. 'by-nc-sa/2.5/', 'Creative Commons Attribution NonCommercial Share Alike 2.5', 'CC' },&lt;br /&gt;
	['CC-BY-NC-SA-3.0'] = { addr.CC .. 'by-nc-sa/3.0/', 'Creative Commons Attribution NonCommercial Share Alike 3.0', 'CC' },&lt;br /&gt;
	['CC-BY-NC-3.0'] = { addr.CC .. 'by-nc/3.0/', 'Creative Commons Attribution NonCommercial 3.0', 'CC' },&lt;br /&gt;
	['CC-BY-SA-3.0'] = { addr.CC .. 'by-sa/3.0/', 'Creative Commons Attribution Share Alike 3.0', 'CC' },&lt;br /&gt;
	['CC-BY-SA-4.0'] = { addr.CC .. 'by-sa/4.0/', 'Creative Commons Attribution Share Alike 4.0', 'CC' },&lt;br /&gt;
	['ECL-2.0']      = { '', '[[wikipedia:Educational Community License|Educational Community License 2.0]]', 'ECL' },&lt;br /&gt;
	['PD']           = { '', '[[wikipedia:Public domain|Public domain]]', 'PD' },&lt;br /&gt;
	['unspecified']  = { '', 'No license specified', 'BLANK'}&lt;br /&gt;
}&lt;br /&gt;
local types = {&lt;br /&gt;
	ajax                = { '[[w:AJAX|Ajax]]',                                        'Ajax extensions' },&lt;br /&gt;
	api                 = { '[[API:Action API|API]]',                                 'API extensions' },&lt;br /&gt;
	['beta feature']    = { '[[Beta Features|Beta Feature]]',                         'Beta Feature extensions' },&lt;br /&gt;
	contenthandler      = { '[[Manual:ContentHandler|ContentHandler]]',               'ContentHandler extensions' },&lt;br /&gt;
	database            = { '[[Manual:Database layout|Database]]',                    'Database extensions' },&lt;br /&gt;
	['data extraction'] = { 'Data extraction',                                        'Data extraction extensions' },&lt;br /&gt;
	example             = { 'Example',                                                'Extension examples' },&lt;br /&gt;
	['extended syntax'] = { '[[Manual:Extending wiki markup|Extended syntax]]',       'Extended syntax extensions' },&lt;br /&gt;
	filerepo            = { 'File repository',                                        'File repository extensions' },&lt;br /&gt;
	hook                = { '[[Manual:Hooks|Hook]]',                                  'Hook extensions' },&lt;br /&gt;
	interface           = { 'User interface',                                         'User interface extensions' },&lt;br /&gt;
	link                = { '[[Manual:Extending wiki markup|Link markup]]',           'Link markup extensions' },&lt;br /&gt;
	media               = { 'Media',                                                  'Media handling extensions' },&lt;br /&gt;
	mywiki              = { '[[Manual:Personalization|MyWiki]]',                      'Personalization extensions' },&lt;br /&gt;
	notify              = { 'Notify',                                                 'Notification extensions' },&lt;br /&gt;
	['page action']     = { '[[Manual:Parameters to index.php#Actions|Page action]]', 'Page action extensions' },&lt;br /&gt;
	parser              = { '[[Manual:Extending wiki markup|Parser extension]]',      'Parser extensions' },&lt;br /&gt;
	['parser function'] = { '[[Manual:Parser functions|Parser function]]',            'Parser function extensions' },&lt;br /&gt;
	php                 = { 'PHP',                                                    'PHP extensions' },&lt;br /&gt;
	search              = { 'Search',                                                 'Search extensions' },&lt;br /&gt;
	skin                = { '[[Manual:Skins|Skin]]',                                  'Skin extensions' },&lt;br /&gt;
	['special page']    = { '[[Manual:Special pages|Special page]]',                  'Special page extensions' },&lt;br /&gt;
	locale              = { '[[Manual:Localization|Locale]]',                         'Internationalization extensions' },&lt;br /&gt;
	tag                 = { '[[Manual:Tag extensions|Tag]]',                          'Tag extensions' },&lt;br /&gt;
	['user access']     = { '[[Manual:Security|User access]]',                        'User access extensions' },&lt;br /&gt;
	['user identity']   = { '[[Manual:Security|User identity]]',                      'User identity extensions' },&lt;br /&gt;
	['user rights']     = { '[[Manual:Security|User rights]]',                        'User rights extensions' },&lt;br /&gt;
	['user activity']   = { '[[Manual:Security|User activity]]',                      'User activity extensions' },&lt;br /&gt;
	variable            = { '[[Manual:Variables|Variable]]',                          'Variable extensions' },&lt;br /&gt;
	-- DEPRECATED TYPES (as per 2007-09 taxonomy discussion)&lt;br /&gt;
	category            = { 'Category',                                               'Category extensions',  deprecated = true },&lt;br /&gt;
	form                = { 'Form',                                                   'Form extensions',      deprecated = true },&lt;br /&gt;
	list                = { 'List',                                                   'List extensions',      deprecated = true },&lt;br /&gt;
	namespace           = { '[[Manual:Namespaces|Namespace]]',                        'Namespace extensions', deprecated = true },&lt;br /&gt;
	['table']           = { 'Table',                                                  'Table extensions',     deprecated = true },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local typeAliases = {&lt;br /&gt;
	db = 'database',&lt;br /&gt;
	pfunc = 'parser function',&lt;br /&gt;
	special = 'special page',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- DEPRECATED TYPES (multiple types handled via type1,type2,...)&lt;br /&gt;
local deprecatedTypes = {&lt;br /&gt;
	['link, tag, special'] = { 'link', 'tag', 'special page' },&lt;br /&gt;
	['parser function, special'] = { 'parser function', 'special page' },&lt;br /&gt;
	['tag, parser function'] = { 'tag', 'parser function' },&lt;br /&gt;
	['tag, parser function, special'] = { 'tag', 'parser function', 'special page' },&lt;br /&gt;
	['tag, special'] = { 'tag', 'special page' },&lt;br /&gt;
	['parser, pfunc'] = { 'parser function' },&lt;br /&gt;
	['parser, hook, special'] = { 'tag' --[[ sic ]], 'hook', 'special page' },&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 '[[Category:' .. title .. ']]'&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] .. '[[Category:' .. cnf[2] .. translation .. ']]'&lt;br /&gt;
		if cnf.deprecated then&lt;br /&gt;
			res = res .. '\'\'-deprecated\'\'' ..&lt;br /&gt;
				tcat( 'Extensions with deprecated types' )&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		cnf = deprecatedTypes[str]&lt;br /&gt;
		if cnf then&lt;br /&gt;
			local dtypes = {}&lt;br /&gt;
			for _, sstr in ipairs( cnf ) do&lt;br /&gt;
				table.insert( dtypes, getType( sstr ) )&lt;br /&gt;
			end&lt;br /&gt;
			res = table.concat( dtypes, ', ' ) ..&lt;br /&gt;
				'&amp;lt;br /&amp;gt;\'\'(deprecated, please use [[Special:MyLanguage/Template:Extension/doc#type|type1,type2'&lt;br /&gt;
			if #cnf &amp;gt; 2 then&lt;br /&gt;
				res = res .. ',type3'&lt;br /&gt;
			end&lt;br /&gt;
			res = res .. ']] instead)\'\'' .. tcat( 'Extensions with deprecated types' )&lt;br /&gt;
		elseif str == '_missing_' then&lt;br /&gt;
			res = tcat( 'Extensions with invalid or missing type' )&lt;br /&gt;
		elseif str == '_demomode_' then&lt;br /&gt;
			if str2 then&lt;br /&gt;
				res = lang:ucfirst( str2 )&lt;br /&gt;
			else&lt;br /&gt;
				res = &amp;quot;''unknown''&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			res = ( str or '\'\'unknown\'\'' ) ..&lt;br /&gt;
				' [[Special:MyLanguage/Template:Extension/doc#type|(\'\'\'\'\'invalid type\'\'\'\'\')]]' ..&lt;br /&gt;
				tcat( 'Extensions with invalid or missing type' )&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;
	return mw.loadData( 'Module:ExtensionJson' )[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 ) == '+' 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( 'Extensions with unknown license' )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getFormattedLicense( str, orlatertext )&lt;br /&gt;
	local orlater = ''&lt;br /&gt;
	local license = getLicenseString(str)&lt;br /&gt;
	if mw.ustring.sub( license, -1 ) == '+' 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] ~= '' and ('[' .. cnf[1] .. ' ' .. cnf[2] .. ']') 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['type'] or 'missing',&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 ) == '' then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		local param = mw.text.trim( param )&lt;br /&gt;
		if args.templatemode == 'nocats' then&lt;br /&gt;
			table.insert( types, getType( '_demomode_', 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, ', ' )&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['+'] or ' or later' )&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 'yes'&lt;br /&gt;
	end&lt;br /&gt;
	return ''&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 ''&lt;br /&gt;
end&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, _ in pairs(config) do&lt;br /&gt;
		if key ~= '_prefix' or not skip_prefix then&lt;br /&gt;
			out = out .. &amp;quot;* $&amp;quot; .. prefix .. key .. &amp;quot;\n&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&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;
	-- [[Module:ExtensionJson]] starts at zero, but Lua tables start at 1&lt;br /&gt;
	local iter, table_ = ipairs(rights)&lt;br /&gt;
	for _, right in iter, table_, -1 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='display:none'&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='display:none'&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;{{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;
return p&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>