<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Acategory_tree%2Fwiktionary_users</id>
	<title>Module:category tree/wiktionary users - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Acategory_tree%2Fwiktionary_users"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:category_tree/wiktionary_users&amp;action=history"/>
	<updated>2026-04-22T05:47:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:category_tree/wiktionary_users&amp;diff=494692&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:category_tree/wiktionary_users&amp;diff=494692&amp;oldid=prev"/>
		<updated>2026-04-21T11:22:26Z</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&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 11:22, 21 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&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>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:category_tree/wiktionary_users&amp;diff=494691&amp;oldid=prev</id>
		<title>wikt&gt;Surjection: Changed protection settings for &quot;Module:category tree/wiktionary users&quot;: Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:category_tree/wiktionary_users&amp;diff=494691&amp;oldid=prev"/>
		<updated>2026-04-15T09:16:48Z</updated>

		<summary type="html">&lt;p&gt;Changed protection settings for &amp;quot;&lt;a href=&quot;/wiki/Module:category_tree/wiktionary_users&quot; title=&quot;Module:category tree/wiktionary users&quot;&gt;Module:category tree/wiktionary users&lt;/a&gt;&amp;quot;: Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local raw_categories = {}&lt;br /&gt;
local raw_handlers = {}&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local unpack = unpack or table.unpack -- Lua 5.2 compatibility&lt;br /&gt;
&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                              RAW CATEGORIES                             --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Wiktionary&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;High level category for material about Wiktionary and its operation.&amp;quot;,&lt;br /&gt;
	parents = &amp;quot;Fundamental&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Wiktionary statistics&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Categories and pages containing statistics about how Wiktionary is used.&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;Wiktionary&amp;quot;, sort = &amp;quot;Statistics&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Wiktionary users&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Pages listing Wiktionarians according to their user rights and categories listing Wiktionarians according to their linguistic and coding abilities.&amp;quot;,&lt;br /&gt;
	breadcrumb = &amp;quot;Users&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;For an automatically generated list of all users, see [[Special:ListUsers]].&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;Wiktionary&amp;quot;, sort = &amp;quot;Users&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Wikimedians banned by the WMF&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Users who have received a [[m:Global bans|global ban]] imposed by the [[m:Wikimedia Foundation|Wikimedia Foundation]], in accordance with the [[m:WMF Global Ban Policy|WMF Global Ban Policy]].&amp;quot;,&lt;br /&gt;
	breadcrumb = &amp;quot;Banned by the WMF&amp;quot;,&lt;br /&gt;
	parents = &amp;quot;Wiktionary users&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;User languages&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Categories listing Wiktionarians according to their linguistic abilities.&amp;quot;,&lt;br /&gt;
	parents = {&lt;br /&gt;
		&amp;quot;Wiktionary users&amp;quot;,&lt;br /&gt;
		&amp;quot;Category:Wiktionary multilingual issues&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;User languages with invalid code&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Categories listing Wiktionarians according to their linguistic abilities, where the language code is invalid for Wiktionary.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;Most of these codes are valid ISO 639-3 codes but are invalid in Wiktionary for various reasons, &amp;quot; ..&lt;br /&gt;
	&amp;quot;typically due to different choices made regarding splitting and merging languages.&amp;quot;,&lt;br /&gt;
	parents = {name = &amp;quot;User languages&amp;quot;, sort = &amp;quot; &amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;User scripts&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Categories listing Wiktionarians according to their abilities to read a given script.&amp;quot;,&lt;br /&gt;
	parents = {&lt;br /&gt;
		&amp;quot;Wiktionary users&amp;quot;,&lt;br /&gt;
		&amp;quot;Category:Wiktionary multilingual issues&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;User coders&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Categories listing Wiktionarians according to their coding abilities.&amp;quot;,&lt;br /&gt;
	parents = &amp;quot;Wiktionary users&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;User families&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Categories listing Wiktionarians according to their knowledge about a given language family.&amp;quot;,&lt;br /&gt;
	parents = &amp;quot;Wiktionary users&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Pages with entries&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Pages which contain language entries.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;The subcategories within this category are used to determine the total number of entries on the English Wiktionary.&amp;quot;,&lt;br /&gt;
	parents = &amp;quot;Wiktionary&amp;quot;,&lt;br /&gt;
	can_be_empty = true,&lt;br /&gt;
	hidden = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Redirects connected to a Wikidata item&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Redirect pages which are connected to a [[d:|Wikidata]] item.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;These are rarely needed, but are occasionally useful following a page merger, where other wikis may still separate the two.&amp;quot;,&lt;br /&gt;
	parents = &amp;quot;Wiktionary statistics&amp;quot;,&lt;br /&gt;
	can_be_empty = true,&lt;br /&gt;
	hidden = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Unsupported titles&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Pages with titles that are not supported by the MediaWiki software.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;For an explanation of the reasons why certain titles are not supported, see [[Appendix:Unsupported titles]].&amp;quot;,&lt;br /&gt;
	parents = &amp;quot;Wiktionary&amp;quot;,&lt;br /&gt;
	can_be_empty = true,&lt;br /&gt;
	hidden = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Tracked according to [[phab:T347324]].&lt;br /&gt;
for ext, data in pairs {&lt;br /&gt;
	[&amp;quot;DynamicPageList&amp;quot;] = {&amp;quot;DynamicPageList (Wikimedia)&amp;quot;, &amp;quot;T287380&amp;quot;},&lt;br /&gt;
	[&amp;quot;EasyTimeline&amp;quot;] = {&amp;quot;EasyTimeline&amp;quot;, &amp;quot;T137291&amp;quot;},&lt;br /&gt;
	[&amp;quot;Graph&amp;quot;] = {&amp;quot;Graph&amp;quot;, &amp;quot;T334940&amp;quot;},&lt;br /&gt;
	[&amp;quot;Kartographer&amp;quot;] = {&amp;quot;Kartographer&amp;quot;},&lt;br /&gt;
	[&amp;quot;Phonos&amp;quot;] = {&amp;quot;Phonos&amp;quot;},&lt;br /&gt;
	[&amp;quot;Score&amp;quot;] = {&amp;quot;Score&amp;quot;},&lt;br /&gt;
	[&amp;quot;WikiHiero&amp;quot;] = {&amp;quot;WikiHiero&amp;quot;, &amp;quot;T344534&amp;quot;},&lt;br /&gt;
} do&lt;br /&gt;
	local link, phab = unpack(data)&lt;br /&gt;
	raw_categories[&amp;quot;Pages using the &amp;quot; .. ext .. &amp;quot; extension&amp;quot;] = {&lt;br /&gt;
		description = (&amp;quot;Pages which make use of the [[mw:Extension:%s|%s]] extension.&amp;quot;):format(link, ext),&lt;br /&gt;
		additional = phab and (&amp;quot;See [[phab:%s|%s]] on Phabricator for background information on why this extension is tracked.&amp;quot;):format(phab, phab) or nil,&lt;br /&gt;
		breadcrumb = (&amp;quot;Using the %s extension&amp;quot;):format(ext),&lt;br /&gt;
		parents = &amp;quot;Wiktionary statistics&amp;quot;,&lt;br /&gt;
		can_be_empty = true,&lt;br /&gt;
		hidden = true,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                                RAW HANDLERS                             --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function get_level_params(data)&lt;br /&gt;
	local speak_verb = &amp;quot;speak&amp;quot;&lt;br /&gt;
	if data.typ == &amp;quot;lang&amp;quot; then&lt;br /&gt;
		local is_sign_language = data.obj and data.obj:getFamilyCode() and data.obj:getFamilyCode():find(&amp;quot;^sgn&amp;quot;) or data.langfam:find(&amp;quot;Sign Language$&amp;quot;)&lt;br /&gt;
		speak_verb = data.args.verb or is_sign_language and &amp;quot;communicate in&amp;quot; or &amp;quot;speak&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return {&lt;br /&gt;
		[&amp;quot;-&amp;quot;] = {&lt;br /&gt;
			cssclass = &amp;quot;babel-3&amp;quot;,&lt;br /&gt;
			lang = &amp;quot;These users &amp;quot; .. speak_verb .. &amp;quot; !LANGFAM!.&amp;quot;,&lt;br /&gt;
			script = &amp;quot;These users read !SCRIPT!.&amp;quot;,&lt;br /&gt;
			coder = &amp;quot;These users know how to code in !LANGFAM!.&amp;quot;,&lt;br /&gt;
			family = &amp;quot;These users know !LANGFAM!.&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;1&amp;quot;] = {&lt;br /&gt;
			cssclass = &amp;quot;babel-1&amp;quot;,&lt;br /&gt;
			lang = &amp;quot;These users &amp;quot; .. speak_verb .. &amp;quot; !LANGFAM! at a &amp;#039;&amp;#039;&amp;#039;basic&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			script = &amp;quot;These users can read !SCRIPT! at a &amp;#039;&amp;#039;&amp;#039;basic&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			coder = &amp;quot;These users know the &amp;#039;&amp;#039;&amp;#039;basics&amp;#039;&amp;#039;&amp;#039; of how to write !LANGFAM! code and make minor tweaks.&amp;quot;,&lt;br /&gt;
			family = &amp;quot;These users know the &amp;#039;&amp;#039;&amp;#039;basics&amp;#039;&amp;#039;&amp;#039; of contributing to !LANGFAM!.&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;2&amp;quot;] = {&lt;br /&gt;
			cssclass = &amp;quot;babel-2&amp;quot;,&lt;br /&gt;
			lang = &amp;quot;These users &amp;quot; .. speak_verb .. &amp;quot; !LANGFAM! at an &amp;#039;&amp;#039;&amp;#039;intermediate&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			script = &amp;quot;These users can read !SCRIPT! at an &amp;#039;&amp;#039;&amp;#039;intermediate&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			coder = &amp;quot;These users have a &amp;#039;&amp;#039;&amp;#039;fair command&amp;#039;&amp;#039;&amp;#039; of !LANGFAM!, and can understand some scripts written by others.&amp;quot;,&lt;br /&gt;
			family = &amp;quot;These users are &amp;#039;&amp;#039;&amp;#039;fairly familiar&amp;#039;&amp;#039;&amp;#039; with !LANGFAM!.&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;3&amp;quot;] = {&lt;br /&gt;
			cssclass = &amp;quot;babel-3&amp;quot;,&lt;br /&gt;
			lang = &amp;quot;These users &amp;quot; .. speak_verb .. &amp;quot; !LANGFAM! at an &amp;#039;&amp;#039;&amp;#039;advanced&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			script = &amp;quot;These users can read !SCRIPT! at an &amp;#039;&amp;#039;&amp;#039;advanced&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			coder = &amp;quot;These users can write &amp;#039;&amp;#039;&amp;#039;more complex&amp;#039;&amp;#039;&amp;#039; !LANGFAM! code, and can understand and modify most scripts written by others.&amp;quot;,&lt;br /&gt;
			family = &amp;quot;These users &amp;#039;&amp;#039;&amp;#039;regularly&amp;#039;&amp;#039;&amp;#039; contribute to !LANGFAM!.&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;4&amp;quot;] = {&lt;br /&gt;
			cssclass = &amp;quot;babel-4&amp;quot;,&lt;br /&gt;
			lang = &amp;quot;These users &amp;quot; .. speak_verb .. &amp;quot; !LANGFAM! at a &amp;#039;&amp;#039;&amp;#039;near-native&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			script = &amp;quot;These users can read !SCRIPT! at a &amp;#039;&amp;#039;&amp;#039;near native&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			coder = &amp;quot;These users can write and understand &amp;#039;&amp;#039;&amp;#039;very complex&amp;#039;&amp;#039;&amp;#039; !LANGFAM! code.&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;5&amp;quot;] = {&lt;br /&gt;
			cssclass = &amp;quot;babel-5&amp;quot;,&lt;br /&gt;
			lang = &amp;quot;These users &amp;quot; .. speak_verb .. &amp;quot; !LANGFAM! at a &amp;#039;&amp;#039;&amp;#039;professional&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			script = &amp;quot;These users can read !SCRIPT! at a &amp;#039;&amp;#039;&amp;#039;professional&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
			coder = &amp;quot;These users can write and understand !LANGFAM! code at a &amp;#039;&amp;#039;&amp;#039;professional&amp;#039;&amp;#039;&amp;#039; level.&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;N&amp;quot;] = {&lt;br /&gt;
			cssclass = &amp;quot;babel-N&amp;quot;,&lt;br /&gt;
			lang = &amp;quot;These users are &amp;#039;&amp;#039;&amp;#039;native&amp;#039;&amp;#039;&amp;#039; speakers of !LANGFAM!.&amp;quot;,&lt;br /&gt;
			script = &amp;quot;These users&amp;#039; &amp;#039;&amp;#039;&amp;#039;native&amp;#039;&amp;#039;&amp;#039; script is !SCRIPT!.&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local coder_links = {&lt;br /&gt;
	Asm = &amp;quot;w:Assembly language&amp;quot;,&lt;br /&gt;
	Bash = &amp;quot;w:Bash (Unix shell)&amp;quot;,&lt;br /&gt;
	C = &amp;quot;w:C (programming language)&amp;quot;,&lt;br /&gt;
	[&amp;quot;C++&amp;quot;] = &amp;quot;w:C++&amp;quot;,&lt;br /&gt;
	[&amp;quot;C Sharp&amp;quot;] = {link = &amp;quot;w:C Sharp (programming language)&amp;quot;, lang = &amp;quot;C&amp;amp;#035;&amp;quot;},&lt;br /&gt;
	CSS = &amp;quot;w:CSS&amp;quot;,&lt;br /&gt;
	Go = &amp;quot;w:Go (programming language)&amp;quot;,&lt;br /&gt;
	Haskell = &amp;quot;w:Haskell&amp;quot;,&lt;br /&gt;
	HTML = &amp;quot;w:HTML&amp;quot;,&lt;br /&gt;
	Java = &amp;quot;w:Java (programming language)&amp;quot;,&lt;br /&gt;
	JavaScript = &amp;quot;w:JavaScript&amp;quot;,&lt;br /&gt;
	Julia = &amp;quot;w:Julia (programming language)&amp;quot;,&lt;br /&gt;
	Kotlin = &amp;quot;w:Kotlin (programming language)&amp;quot;,&lt;br /&gt;
	Lisp = &amp;quot;w:Lisp (programming language)&amp;quot;,&lt;br /&gt;
	Lua = &amp;quot;Wiktionary:Scripting&amp;quot;,&lt;br /&gt;
	Perl = &amp;quot;w:Perl&amp;quot;,&lt;br /&gt;
	PHP = &amp;quot;w:PHP&amp;quot;,&lt;br /&gt;
	Python = &amp;quot;w:Python (programming language)&amp;quot;,&lt;br /&gt;
	regex = {link = &amp;quot;w:Regular expression&amp;quot;, name = &amp;quot;regular expressions&amp;quot;},&lt;br /&gt;
	Ruby = &amp;quot;w:Ruby (programming language)&amp;quot;,&lt;br /&gt;
	Rust = &amp;quot;w:Rust (programming language)&amp;quot;,&lt;br /&gt;
	Scala = &amp;quot;w:Scala (programming language)&amp;quot;,&lt;br /&gt;
	Scheme = &amp;quot;w:Scheme (programming language)&amp;quot;,&lt;br /&gt;
	SQL = &amp;quot;w:SQL&amp;quot;,&lt;br /&gt;
	template = {link = &amp;quot;Wiktionary:Templates&amp;quot;, name = &amp;quot;wiki templates&amp;quot;},&lt;br /&gt;
	TypeScript = &amp;quot;w:TypeScript&amp;quot;,&lt;br /&gt;
	VBScript = &amp;quot;w:VBScript&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local custom_script_links = {&lt;br /&gt;
	IPA = &amp;quot;w:International Phonetic Alphabet&amp;quot;,&lt;br /&gt;
	UPA = &amp;quot;w:Uralic Phonetic Alphabet&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Generic implementation of competency handler for (natural) languages, scripts, families and &amp;quot;coders&amp;quot; (= programming languages).&lt;br /&gt;
local function competency_handler(data)&lt;br /&gt;
	local category = data.category&lt;br /&gt;
	local langtext = data.langtext&lt;br /&gt;
	local typ = data.typ&lt;br /&gt;
	local args = data.args&lt;br /&gt;
	local code = data.code&lt;br /&gt;
	local langfam = data.langfam&lt;br /&gt;
	local langfamcat = data.langfamcat&lt;br /&gt;
	local script = data.script&lt;br /&gt;
	local scriptcat = data.scriptcat&lt;br /&gt;
	local level = data.level&lt;br /&gt;
	local parents = data.parents&lt;br /&gt;
	local addl_parents = data.addl_parents&lt;br /&gt;
	local topright = data.topright&lt;br /&gt;
	local data_addl = data.additional&lt;br /&gt;
	local inactive = data.inactive&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	local function ins(txt)&lt;br /&gt;
		insert(parts, txt)&lt;br /&gt;
	end&lt;br /&gt;
	local level_params = get_level_params(data)&lt;br /&gt;
&lt;br /&gt;
	local params = level_params[level or &amp;quot;-&amp;quot;]&lt;br /&gt;
	if not params then&lt;br /&gt;
		error((&amp;quot;Internal error: No params for for code &amp;#039;%s&amp;#039;, level %s&amp;quot;):format(code, level or &amp;quot;-&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
	local function insert_text()&lt;br /&gt;
		if langtext then&lt;br /&gt;
			ins(langtext)&lt;br /&gt;
			ins(&amp;quot;&amp;lt;hr /&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if not params[typ] then&lt;br /&gt;
			error((&amp;quot;No English text for code &amp;#039;%s&amp;#039;, type &amp;#039;%s&amp;#039;, level %s&amp;quot;):format(code, typ, level or &amp;quot;-&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		local pattern, repl&lt;br /&gt;
		if typ == &amp;quot;script&amp;quot; then&lt;br /&gt;
			pattern = &amp;quot;!SCRIPT!&amp;quot;&lt;br /&gt;
			repl = (&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. scriptcat .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(script)&lt;br /&gt;
		else&lt;br /&gt;
			pattern = &amp;quot;!LANGFAM!&amp;quot;&lt;br /&gt;
			repl = (&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. langfamcat .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(langfam)&lt;br /&gt;
			if script then&lt;br /&gt;
				repl = repl .. (&amp;quot; written in &amp;#039;&amp;#039;&amp;#039;&amp;quot; .. scriptcat .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(script)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		ins(params[typ]:gsub(pattern, repl))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local additional = {}&lt;br /&gt;
	if level then&lt;br /&gt;
		insert(additional, (&amp;quot;To be included on this list, add {{tl|Babel|%s}} to your user page. Complete instructions are &amp;quot; ..&lt;br /&gt;
			&amp;quot;available at [[Wiktionary:Babel]].&amp;quot;):format(level == &amp;quot;N&amp;quot; and code or (&amp;quot;%s-%s&amp;quot;):format(code, level)))&lt;br /&gt;
	else&lt;br /&gt;
		insert(additional, &amp;quot;To be included on this list, use {{tl|Babel}} on your user page. Complete instructions are &amp;quot; ..&lt;br /&gt;
			&amp;quot;available at [[Wiktionary:Babel]].&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if inactive then&lt;br /&gt;
		insert(additional, &amp;quot;&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; Users in this category have not been active on the English Wiktionary for at &amp;quot; ..&lt;br /&gt;
			&amp;quot;least two years and have been moved into the &amp;#039;inactive&amp;#039; state due to &amp;quot; ..&lt;br /&gt;
			&amp;quot;[[Wiktionary:Votes/pl-2017-04/Removing inactive editors from user-proficiency categories]].&amp;quot;)&lt;br /&gt;
		parents = {{name = category, sort = &amp;quot; &amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	if addl_parents then&lt;br /&gt;
		for _, addl_parent in ipairs(addl_parents) do&lt;br /&gt;
			insert(parents, addl_parent)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if data_addl then&lt;br /&gt;
		insert(additional, data_addl)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local babel_templatestyles = require(&amp;quot;Module:TemplateStyles&amp;quot;)(&amp;quot;Template:Babel/style.css&amp;quot;)&lt;br /&gt;
	if level then&lt;br /&gt;
		ins((&amp;#039;&amp;lt;div class=&amp;quot;babel-box %s&amp;quot;&amp;gt;&amp;#039;):format(params.cssclass))&lt;br /&gt;
		ins(&amp;#039;&amp;lt;table class=&amp;quot;babel-content&amp;quot; style=&amp;quot;width:238px&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;#039;)&lt;br /&gt;
		ins(&amp;#039;&amp;lt;td class=&amp;quot;babel-code&amp;quot; style=&amp;quot;font-size:14pt&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
		ins((&amp;quot;&amp;#039;&amp;#039;&amp;#039;%s-%s&amp;#039;&amp;#039;&amp;#039;&amp;lt;/td&amp;gt;&amp;quot;):format(code, level))&lt;br /&gt;
		ins(&amp;#039;&amp;lt;td class=&amp;quot;babel-text&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
		insert_text()&lt;br /&gt;
		ins(&amp;#039;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br clear=&amp;quot;left&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		return {&lt;br /&gt;
			description = concat(parts) .. babel_templatestyles,&lt;br /&gt;
			additional = concat(additional, &amp;quot;\n\n&amp;quot;),&lt;br /&gt;
			breadcrumb = inactive and &amp;quot;Inactive&amp;quot; or &amp;quot;Level &amp;quot; .. level,&lt;br /&gt;
			parents = parents,&lt;br /&gt;
		}, not not args&lt;br /&gt;
	else&lt;br /&gt;
		ins((&amp;#039;&amp;lt;div class=&amp;quot;babel-box %s&amp;quot;&amp;gt;\n&amp;#039;):format(params.cssclass))&lt;br /&gt;
		ins(&amp;#039;{| class=&amp;quot;babel-content&amp;quot; style=&amp;quot;width:260px;&amp;quot;\n&amp;#039;)&lt;br /&gt;
		ins(&amp;#039;| class=&amp;quot;babel-code&amp;quot; style=&amp;quot;font-size:14pt;&amp;quot; | &amp;#039;)&lt;br /&gt;
		ins((&amp;quot;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;\n&amp;quot;):format(code))&lt;br /&gt;
		ins(&amp;#039;| class=&amp;quot;babel-text&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | &amp;#039;)&lt;br /&gt;
		insert_text()&lt;br /&gt;
		ins(&amp;#039;\n|}&amp;lt;/div&amp;gt;&amp;lt;br clear=&amp;quot;left&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		return {&lt;br /&gt;
			topright = topright,&lt;br /&gt;
			description = concat(parts) .. babel_templatestyles,&lt;br /&gt;
			additional = concat(additional, &amp;quot;\n\n&amp;quot;),&lt;br /&gt;
			breadcrumb = inactive and &amp;quot;Inactive&amp;quot; or lang,&lt;br /&gt;
			parents = parents,&lt;br /&gt;
		}, not not args&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Guts of implementation of competency handlers for natural languages (full or etymology-only), possibly with a&lt;br /&gt;
-- script attached (e.g. [[Category:User ko-Kore]]).&lt;br /&gt;
local function handle_user_lang_maybe_script(data, category, inactive, code, sccode, level, args)&lt;br /&gt;
	local lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(code, nil, &amp;quot;allow etym&amp;quot;)&lt;br /&gt;
	local langname = args.langname&lt;br /&gt;
	local sc, scriptname&lt;br /&gt;
	if sccode then&lt;br /&gt;
		sc = require(&amp;quot;Module:scripts&amp;quot;).getByCode(sccode)&lt;br /&gt;
		scriptname = args.scriptname&lt;br /&gt;
	end&lt;br /&gt;
	local code_with_script = code .. (sccode and &amp;quot;-&amp;quot; .. sccode or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if not lang or sccode and not sc then&lt;br /&gt;
		-- If unrecognized language and called from inside, we&amp;#039;re handling the parents and breadcrumb for a&lt;br /&gt;
		-- higher-level category, so at least return something.&lt;br /&gt;
		if not level and data.called_from_inside then&lt;br /&gt;
			return {&lt;br /&gt;
				-- FIXME, scrape langname= category?&lt;br /&gt;
				breadcrumb = {name = code_with_script, nocap = true},&lt;br /&gt;
				parents = {name = lang and &amp;quot;User languages with invalid script code&amp;quot; or&lt;br /&gt;
					&amp;quot;User languages with invalid code&amp;quot;, sort = code_with_script}&lt;br /&gt;
			}, true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if not langname then&lt;br /&gt;
			-- Check if the code matches a Wikimedia language (e.g. &amp;quot;ku&amp;quot; for Kurdish). If it does, treat&lt;br /&gt;
			-- its canonical name as though it had been given as langname=.&lt;br /&gt;
			local wm_lang = require(&amp;quot;Module:wikimedia languages&amp;quot;).getByCode(code)&lt;br /&gt;
			if not wm_lang then&lt;br /&gt;
				mw.log((&amp;quot;Skipping category &amp;#039;%s&amp;#039; because lang code &amp;#039;%s&amp;#039; is unrecognized and langname= not given&amp;quot;):&lt;br /&gt;
					format(data.category, code))&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			langname = wm_lang:getCanonicalName()&lt;br /&gt;
		end&lt;br /&gt;
		if sccode and not sc and not scriptname then&lt;br /&gt;
			mw.log((&amp;quot;Skipping category &amp;#039;%s&amp;#039; because script code &amp;#039;%s&amp;#039; is unrecognized and scriptname= not given&amp;quot;):&lt;br /&gt;
				format(data.category, sccode))&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not langname then&lt;br /&gt;
		if not lang then&lt;br /&gt;
			error(&amp;quot;Internal error: Something went wrong, undefined lang= should have been caught above&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		langname = lang:getCanonicalName()&lt;br /&gt;
	end&lt;br /&gt;
	if not scriptname and sccode then&lt;br /&gt;
		if not sc then&lt;br /&gt;
			error(&amp;quot;Internal error: Something went wrong, undefined sc= should have been caught above&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Use `getCategoryName` not `getCanonicalName` to display &amp;#039;Foo script&amp;#039; than just &amp;#039;Foo&amp;#039;, as so many scripts&lt;br /&gt;
		-- are the same as language names, and otherwise we get nonsensical output like &amp;quot;These users are native speakers&lt;br /&gt;
		-- of Korean written in Korean&amp;quot;.&lt;br /&gt;
		scriptname = sc:getCategoryName()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Insert text, appropriately script-tagged, unless already script-tagged (we check for &amp;#039;&amp;lt;span&amp;#039;), in which case we&lt;br /&gt;
	-- insert it directly. Also handle &amp;lt;&amp;lt;...&amp;gt;&amp;gt; and &amp;lt;&amp;lt;&amp;lt;...&amp;gt;&amp;gt;&amp;gt; in text and convert to bolded link to parent category.&lt;br /&gt;
	local function wrap(txt)&lt;br /&gt;
		if not txt then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		if sccode then&lt;br /&gt;
			-- Substitute &amp;lt;&amp;lt;&amp;lt;...&amp;gt;&amp;gt;&amp;gt; (where ... is supposed to be the native rendering of the script) with a link to the&lt;br /&gt;
			-- top-level &amp;#039;User SCRIPT&amp;#039; category (e.g. [[:Category:User Kore]] if we&amp;#039;re in a sublevel category, or to the&lt;br /&gt;
			-- top-level script category (e.g. [[:Category:Korean script]]) if we&amp;#039;re in a top-level &amp;#039;User CODE-SCRIPT&amp;#039;&lt;br /&gt;
			-- category.&lt;br /&gt;
			txt = txt:gsub(&amp;quot;&amp;lt;&amp;lt;&amp;lt;(.-)&amp;gt;&amp;gt;&amp;gt;&amp;quot;, function(inside)&lt;br /&gt;
				if level then&lt;br /&gt;
					return (&amp;quot;&amp;#039;&amp;#039;&amp;#039;[[:Category:User %s|%s]]&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(sccode, inside)&lt;br /&gt;
				elseif sc then&lt;br /&gt;
					return (&amp;quot;&amp;#039;&amp;#039;&amp;#039;[[:Category:%s|%s]]&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(sc:getCategoryName(), inside)&lt;br /&gt;
				else&lt;br /&gt;
					return (&amp;quot;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(inside)&lt;br /&gt;
				end&lt;br /&gt;
			end)&lt;br /&gt;
		end&lt;br /&gt;
		-- Substitute &amp;lt;&amp;lt;...&amp;gt;&amp;gt; (where ... is supposed to be the native rendering of the language) with a link to the&lt;br /&gt;
		-- top-level &amp;#039;User CODE&amp;#039; category (e.g. [[:Category:User fr]] or [[:Category:User fr-CA]]) if we&amp;#039;re in a&lt;br /&gt;
		-- sublevel category, or to the top-level language category (e.g. [[:Category:French language]] or&lt;br /&gt;
		-- [[:Category:Canadian English]]) if we&amp;#039;re in a top-level &amp;#039;User CODE&amp;#039; category.&lt;br /&gt;
		txt = txt:gsub(&amp;quot;&amp;lt;&amp;lt;(.-)&amp;gt;&amp;gt;&amp;quot;, function(inside)&lt;br /&gt;
			if level then&lt;br /&gt;
				return (&amp;quot;&amp;#039;&amp;#039;&amp;#039;[[:Category:User %s|%s]]&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(code, inside)&lt;br /&gt;
			elseif lang then&lt;br /&gt;
				return (&amp;quot;&amp;#039;&amp;#039;&amp;#039;[[:Category:%s|%s]]&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(lang:getCategoryName(), inside)&lt;br /&gt;
			else&lt;br /&gt;
				return (&amp;quot;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;&amp;quot;):format(inside)&lt;br /&gt;
			end&lt;br /&gt;
		end)&lt;br /&gt;
		if txt:find(&amp;quot;&amp;lt;span&amp;quot;) or not lang then&lt;br /&gt;
			return txt&lt;br /&gt;
		else&lt;br /&gt;
			return require(&amp;quot;Module:script utilities&amp;quot;).tag_text(txt, lang, sc)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function get_request_cats()&lt;br /&gt;
		if args.text or code == &amp;quot;en&amp;quot; or code:find(&amp;quot;^en%-&amp;quot;) or inactive then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		local num_pages = mw.site.stats.pagesInCategory(data.category, &amp;quot;pages&amp;quot;)&lt;br /&gt;
		local count_cat, count_sort&lt;br /&gt;
		if num_pages == 0 then&lt;br /&gt;
			count_cat = &amp;quot;Requests for translations in user-competency categories with 0 users&amp;quot;&lt;br /&gt;
			count_sort = &amp;quot;*&amp;quot; .. code_with_script&lt;br /&gt;
		elseif num_pages == 1 then&lt;br /&gt;
			count_cat = &amp;quot;Requests for translations in user-competency categories with 1 user&amp;quot;&lt;br /&gt;
			count_sort = &amp;quot;*&amp;quot; .. code_with_script&lt;br /&gt;
		else&lt;br /&gt;
			local lowernum, uppernum&lt;br /&gt;
			lowernum = 2&lt;br /&gt;
			while true do&lt;br /&gt;
				uppernum = lowernum * 2 - 1&lt;br /&gt;
				if num_pages &amp;lt;= uppernum then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
				lowernum = lowernum * 2&lt;br /&gt;
			end&lt;br /&gt;
			count_cat = (&amp;quot;Requests for translations in user-competency categories with %s-%s users&amp;quot;):format(&lt;br /&gt;
				lowernum, uppernum)&lt;br /&gt;
			count_sort = &amp;quot;*&amp;quot; .. (&amp;quot;%0&amp;quot; .. #(tostring(uppernum)) .. &amp;quot;d&amp;quot;):format(num_pages)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local addl_parents = {}&lt;br /&gt;
		insert(addl_parents, {&lt;br /&gt;
			name = &amp;quot;Requests for translations in user-competency categories by language&amp;quot;,&lt;br /&gt;
			sort = code_with_script,&lt;br /&gt;
		})&lt;br /&gt;
		insert(addl_parents, {&lt;br /&gt;
			name = count_cat,&lt;br /&gt;
			sort = count_sort,&lt;br /&gt;
		})&lt;br /&gt;
		return addl_parents&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local invalid_lang_warning&lt;br /&gt;
	if not lang then&lt;br /&gt;
		invalid_lang_warning = &amp;quot;&amp;#039;&amp;#039;&amp;#039;WARNING&amp;#039;&amp;#039;&amp;#039;: The specified language code is invalid on Wiktionary. Please migrate &amp;quot; ..&lt;br /&gt;
			&amp;quot;all competency ratings to the closest valid code.&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parents&lt;br /&gt;
	if level then&lt;br /&gt;
		parents = {(&amp;quot;User %s&amp;quot;):format(code_with_script), sort = level}&lt;br /&gt;
	elseif sccode then&lt;br /&gt;
		parents = {}&lt;br /&gt;
		insert(parents, {name = (&amp;quot;User %s&amp;quot;):format(code), sort = sccode})&lt;br /&gt;
		insert(parents, {name = (&amp;quot;User %s&amp;quot;):format(sccode), sort = code})&lt;br /&gt;
	elseif lang then&lt;br /&gt;
		parents = {}&lt;br /&gt;
		if lang:hasType(&amp;quot;etymology-only&amp;quot;) then&lt;br /&gt;
			local full_code = lang:getFullCode()&lt;br /&gt;
			local sort_key = code:gsub((&amp;quot;^%s%%-&amp;quot;):format(require(string_utilities_module).pattern_escape(full_code)),&lt;br /&gt;
				&amp;quot;&amp;quot;)&lt;br /&gt;
			insert(parents,	{name = (&amp;quot;User %s&amp;quot;):format(full_code), sort = sort_key})&lt;br /&gt;
		else&lt;br /&gt;
			insert(parents, {name = &amp;quot;User languages&amp;quot;, sort = code})&lt;br /&gt;
		end&lt;br /&gt;
		insert(parents, {name = lang:getCategoryName(), sort = &amp;quot;user&amp;quot;})&lt;br /&gt;
	else&lt;br /&gt;
		parents = {&amp;quot;User languages with invalid code&amp;quot;, sort = code}&lt;br /&gt;
	end&lt;br /&gt;
	local addl_parents = get_request_cats()&lt;br /&gt;
&lt;br /&gt;
	local topright&lt;br /&gt;
	if args.commonscat then&lt;br /&gt;
		local commonscat = require(&amp;quot;Module:yesno&amp;quot;)(args.commonscat, &amp;quot;+&amp;quot;)&lt;br /&gt;
		if commonscat == &amp;quot;+&amp;quot; or commonscat == true then&lt;br /&gt;
			commonscat = data.category&lt;br /&gt;
		end&lt;br /&gt;
		if commonscat then&lt;br /&gt;
			topright = (&amp;quot;{{commonscat|%s}}&amp;quot;):format(commonscat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langcat&lt;br /&gt;
	if level then&lt;br /&gt;
		langcat = (&amp;quot;[[:Category:User %s|%%s]]&amp;quot;):format(code)&lt;br /&gt;
	elseif lang then&lt;br /&gt;
		langcat = (&amp;quot;[[:Category:%s|%%s]]&amp;quot;):format(lang:getCategoryName())&lt;br /&gt;
	else&lt;br /&gt;
		langcat = &amp;quot;[[%s]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local scriptcat&lt;br /&gt;
	if sccode then&lt;br /&gt;
		if level then&lt;br /&gt;
			scriptcat = (&amp;quot;[[:Category:User %s|%%s]]&amp;quot;):format(sccode)&lt;br /&gt;
		elseif sc then&lt;br /&gt;
			scriptcat = (&amp;quot;[[:Category:%s|%%s]]&amp;quot;):format(sc:getCategoryName())&lt;br /&gt;
		else&lt;br /&gt;
			scriptcat = &amp;quot;[[%s]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return competency_handler {&lt;br /&gt;
		category = category,&lt;br /&gt;
		inactive = inactive,&lt;br /&gt;
		langtext = wrap(args.text),&lt;br /&gt;
		typ = &amp;quot;lang&amp;quot;,&lt;br /&gt;
		args = args,&lt;br /&gt;
		obj = lang,&lt;br /&gt;
		code = code_with_script,&lt;br /&gt;
		langfam = langname,&lt;br /&gt;
		langfamcat = langcat,&lt;br /&gt;
		script = scriptname,&lt;br /&gt;
		scriptcat = scriptcat,&lt;br /&gt;
		level = level,&lt;br /&gt;
		parents = parents,&lt;br /&gt;
		addl_parents = addl_parents,&lt;br /&gt;
		topright = topright,&lt;br /&gt;
		additional = invalid_lang_warning,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Hander for categories named [[Category:User LANG-SCRIPT]] or [[Category:User LANG-SCRIPT-#]] where # is a&lt;br /&gt;
-- competency level (0 through 5 or N), e.g. [[Category:zh-Hans]] or [[Category:yue-Hant-N]]. It&amp;#039;s a bit tricky because&lt;br /&gt;
-- of the multitude of language formats, e.g. ko-KP is a language code (etym variety) but ko-Kore is a combination&lt;br /&gt;
-- lang + script code. We depend on the fact that all script codes are currently of the form Xxxx or Xxxxx, and check&lt;br /&gt;
-- for that first. We also need to run prior to the lang-only handler (next handler) so it doesn&amp;#039;t try to interpret&lt;br /&gt;
-- the script code as an etym variant code.&lt;br /&gt;
--&lt;br /&gt;
-- Note that there are current categories named things like &amp;#039;zh-Hant-TW&amp;#039; and &amp;#039;zh-Hant-HK-3&amp;#039;, which we don&amp;#039;t support.&lt;br /&gt;
-- They should be renamed to some supported code, e.g. &amp;#039;cmn-TW-Hant&amp;#039; and &amp;#039;yue-HK-Hant-3&amp;#039;.&lt;br /&gt;
insert(raw_handlers, function(data)&lt;br /&gt;
	local category, inactive = data.category:match(&amp;quot;^(.*) (%(inactive%))$&amp;quot;)&lt;br /&gt;
	category = category or data.category&lt;br /&gt;
	local code, sccode, level = category:match(&amp;quot;^User ([a-z][a-z][a-z]?)%-([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	if not code then&lt;br /&gt;
		code, sccode, level =&lt;br /&gt;
			category:match(&amp;quot;^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code, sccode = category:match(&amp;quot;^User ([a-z][a-z][a-z]?)%-([A-Z][a-z][a-z][a-z][a-z]?)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code, sccode = category:match(&amp;quot;^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([A-Z][a-z][a-z][a-z][a-z]?)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(data.args, {&lt;br /&gt;
		text = true,&lt;br /&gt;
		verb = true,&lt;br /&gt;
		langname = true,&lt;br /&gt;
		scriptname = true,&lt;br /&gt;
		scname = {alias_of = &amp;quot;scriptname&amp;quot;},&lt;br /&gt;
		commonscat = true,&lt;br /&gt;
	})&lt;br /&gt;
	&lt;br /&gt;
	return handle_user_lang_maybe_script(data, category, inactive, code, sccode, level, args)&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Hander for categories named [[Category:User LANG]] e.g. [[Category:User en]], [[Category:User en-US]],&lt;br /&gt;
-- [[Category:User ine-pro]] or [[Category:User LANG-#]] where # is a competency level (0 through 5 or N) e.g.&lt;br /&gt;
-- [[Category:User en-N]] or [[Category:User ndl-nl-1]].&lt;br /&gt;
insert(raw_handlers, function(data)&lt;br /&gt;
	local category, inactive = data.category:match(&amp;quot;^(.*) (%(inactive%))$&amp;quot;)&lt;br /&gt;
	category = category or data.category&lt;br /&gt;
	local code, level = category:match(&amp;quot;^User ([a-z][a-z][a-z]?)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	if not code then&lt;br /&gt;
		code, level = category:match(&amp;quot;^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code = category:match(&amp;quot;^User ([a-z][a-z][a-z]?)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code = category:match(&amp;quot;^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(data.args, {&lt;br /&gt;
		text = true,&lt;br /&gt;
		verb = true,&lt;br /&gt;
		langname = true,&lt;br /&gt;
		commonscat = true,&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	return handle_user_lang_maybe_script(data, category, inactive, code, nil, level, args)&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Handler for scripts.&lt;br /&gt;
insert(raw_handlers, function(data)&lt;br /&gt;
	local category, inactive = data.category:match(&amp;quot;^(.*) (%(inactive%))$&amp;quot;)&lt;br /&gt;
	category = category or data.category&lt;br /&gt;
	local code, level = category:match(&amp;quot;^User ([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	if not code then&lt;br /&gt;
		code = category:match(&amp;quot;^User ([A-Z][a-z][a-z][a-z][a-z]?)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code, level = category:match(&amp;quot;^User ([a-z][a-z][a-z]?%-[A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code = category:match(&amp;quot;^User ([a-z][a-z][a-z]?%-[A-Z][a-z][a-z][a-z][a-z]?)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local sc = require(&amp;quot;Module:scripts&amp;quot;).getByCode(code)&lt;br /&gt;
	if not sc then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parents&lt;br /&gt;
	if level then&lt;br /&gt;
		parents = {(&amp;quot;User %s&amp;quot;):format(code), sort = level}&lt;br /&gt;
	else&lt;br /&gt;
		parents = {&lt;br /&gt;
			{name = &amp;quot;User scripts&amp;quot;, sort = code},&lt;br /&gt;
			{name = sc:getCategoryName(), sort = &amp;quot;user&amp;quot;},&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local scriptcat&lt;br /&gt;
	-- Better to display &amp;#039;Foo script&amp;#039; than just &amp;#039;Foo&amp;#039;, as so many scripts are the same as language names.&lt;br /&gt;
	if level then&lt;br /&gt;
		scriptcat = (&amp;quot;[[:Category:User %s|%s]]&amp;quot;):format(code, sc:getCategoryName())&lt;br /&gt;
	else&lt;br /&gt;
		scriptcat = (&amp;quot;[[:Category:%s|%s]]&amp;quot;):format(sc:getCategoryName(), sc:getCategoryName())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return competency_handler {&lt;br /&gt;
		category = category,&lt;br /&gt;
		inactive = inactive,&lt;br /&gt;
		typ = &amp;quot;script&amp;quot;,&lt;br /&gt;
		obj = sc,&lt;br /&gt;
		code = code,&lt;br /&gt;
		script = sc:getCanonicalName(),&lt;br /&gt;
		scriptcat = scriptcat,&lt;br /&gt;
		level = level,&lt;br /&gt;
		parents = parents,&lt;br /&gt;
	}&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Handler for &amp;quot;custom&amp;quot; scripts (e.g. IPA).&lt;br /&gt;
insert(raw_handlers, function(data)&lt;br /&gt;
	local category, inactive = data.category:match(&amp;quot;^(.*) (%(inactive%))$&amp;quot;)&lt;br /&gt;
	category = category or data.category&lt;br /&gt;
	local code, level&lt;br /&gt;
	if not code then&lt;br /&gt;
		code, level = category:match(&amp;quot;^User ([A-Za-z-]+)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code = category:match(&amp;quot;^User ([A-Za-z-]+)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code or not custom_script_links[code] then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parents&lt;br /&gt;
	if level then&lt;br /&gt;
		parents = {(&amp;quot;User %s&amp;quot;):format(code), sort = level}&lt;br /&gt;
	else&lt;br /&gt;
		parents = {&amp;quot;User scripts&amp;quot;, sort = code}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local scriptdata = custom_script_links[code]&lt;br /&gt;
	if type(scriptdata) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		scriptdata = {link = scriptdata}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local scriptcat = (&amp;quot;[[%s|%%s]]&amp;quot;):format(scriptdata.link)&lt;br /&gt;
&lt;br /&gt;
	return competency_handler {&lt;br /&gt;
		category = category,&lt;br /&gt;
		inactive = inactive,&lt;br /&gt;
		typ = &amp;quot;script&amp;quot;,&lt;br /&gt;
		code = code,&lt;br /&gt;
		script = scriptdata.script or code,&lt;br /&gt;
		scriptcat = scriptcat,&lt;br /&gt;
		level = level,&lt;br /&gt;
		parents = parents,&lt;br /&gt;
	}&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Handler for programming languages.&lt;br /&gt;
insert(raw_handlers, function(data)&lt;br /&gt;
	local category, inactive = data.category:match(&amp;quot;^(.*) (%(inactive%))$&amp;quot;)&lt;br /&gt;
	category = category or data.category&lt;br /&gt;
	local code, level&lt;br /&gt;
	if not code then&lt;br /&gt;
		code, level = category:match(&amp;quot;^User ([A-Za-z+-]+) coder%-([0-5N])$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code = category:match(&amp;quot;^User ([A-Za-z+-]+) coder$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code or not coder_links[code] then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parents&lt;br /&gt;
	if level then&lt;br /&gt;
		parents = {(&amp;quot;User %s coder&amp;quot;):format(code), sort = level}&lt;br /&gt;
	else&lt;br /&gt;
		parents = {&amp;quot;User coders&amp;quot;, sort = code}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langdata = coder_links[code]&lt;br /&gt;
	if type(langdata) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		langdata = {link = langdata}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langcat = (&amp;quot;[[%s|%%s]]&amp;quot;):format(langdata.link)&lt;br /&gt;
&lt;br /&gt;
	return competency_handler {&lt;br /&gt;
		category = category,&lt;br /&gt;
		inactive = inactive,&lt;br /&gt;
		typ = &amp;quot;coder&amp;quot;,&lt;br /&gt;
		code = code,&lt;br /&gt;
		langfam = langdata.lang or code,&lt;br /&gt;
		langfamcat = langcat,&lt;br /&gt;
		level = level,&lt;br /&gt;
		parents = parents,&lt;br /&gt;
	}&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Handler for language families.&lt;br /&gt;
insert(raw_handlers, function(data)&lt;br /&gt;
	local category, inactive = data.category:match(&amp;quot;^(.*) (%(inactive%))$&amp;quot;)&lt;br /&gt;
	category = category or data.category&lt;br /&gt;
	local code, level = category:match(&amp;quot;^User ([a-z][a-z][a-z]?)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	if not code then&lt;br /&gt;
		code, level = category:match(&amp;quot;^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([0-5N])$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code = category:match(&amp;quot;^User ([a-z][a-z][a-z]?)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		code = category:match(&amp;quot;^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not code then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local fam = require(&amp;quot;Module:families&amp;quot;).getByCode(code)&lt;br /&gt;
	if not fam then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parents&lt;br /&gt;
	if level then&lt;br /&gt;
		parents = {(&amp;quot;User %s&amp;quot;):format(code), sort = level}&lt;br /&gt;
	else&lt;br /&gt;
		parents = {&lt;br /&gt;
			{name = &amp;quot;User families&amp;quot;, sort = code},&lt;br /&gt;
			{name = fam:getCategoryName(), sort = &amp;quot;user&amp;quot;},&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local famcat&lt;br /&gt;
	if level then&lt;br /&gt;
		famcat = (&amp;quot;[[:Category:User %s|%s]]&amp;quot;):format(code, fam:getCategoryName())&lt;br /&gt;
	else&lt;br /&gt;
		famcat = (&amp;quot;[[:Category:%s|%s]]&amp;quot;):format(fam:getCategoryName(), fam:getCategoryName())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return competency_handler {&lt;br /&gt;
		category = category,&lt;br /&gt;
		inactive = inactive,&lt;br /&gt;
		typ = &amp;quot;family&amp;quot;,&lt;br /&gt;
		obj = fam,&lt;br /&gt;
		code = code,&lt;br /&gt;
		langfam = fam:getCanonicalName(),&lt;br /&gt;
		langfamcat = famcat,&lt;br /&gt;
		level = level,&lt;br /&gt;
		parents = parents,&lt;br /&gt;
	}&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
insert(raw_handlers, function(data)&lt;br /&gt;
	local n, suffix = data.category:match(&amp;quot;^Pages with (%d+) entr(.+)$&amp;quot;)&lt;br /&gt;
	-- Only match if there are no leading zeroes and the suffix is correct.&lt;br /&gt;
	if not (n and not n:match(&amp;quot;^0%d&amp;quot;) and suffix == (n == &amp;quot;1&amp;quot; and &amp;quot;y&amp;quot; or &amp;quot;ies&amp;quot;)) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	return {&lt;br /&gt;
		breadcrumb = (&amp;quot;%d entr%s&amp;quot;):format(n, suffix),&lt;br /&gt;
		description = (&amp;quot;Pages which contain %s language entr%s.&amp;quot;):format(n, suffix),&lt;br /&gt;
		additional = &amp;quot;This category, and others like it, are used to determine the total number of entries on the English Wiktionary&amp;quot;,&lt;br /&gt;
		hidden = true,&lt;br /&gt;
		can_be_empty = true,&lt;br /&gt;
		parents = {&lt;br /&gt;
			{name = &amp;quot;Pages with entries&amp;quot;, sort = require(&amp;quot;Module:category tree&amp;quot;).numeral_sortkey(n)},&lt;br /&gt;
			n == &amp;quot;0&amp;quot; and &amp;quot;Wiktionary maintenance&amp;quot; or nil, -- &amp;quot;Pages with 0 entries&amp;quot; only contains pages with something wrong.&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}&lt;/div&gt;</summary>
		<author><name>wikt&gt;Surjection</name></author>
	</entry>
</feed>