<?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%3Atemplate_cat</id>
	<title>Module:template cat - 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%3Atemplate_cat"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:template_cat&amp;action=history"/>
	<updated>2026-06-27T04:49:41Z</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:template_cat&amp;diff=517202&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;-- Author: Benwing  local export = {}  local require_when_needed = require(&quot;Module:utilities/require when needed&quot;) local is_callable = require_when_needed(&quot;Module:fun&quot;, &quot;is_callable&quot;) local format_categories = require_when_needed(&quot;Module:utilities&quot;, &quot;format_categories&quot;) local parse_interface_module = &quot;Module:parse interface&quot; local m_string_utilities = require(&quot;Module:string utilities&quot;) local und_lang = require(&quot;Module:languages&quot;).getByCode(&quot;und&quot;, true)  local ugsub = m_s...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:template_cat&amp;diff=517202&amp;oldid=prev"/>
		<updated>2026-05-08T13:12:58Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- Author: Benwing  local export = {}  local require_when_needed = require(&amp;quot;Module:utilities/require when needed&amp;quot;) local is_callable = require_when_needed(&amp;quot;Module:fun&amp;quot;, &amp;quot;is_callable&amp;quot;) local format_categories = require_when_needed(&amp;quot;Module:utilities&amp;quot;, &amp;quot;format_categories&amp;quot;) local parse_interface_module = &amp;quot;Module:parse interface&amp;quot; local m_string_utilities = require(&amp;quot;Module:string utilities&amp;quot;) local und_lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(&amp;quot;und&amp;quot;, true)  local ugsub = m_s...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Author: Benwing&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local require_when_needed = require(&amp;quot;Module:utilities/require when needed&amp;quot;)&lt;br /&gt;
local is_callable = require_when_needed(&amp;quot;Module:fun&amp;quot;, &amp;quot;is_callable&amp;quot;)&lt;br /&gt;
local format_categories = require_when_needed(&amp;quot;Module:utilities&amp;quot;, &amp;quot;format_categories&amp;quot;)&lt;br /&gt;
local parse_interface_module = &amp;quot;Module:parse interface&amp;quot;&lt;br /&gt;
local m_string_utilities = require(&amp;quot;Module:string utilities&amp;quot;)&lt;br /&gt;
local und_lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(&amp;quot;und&amp;quot;, true)&lt;br /&gt;
&lt;br /&gt;
local ugsub = m_string_utilities.gsub&lt;br /&gt;
local ufind = m_string_utilities.find&lt;br /&gt;
local split = m_string_utilities.split&lt;br /&gt;
&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local unpack = unpack or table.unpack -- Lua 5.2 compatibility&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- This table detects the category type of the template given its name. When this is invoked, the language code has&lt;br /&gt;
-- already been removed from the beginning, and anything starting with a slash has been truncated. The entries are&lt;br /&gt;
-- processed in order and are two-element lists of Lua patterns (anchored on both sides; beware of hyphens, which need&lt;br /&gt;
-- to be %-escaped) and the category type to use. The category types themselves are mapped to categories in&lt;br /&gt;
-- category_type_to_category.&lt;br /&gt;
local detect_category_type_list = {&lt;br /&gt;
	-- order is important here&lt;br /&gt;
&lt;br /&gt;
	-- nouns, proper nouns, pronouns&lt;br /&gt;
	-- (1) unambiguous decl/infl templates&lt;br /&gt;
	{&amp;quot;decl%-.*proper.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;infl%-.*proper.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;decl%-.*pron.*&amp;quot;, &amp;quot;pronoun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;infl%-.*pron.*&amp;quot;, &amp;quot;pronoun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;decl%-noun.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;infl%-noun.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	-- (2) nouns&lt;br /&gt;
	{&amp;quot;noun&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;noun[ -]form&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;noun[ -]pl&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;noun[ -]plonly&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	-- Some languages, e.g. Urdu, have inflection templates called e.g. [[Template:ur-noun-f-ī]]. They should be called&lt;br /&gt;
	-- [[Template:ur-decl-noun-f-ī]] but we can autodetect them if we exclude the likely cases that are not declension&lt;br /&gt;
	-- templates.&lt;br /&gt;
	{&amp;quot;noun%-.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;ndecl&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;ndecl%-.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	-- (3) proper nouns&lt;br /&gt;
	{&amp;quot;proper[ -]?noun&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;proper[ -]?noun[ -]form&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;proper[ -]?noun[ -]pl&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;proper[ -]?noun[ -]plonly&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;pnoun&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;pnoun[ -]form&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;pnoun[ -]pl&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;pnoun[ -]plonly&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;propn&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;propn[ -]form&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;propn[ -]pl&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;propn[ -]plonly&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	-- See above for inflection templates without &amp;#039;decl&amp;#039; or &amp;#039;infl&amp;#039; in them.&lt;br /&gt;
	{&amp;quot;proper[ -]?noun%-.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;pnoun%-.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;propn%-.*&amp;quot;, &amp;quot;noun inflection-table&amp;quot;},&lt;br /&gt;
	-- (4) pronouns&lt;br /&gt;
	{&amp;quot;pron&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;pronoun&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;pron[ -]form&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;pronoun[ -]form&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;prondecl&amp;quot;, &amp;quot;pronoun inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;prondecl%-.*&amp;quot;, &amp;quot;pronoun inflection-table&amp;quot;},&lt;br /&gt;
	-- adjectives&lt;br /&gt;
	{&amp;quot;decl%-adj.*&amp;quot;, &amp;quot;adjective inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;infl%-adj.*&amp;quot;, &amp;quot;adjective inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;adj&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;adjective&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;adj[ -]form&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;adjective[ -]form&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;adj[ -]comp&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;adjective[ -]comp&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;adj[ -]sup&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;adjective[ -]sup&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	-- Some languages, e.g. Urdu and Lithuanian, have inflection templates called e.g. [[Template:ur-adj-1]] and&lt;br /&gt;
	-- [[Template:lt-adj-is]]. They should be called [[Template:ur-decl-adj-1]] and [[Template:lt-decl-adj-is]] but we&lt;br /&gt;
	-- can autodetect them if we exclude the likely cases that are not declension templates.&lt;br /&gt;
	{&amp;quot;adj%-.*&amp;quot;, &amp;quot;adjective inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;adecl&amp;quot;, &amp;quot;adjective inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;adecl%-.*&amp;quot;, &amp;quot;adjective inflection-table&amp;quot;},&lt;br /&gt;
	-- verbs; need to avoid including conjunctions&lt;br /&gt;
	{&amp;quot;verb&amp;quot;, &amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	{&amp;quot;conj&amp;quot;, &amp;quot;verb inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;conj[0-9 -].*&amp;quot;, &amp;quot;verb inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;conjug.*&amp;quot;, &amp;quot;verb inflection-table&amp;quot;},&lt;br /&gt;
	{&amp;quot;infl%-verb.*&amp;quot;, &amp;quot;verb inflection-table&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
	-- pronunciation&lt;br /&gt;
	{&amp;quot;.*IPA.*&amp;quot;, &amp;quot;pronunciation&amp;quot;},&lt;br /&gt;
	{&amp;quot;pronunciation&amp;quot;, &amp;quot;pronunciation&amp;quot;},&lt;br /&gt;
	{&amp;quot;pr&amp;quot;, &amp;quot;pronunciation&amp;quot;},&lt;br /&gt;
	{&amp;quot;p&amp;quot;, &amp;quot;pronunciation&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
	-- form-of&lt;br /&gt;
	{&amp;quot;.*form of&amp;quot;, &amp;quot;form-of&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
	-- pronominal boxes&lt;br /&gt;
	{&amp;quot;.*personal pronouns&amp;quot;, &amp;quot;personal pronoun&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*demonstrative.*&amp;quot;, &amp;quot;demonstrative&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*interrogative.*&amp;quot;, &amp;quot;interrogative&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*possessives&amp;quot;, &amp;quot;possessive&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*possessive .*&amp;quot;, &amp;quot;possessive&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*reflexives&amp;quot;, &amp;quot;reflexive&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*reflexive .*&amp;quot;, &amp;quot;reflexive&amp;quot;},&lt;br /&gt;
	-- these next two should precede &amp;#039;relative&amp;#039;&lt;br /&gt;
	{&amp;quot;.*correlatives&amp;quot;, &amp;quot;pro-form&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*correlative .*&amp;quot;, &amp;quot;pro-form&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*relative .*&amp;quot;, &amp;quot;relative&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*articles&amp;quot;, &amp;quot;article&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*prefixes&amp;quot;, &amp;quot;affix&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*suffixes&amp;quot;, &amp;quot;affix&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
	-- TOC tables&lt;br /&gt;
	{&amp;quot;.*TOC&amp;quot;, &amp;quot;TOC&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
	-- numbers, numerals&lt;br /&gt;
	{&amp;quot;.*numbers&amp;quot;, &amp;quot;number&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*numerals&amp;quot;, &amp;quot;number&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*ordinals&amp;quot;, &amp;quot;ordinal&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*cardinals&amp;quot;, &amp;quot;cardinal&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*digits&amp;quot;, &amp;quot;digit&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
	-- transliteration&lt;br /&gt;
	{&amp;quot;.*xlit&amp;quot;, &amp;quot;orthographic conversion&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*translit&amp;quot;, &amp;quot;orthographic conversion&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
	-- orthographic and regional variants&lt;br /&gt;
	{&amp;quot;.*variant&amp;quot;, &amp;quot;orthographic variant&amp;quot;},&lt;br /&gt;
	{&amp;quot;.*regional&amp;quot;, &amp;quot;regional variant&amp;quot;},&lt;br /&gt;
	&lt;br /&gt;
	-- sign production templates&lt;br /&gt;
	-- FIXME: We should limit this to sign languages. As it is, we put it near the bottom of the&lt;br /&gt;
	-- pattern list so it doesn&amp;#039;t accidentally override other patterns for non-sign languages.&lt;br /&gt;
	{&amp;quot;prod .*&amp;quot;, &amp;quot;sign production&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- This table indicates how to convert template category types to categories. It consists of a list of pairs, where the&lt;br /&gt;
-- first element is the category type and the second element is a key-value table containing the following keys:&lt;br /&gt;
-- * `aliases`: Optional list of aliases for the category type, which can be used when explicitly specifying the type,&lt;br /&gt;
--   e.g. {{tcat|hw}} instead of {{tcat|headword-line}}.&lt;br /&gt;
-- * `cats`: List of categories to add the template to. Each entry either specifies a &amp;#039;&amp;#039;raw&amp;#039;&amp;#039; category (if the category&lt;br /&gt;
--   name begins with &amp;quot;Category:&amp;quot;), a &amp;#039;&amp;#039;full table&amp;#039;&amp;#039; category (if the category name begins with &amp;quot;label:&amp;quot;, where what&lt;br /&gt;
--   follows specifies the full label without the prefixed language name) or a &amp;#039;&amp;#039;regular label&amp;#039;&amp;#039; category (for other&lt;br /&gt;
--   strings, where e.g. if the label is &amp;quot;noun inflection-table&amp;quot;, the category name is&lt;br /&gt;
--   &amp;quot;LANG noun inflection-table templates&amp;quot;). An entry is either a string, directly specifying the category name, or a&lt;br /&gt;
--   key-value table with keys `name` (the category name) and `sort` (how to generate the sort base). By default, the&lt;br /&gt;
--   sort base for raw categories is a comma-separated list of the language names (not codes) associated with the&lt;br /&gt;
--   template, or the full template name if there are no languages, and the sort base for label categories is the&lt;br /&gt;
--   template name minus the initial language code. If this isn&amp;#039;t correct, the `sort` field specifies how to compute the&lt;br /&gt;
--   sort base. It is either a function of two arguments, the template name and language object, which should return the&lt;br /&gt;
--   sort base; or a table of specs telling how to compute the sort base. In the case of a function, the template name&lt;br /&gt;
--   passed in is the full name for raw categories, but the name minus any language code prefix in the case of label&lt;br /&gt;
--   categories; and for raw categories, a list of all associated language objects is passed in, or {nil} if none, while&lt;br /&gt;
--   for label categories, a single language object is passed in. (Label categories can only exist if there are&lt;br /&gt;
--   associated languages.) In the case where `sort` is a table of specs, it is a list where each element is a&lt;br /&gt;
--   two-element list of a Lua pattern anchored on both sides and the corresponding pattern replacement string. The&lt;br /&gt;
--   specs are processed in order.&lt;br /&gt;
local category_type_to_category = {&lt;br /&gt;
	-- Inflection-table templates&lt;br /&gt;
	{&amp;quot;noun inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;nouninfl&amp;quot;, &amp;quot;noundecl&amp;quot;, &amp;quot;ndecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;noun inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;noun%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch noun-decl-* and decl-noun-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;noun&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;ndecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;ndecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;ndecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;ndecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;propndecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;propndecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;propndecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;propndecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;proper[ -]?noun%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;propn%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;pnoun%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;pronoun inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;proninfl&amp;quot;, &amp;quot;prondecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;pronoun inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;pronoun%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;pron%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch pron-decl-* and decl-pron-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;pronoun&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;pron&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;prondecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;prondecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;prondecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;prondecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;article inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;artinfl&amp;quot;, &amp;quot;artdecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;article inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;article%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;art%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch art-decl-* and decl-art-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;article&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;art&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;artdecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;artdecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;artdecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;artdecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;determiner inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;detinfl&amp;quot;, &amp;quot;detdecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;determiner inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;determiner%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;det%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch det-decl-* and decl-det-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;determiner&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;det&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;detdecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;detdecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;detdecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;detdecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;preposition inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;prepinfl&amp;quot;, &amp;quot;prepdecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;preposition inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;preposition%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;prep%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch prep-decl-* and decl-prep-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;preposition&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;prep&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;prepdecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;prepdecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;prepdecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;prepdecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;prepinfl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;prepinfl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;prepinfl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;prepinfl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;postposition inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;postpinfl&amp;quot;, &amp;quot;postpdecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;postposition inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;postposition%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;postp%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;post%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch postp-decl-* and decl-postp-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;postposition&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;postp&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;post&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;postpdecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;postpdecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;postpdecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;postpdecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;postpinfl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;postpinfl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;postpinfl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;postpinfl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;adjective inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;adjinfl&amp;quot;, &amp;quot;adjdecl&amp;quot;, &amp;quot;adecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;adjective inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;adj%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;adjective%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch adj-decl-* and decl-adj-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;adj&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;adjective&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;adecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;adecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;adecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;adecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;numeral inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;numinfl&amp;quot;, &amp;quot;numdecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;numeral inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;numeral%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;number%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;num%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch num-decl-* and decl-num-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;numeral&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;number&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;num&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;numdecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;numdecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;numdecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;numdecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;nominal inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;nominfl&amp;quot;, &amp;quot;nomdecl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;nominal inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;nominal%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;nom%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch nom-decl-* and decl-nom-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;nominal&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;nom&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;nomdecl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;nomdecl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;nomdecl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;nomdecl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;verb inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;verbinfl&amp;quot;, &amp;quot;conj&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;verb inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;verb%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch verb-infl-* and infl-verb-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;conj%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;conj%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			-- handle conj2, conj1-c, etc.&lt;br /&gt;
			{&amp;quot;conj%-?(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;conj&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;adverb inflection-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;advinfl&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;adverb inflection-table&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;adverb%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;adv%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			-- put this twice to catch adv-decl-* and decl-adv-*&lt;br /&gt;
			{&amp;quot;infl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;decl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;adverb&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;adv&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
			{&amp;quot;advinfl%-base%-(.*)&amp;quot;, &amp;quot; %1&amp;quot;},&lt;br /&gt;
			{&amp;quot;advinfl%-base&amp;quot;, &amp;quot; &amp;quot;},&lt;br /&gt;
			{&amp;quot;advinfl%-(.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
			{&amp;quot;advinfl&amp;quot;, &amp;quot;*&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Inflection-table subtemplates&lt;br /&gt;
	{&amp;quot;inflection-table sub&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;inflsub&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;label:inflection-table subtemplates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Definition templates&lt;br /&gt;
	-- Headword-line templates&lt;br /&gt;
	{&amp;quot;headword-line&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;hw&amp;quot;, &amp;quot;headword&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;headword-line&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Definition templates&lt;br /&gt;
	{&amp;quot;definition&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;def&amp;quot;, &amp;quot;defn&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;definition&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;form-of&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;form of&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;form-of&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Etymology and pronunciation templates&lt;br /&gt;
	{&amp;quot;etymology&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;etym&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;etymology&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;morphology&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;morph&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;etymology&amp;quot;, &amp;quot;Category:Language-specific morphology templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;pronunciation&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;pron&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;pronunciation&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;sign production&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;signprod&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;sign production&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;prod (.*)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
		}}},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Pseudo-namespace templates&lt;br /&gt;
	{&amp;quot;reference&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;ref&amp;quot;},&lt;br /&gt;
		cats = {{name = &amp;quot;reference&amp;quot;, allow_etym = true}},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;quotation&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;quote&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;quotation&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;usage&amp;quot;, {&lt;br /&gt;
		cats = {&amp;quot;usage&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;list&amp;quot;, {&lt;br /&gt;
		cats = {&amp;quot;list&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;auto-table&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;table&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;auto-table&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Navigation templates&lt;br /&gt;
	&lt;br /&gt;
	-- Pro-form box templates&lt;br /&gt;
	{&amp;quot;pro-form&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;pro-forms&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Pro-form box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;adposition&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;adpositions&amp;quot;, &amp;quot;preposition&amp;quot;, &amp;quot;prepositions&amp;quot;, &amp;quot;postposition&amp;quot;, &amp;quot;postpositions&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Adposition box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;affix&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;affixes&amp;quot;, &amp;quot;prefix&amp;quot;, &amp;quot;prefixes&amp;quot;, &amp;quot;suffix&amp;quot;, &amp;quot;suffixes&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Pro-form affix box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;article&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;articles&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Grammatical article box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;demonstrative&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;demonstratives&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Demonstrative box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;interrogative&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;interrogatives&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Interrogative box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;personal pronoun&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;perspron&amp;quot;, &amp;quot;personal pronouns&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Personal pronoun box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;possessive&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;possessives&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Possessive pronoun and determiner box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;reflexive&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;reflexives&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Reflexive pronoun and determiner box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;relative&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;relatives&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Relative pronoun and determiner box templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;navigation&amp;quot;, {&lt;br /&gt;
		-- miscellaneous navigation box templates like {{eu-aux verbs}}, {{pt-forms of address}}&lt;br /&gt;
		aliases = {&amp;quot;nav&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;TOC&amp;quot;, {&lt;br /&gt;
		cats = {{name = &amp;quot;navigation&amp;quot;, sort = {&lt;br /&gt;
			{&amp;quot;categoryTOC&amp;quot;, &amp;quot;TOC&amp;quot;},&lt;br /&gt;
		}}, &amp;quot;Category:TOC templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;number&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;numbers&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Language-specific number templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;cardinal&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;cardinals&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Language-specific number templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;ordinal&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;ordinals&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Language-specific number templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;digit&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;digits&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;list&amp;quot;, &amp;quot;Category:Language-specific number templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Entry templates&lt;br /&gt;
	{&amp;quot;entry&amp;quot;, {&lt;br /&gt;
		cats = {&amp;quot;entry&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Orthographic conversion templates (e.g. for converting between scripts)&lt;br /&gt;
	{&amp;quot;orthographic conversion&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;transliteration&amp;quot;, &amp;quot;translit&amp;quot;, &amp;quot;xlit&amp;quot;, &amp;quot;orthconv&amp;quot;, &amp;quot;scriptconv&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;conversion&amp;quot;, &amp;quot;Category:Orthographic conversion templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Orthographic and regional variant templates (for displaying orthographic, script and/or regional variants)&lt;br /&gt;
	{&amp;quot;orthographic variant&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;orthvar&amp;quot;, &amp;quot;scriptvar&amp;quot;},&lt;br /&gt;
		-- Currently we categorize orthographic and regional variants the same but we could split them if needed&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Orthographic and regional variant templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;regional variant&amp;quot;, {&lt;br /&gt;
		aliases = {&amp;quot;regvar&amp;quot;},&lt;br /&gt;
		cats = {&amp;quot;navigation&amp;quot;, &amp;quot;Category:Orthographic and regional variant templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
&lt;br /&gt;
	-- Internal link templates&lt;br /&gt;
	{&amp;quot;link&amp;quot;, {&lt;br /&gt;
		cats = {&amp;quot;link&amp;quot;, &amp;quot;Category:Language-specific internal link templates&amp;quot;},&lt;br /&gt;
	}},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local category_type_to_category_map = {}&lt;br /&gt;
&lt;br /&gt;
for _, category_type_to_category_spec in ipairs(category_type_to_category) do&lt;br /&gt;
	local category_type, props = unpack(category_type_to_category_spec)&lt;br /&gt;
	category_type_to_category_map[category_type] = props&lt;br /&gt;
	if props.aliases then&lt;br /&gt;
		for _, alias in ipairs(props.aliases) do&lt;br /&gt;
			category_type_to_category_map[alias] = props&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Split an argument on comma, but not comma followed by whitespace; split off sort base after a colon.&lt;br /&gt;
local function split_on_comma_and_split_off_sort_base(val)&lt;br /&gt;
	local cattypes&lt;br /&gt;
	if val:find(&amp;quot;,&amp;quot;) then&lt;br /&gt;
		-- Don&amp;#039;t optimize more than this because there can be commas backslashed, inside of links or followed by&lt;br /&gt;
		-- whitespace that don&amp;#039;t cause splitting.&lt;br /&gt;
		cattypes = require(parse_interface_module).split_on_comma(val)&lt;br /&gt;
	else&lt;br /&gt;
		cattypes = {val}&lt;br /&gt;
	end&lt;br /&gt;
	for i, cattype_spec in ipairs(cattypes) do&lt;br /&gt;
		if cattype_spec:find(&amp;quot;:&amp;quot;) then&lt;br /&gt;
			local cattype, sort_base = cattype_spec:match(&amp;quot;^(.-):(.*)$&amp;quot;)&lt;br /&gt;
			sort_base = sort_base:gsub(&amp;quot;_&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
			cattypes[i] = {name = cattype, sort_base = sort_base}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return cattypes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_lang_or_script(code)&lt;br /&gt;
	return code == &amp;quot;-&amp;quot; and code or&lt;br /&gt;
		require(&amp;quot;Module:languages&amp;quot;).getByCode(code, nil, &amp;quot;allow etym&amp;quot;) or&lt;br /&gt;
		require(&amp;quot;Module:languages&amp;quot;).getByCode(code .. &amp;quot;-pro&amp;quot;, nil, &amp;quot;allow etym&amp;quot;) or&lt;br /&gt;
		require(&amp;quot;Module:scripts&amp;quot;).getByCode(code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function obj_code(obj)&lt;br /&gt;
	if obj == &amp;quot;-&amp;quot; then&lt;br /&gt;
		return obj&lt;br /&gt;
	end&lt;br /&gt;
	return obj:getCode()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_prefixed_obj(after_prefix)&lt;br /&gt;
	return after_prefix:match(&amp;quot;^(%a[%a-]*%a):(.+)$&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_suffixed_obj(after_prefix)&lt;br /&gt;
	local rest, objcode = after_prefix:match(&amp;quot;^(.+)/(%a[%a-]*%a)$&amp;quot;)&lt;br /&gt;
	return objcode, rest&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local pseudo_namespace_templates = {&lt;br /&gt;
	{&amp;quot;R:&amp;quot;, {&lt;br /&gt;
		category_type = &amp;quot;reference&amp;quot;,&lt;br /&gt;
		get_obj_and_rest = get_prefixed_obj,&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;RQ:&amp;quot;, {&lt;br /&gt;
		category_type = &amp;quot;quotation&amp;quot;,&lt;br /&gt;
		get_obj_and_rest = get_prefixed_obj,&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;U:&amp;quot;, {&lt;br /&gt;
		category_type = &amp;quot;usage&amp;quot;,&lt;br /&gt;
		get_obj_and_rest = get_prefixed_obj,&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;list:&amp;quot;, {&lt;br /&gt;
		category_type = &amp;quot;list&amp;quot;,&lt;br /&gt;
		get_obj_and_rest = get_suffixed_obj,&lt;br /&gt;
	}},&lt;br /&gt;
	{&amp;quot;table:&amp;quot;, {&lt;br /&gt;
		category_type = &amp;quot;auto-table&amp;quot;,&lt;br /&gt;
		get_obj_and_rest = get_suffixed_obj,&lt;br /&gt;
	}},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function infer_lang_or_script_code_and_category_type(name)&lt;br /&gt;
	if name:find(&amp;quot;:&amp;quot;) then -- only check for pseudo-namespace prefix when a colon is present&lt;br /&gt;
		for _, pseudo_namespace_spec in ipairs(pseudo_namespace_templates) do&lt;br /&gt;
			local prefix, props = unpack(pseudo_namespace_spec)&lt;br /&gt;
			local after_prefix = name:match(&amp;quot;^&amp;quot; .. prefix .. &amp;quot;(.+)$&amp;quot;)&lt;br /&gt;
			if after_prefix then&lt;br /&gt;
				local objcode, rest = props.get_obj_and_rest(after_prefix)&lt;br /&gt;
				local obj&lt;br /&gt;
				if objcode then&lt;br /&gt;
					obj = get_lang_or_script(objcode) -- may return nil&lt;br /&gt;
					if not obj then&lt;br /&gt;
						rest = after_prefix&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					rest = after_prefix&lt;br /&gt;
				end&lt;br /&gt;
				return obj, rest, props.category_type&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local hyphen_parts = split(name, &amp;quot;%-&amp;quot;)&lt;br /&gt;
	for i = #hyphen_parts - 1, 1, -1 do&lt;br /&gt;
		local code = concat(hyphen_parts, &amp;quot;-&amp;quot;, 1, i)&lt;br /&gt;
		local obj = get_lang_or_script(code)&lt;br /&gt;
		if obj then&lt;br /&gt;
			local rest = concat(hyphen_parts, &amp;quot;-&amp;quot;, i + 1)&lt;br /&gt;
			return obj, rest, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil, name, nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function process_sortbase_specs(sortbase, specs)&lt;br /&gt;
	for _, spec in ipairs(specs) do&lt;br /&gt;
		local from, to = unpack(spec)&lt;br /&gt;
		sortbase = ugsub(sortbase, &amp;quot;^&amp;quot; .. from .. &amp;quot;$&amp;quot;, to)&lt;br /&gt;
	end&lt;br /&gt;
	return sortbase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function template_name_minus_langcode_to_category_type(name)&lt;br /&gt;
	for _, type_spec in ipairs(detect_category_type_list) do&lt;br /&gt;
		local pattern, intended_type = unpack(type_spec)&lt;br /&gt;
		if ufind(name, &amp;quot;^&amp;quot; .. pattern .. &amp;quot;$&amp;quot;) then&lt;br /&gt;
			return intended_type&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function compute_categories_for_template(full_template_name, template_name_minus_langcode, category_type,&lt;br /&gt;
	langs_or_scripts)&lt;br /&gt;
	local overriding_sort_base&lt;br /&gt;
	if type(category_type) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		overriding_sort_base = category_type.sort_base&lt;br /&gt;
		category_type = category_type.name&lt;br /&gt;
	end&lt;br /&gt;
	if not category_type_to_category_map[category_type] then&lt;br /&gt;
		error(&amp;quot;Unrecognized template category type: &amp;quot; .. category_type)&lt;br /&gt;
	end&lt;br /&gt;
	local props = category_type_to_category_map[category_type]&lt;br /&gt;
	if not props.cats then&lt;br /&gt;
		error(&amp;quot;Internal error: No categories given for category type: &amp;quot; .. category_type)&lt;br /&gt;
	end&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	for _, catspec in ipairs(props.cats) do&lt;br /&gt;
		if type(catspec) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			catspec = {name = catspec}&lt;br /&gt;
		end&lt;br /&gt;
		local rawcat = catspec.name:match(&amp;quot;^Category:(.*)&amp;quot;)&lt;br /&gt;
		if rawcat then&lt;br /&gt;
			local sortbase&lt;br /&gt;
			-- User-specified sort base does not apply to raw categories, which have a different sort key format&lt;br /&gt;
			-- than language-specific categories.&lt;br /&gt;
			if not catspec.sort then&lt;br /&gt;
				if langs_or_scripts then&lt;br /&gt;
					local langnames = {}&lt;br /&gt;
					for _, lang_or_sc in ipairs(langs_or_scripts) do&lt;br /&gt;
						insert(langnames, lang_or_sc:getCanonicalName()) -- FIXME: or lang:getFullName()?&lt;br /&gt;
					end&lt;br /&gt;
					sortbase = concat(langnames, &amp;quot;,&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					sortbase = full_template_name&lt;br /&gt;
				end&lt;br /&gt;
			elseif is_callable(catspec.sort) then&lt;br /&gt;
				sortbase = catspec.sort(full_template_name, langs_or_scripts)&lt;br /&gt;
			else&lt;br /&gt;
				sortbase = process_sortbase_specs(full_template_name, catspec.sort)&lt;br /&gt;
			end&lt;br /&gt;
			insert(categories, {cat = rawcat, lang = und_lang, sort_base = sortbase})&lt;br /&gt;
		elseif langs_or_scripts then&lt;br /&gt;
			for _, lang_or_sc in ipairs(langs_or_scripts) do&lt;br /&gt;
				local sortbase&lt;br /&gt;
				if overriding_sort_base then&lt;br /&gt;
					sortbase = overriding_sort_base&lt;br /&gt;
				elseif not catspec.sort then&lt;br /&gt;
					sortbase = template_name_minus_langcode&lt;br /&gt;
				elseif is_callable(catspec.sort) then&lt;br /&gt;
					sortbase = catspec.sort(template_name_minus_langcode, lang_or_sc)&lt;br /&gt;
				else&lt;br /&gt;
					sortbase = process_sortbase_specs(template_name_minus_langcode, catspec.sort)&lt;br /&gt;
				end&lt;br /&gt;
				if lang_or_sc:hasType(&amp;quot;script&amp;quot;) then&lt;br /&gt;
					insert(categories, {&lt;br /&gt;
						cat = (&amp;quot;%s templates&amp;quot;):format(lang_or_sc:getCategoryName()), lang = und_lang, sc = lang_or_sc,&lt;br /&gt;
						sort_base = sortbase,&lt;br /&gt;
					})&lt;br /&gt;
				else&lt;br /&gt;
					local cat&lt;br /&gt;
					local full_label = catspec.name:match(&amp;quot;^label:(.*)$&amp;quot;)&lt;br /&gt;
					local lang_name = catspec.allow_etym and lang_or_sc:getCanonicalName() or lang_or_sc:getFullName()&lt;br /&gt;
					if full_label then&lt;br /&gt;
						cat = (&amp;quot;%s %s&amp;quot;):format(lang_name, full_label)&lt;br /&gt;
					else&lt;br /&gt;
						cat = (&amp;quot;%s %s templates&amp;quot;):format(lang_name, catspec.name)&lt;br /&gt;
					end&lt;br /&gt;
					insert(categories, {&lt;br /&gt;
						cat = cat, lang = lang_or_sc:getFull(), sort_base = sortbase,&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not categories[1] then&lt;br /&gt;
		error((&amp;quot;No categories generated for template [[Template:%s]] with category type &amp;#039;%s&amp;#039;&amp;quot;):format(&lt;br /&gt;
			full_template_name, category_type))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return categories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Main entry point.&lt;br /&gt;
]==]&lt;br /&gt;
function export.categorize(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {}, -- comma-separated list of category types; by default, inferred from template name&lt;br /&gt;
		lang = {}, -- comma-separated list of languages; by default, inferred from template name&lt;br /&gt;
		[&amp;quot;pagename&amp;quot;] = {}, -- for testing&lt;br /&gt;
		[&amp;quot;json&amp;quot;] = {type = &amp;quot;boolean&amp;quot;}, -- for testing&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	args = require(&amp;quot;Module:parameters&amp;quot;).process(parent_args, params)&lt;br /&gt;
	local category_specs = {}&lt;br /&gt;
&lt;br /&gt;
	local function insert_cat(cat, sort_key)&lt;br /&gt;
		for _, existing_cat in ipairs(category_specs) do&lt;br /&gt;
			if existing_cat.cat == cat then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		insert(category_specs, {cat = cat, sort_key = sort_key})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local pagename = args.pagename&lt;br /&gt;
	if not pagename then&lt;br /&gt;
		title = mw.title.getCurrentTitle()&lt;br /&gt;
		pagename = title.fullText&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if pagename:find(&amp;quot;/documentation$&amp;quot;) or pagename:find(&amp;quot;/documentation/&amp;quot;) then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if pagename:find(&amp;quot;^Template:User:&amp;quot;) then&lt;br /&gt;
		insert_cat(&amp;quot;User sandbox templates&amp;quot;, (pagename:gsub(&amp;quot;^Template:User:&amp;quot;, &amp;quot;&amp;quot;)))&lt;br /&gt;
	elseif pagename:find(&amp;quot;^User:&amp;quot;) then&lt;br /&gt;
		insert_cat(&amp;quot;User sandbox templates&amp;quot;, (pagename:gsub(&amp;quot;^User:&amp;quot;, &amp;quot;&amp;quot;)))&lt;br /&gt;
	else&lt;br /&gt;
		if not pagename:find(&amp;quot;^Template:&amp;quot;) then&lt;br /&gt;
			error((&amp;quot;This template should only be used in the Template namespace, not on page &amp;#039;%s&amp;#039;&amp;quot;):format(pagename))&lt;br /&gt;
		end&lt;br /&gt;
		local full_template_name = pagename:gsub(&amp;quot;^Template:&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		local rootpage = full_template_name:gsub(&amp;quot;/.*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		if full_template_name:find(&amp;quot;/sandbox&amp;quot;) then&lt;br /&gt;
			insert_cat(&amp;quot;Sandbox templates&amp;quot;, full_template_name)&lt;br /&gt;
		elseif full_template_name:find(&amp;quot;^sandbox/&amp;quot;) then&lt;br /&gt;
			insert_cat(&amp;quot;Sandbox templates&amp;quot;, full_template_name:gsub(&amp;quot;^sandbox/&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
		else&lt;br /&gt;
			local template_objs&lt;br /&gt;
			if args.lang == &amp;quot;-&amp;quot; then&lt;br /&gt;
				template_objs = false&lt;br /&gt;
			elseif args.lang then&lt;br /&gt;
				template_objs = {}&lt;br /&gt;
				for _, code in ipairs(split(args.lang, &amp;quot;,&amp;quot;)) do&lt;br /&gt;
					-- We need to have an indicator of families because we allow bare family codes to stand for proto-languages.&lt;br /&gt;
					if code:find(&amp;quot;^fam:&amp;quot;) then&lt;br /&gt;
						code = code:gsub(&amp;quot;^fam:&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						local family = require(&amp;quot;Module:families&amp;quot;).getByCode(code) or&lt;br /&gt;
							error((&amp;quot;Unrecognized family code &amp;#039;%s&amp;#039; in [[Module:template cat]]&amp;quot;):format(code))&lt;br /&gt;
						local descendants = family:getDescendantCodes()&lt;br /&gt;
						for _, desc in ipairs(descendants) do&lt;br /&gt;
							local obj = get_lang_or_script(desc)&lt;br /&gt;
							if obj then&lt;br /&gt;
								-- make sure we skip families without proto-languages&lt;br /&gt;
								insert(template_objs, obj)&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						local obj = get_lang_or_script(code)&lt;br /&gt;
						if not obj then&lt;br /&gt;
							error((&amp;quot;Unrecognized language or script code &amp;#039;%s&amp;#039;&amp;quot;):format(code))&lt;br /&gt;
						end&lt;br /&gt;
						insert(template_objs, obj)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local cattypes&lt;br /&gt;
			if args[1] then&lt;br /&gt;
				cattypes = split_on_comma_and_split_off_sort_base(args[1])&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local inferred_obj, inferred_rest, inferred_cattype =&lt;br /&gt;
				infer_lang_or_script_code_and_category_type(rootpage)&lt;br /&gt;
			if template_objs == nil or not cattypes then&lt;br /&gt;
				if template_objs == nil then&lt;br /&gt;
					if not inferred_obj then&lt;br /&gt;
						if not inferred_cattype then&lt;br /&gt;
							error((&amp;quot;Unable to infer language or script from template root page &amp;#039;%s&amp;#039; for template &amp;#039;%s&amp;#039;; specify lang/script and type explicitly&amp;quot;):format(&lt;br /&gt;
								rootpage, pagename))&lt;br /&gt;
						else&lt;br /&gt;
							error((&amp;quot;Unable to infer language or script from template root page &amp;#039;%s&amp;#039; for template &amp;#039;%s&amp;#039;, inferred category type &amp;#039;%s&amp;#039;; specify lang/script explicitly&amp;quot;):format(&lt;br /&gt;
								rootpage, pagename, inferred_cattype))&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						template_objs = {inferred_obj}&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not cattypes then&lt;br /&gt;
					inferred_cattype = inferred_cattype or&lt;br /&gt;
						template_name_minus_langcode_to_category_type(inferred_rest)&lt;br /&gt;
					if not inferred_cattype then&lt;br /&gt;
						error((&amp;quot;Unable to infer template category type from template remainder (after stripping langcode) &amp;#039;%s&amp;#039; for template &amp;#039;%s&amp;#039;; specify type explicitly&amp;quot;):format(&lt;br /&gt;
							inferred_rest, pagename))&lt;br /&gt;
					end&lt;br /&gt;
					cattypes = {inferred_cattype}&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			for _, cattype in ipairs(cattypes) do&lt;br /&gt;
				local cats = compute_categories_for_template(full_template_name, inferred_rest, cattype, template_objs)&lt;br /&gt;
				for _, cat in ipairs(cats) do&lt;br /&gt;
					insert(category_specs, cat)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- We are returning categories for templates or user-space pages, so we need to force the output.&lt;br /&gt;
	local retval = format_categories(category_specs, nil, nil, nil, &amp;quot;force_output&amp;quot;)&lt;br /&gt;
	if args.json then&lt;br /&gt;
		return require(&amp;quot;Module:JSON&amp;quot;).toJSON {&lt;br /&gt;
			category_specs = category_specs,&lt;br /&gt;
			retval = mw.text.nowiki(retval),&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		return retval&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Table used in the documentation to {{tl|template cat}}.]==]&lt;br /&gt;
function export.pattern_to_category_type_table()&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	local function ins(text)&lt;br /&gt;
		insert(parts, text)&lt;br /&gt;
	end&lt;br /&gt;
	ins(&amp;#039;{|class=&amp;quot;wikitable&amp;quot;&amp;#039;)&lt;br /&gt;
	ins(&amp;quot;! Pattern !! Inferred category type&amp;quot;)&lt;br /&gt;
	for _, detect_spec in ipairs(detect_category_type_list) do&lt;br /&gt;
		local pattern, category_type = unpack(detect_spec)&lt;br /&gt;
		ins(&amp;quot;|-&amp;quot;)&lt;br /&gt;
		ins((&amp;quot;| &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;):format(pattern, category_type))&lt;br /&gt;
	end&lt;br /&gt;
	ins(&amp;quot;|}&amp;quot;)&lt;br /&gt;
	return concat(parts, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Table used in the documentation to {{tl|template cat}}.]==]&lt;br /&gt;
function export.category_type_to_category_table()&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	local function ins(text)&lt;br /&gt;
		insert(parts, text)&lt;br /&gt;
	end&lt;br /&gt;
	local category_types = {}&lt;br /&gt;
	local category_type_to_aliases = {}&lt;br /&gt;
&lt;br /&gt;
	for _, category_type_to_category_spec in ipairs(category_type_to_category) do&lt;br /&gt;
		local category_type, props = unpack(category_type_to_category_spec)&lt;br /&gt;
		insert(category_types, category_type)&lt;br /&gt;
		category_type_to_aliases[category_type] = {}&lt;br /&gt;
		if props.aliases then&lt;br /&gt;
			for _, alias in ipairs(props.aliases) do&lt;br /&gt;
				insert(category_type_to_aliases[category_type], alias)&lt;br /&gt;
			end&lt;br /&gt;
			table.sort(category_type_to_aliases[category_type])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(category_types)&lt;br /&gt;
&lt;br /&gt;
	local function get_category_type_categories(category_type)&lt;br /&gt;
		local cats = {}&lt;br /&gt;
		for _, catspec in ipairs(category_type_to_category_map[category_type].cats) do&lt;br /&gt;
			if type(catspec) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				catspec = {name = catspec}&lt;br /&gt;
			end&lt;br /&gt;
			local cat = catspec.name&lt;br /&gt;
			if cat:find(&amp;quot;^Category:&amp;quot;) then&lt;br /&gt;
				insert(cats, (&amp;quot;&amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;):format((cat:gsub(&amp;quot;^Category:&amp;quot;, &amp;quot;&amp;quot;))))&lt;br /&gt;
			elseif cat:find(&amp;quot;^label:&amp;quot;) then&lt;br /&gt;
				insert(cats, (&amp;quot;&amp;lt;code&amp;gt;&amp;lt;var&amp;gt;LANG&amp;lt;/var&amp;gt; %s&amp;lt;/code&amp;gt;&amp;quot;):format((cat:gsub(&amp;quot;^label:&amp;quot;, &amp;quot;&amp;quot;))))&lt;br /&gt;
			else&lt;br /&gt;
				insert(cats, (&amp;quot;&amp;lt;code&amp;gt;&amp;lt;var&amp;gt;LANG&amp;lt;/var&amp;gt; %s templates&amp;lt;/code&amp;gt;&amp;quot;):format(cat))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return concat(cats, &amp;quot;, &amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ins(&amp;#039;{|class=&amp;quot;wikitable&amp;quot;&amp;#039;)&lt;br /&gt;
	ins(&amp;quot;! Category type !! Canonical category type !! Categories&amp;quot;)&lt;br /&gt;
	for _, category_type in ipairs(category_types) do&lt;br /&gt;
		ins(&amp;quot;|-&amp;quot;)&lt;br /&gt;
		ins((&amp;quot;| &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; || &amp;#039;&amp;#039;(same)&amp;#039;&amp;#039; || &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;):format(&lt;br /&gt;
			category_type, get_category_type_categories(category_type)))&lt;br /&gt;
		for _, alias in ipairs(category_type_to_aliases[category_type]) do&lt;br /&gt;
			ins(&amp;quot;|-&amp;quot;)&lt;br /&gt;
			ins((&amp;quot;| &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;):format(&lt;br /&gt;
				alias, category_type, get_category_type_categories(category_type)))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	ins(&amp;quot;|}&amp;quot;)&lt;br /&gt;
	return concat(parts, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>