<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sware</id>
	<title>Linguifex - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sware"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/wiki/Special:Contributions/Sware"/>
	<updated>2026-04-05T12:16:46Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492671</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492671"/>
		<updated>2026-04-02T15:08:34Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
	&lt;br /&gt;
	local dest_lang = m_lang.getByCode(dest_code)&lt;br /&gt;
	local etymologies = {}&lt;br /&gt;
&lt;br /&gt;
	-- iterate in stable order&lt;br /&gt;
	for _, ancestor in ipairs(ancestor_codes) do&lt;br /&gt;
		local code = ancestor.code&lt;br /&gt;
		local lang_options = ancestor.options or {}&lt;br /&gt;
&lt;br /&gt;
		local ancestor_lang = m_lang.getByCode(code)&lt;br /&gt;
&lt;br /&gt;
		local ancestor_params = {&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not lang_options.optional,&lt;br /&gt;
				list = lang_options.roots,&lt;br /&gt;
				default = lang_options.default,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if lang_options.roots then&lt;br /&gt;
			ancestor_params[1].allow_holes = true&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local parsed = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = ancestor_params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = parent_args,&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = ancestor_lang,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		local terms = parsed.terms&lt;br /&gt;
&lt;br /&gt;
		-- ensure at least one term exists&lt;br /&gt;
		if not terms[1] then&lt;br /&gt;
			terms[1] = { lang = ancestor_lang }&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local etymology = m_etym.format_derived({&lt;br /&gt;
			lang = dest_lang,&lt;br /&gt;
			sources = { ancestor_lang },&lt;br /&gt;
			terms = terms,&lt;br /&gt;
			nocat = parent_args.nocat,&lt;br /&gt;
			template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		table.insert(etymologies, etymology)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return etymologies&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parent_args, etymologies)&lt;br /&gt;
&lt;br /&gt;
	local capital = parent_args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(etymologies, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang.getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {default = &amp;quot;asʰilavən&amp;quot;},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true, roots = true, default = &amp;quot;asł-ila&amp;quot;}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local evolution = parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	&lt;br /&gt;
	return concat_etymologies(parent_args, evolution)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;lyti-mid&amp;quot;] = {optional = not parent_args.mid},&lt;br /&gt;
		[&amp;quot;lyti-old&amp;quot;] = {optional = not parent_args.old},&lt;br /&gt;
		[source_code] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492670</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492670"/>
		<updated>2026-04-02T15:07:43Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, ancestor_specs)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({&lt;br /&gt;
		{ group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;} },&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	local parsed = {}&lt;br /&gt;
	local common = {&lt;br /&gt;
		nocat = parent_args.nocat,&lt;br /&gt;
		nocap = parent_args.nocap,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for i, spec in ipairs(ancestor_specs) do&lt;br /&gt;
		local lang = m_lang.getByCode(spec.code)&lt;br /&gt;
		local params = {&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not spec.optional,&lt;br /&gt;
				list = spec.roots and &amp;quot;term&amp;quot;,&lt;br /&gt;
				allow_holes = spec.roots or nil,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		local terms_obj = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = { [1] = parent_args[i] }, -- map positional arg i -&amp;gt; local [1]&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = lang,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		local terms = terms_obj.terms&lt;br /&gt;
		if not terms[1] then&lt;br /&gt;
			terms[1] = { lang = lang } -- allow empty optional term if desired&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		parsed[i] = {&lt;br /&gt;
			lang = lang,&lt;br /&gt;
			terms = terms,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return parsed, common&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parsed, opts, dest_lang)&lt;br /&gt;
	local chunks = {}&lt;br /&gt;
&lt;br /&gt;
	for _, item in ipairs(parsed) do&lt;br /&gt;
		if item.terms and item.terms[1] then&lt;br /&gt;
			table.insert(chunks, m_etym.format_derived({&lt;br /&gt;
				lang = dest_lang,&lt;br /&gt;
				sources = { item.lang },&lt;br /&gt;
				terms = item.terms,&lt;br /&gt;
				nocat = opts.nocat,&lt;br /&gt;
				template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
			}))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local capital = opts.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	local text = capital .. &amp;quot;rom &amp;quot; .. table.concat(chunks, &amp;quot;, from &amp;quot;)&lt;br /&gt;
	return text .. &amp;quot;.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang.getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local ancestor_specs = {&lt;br /&gt;
		{ code = &amp;quot;sekh&amp;quot;, optional = false },&lt;br /&gt;
		{ code = &amp;quot;wasc&amp;quot;, optional = true, roots = true },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parsed, opts = parse_args(parent_args, ancestor_specs)&lt;br /&gt;
	return concat_etymologies(parsed, opts, dest_lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		{code = &amp;quot;lyti-mid&amp;quot;, options = {optional = not parent_args.mid}},&lt;br /&gt;
		{code = &amp;quot;lyti-old&amp;quot;, options = {optional = not parent_args.old}},&lt;br /&gt;
		{code = source_code, options = {}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local etymologies = parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
	return concat_etymologies(parent_args, etymologies)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492669</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492669"/>
		<updated>2026-04-02T15:07:08Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, ancestor_specs)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({&lt;br /&gt;
		{ group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;} },&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	local parsed = {}&lt;br /&gt;
	local common = {&lt;br /&gt;
		nocat = parent_args.nocat,&lt;br /&gt;
		nocap = parent_args.nocap,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for i, spec in ipairs(ancestor_specs) do&lt;br /&gt;
		local lang = m_lang.getByCode(spec.code)&lt;br /&gt;
		local params = {&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not spec.optional,&lt;br /&gt;
				list = spec.roots and &amp;quot;term&amp;quot;,&lt;br /&gt;
				allow_holes = spec.roots or nil,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		local terms_obj = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = { [1] = parent_args[i] }, -- map positional arg i -&amp;gt; local [1]&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = lang,&lt;br /&gt;
			sc = &amp;quot;sc.default&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		local terms = terms_obj.terms&lt;br /&gt;
		if not terms[1] then&lt;br /&gt;
			terms[1] = { lang = lang } -- allow empty optional term if desired&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		parsed[i] = {&lt;br /&gt;
			lang = lang,&lt;br /&gt;
			terms = terms,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return parsed, common&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parsed, opts, dest_lang)&lt;br /&gt;
	local chunks = {}&lt;br /&gt;
&lt;br /&gt;
	for _, item in ipairs(parsed) do&lt;br /&gt;
		if item.terms and item.terms[1] then&lt;br /&gt;
			table.insert(chunks, m_etym.format_derived({&lt;br /&gt;
				lang = dest_lang,&lt;br /&gt;
				sources = { item.lang },&lt;br /&gt;
				terms = item.terms,&lt;br /&gt;
				nocat = opts.nocat,&lt;br /&gt;
				template_name = &amp;quot;der&amp;quot;,&lt;br /&gt;
			}))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local capital = opts.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	local text = capital .. &amp;quot;rom &amp;quot; .. table.concat(chunks, &amp;quot;, from &amp;quot;)&lt;br /&gt;
	return text .. &amp;quot;.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang.getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local ancestor_specs = {&lt;br /&gt;
		{ code = &amp;quot;sekh&amp;quot;, optional = false },&lt;br /&gt;
		{ code = &amp;quot;wasc&amp;quot;, optional = true, roots = true },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parsed, opts = parse_args(parent_args, ancestor_specs)&lt;br /&gt;
	return concat_etymologies(parsed, opts, dest_lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		{code = &amp;quot;lyti-mid&amp;quot;, options = {optional = not parent_args.mid}},&lt;br /&gt;
		{code = &amp;quot;lyti-old&amp;quot;, options = {optional = not parent_args.old}},&lt;br /&gt;
		{code = source_code, options = {}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local etymologies = parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
	return concat_etymologies(parent_args, etymologies)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492668</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492668"/>
		<updated>2026-04-02T14:46:11Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
	local dest_lang = m_lang.getByCode(dest_code)&lt;br /&gt;
	local etymologies = {}&lt;br /&gt;
&lt;br /&gt;
	-- Parse all terms once&lt;br /&gt;
	local parsed = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
		params = {},  -- generic, handled per ancestor below&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 1,&lt;br /&gt;
	})&lt;br /&gt;
	local all_terms = parsed.terms&lt;br /&gt;
&lt;br /&gt;
	-- Loop through ancestors in order&lt;br /&gt;
	for i, ancestor in ipairs(ancestor_codes) do&lt;br /&gt;
		local code = ancestor.code&lt;br /&gt;
		local options = ancestor.options or {}&lt;br /&gt;
		local ancestor_lang = m_lang.getByCode(code)&lt;br /&gt;
&lt;br /&gt;
		-- Select the correct term(s) for this ancestor&lt;br /&gt;
		local terms = {}&lt;br /&gt;
		if i == 1 then&lt;br /&gt;
			-- first ancestor takes the first term&lt;br /&gt;
			if all_terms[1] then terms = { all_terms[1] } end&lt;br /&gt;
		else&lt;br /&gt;
			-- subsequent ancestors take remaining terms&lt;br /&gt;
			for j = i, #all_terms do&lt;br /&gt;
				table.insert(terms, all_terms[j])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Ensure at least one term exists&lt;br /&gt;
		if not terms[1] then&lt;br /&gt;
			terms[1] = { lang = ancestor_lang }&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Generate etymology step&lt;br /&gt;
		local etymology = m_etym.format_derived({&lt;br /&gt;
			lang = dest_lang,&lt;br /&gt;
			sources = { ancestor_lang },&lt;br /&gt;
			terms = terms,&lt;br /&gt;
			nocat = parent_args.nocat,&lt;br /&gt;
			template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		table.insert(etymologies, etymology)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return etymologies&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Concatenate multiple etymology steps into a readable string&lt;br /&gt;
local function concat_etymologies(parent_args, etymologies)&lt;br /&gt;
	local capital = parent_args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(etymologies, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		{ code = &amp;quot;sekh&amp;quot;, options = { default = &amp;quot;asʰilavən&amp;quot; } },&lt;br /&gt;
		{ code = &amp;quot;wasc&amp;quot;, options = { optional = true, roots = true, default = &amp;quot;asł-ila&amp;quot; } },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local etymologies = parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	return concat_etymologies(parent_args, etymologies)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		{code = &amp;quot;lyti-mid&amp;quot;, options = {optional = not parent_args.mid}},&lt;br /&gt;
		{code = &amp;quot;lyti-old&amp;quot;, options = {optional = not parent_args.old}},&lt;br /&gt;
		{code = source_code, options = {}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local etymologies = parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
	return concat_etymologies(parent_args, etymologies)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492667</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492667"/>
		<updated>2026-04-02T14:23:32Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
	&lt;br /&gt;
	local dest_lang = m_lang.getByCode(dest_code)&lt;br /&gt;
	local etymologies = {}&lt;br /&gt;
&lt;br /&gt;
	-- iterate in stable order&lt;br /&gt;
	for _, ancestor in ipairs(ancestor_codes) do&lt;br /&gt;
		local code = ancestor.code&lt;br /&gt;
		local lang_options = ancestor.options or {}&lt;br /&gt;
&lt;br /&gt;
		local ancestor_lang = m_lang.getByCode(code)&lt;br /&gt;
&lt;br /&gt;
		local ancestor_params = {&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not lang_options.optional,&lt;br /&gt;
				list = lang_options.roots,&lt;br /&gt;
				default = lang_options.default,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if lang_options.roots then&lt;br /&gt;
			ancestor_params[1].allow_holes = true&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local parsed = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = ancestor_params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = parent_args,&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = ancestor_lang,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		local terms = parsed.terms&lt;br /&gt;
&lt;br /&gt;
		-- ensure at least one term exists&lt;br /&gt;
		if not terms[1] then&lt;br /&gt;
			terms[1] = { lang = ancestor_lang }&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local etymology = m_etym.format_derived({&lt;br /&gt;
			lang = dest_lang,&lt;br /&gt;
			sources = { ancestor_lang },&lt;br /&gt;
			terms = terms,&lt;br /&gt;
			nocat = parent_args.nocat,&lt;br /&gt;
			template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		table.insert(etymologies, etymology)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return etymologies&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parent_args, etymologies)&lt;br /&gt;
&lt;br /&gt;
	local capital = parent_args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(etymologies, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang.getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		{code = &amp;quot;sekh&amp;quot;, options = {default = &amp;quot;asʰilavən&amp;quot;}},&lt;br /&gt;
		{code = &amp;quot;wasc&amp;quot;, options = {optional = true, roots = true, default = &amp;quot;asł-ila&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local evolution = parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	&lt;br /&gt;
	return concat_etymologies(parent_args, evolution)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		{code = &amp;quot;lyti-mid&amp;quot;, options = {optional = not parent_args.mid}},&lt;br /&gt;
		{code = &amp;quot;lyti-old&amp;quot;, options = {optional = not parent_args.old}},&lt;br /&gt;
		{code = source_code, options = {}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local etymologies = parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
	return concat_etymologies(parent_args, etymologies)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Template:Qsc-inh&amp;diff=492665</id>
		<title>Template:Qsc-inh</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Template:Qsc-inh&amp;diff=492665"/>
		<updated>2026-04-02T13:57:43Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{lua|pollasena-roots}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#invoke: pollasena-roots|qsc}}&lt;br /&gt;
&lt;br /&gt;
{{#if: {{{nocap|}}}|f|F}}rom {{mn|sekh|{{{1|}}}}}{{#if:{{{2|}}}|, from [[Wascotl]] &amp;lt;i&amp;gt;{{#invoke: pollasena-roots|getLink|wasc|qsc|old=1}}&amp;lt;/i&amp;gt;|}}.{{#ifeq:{{NAMESPACE}}|Template||[[Category:Soc&#039;ul&#039; inherited terms]]}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{documentation}}[[Category:Soc&#039;ul&#039; templates|i]][[Category:Soc&#039;ul&#039; etymology templates|i]][[Category:Contionary templates]][[Category:Templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492664</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492664"/>
		<updated>2026-04-02T13:52:22Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
	&lt;br /&gt;
	local dest_lang = m_lang.getByCode(dest_code)&lt;br /&gt;
	local etymologies = {}&lt;br /&gt;
&lt;br /&gt;
	-- iterate in stable order&lt;br /&gt;
	for _, ancestor in ipairs(ancestor_codes) do&lt;br /&gt;
		local code = ancestor.code&lt;br /&gt;
		local lang_options = ancestor.options or {}&lt;br /&gt;
&lt;br /&gt;
		local ancestor_lang = m_lang.getByCode(code)&lt;br /&gt;
&lt;br /&gt;
		local ancestor_params = {&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not lang_options.optional,&lt;br /&gt;
				list = lang_options.roots,&lt;br /&gt;
				default = lang_options.default,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if lang_options.roots then&lt;br /&gt;
			ancestor_params[1].allow_holes = true&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local parsed = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = ancestor_params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = parent_args,&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = ancestor_lang,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		local terms = parsed.terms&lt;br /&gt;
&lt;br /&gt;
		-- ensure at least one term exists&lt;br /&gt;
		if not terms[1] then&lt;br /&gt;
			terms[1] = { lang = ancestor_lang }&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local etymology = m_etym.format_derived({&lt;br /&gt;
			lang = dest_lang,&lt;br /&gt;
			sources = { ancestor_lang },&lt;br /&gt;
			terms = terms,&lt;br /&gt;
			nocat = parent_args.nocat,&lt;br /&gt;
			template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
		table.insert(etymologies, etymology)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return etymologies&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parent_args, etymologies)&lt;br /&gt;
&lt;br /&gt;
	local capital = parent_args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(etymologies, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang.getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {default = &amp;quot;asʰilavən&amp;quot;},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true, roots = true, default = &amp;quot;asł-ila&amp;quot;}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local evolution = parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	&lt;br /&gt;
	return concat_etymologies(parent_args, evolution)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;lyti-mid&amp;quot;] = {optional = not parent_args.mid},&lt;br /&gt;
		[&amp;quot;lyti-old&amp;quot;] = {optional = not parent_args.old},&lt;br /&gt;
		[source_code] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492663</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492663"/>
		<updated>2026-04-02T12:50:55Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
	&lt;br /&gt;
	local dest_lang = m_lang.getByCode(dest_code)&lt;br /&gt;
	local ancestor_lang, etymology&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_params, terms, args, etymologies = {}, {}, {}, {}&lt;br /&gt;
	for ancestor_code, lang_options in pairs(ancestor_codes) do&lt;br /&gt;
		ancestor_params = {&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not lang_options.optional,&lt;br /&gt;
				list = lang_options.roots,&lt;br /&gt;
				template_default = lang_options.default&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if lang_options.roots then&lt;br /&gt;
			params[1].allow_holes = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		ancestor_lang = m_lang.getByCode(ancestor_code)&lt;br /&gt;
		&lt;br /&gt;
		terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = ancestor_params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = parent_args,&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = ancestor_lang,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
		if not terms.terms[1] then&lt;br /&gt;
			terms.terms[1] = {&lt;br /&gt;
				lang = ancestor_lang,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		terms = terms.terms&lt;br /&gt;
		etymology = m_etym.format_derived({&lt;br /&gt;
			lang = dest_lang,&lt;br /&gt;
			sources = ancestor_lang,&lt;br /&gt;
			terms = terms[ancestor_code],&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
		table.insert(etymologies, etymology)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return etymologies&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parent_args, etymologies)&lt;br /&gt;
&lt;br /&gt;
	local capital = parent_args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(etymologies, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang.getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {default = &amp;quot;asʰilavən&amp;quot;},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true, roots = true, default = &amp;quot;asł-ila&amp;quot;}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local evolution = parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	&lt;br /&gt;
	return concat_etymologies(parent_args, evolution)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;lyti-mid&amp;quot;] = {optional = not parent_args.mid},&lt;br /&gt;
		[&amp;quot;lyti-old&amp;quot;] = {optional = not parent_args.old},&lt;br /&gt;
		[source_code] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492662</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492662"/>
		<updated>2026-04-02T12:38:30Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
	&lt;br /&gt;
	local dest_lang = m_lang.getByCode(dest_code)&lt;br /&gt;
	local ancestor_lang, etymology&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_params, terms, args, etymologies = {}, {}, {}, {}&lt;br /&gt;
	for ancestor_code, lang_options in pairs(ancestor_codes) do&lt;br /&gt;
		ancestor_params = {&lt;br /&gt;
			[&amp;quot;nocat&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
			[&amp;quot;nocap&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not lang_options.optional,&lt;br /&gt;
				list = lang_options.roots,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if lang_options.roots then&lt;br /&gt;
			params[1].allow_holes = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		ancestor_lang = m_lang.getByCode(ancestor_code)&lt;br /&gt;
		&lt;br /&gt;
		terms, arg = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = ancestor_params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = parent_args,&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = ancestor_lang,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
		if not terms.terms[1] then&lt;br /&gt;
			terms.terms[1] = {&lt;br /&gt;
				lang = ancestor_lang,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		terms = terms.terms&lt;br /&gt;
		etymology = m_etym.format_derived({&lt;br /&gt;
			lang = dest_lang,&lt;br /&gt;
			sources = ancestor_lang,&lt;br /&gt;
			terms = terms[ancestor_code],&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
		table.insert(etymologies, etymology)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return etymologies&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parent_args, etymologies)&lt;br /&gt;
&lt;br /&gt;
	local capital = parent_args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(etymologies, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang.getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true, roots = true}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local evolution = parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	&lt;br /&gt;
	return concat_etymologies(parent_args, evolution)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;lyti-mid&amp;quot;] = {optional = not parent_args.mid},&lt;br /&gt;
		[&amp;quot;lyti-old&amp;quot;] = {optional = not parent_args.old},&lt;br /&gt;
		[source_code] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492661</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492661"/>
		<updated>2026-04-02T12:37:25Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
	&lt;br /&gt;
	local dest_lang = m_lang.getByCode(dest_code)&lt;br /&gt;
	local ancestor_lang, etymology&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_params, terms, args, etymologies = {}, {}, {}, {}&lt;br /&gt;
	for ancestor_code, lang_options in pairs(ancestor_codes) do&lt;br /&gt;
		ancestor_params = {&lt;br /&gt;
			[&amp;quot;nocat&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
			[&amp;quot;nocap&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not lang_options.optional,&lt;br /&gt;
				list = lang_options.roots,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if lang_options.roots then&lt;br /&gt;
			params[1].allow_holes = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		ancestor_lang = m_lang.getByCode(ancestor_code)&lt;br /&gt;
		&lt;br /&gt;
		terms, arg = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = ancestor_params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = parent_args,&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = ancestor_lang,&lt;br /&gt;
			sc = &amp;quot;sc.default&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
		if not terms.terms[1] then&lt;br /&gt;
			terms.terms[1] = {&lt;br /&gt;
				lang = ancestor_lang,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		terms = terms.terms&lt;br /&gt;
		etymology = m_etym.format_derived({&lt;br /&gt;
			lang = dest_lang,&lt;br /&gt;
			sources = ancestor_lang,&lt;br /&gt;
			terms = terms[ancestor_code],&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
		table.insert(etymologies, etymology)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return etymologies&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parent_args, etymologies)&lt;br /&gt;
&lt;br /&gt;
	local capital = parent_args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(etymologies, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang.getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true, roots = true}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local evolution = parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	&lt;br /&gt;
	return concat_etymologies(parent_args, evolution)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;lyti-mid&amp;quot;] = {optional = not parent_args.mid},&lt;br /&gt;
		[&amp;quot;lyti-old&amp;quot;] = {optional = not parent_args.old},&lt;br /&gt;
		[source_code] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492660</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492660"/>
		<updated>2026-04-02T12:14:32Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_lang = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return m_links.full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
	&lt;br /&gt;
	local dest_lang = m_lang.getByCode(dest_code)&lt;br /&gt;
	local ancestor_lang, etymology&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_params, terms, args, etymologies = {}, {}, {}, {}&lt;br /&gt;
	for ancestor_code, lang_options in pairs(ancestor_codes) do&lt;br /&gt;
		ancestor_params = {&lt;br /&gt;
			[&amp;quot;nocat&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
			[&amp;quot;nocap&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
			[1] = {&lt;br /&gt;
				required = not lang_options.optional,&lt;br /&gt;
				list = lang_options.roots,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if lang_options.roots then&lt;br /&gt;
			params[1].allow_holes = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		ancestor_lang = m_lang.getByCode(ancestor_code)&lt;br /&gt;
		&lt;br /&gt;
		terms, arg = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
			params = ancestor_params,&lt;br /&gt;
			param_mods = param_mods,&lt;br /&gt;
			raw_args = parent_args,&lt;br /&gt;
			termarg = 1,&lt;br /&gt;
			lang = ancestor_lang,&lt;br /&gt;
			sc = &amp;quot;sc.default&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
		if not terms.terms[1] then&lt;br /&gt;
			terms.terms[1] = {&lt;br /&gt;
				lang = ancestor_lang,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		terms = terms.terms&lt;br /&gt;
		etymology = m_etym.format_derived({&lt;br /&gt;
			lang = dest_lang,&lt;br /&gt;
			sources = ancestor_lang,&lt;br /&gt;
			terms = terms[ancestor_code],&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
		table.insert(etymologies, etymology)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return etymologies&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concat_etymologies(parent_args, etymologies)&lt;br /&gt;
&lt;br /&gt;
	local capital = parent_args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(etymologies, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local dest_lang = m_lang:getByCode(&amp;quot;qsc&amp;quot;)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true, roots = true}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local evolution = parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	&lt;br /&gt;
	return concat_etymologies(parent_args, evolution)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;lyti-mid&amp;quot;] = {optional = not parent_args.mid},&lt;br /&gt;
		[&amp;quot;lyti-old&amp;quot;] = {optional = not parent_args.old},&lt;br /&gt;
		[source_code] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492606</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492606"/>
		<updated>2026-04-01T23:03:20Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
local m_etym = require(&amp;quot;Module:etymology&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function getLanguage(code)&lt;br /&gt;
	return require(&amp;quot;Module:languages&amp;quot;).getByCode(code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return require(&#039;Module:links&#039;).full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_etym_args(parent_args, base_params, dest_code)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
		params = base_params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 1,&lt;br /&gt;
		lang = function(args)&lt;br /&gt;
			return args[sourcearg][#args[sourcearg]]&lt;br /&gt;
		end,&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
	-- If term param 3= is empty, there will be no terms in terms.terms. To facilitate further code and for&lt;br /&gt;
	-- compatibility,, insert one. It will display as &amp;lt;small&amp;gt;[Term?]&amp;lt;/small&amp;gt;.&lt;br /&gt;
	if not terms.terms[1] then&lt;br /&gt;
		terms.terms[1] = {&lt;br /&gt;
			lang = args[sourcearg][#args[sourcearg]],&lt;br /&gt;
			sc = args.sc,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return terms.terms, args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		[&amp;quot;nocap&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for i, lang_options in ipairs(ancestor_codes) do&lt;br /&gt;
		params[i] = {&lt;br /&gt;
			required = not lang_options.optional,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return parse_etym_args(parent_args, params, dest_code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
	local capital = args.nocap and &amp;quot;f&amp;quot; or &amp;quot;F&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	m_etym.format_derived {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return capital .. &amp;quot;rom &amp;quot; .. table.concat(evolution, &amp;quot;, from &amp;quot;) .. &amp;quot;.&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.lyti(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local source_code = parent_args.source&lt;br /&gt;
	&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;lyti-mid&amp;quot;] = {optional = not parent_args.mid},&lt;br /&gt;
		[&amp;quot;lyti-old&amp;quot;] = {optional = not parent_args.old},&lt;br /&gt;
		[source_code] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;lyti&amp;quot;, ancestor_codes)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492576</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492576"/>
		<updated>2026-04-01T19:21:23Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function getLanguage(code)&lt;br /&gt;
	return require(&amp;quot;Module:languages&amp;quot;).getByCode(code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return require(&#039;Module:links&#039;).full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_etym_args(parent_args, base_params, dest_code)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
		params = base_params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 1,&lt;br /&gt;
		lang = function(args)&lt;br /&gt;
			return args[sourcearg][#args[sourcearg]]&lt;br /&gt;
		end,&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
	-- If term param 3= is empty, there will be no terms in terms.terms. To facilitate further code and for&lt;br /&gt;
	-- compatibility,, insert one. It will display as &amp;lt;small&amp;gt;[Term?]&amp;lt;/small&amp;gt;.&lt;br /&gt;
	if not terms.terms[1] then&lt;br /&gt;
		terms.terms[1] = {&lt;br /&gt;
			lang = args[sourcearg][#args[sourcearg]],&lt;br /&gt;
			sc = args.sc,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return terms.terms, args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for i, lang_options in ipairs(ancestor_codes) do&lt;br /&gt;
		params[i] = {&lt;br /&gt;
			required = not lang_options.optional,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return parse_etym_args(parent_args, params, dest_code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492560</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492560"/>
		<updated>2026-04-01T16:36:46Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
local m_param = require(&amp;quot;Module:parameters&amp;quot;)&lt;br /&gt;
local m_param_utils = require(&amp;quot;Module:parameter utilities&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function getLanguage(code)&lt;br /&gt;
	return require(&amp;quot;Module:languages&amp;quot;).getByCode(code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return require(&#039;Module:links&#039;).full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_etym_args(parent_args, base_params)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods({{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;}}})&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params({&lt;br /&gt;
		params = base_params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 1,&lt;br /&gt;
		lang = function(args)&lt;br /&gt;
			return args[sourcearg][#args[sourcearg]]&lt;br /&gt;
		end,&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
	})&lt;br /&gt;
	-- If term param 3= is empty, there will be no terms in terms.terms. To facilitate further code and for&lt;br /&gt;
	-- compatibility,, insert one. It will display as &amp;lt;small&amp;gt;[Term?]&amp;lt;/small&amp;gt;.&lt;br /&gt;
	if not terms.terms[1] then&lt;br /&gt;
		terms.terms[1] = {&lt;br /&gt;
			lang = args[sourcearg][#args[sourcearg]],&lt;br /&gt;
			sc = args.sc,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return terms.terms, args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function parse_args(parent_args, dest_code, ancestor_codes)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			list = true,&lt;br /&gt;
			allow_holes = true,&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for code, lang_options in ipairs() do&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return parse_etym_args(parent_args, params)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local ancestor_codes = {&lt;br /&gt;
		[&amp;quot;sekh&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;wasc&amp;quot;] = {optional = true}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args =	parse_args(parent_args, &amp;quot;qsc&amp;quot;, ancestor_codes)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492397</id>
		<title>Module:pollasena-roots</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:pollasena-roots&amp;diff=492397"/>
		<updated>2026-04-01T12:56:44Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local m_put = require(&amp;quot;Module:parse utilities&amp;quot;)&lt;br /&gt;
local m_families = require(&amp;quot;Module:families&amp;quot;)&lt;br /&gt;
local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
local PAGENAME = gsub(mw.title.getCurrentTitle().text, &amp;quot;%s&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
local match = mw.ustring.match&lt;br /&gt;
local gmatch = mw.ustring.gmatch&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function getLanguage(code)&lt;br /&gt;
	return require(&amp;quot;Module:languages&amp;quot;).getByCode(code)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ncategories(categories)&lt;br /&gt;
	local out_categories = {}&lt;br /&gt;
	for key, cat in ipairs(categories) do&lt;br /&gt;
		out_categories[key] = &amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return NAMESPACE == &amp;quot;Template&amp;quot; and &amp;quot;&amp;quot; or table.concat(out_categories, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(lang, term, alt)&lt;br /&gt;
	local natlang = lang:getWikidataItem() or false&lt;br /&gt;
	-- true if the language declaration has a wikidata item, a marginal amount of conlangs have it&lt;br /&gt;
	&lt;br /&gt;
	if lang:hasType(&amp;quot;reconstructed&amp;quot;) and not term:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
		term = &amp;quot;*&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	local data = {term = term, alt = alt or term, lang = lang, to_wikt = natlang}&lt;br /&gt;
	return require(&#039;Module:links&#039;).full_link(data, &amp;quot;term&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getLink(frame)&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local a = 0&lt;br /&gt;
	&lt;br /&gt;
	if frame.args[&amp;quot;offset&amp;quot;] or (frame.args[&amp;quot;old&amp;quot;] or frame.args[&amp;quot;older&amp;quot;]) then&lt;br /&gt;
		local offset = frame.args[&amp;quot;old&amp;quot;] and 1 or frame.args[&amp;quot;older&amp;quot;] and 2 or tonumber(frame.args[&amp;quot;offset&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		for i=1,offset do&lt;br /&gt;
			params[i] = {}&lt;br /&gt;
		end&lt;br /&gt;
		params[offset+1] = {list = true}&lt;br /&gt;
		a = offset + 1&lt;br /&gt;
	else&lt;br /&gt;
		params[1] = {list = true}&lt;br /&gt;
		a = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- exceptions&lt;br /&gt;
	params[&amp;quot;and&amp;quot;], params[&amp;quot;see&amp;quot;] = {}, {}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local fam, lang = m_families.getByCode(frame.args[1]), require(&amp;quot;Module:languages&amp;quot;).getByCode(frame.args[2])&lt;br /&gt;
	local proto = fam:getProtoLanguage()&lt;br /&gt;
&lt;br /&gt;
	local links = {}; local categories = {}; local alts = {};&lt;br /&gt;
	-- WIP&lt;br /&gt;
	for i, item in ipairs(args[a]) do&lt;br /&gt;
		if item == &amp;quot;+&amp;quot; then&lt;br /&gt;
			table.insert(links,&amp;quot;&amp;amp;nbsp;&amp;quot;)&lt;br /&gt;
		elseif item == &amp;quot;-&amp;quot; then&lt;br /&gt;
			table.insert(links, item)&lt;br /&gt;
		elseif item:find(&amp;quot;&amp;lt;&amp;quot;) and not item:find(&amp;quot;^[^&amp;lt;]*&amp;lt;[a-z]*[^a-z:]&amp;quot;) then&lt;br /&gt;
			local run = m_put.parse_balanced_segment_run(item, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
			local orig_param = a + i - 1&lt;br /&gt;
			local function parse_err(msg)&lt;br /&gt;
				error(msg .. &amp;quot;: &amp;quot; .. orig_param .. &amp;quot;= &amp;quot; .. table.concat(run))&lt;br /&gt;
			end&lt;br /&gt;
			local term = run[1]:gsub(&amp;quot;%*&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			for j = 2, #run - 1, 2 do&lt;br /&gt;
				local modtext = run[j]:match(&amp;quot;^&amp;lt;(.*)&amp;gt;$&amp;quot;)&lt;br /&gt;
				local prefix, arg = modtext:match(&amp;quot;^([a-z]+):(.*)$&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				if item:match(&amp;quot;&amp;gt;&amp;lt;&amp;quot;) then&lt;br /&gt;
					if prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
						table.insert(links, link(proto, term, arg))&lt;br /&gt;
						table.insert(alts, arg)&lt;br /&gt;
					elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
						table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
						table.insert(alts, term)&lt;br /&gt;
					end&lt;br /&gt;
				elseif prefix == &amp;quot;a&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term, arg))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. term)&lt;br /&gt;
					table.insert(alts, arg)&lt;br /&gt;
				elseif prefix == &amp;quot;c&amp;quot; then&lt;br /&gt;
					table.insert(links, link(proto, term))&lt;br /&gt;
					table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. arg)&lt;br /&gt;
					table.insert(alts, term)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(links, link(proto, args[a][i]))&lt;br /&gt;
			table.insert(categories, lang:getCanonicalName() .. &amp;quot; terms from &amp;quot; .. proto:getCanonicalName() .. &amp;quot; *&amp;quot; .. args[a][i])&lt;br /&gt;
			table.insert(alts, args[a][i])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if i~=1 and links[i-1] == &amp;quot;-&amp;quot; then alts[i] = links[i]:gsub(&amp;quot;^%*&amp;quot;,&amp;quot;&amp;quot;) end&lt;br /&gt;
		--if i~=1 and links[i-1] ~= &amp;quot;&amp;amp;nbsp;&amp;quot; then links[i] = links[i]:gsub(&amp;quot;(%|?)%*%-&amp;quot;,&amp;quot;%1-&amp;quot;) end&lt;br /&gt;
		--if i~=1 and alts[i-1]:match(&amp;quot;%-$&amp;quot;) then links[i] = links[i]:gsub(&amp;quot;%|%*&amp;quot;,&amp;quot;|&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(links) .. ncategories(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.qsc(frame)&lt;br /&gt;
	local qsc, sekh, wasc = getLanguage(&amp;quot;qsc&amp;quot;), getLanguage(&amp;quot;sekh&amp;quot;), getLanguage(&amp;quot;wasc&amp;quot;)&lt;br /&gt;
	local max_number_ascendants = 2&lt;br /&gt;
	&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args =	export.parse_2_lang_args(parent_args)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Contionary:kug%C3%B6nz%C2%B3&amp;diff=492289</id>
		<title>Contionary:kugönz³</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Contionary:kug%C3%B6nz%C2%B3&amp;diff=492289"/>
		<updated>2026-04-01T11:57:18Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Gwaxol==&lt;br /&gt;
===Etymology===&lt;br /&gt;
{{gwax-nen|kúggöz}}&lt;br /&gt;
&lt;br /&gt;
===Pronunciation===&lt;br /&gt;
* {{IPA all|gwax|/kugɵz̃˥˧/}}&lt;br /&gt;
&lt;br /&gt;
===Verb===&lt;br /&gt;
{{head|gwax|verb}}&lt;br /&gt;
&lt;br /&gt;
# to cough up&lt;br /&gt;
#: {{ux|gwax||}}&lt;br /&gt;
&lt;br /&gt;
====Conjugation====&lt;br /&gt;
{{gwax-table-v|kugönz|3}}&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:IPA&amp;diff=492287</id>
		<title>Module:IPA</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:IPA&amp;diff=492287"/>
		<updated>2026-04-01T11:56:14Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local force_cat = false -- for testing&lt;br /&gt;
&lt;br /&gt;
local pages_module = &amp;quot;Module:pages&amp;quot;&lt;br /&gt;
local pron_qualifier_module = &amp;quot;Module:pron qualifier&amp;quot;&lt;br /&gt;
local qualifier_module = &amp;quot;Module:qualifier&amp;quot;&lt;br /&gt;
local references_module = &amp;quot;Module:references&amp;quot;&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
local syllables_module = &amp;quot;Module:syllables&amp;quot;&lt;br /&gt;
local utilities_module = &amp;quot;Module:utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local m_data = mw.loadData(&amp;quot;Module:IPA/data&amp;quot;)&lt;br /&gt;
local m_str_utils = require(string_utilities_module)&lt;br /&gt;
local m_syllables -- [[Module:syllables]]; loaded below if needed&lt;br /&gt;
local m_symbols = mw.loadData(&amp;quot;Module:IPA/data/symbols&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local decode_entities = m_str_utils.decode_entities&lt;br /&gt;
local find = string.find&lt;br /&gt;
local gmatch = m_str_utils.gmatch&lt;br /&gt;
local gsub = string.gsub&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local is_preview = require(pages_module).is_preview&lt;br /&gt;
local len = m_str_utils.len&lt;br /&gt;
local listToText = mw.text.listToText&lt;br /&gt;
local match = string.match&lt;br /&gt;
local pattern_escape = m_str_utils.pattern_escape&lt;br /&gt;
local sub = string.sub&lt;br /&gt;
local u = m_str_utils.char&lt;br /&gt;
local ugsub = m_str_utils.gsub&lt;br /&gt;
local umatch = m_str_utils.match&lt;br /&gt;
local usub = m_str_utils.sub&lt;br /&gt;
&lt;br /&gt;
local namespace = mw.title.getCurrentTitle().namespace&lt;br /&gt;
local is_content_page = namespace == 0 or namespace == 120&lt;br /&gt;
&lt;br /&gt;
local function process_maybe_split_categories(split_output, categories, prontext, lang, errtext)&lt;br /&gt;
	if split_output ~= &amp;quot;raw&amp;quot; then&lt;br /&gt;
		if categories[1] then&lt;br /&gt;
			categories = require(utilities_module).format_categories(categories, lang, nil, nil, force_cat)&lt;br /&gt;
		else&lt;br /&gt;
			categories = &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if split_output then -- for use of IPA in links, etc.&lt;br /&gt;
		if errtext then&lt;br /&gt;
			return prontext, categories, errtext&lt;br /&gt;
		else&lt;br /&gt;
			return prontext, categories&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return prontext .. (errtext or &amp;quot;&amp;quot;) .. categories&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format a line of one or more IPA pronunciations as {{tl|IPA}} would do it, i.e. with a preceding {&amp;quot;IPA:&amp;quot;} followed by&lt;br /&gt;
the word {&amp;quot;key&amp;quot;} linking to an Appendix page describing the language&#039;s phonology, and with an added category&lt;br /&gt;
` ``lang`` terms with IPA pronunciation`. Other than the extra preceding text and category, this is identical&lt;br /&gt;
to {format_IPA_multiple()}, and the considerations described there in the documentation apply here as well. There is a&lt;br /&gt;
single parameter `data`, an object with the following fields:&lt;br /&gt;
* `lang`: Object representing the language of the pronunciations, which is used when adding cleanup categories for&lt;br /&gt;
   pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to&lt;br /&gt;
   add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); for adding a category&lt;br /&gt;
   ` ``lang`` terms with IPA pronunciation`; and for determining the proper sort keys for categories. Unlike&lt;br /&gt;
   for {format_IPA_multiple()}, `lang` may not be {nil}.&lt;br /&gt;
* `items`: List of pronunciations, in exactly the same format as for {format_IPA_multiple()}.&lt;br /&gt;
* `err`: If not {nil}, a string containing an error message to use in place of the link to the language&#039;s phonology.&lt;br /&gt;
* `separator`: The default separator to use when separating formatted items. Defaults to {&amp;quot;, &amp;quot;}. Does not apply to the&lt;br /&gt;
  first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in&lt;br /&gt;
  `items`.&lt;br /&gt;
* `sort_key`: Explicit sort key used for categories.&lt;br /&gt;
* `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that&lt;br /&gt;
  only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a&lt;br /&gt;
  given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup&lt;br /&gt;
  or other categories. If you need them suppressed, use `split_output` to return the categories separately and ignore&lt;br /&gt;
  them.&lt;br /&gt;
* `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted&lt;br /&gt;
  categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is&lt;br /&gt;
  the value {&amp;quot;raw&amp;quot;}, the categories are returned in list form, where the list elements are a combination of category&lt;br /&gt;
  strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If&lt;br /&gt;
  `split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string.&lt;br /&gt;
* `include_langname`: If specified, prefix the result with the language name, followed by a colon.&lt;br /&gt;
* `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted&lt;br /&gt;
  pronunciations and preceding {&amp;quot;IPA:&amp;quot;}.&lt;br /&gt;
* `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations.&lt;br /&gt;
* `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted&lt;br /&gt;
  pronunciations and preceding {&amp;quot;IPA:&amp;quot;}.&lt;br /&gt;
* `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_IPA_full(data)&lt;br /&gt;
	if type(data) ~= &amp;quot;table&amp;quot; or data.getCode then&lt;br /&gt;
		error(&amp;quot;Must now supply a table of arguments to format_IPA_full(); first argument should be that table, not a language object&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	local lang = data.lang&lt;br /&gt;
	local items = data.items&lt;br /&gt;
	local err = data.err&lt;br /&gt;
	local separator = data.separator&lt;br /&gt;
	local sort_key = data.sort_key&lt;br /&gt;
	local no_count = data.no_count&lt;br /&gt;
	local split_output = data.split_output&lt;br /&gt;
	local q = data.q&lt;br /&gt;
	local qq = data.qq&lt;br /&gt;
	local a = data.a&lt;br /&gt;
	local aa = data.aa&lt;br /&gt;
	local include_langname = data.include_langname&lt;br /&gt;
&lt;br /&gt;
	local hasKey = m_data.langs_with_infopages&lt;br /&gt;
&lt;br /&gt;
	if not lang or not lang.getCode then&lt;br /&gt;
		error(&amp;quot;Must specify language to format_IPA_full()&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	local langname = lang:getCanonicalName()&lt;br /&gt;
&lt;br /&gt;
	local prefix_text&lt;br /&gt;
	if err then&lt;br /&gt;
		prefix_text = &#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&#039; .. err .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
	else&lt;br /&gt;
		prefix_text = &amp;quot;IPA for &amp;quot; .. langname&lt;br /&gt;
		prefix_text = &amp;quot;[[&amp;quot; .. prefix_text .. &amp;quot;|key]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix = &amp;quot;[[wikt:Wiktionary:International Phonetic Alphabet|IPA]]&amp;lt;sup&amp;gt;(&amp;quot; .. prefix_text .. &amp;quot;)&amp;lt;/sup&amp;gt;:&amp;amp;#32;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local IPAs, categories = export.format_IPA_multiple(lang, items, separator, no_count, &amp;quot;raw&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local prontext = prefix .. IPAs&lt;br /&gt;
	if q and q[1] or qq and qq[1] or a and a[1] or aa and aa[1] then&lt;br /&gt;
		prontext = require(pron_qualifier_module).format_qualifiers {&lt;br /&gt;
			lang = lang,&lt;br /&gt;
			text = prontext,&lt;br /&gt;
			q = q,&lt;br /&gt;
			qq = qq,&lt;br /&gt;
			a = a,&lt;br /&gt;
			aa = aa,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	if include_langname then&lt;br /&gt;
		prontext = langname .. &amp;quot;: &amp;quot; .. prontext&lt;br /&gt;
	end&lt;br /&gt;
	return process_maybe_split_categories(split_output, categories, prontext, lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split_phonemic_phonetic(pron)&lt;br /&gt;
	local reconstructed, phonemic, phonetic = match(pron, &amp;quot;^(%*?)(/.-/)%s+(%[.-%])$&amp;quot;)&lt;br /&gt;
	if reconstructed then&lt;br /&gt;
		return reconstructed .. phonemic, reconstructed .. phonetic&lt;br /&gt;
	else&lt;br /&gt;
		return pron, nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function determine_repr(pron)&lt;br /&gt;
	local reconstructed&lt;br /&gt;
&lt;br /&gt;
	-- Temporarily remove any initial asterisk before representation marks,&lt;br /&gt;
	-- which avoids having to account for it in the data, but set the&lt;br /&gt;
	-- `reconstructed` flag.&lt;br /&gt;
	if sub(pron, 1, 1) == &amp;quot;*&amp;quot; then&lt;br /&gt;
		reconstructed = true&lt;br /&gt;
		pron = sub(pron, 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Some representation types have aliases for convenience (e.g. &amp;quot;// //&amp;quot; is&lt;br /&gt;
	-- an alias for &amp;quot;⫽ ⫽&amp;quot;). and these need to be substituted in before checking&lt;br /&gt;
	-- for other data.&lt;br /&gt;
	local opening, n = match(pron, &amp;quot;^.[\128-\191]*&amp;quot;)&lt;br /&gt;
	local subs_data = m_data.representation_subs[opening]&lt;br /&gt;
	if subs_data then&lt;br /&gt;
		pron, n = ugsub(pron, subs_data[1], subs_data[2])&lt;br /&gt;
		-- If the substitution was made, `opening` needs to be changed to the&lt;br /&gt;
		-- new opening character.&lt;br /&gt;
		if n ~= 0 then&lt;br /&gt;
			opening = subs_data[3]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the type data based on the opening character (if any), and set the&lt;br /&gt;
	-- representation type if the closing character matches.&lt;br /&gt;
	local type_data, repr, closing = m_data.representation_types[opening]&lt;br /&gt;
	if type_data then&lt;br /&gt;
		closing = type_data[2]&lt;br /&gt;
		if type_data and match(pron, pattern_escape(closing) .. &amp;quot;$&amp;quot;, #opening + 1) then&lt;br /&gt;
			repr = type_data[1]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Default to the empty string.&lt;br /&gt;
	if not repr then&lt;br /&gt;
		opening, closing = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Reattach the asterisk if reconstructed.&lt;br /&gt;
	if reconstructed then&lt;br /&gt;
		pron = &amp;quot;*&amp;quot; .. pron&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return pron, repr, opening, closing, reconstructed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasInvalidSeparators(transcription)&lt;br /&gt;
	-- Escape certain characters as well as pauses, which have the format &amp;quot;(...)&amp;quot; (with any number of dots), to avoid false-positives.&lt;br /&gt;
	transcription = transcription:gsub(&amp;quot;.[\128-\191]*&amp;quot;, m_symbols.separator_escapes)&lt;br /&gt;
		:gsub(&amp;quot;%(%.+%)&amp;quot;, &amp;quot;\3&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;[()]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	return (&lt;br /&gt;
		transcription:find(&amp;quot;..&amp;quot;, nil, true) or&lt;br /&gt;
		transcription:match(&amp;quot;%.%f[%z \1\2\3,:;]&amp;quot;) or&lt;br /&gt;
		transcription:match(&amp;quot;\1%f[%z \2\3,:;]&amp;quot;) or&lt;br /&gt;
		transcription:match(&amp;quot;\2%f[%z \1\3,:;]&amp;quot;) or&lt;br /&gt;
		transcription:match(&amp;quot;\3[:;]&amp;quot;) or&lt;br /&gt;
		transcription:match(&amp;quot;%f[^%z \1\2\3,]%.&amp;quot;)&lt;br /&gt;
	) and true or false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format a line of one or more bare IPA pronunciations (i.e. without any preceding {&amp;quot;IPA:&amp;quot;} and without adding to a&lt;br /&gt;
category ` ``lang`` terms with IPA pronunciation`). Individual pronunciations are formatted using&lt;br /&gt;
{format_IPA()} and are combined with separators, qualifiers, pre-text, post-text, etc. to form a line of pronunciations.&lt;br /&gt;
Parameters accepted are:&lt;br /&gt;
* `lang` is an object representing the language of the pronunciations, which is used when adding cleanup categories for&lt;br /&gt;
   pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to&lt;br /&gt;
   add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); and for computing the&lt;br /&gt;
   proper sort keys for categories. `lang` may be {nil}.&lt;br /&gt;
* `items` is a list of pronunciations, each of which is an object with the following properties:&lt;br /&gt;
** `pron`: the pronunciation, in the same format as is accepted by {format_IPA()}, i.e. it should be either phonemic&lt;br /&gt;
     (surrounded by {/.../}), phonetic (surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}) or a rhyme&lt;br /&gt;
	 (beginning with a hyphen);&lt;br /&gt;
** `pretext`: text to display directly before the formatted pronunciation, inside of any qualifiers or accent&lt;br /&gt;
     qualifiers;&lt;br /&gt;
** `posttext`: text to display directly after the formatted pronunciation, inside of any qualifiers or accent&lt;br /&gt;
     qualifiers;&lt;br /&gt;
** `q` or `qualifiers`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted&lt;br /&gt;
     pronunciation; note that `qualifiers` is deprecated;&lt;br /&gt;
** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation;&lt;br /&gt;
** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation;&lt;br /&gt;
** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation;&lt;br /&gt;
** `refs`: {nil} or a list of references or reference specs to add after the pronunciation and any posttext and&lt;br /&gt;
     qualifiers; the value of a list item is either a string containing the reference text (typically a call to a&lt;br /&gt;
	 citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text`&lt;br /&gt;
	 (the reference text), `name` (the name of the reference, as in {{cd|&amp;lt;nowiki&amp;gt;&amp;lt;ref name=&amp;quot;foo&amp;quot;&amp;gt;...&amp;lt;/ref&amp;gt;&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
	 or {{cd|&amp;lt;nowiki&amp;gt;&amp;lt;ref name=&amp;quot;foo&amp;quot; /&amp;gt;&amp;lt;/nowiki&amp;gt;}}) and/or `group` (the group of the reference, as in&lt;br /&gt;
	 {{cd|&amp;lt;nowiki&amp;gt;&amp;lt;ref name=&amp;quot;foo&amp;quot; group=&amp;quot;bar&amp;quot;&amp;gt;...&amp;lt;/ref&amp;gt;&amp;lt;/nowiki&amp;gt;}} or&lt;br /&gt;
	 {{cd|&amp;lt;nowiki&amp;gt;&amp;lt;ref name=&amp;quot;foo&amp;quot; group=&amp;quot;bar&amp;quot;/&amp;gt;&amp;lt;/nowiki&amp;gt;}}); this uses a parser function to format the reference&lt;br /&gt;
	 appropriately and insert a footnote number that hyperlinks to the actual reference, located in the&lt;br /&gt;
	 {{cd|&amp;lt;nowiki&amp;gt;&amp;lt;references /&amp;gt;&amp;lt;/nowiki&amp;gt;}} section;&lt;br /&gt;
** `gloss`: {nil} or a gloss (definition) for this item, if different definitions have different pronunciations;&lt;br /&gt;
** `pos`: {nil} or a part of speech for this item, if different parts of speech have different pronunciations;&lt;br /&gt;
** `separator`: the separator text to insert directly before the formatted pronunciation and all qualifiers, accent&lt;br /&gt;
   qualifiers and pre-text; defaults to the outer `separator` parameter.&lt;br /&gt;
* `separator`: The default separator to use when separating formatted items. Defaults to {&amp;quot;, &amp;quot;}. Does not apply to the&lt;br /&gt;
  first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in&lt;br /&gt;
  `items`.&lt;br /&gt;
* `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that&lt;br /&gt;
  only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a&lt;br /&gt;
  given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup&lt;br /&gt;
  categories. If you need them suppressed, use `split_output` to return the categories separately and ignore them.&lt;br /&gt;
* `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted&lt;br /&gt;
  categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is&lt;br /&gt;
  the value {&amp;quot;raw&amp;quot;}, the categories are returned in list form, where the list elements are a combination of category&lt;br /&gt;
  strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If&lt;br /&gt;
  `split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_IPA_multiple(lang, items, separator, no_count, split_output)&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	separator = separator or &amp;quot;, &amp;quot;&lt;br /&gt;
&lt;br /&gt;
	-- Format&lt;br /&gt;
	if not items[1] then&lt;br /&gt;
		if namespace == 10 then -- Template&lt;br /&gt;
			insert(items, {pron = &amp;quot;/aɪ piː ˈeɪ/&amp;quot;})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local bits = {}&lt;br /&gt;
&lt;br /&gt;
	for i, item in ipairs(items) do&lt;br /&gt;
		local bit&lt;br /&gt;
&lt;br /&gt;
		-- If the pronunciation is entirely empty, allow this and don&#039;t do anything, so that e.g. the pretext and/or&lt;br /&gt;
		-- posttext can be specified to force something like &#039;&#039;unknown&#039;&#039; to appear in place of the pronunciation&lt;br /&gt;
		-- (as happens e.g. when ? is used as a respelling in [[Module:ca-IPA]]; see [[guèiser]] for an example).&lt;br /&gt;
		if item.pron == &amp;quot;&amp;quot; then&lt;br /&gt;
			bit = &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			local item_categories, errtext&lt;br /&gt;
			bit, item_categories, errtext = export.format_IPA(lang, item.pron, &amp;quot;raw&amp;quot;)&lt;br /&gt;
			bit = bit .. errtext&lt;br /&gt;
			for _, cat in ipairs(item_categories) do&lt;br /&gt;
				insert(categories, cat)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if item.pretext then&lt;br /&gt;
			bit = item.pretext .. bit&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if item.posttext then&lt;br /&gt;
			bit = bit .. item.posttext&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local has_qualifiers = item.q and item.q[1] or item.qq and item.qq[1] or item.qualifiers and item.qualifiers[1]&lt;br /&gt;
			or item.a and item.a[1] or item.aa and item.aa[1]&lt;br /&gt;
		local has_gloss_or_pos = item.gloss or item.pos&lt;br /&gt;
		if has_qualifiers or has_gloss_or_pos then&lt;br /&gt;
			-- FIXME: Currently we tack the gloss and POS (in that order) onto the end of the regular left qualifiers.&lt;br /&gt;
			-- Should we do something different?&lt;br /&gt;
			local q = item.q&lt;br /&gt;
			if has_gloss_or_pos then&lt;br /&gt;
				q = mw.clone(item.q) or {}&lt;br /&gt;
				if item.gloss then&lt;br /&gt;
					local m_qualifier = require(qualifier_module)&lt;br /&gt;
					insert(q, m_qualifier.wrap_qualifier_css(&amp;quot;“&amp;quot;, &amp;quot;quote&amp;quot;) .. item.gloss ..&lt;br /&gt;
						m_qualifier.wrap_qualifier_css(&amp;quot;”&amp;quot;, &amp;quot;quote&amp;quot;))&lt;br /&gt;
				end&lt;br /&gt;
				if item.pos then&lt;br /&gt;
					-- FIXME: Consider expanding aliases as found in [[Module:headword/data]] or similar.&lt;br /&gt;
					insert(q, item.pos)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			bit = require(&amp;quot;Module:pron qualifier&amp;quot;).format_qualifiers {&lt;br /&gt;
				lang = lang,&lt;br /&gt;
				text = bit,&lt;br /&gt;
				q = q,&lt;br /&gt;
				qq = item.qq,&lt;br /&gt;
				qualifiers = item.qualifiers,&lt;br /&gt;
				a = item.a,&lt;br /&gt;
				aa = item.aa,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if item.note then&lt;br /&gt;
			-- Support removed on 2024-06-15.&lt;br /&gt;
			error(&amp;quot;Support for `.note` has been removed; switch to `.refs` (which must be a list)&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if item.refs then&lt;br /&gt;
			local refspecs = item.refs&lt;br /&gt;
			if #refspecs &amp;gt; 0 then&lt;br /&gt;
				bit = bit .. require(references_module).format_references(refspecs)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		bit = (item.separator or (i == 1 and &amp;quot;&amp;quot; or separator)) .. bit&lt;br /&gt;
&lt;br /&gt;
		insert(bits, bit)&lt;br /&gt;
&lt;br /&gt;
		if lang then&lt;br /&gt;
			-- Add syllable count if the language&#039;s diphthongs are listed in [[Module:syllables]].&lt;br /&gt;
			-- Don&#039;t do this if the term has spaces, a liaison mark (‿) or isn&#039;t in mainspace.&lt;br /&gt;
			if not no_count and namespace == 0 then&lt;br /&gt;
				m_syllables = m_syllables or require(syllables_module)&lt;br /&gt;
				local langcode = lang:getCode()&lt;br /&gt;
				if m_data.langs_to_generate_syllable_count_categories[langcode] then&lt;br /&gt;
					local raw_phonemic, phonetic, use_it = split_phonemic_phonetic(item.pron)&lt;br /&gt;
					local phonemic, repr = determine_repr(raw_phonemic)&lt;br /&gt;
					if not phonetic then -- not a &#039;/.../ [...]&#039; combined pronunciation&lt;br /&gt;
						if m_data.langs_to_use_phonetic_notation[langcode] then&lt;br /&gt;
							use_it = repr == &amp;quot;phonetic&amp;quot; and phonemic or nil&lt;br /&gt;
						else&lt;br /&gt;
							use_it = repr == &amp;quot;phonemic&amp;quot; and phonemic or nil&lt;br /&gt;
						end&lt;br /&gt;
					elseif repr == &amp;quot;phonetic&amp;quot; then&lt;br /&gt;
						use_it = phonetic&lt;br /&gt;
					elseif repr == &amp;quot;phonemic&amp;quot; then&lt;br /&gt;
						use_it = phonemic&lt;br /&gt;
					end&lt;br /&gt;
					-- Note: two uses of find with plain patterns is much faster than umatch with [ ‿].&lt;br /&gt;
					if use_it and not (find(use_it, &amp;quot; &amp;quot;) or find(use_it, &amp;quot;‿&amp;quot;)) then&lt;br /&gt;
						local syllable_count = m_syllables.getVowels(use_it, lang)&lt;br /&gt;
						if syllable_count then&lt;br /&gt;
							insert(categories, lang:getCanonicalName() .. &amp;quot; &amp;quot; .. syllable_count ..&lt;br /&gt;
								&amp;quot;-syllable words&amp;quot;)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return process_maybe_split_categories(split_output, categories, concat(bits), lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Format a single IPA pronunciation, which cannot be a combined spec (such as {/.../ [...]}). This has been extracted from&lt;br /&gt;
{format_IPA()} to allow the latter to handle such combined specs. This works like {format_IPA()} but requires that&lt;br /&gt;
pre-created {err} (for error messages) and {categories} lists be passed in, and adds any generated error messages and&lt;br /&gt;
categories to those lists. A single value is returned, the pronunciation, which is usually the same as passed in, but&lt;br /&gt;
may have HTML added surrounding invalid characters so they appear in red.&lt;br /&gt;
]=]&lt;br /&gt;
local function format_one_IPA(lang, raw_pron, err, categories)&lt;br /&gt;
	-- Disallow wikilinks.&lt;br /&gt;
	if match(raw_pron, &amp;quot;%[%[.-%]%]&amp;quot;) then&lt;br /&gt;
		error(&amp;quot;IPA input must not contain wikilinks.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	raw_pron = decode_entities(raw_pron)&lt;br /&gt;
&lt;br /&gt;
	-- Detect the type of transcription.&lt;br /&gt;
	local pron, repr, opening, closing, reconstructed = determine_repr(raw_pron)&lt;br /&gt;
	&lt;br /&gt;
	-- Strip any reconstruction asterisk and representation marks.&lt;br /&gt;
	pron = sub(pron, #opening + 1 + (reconstructed and 1 or 0), -#closing - 1)&lt;br /&gt;
&lt;br /&gt;
	if repr ~= &amp;quot;orthographic&amp;quot; and lang and lang:getCode() == &amp;quot;en&amp;quot; and hasInvalidSeparators(pron) then&lt;br /&gt;
		insert(categories, &amp;quot;English IPA pronunciations with invalid separators&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check for obsolete and nonstandard symbols&lt;br /&gt;
	for _, symbol in ipairs(m_data.nonstandard) do&lt;br /&gt;
		local result&lt;br /&gt;
		for nonstandard in gmatch(pron, symbol) do&lt;br /&gt;
			if not result then&lt;br /&gt;
				result = {}&lt;br /&gt;
			end&lt;br /&gt;
			insert(result, nonstandard)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if result then&lt;br /&gt;
			insert(err, &amp;quot;obsolete or nonstandard characters (&amp;quot; .. concat(result) .. &amp;quot;)&amp;quot;)&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[ Check for invalid symbols after removing the following:&lt;br /&gt;
			1. wikilinks (handled above)&lt;br /&gt;
			2. paired HTML tags&lt;br /&gt;
			3. bolding&lt;br /&gt;
			4. italics&lt;br /&gt;
			5. asterisk at beginning of transcription&lt;br /&gt;
			6. comma followed by spacing characters&lt;br /&gt;
			7. superscripts enclosed in superscript parentheses		]]&lt;br /&gt;
	local found_HTML&lt;br /&gt;
	local result = gsub(pron, &amp;quot;&amp;lt;(%a+)[^&amp;gt;]*&amp;gt;([^&amp;lt;]+)&amp;lt;/%1&amp;gt;&amp;quot;,&lt;br /&gt;
		function(tagName, content)&lt;br /&gt;
			found_HTML = true&lt;br /&gt;
			return content&lt;br /&gt;
		end)&lt;br /&gt;
	result = gsub(result, &amp;quot;&#039;&#039;&#039;([^&#039;]*)&#039;&#039;&#039;&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	result = gsub(result, &amp;quot;&#039;&#039;([^&#039;]*)&#039;&#039;&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	result = gsub(result, &amp;quot;^%*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	result = ugsub(result, &amp;quot;,%s+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- VS15&lt;br /&gt;
	local vs15_class = &amp;quot;[&amp;quot; .. m_symbols.add_vs15 .. &amp;quot;]&amp;quot;&lt;br /&gt;
	if umatch(pron, vs15_class) then&lt;br /&gt;
		local vs15 = u(0xFE0E)&lt;br /&gt;
		if find(result, vs15) then&lt;br /&gt;
			result = gsub(result, vs15, &amp;quot;&amp;quot;)&lt;br /&gt;
			pron = gsub(pron, vs15, &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		pron = ugsub(pron, vs15_class, &amp;quot;%0&amp;quot; .. vs15)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if result ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		if lang then&lt;br /&gt;
			-- Get the per_lang_valid data, and convert any per-language valid sequences to spaces.&lt;br /&gt;
			local per_lang_valid = m_symbols.per_lang_valid[lang:getCode()]&lt;br /&gt;
			if per_lang_valid then&lt;br /&gt;
				if type(per_lang_valid) == &amp;quot;table&amp;quot; then&lt;br /&gt;
					for _, pattern in pairs(per_lang_valid) do&lt;br /&gt;
						result = ugsub(result, pattern, &amp;quot; &amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
				else -- Should be a string.&lt;br /&gt;
					result = ugsub(result, per_lang_valid, &amp;quot; &amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local suggestions&lt;br /&gt;
		-- Check for any invalid sequences, excluding anything in the per-language lookup table.&lt;br /&gt;
		for k, v in pairs(m_symbols.invalid) do&lt;br /&gt;
			if find(result, k, nil, true) then&lt;br /&gt;
				result = ugsub(result, k, v)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Convert any valid character sequences to spaces&lt;br /&gt;
		for _, pattern in pairs(m_symbols.valid) do&lt;br /&gt;
			result = ugsub(result, pattern, &amp;quot; &amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (repr == &amp;quot;phonemic&amp;quot; or repr == &amp;quot;rhyme&amp;quot;) and lang and m_data.phonemes[lang:getCode()] then&lt;br /&gt;
		local valid_phonemes = m_data.phonemes[lang:getCode()]&lt;br /&gt;
		local rest = pron&lt;br /&gt;
		local phonemes = {}&lt;br /&gt;
&lt;br /&gt;
		while #rest &amp;gt; 0 do&lt;br /&gt;
			local longestmatch, longestmatch_len = &amp;quot;&amp;quot;, 0&lt;br /&gt;
&lt;br /&gt;
			local rest_init = sub(rest, 1, 1)&lt;br /&gt;
			if rest_init == &amp;quot;(&amp;quot; or rest_init == &amp;quot;)&amp;quot; then&lt;br /&gt;
				longestmatch = rest_init&lt;br /&gt;
				longestmatch_len = 1&lt;br /&gt;
			else&lt;br /&gt;
				for _, phoneme in ipairs(valid_phonemes) do&lt;br /&gt;
					local phoneme_len = len(phoneme)&lt;br /&gt;
					if phoneme_len &amp;gt; longestmatch_len and usub(rest, 1, phoneme_len) == phoneme then&lt;br /&gt;
						longestmatch = phoneme&lt;br /&gt;
						longestmatch_len = len(longestmatch)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if longestmatch_len &amp;gt; 0 then&lt;br /&gt;
				insert(phonemes, longestmatch)&lt;br /&gt;
				rest = usub(rest, longestmatch_len + 1)&lt;br /&gt;
			else&lt;br /&gt;
				local phoneme = usub(rest, 1, 1)&lt;br /&gt;
				insert(phonemes, &amp;quot;&amp;lt;span style=\&amp;quot;color: var(--wikt-palette-red,red)\&amp;quot;&amp;gt;&amp;quot; .. phoneme .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;)&lt;br /&gt;
				rest = usub(rest, 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		pron = concat(phonemes)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return (reconstructed and &amp;quot;*&amp;quot; or &amp;quot;&amp;quot;) .. opening .. pron .. closing&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format an IPA pronunciation. This wraps the pronunciation in appropriate CSS classes and adds cleanup categories and&lt;br /&gt;
error messages as needed. The pronunciation `pron` should be either phonemic (surrounded by {/.../}), phonetic&lt;br /&gt;
(surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}), a rhyme (beginning with a hyphen) or a combined&lt;br /&gt;
phonemic/phonetic spec (of the form {/.../ [...]}). `lang` indicates the language of the pronunciation and can be {nil}.&lt;br /&gt;
If not {nil}, and the specified language has data in [[Module:IPA/data]] indicating the allowed phonemes, then the page&lt;br /&gt;
will be added to a cleanup category and an error message displayed next to the outputted pronunciation. Note that {lang}&lt;br /&gt;
also determines sort key processing in the added cleanup categories. If `split_output` is not given, the return value is&lt;br /&gt;
a concatenation of the formatted pronunciation, error messages and formatted cleanup categories. Otherwise, three values&lt;br /&gt;
are returned: the formatted pronunciation, the cleanup categories and the concatenated error messages. If `split_output`&lt;br /&gt;
is the value {&amp;quot;raw&amp;quot;}, the cleanup categories are returned in list form, where the list elements are a combination of&lt;br /&gt;
category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]].&lt;br /&gt;
If `split_output` is any other value besides {nil}, the cleanup categories are returned as a pre-formatted concatenated&lt;br /&gt;
string.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_IPA(lang, pron, split_output)&lt;br /&gt;
	local err = {}&lt;br /&gt;
	local categories = {}&lt;br /&gt;
&lt;br /&gt;
	-- `pron` shouldn&#039;t contain ref tags.&lt;br /&gt;
	if match(pron, &amp;quot;\127&#039;\&amp;quot;`UNIQ%-%-ref%-[%dA-F]+%-QINU`\&amp;quot;&#039;\127&amp;quot;) then&lt;br /&gt;
		error(&amp;quot;&amp;lt;ref&amp;gt; tags found inside pronunciation parameter.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local phonemic, phonetic = split_phonemic_phonetic(pron)&lt;br /&gt;
	pron = format_one_IPA(lang, phonemic, err, categories)&lt;br /&gt;
	if phonetic then&lt;br /&gt;
		phonetic = format_one_IPA(lang, phonetic, err, categories)&lt;br /&gt;
		pron = pron .. &amp;quot; &amp;quot; .. phonetic&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if err[1] and is_preview() then&lt;br /&gt;
		err = &#039;&amp;lt;span class=&amp;quot;error&amp;quot; style=&amp;quot;font-size: small;&amp;gt;&amp;amp;#32;&#039; .. concat(err, &amp;quot;, &amp;quot;) .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		err = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return process_maybe_split_categories(split_output, categories, &#039;&amp;lt;span class=&amp;quot;IPA nowrap&amp;quot;&amp;gt;&#039; .. pron .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;, lang,&lt;br /&gt;
		err)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format a line of one or more enPR pronunciations as {{tl|enPR}} would do it, i.e. with a preceding {&amp;quot;enPR:&amp;quot;} (linked to&lt;br /&gt;
[[Appendix:English pronunciation]]) followed by one or more formatted, comma-separated enPR pronunciations. The&lt;br /&gt;
pronunciations are formatted by wrapping them in the `AHD` and `enPR` CSS classes and adding any left and&lt;br /&gt;
right regular and accent qualifiers. In addition, the overall result is wrapped in any overall left and right regular&lt;br /&gt;
and accent qualifiers. There is a single parameter `data`, an object with the following fields:&lt;br /&gt;
* `items` is a list of enPR pronunciations, each of which is an object with the following properties:&lt;br /&gt;
** `pron`: the enPR pronunciation;&lt;br /&gt;
** `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted pronunciation;&lt;br /&gt;
** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation;&lt;br /&gt;
** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation;&lt;br /&gt;
** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation.&lt;br /&gt;
* `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted&lt;br /&gt;
  pronunciations and preceding {&amp;quot;enPR:&amp;quot;}.&lt;br /&gt;
* `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations.&lt;br /&gt;
* `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted&lt;br /&gt;
  pronunciations and preceding {&amp;quot;enPR:&amp;quot;}.&lt;br /&gt;
* `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_enPR_full(data)&lt;br /&gt;
	local prefix = &amp;quot;[[wikt:Appendix:English pronunciation|enPR]]: &amp;quot;&lt;br /&gt;
	local lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(&amp;quot;en&amp;quot;)&lt;br /&gt;
	local parts = {}&lt;br /&gt;
&lt;br /&gt;
	for _, item in ipairs(data.items) do&lt;br /&gt;
		local part = &#039;&amp;lt;span class=&amp;quot;AHD enPR&amp;quot;&amp;gt;&#039; .. item.pron .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
		if item.q and item.q[1] or item.qq and item.qq[1] or item.a and item.a[1] or item.aa and item.aa[1] then&lt;br /&gt;
			part = require(&amp;quot;Module:pron qualifier&amp;quot;).format_qualifiers {&lt;br /&gt;
				lang = lang,&lt;br /&gt;
				text = part,&lt;br /&gt;
				q = item.q,&lt;br /&gt;
				qq = item.qq,&lt;br /&gt;
				a = item.a,&lt;br /&gt;
				aa = item.aa,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		insert(parts, part)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prontext = prefix .. concat(parts, &amp;quot;, &amp;quot;)&lt;br /&gt;
	if data.q and data.q[1] or data.qq and data.qq[1] or data.a and data.a[1] or data.aa and data.aa[1] then&lt;br /&gt;
		prontext = require(pron_qualifier_module).format_qualifiers {&lt;br /&gt;
			lang = lang,&lt;br /&gt;
			text = prontext,&lt;br /&gt;
			q = data.q,&lt;br /&gt;
			qq = data.qq,&lt;br /&gt;
			a = data.a,&lt;br /&gt;
			aa = data.aa,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return prontext&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:math/compare&amp;diff=492226</id>
		<title>Module:math/compare</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:math/compare&amp;diff=492226"/>
		<updated>2026-04-01T10:45:56Z</updated>

		<summary type="html">&lt;p&gt;Sware: Created page with &amp;quot;local math_module = &amp;quot;Module:math&amp;quot;  local function is_NaN(...) 	is_NaN = require(math_module).is_NaN 	return is_NaN(...) end  local function sign(...) 	sign = require(math_module).sign 	return sign(...) end  --[==[ A comparison function for numbers, which returns {true} if {a} sorts before {b}, or otherwise {false}; it can be used as the sort function with {table.sort}.  This function is roughly equivalent to the {&amp;lt;} operator, but contains the following special considerat...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local math_module = &amp;quot;Module:math&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function is_NaN(...)&lt;br /&gt;
	is_NaN = require(math_module).is_NaN&lt;br /&gt;
	return is_NaN(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function sign(...)&lt;br /&gt;
	sign = require(math_module).sign&lt;br /&gt;
	return sign(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
A comparison function for numbers, which returns {true} if {a} sorts before {b}, or otherwise {false}; it can be used as the sort function with {table.sort}.&lt;br /&gt;
&lt;br /&gt;
This function is roughly equivalent to the {&amp;lt;} operator, but contains the following special considerations in accordance with the {{w|IEEE 754}} standard:&lt;br /&gt;
* {{w|NaN}} is sorted as though it has a larger absolute value than infinity ({-NaN &amp;lt; -Inf}; {+Inf &amp;lt; +NaN}).&lt;br /&gt;
* {{w|Signed zero}} is acknowledged, with {-0 &amp;lt; +0}.]==]&lt;br /&gt;
return function(a, b)&lt;br /&gt;
	-- &amp;lt;, &amp;gt; and == canot return true if either `a` or `b` are NaN.&lt;br /&gt;
	if a &amp;lt; b then&lt;br /&gt;
		return true&lt;br /&gt;
	-- Use &amp;gt; then == instead of &amp;gt;=, so that the ±0 check is only done when `a`&lt;br /&gt;
	-- and `b` are equal.&lt;br /&gt;
	elseif a &amp;gt; b then&lt;br /&gt;
		return false&lt;br /&gt;
	elseif a == b then&lt;br /&gt;
		-- 1/(+0) is Inf; 1/(-0) is -Inf.&lt;br /&gt;
		return a == 0 and b == 0 and 1 / a &amp;lt; 1 / b or false&lt;br /&gt;
	-- One or both must be NaN, and NaN is the only number that returns false&lt;br /&gt;
	-- to a self-equality check, so if `a` == `a` then `b` is NaN (and vice-&lt;br /&gt;
	-- versa). -NaN sorts before everything and +NaN after everything, so the&lt;br /&gt;
	-- sign determines the result.&lt;br /&gt;
	elseif not is_NaN(a) then -- `b` is NaN&lt;br /&gt;
		return sign(b) == 1&lt;br /&gt;
	elseif not is_NaN(b) then -- `a` is NaN&lt;br /&gt;
		return sign(a) == -1&lt;br /&gt;
	end&lt;br /&gt;
	-- If both are NaN, only return true if `a` is -NaN and `b` is +NaN.&lt;br /&gt;
	return sign(a) &amp;lt; sign(b)&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:table/length&amp;diff=491922</id>
		<title>Module:table/length</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:table/length&amp;diff=491922"/>
		<updated>2026-03-28T23:05:26Z</updated>

		<summary type="html">&lt;p&gt;Sware: Created page with &amp;quot;local ipairs_default_iter = ipairs{}  return function(t, raw) 	local n = 0 	if raw then 		for i in ipairs_default_iter, t, 0 do 			n = i 		end 		return n 	end 	repeat 		n = n + 1 	until t[n] == nil 	return n - 1 end&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local ipairs_default_iter = ipairs{}&lt;br /&gt;
&lt;br /&gt;
return function(t, raw)&lt;br /&gt;
	local n = 0&lt;br /&gt;
	if raw then&lt;br /&gt;
		for i in ipairs_default_iter, t, 0 do&lt;br /&gt;
			n = i&lt;br /&gt;
		end&lt;br /&gt;
		return n&lt;br /&gt;
	end&lt;br /&gt;
	repeat&lt;br /&gt;
		n = n + 1&lt;br /&gt;
	until t[n] == nil&lt;br /&gt;
	return n - 1&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:documentation&amp;diff=491921</id>
		<title>Module:documentation</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:documentation&amp;diff=491921"/>
		<updated>2026-03-28T23:04:06Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local array_module = &amp;quot;Module:array&amp;quot;&lt;br /&gt;
local frame_module = &amp;quot;Module:frame&amp;quot;&lt;br /&gt;
local fun_is_callable_module = &amp;quot;Module:fun/isCallable&amp;quot;&lt;br /&gt;
local languages_module = &amp;quot;Module:languages&amp;quot;&lt;br /&gt;
local links_module = &amp;quot;Module:links&amp;quot;&lt;br /&gt;
local load_module = &amp;quot;Module:load&amp;quot;&lt;br /&gt;
local module_categorization_module = &amp;quot;Module:module categorization&amp;quot;&lt;br /&gt;
local number_list_show_module = &amp;quot;Module:number list/show&amp;quot;&lt;br /&gt;
local pages_module = &amp;quot;Module:pages&amp;quot;&lt;br /&gt;
local parameters_module = &amp;quot;Module:parameters&amp;quot;&lt;br /&gt;
local scripts_module = &amp;quot;Module:scripts&amp;quot;&lt;br /&gt;
local string_endswith_module = &amp;quot;Module:string/endswith&amp;quot;&lt;br /&gt;
local string_gline_module = &amp;quot;Module:string/gline&amp;quot;&lt;br /&gt;
local string_insert_module = &amp;quot;Module:string/insert&amp;quot;&lt;br /&gt;
local string_startswith_module = &amp;quot;Module:string/startswith&amp;quot;&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
local template_parser_module = &amp;quot;Module:template parser&amp;quot;&lt;br /&gt;
local title_exists_module = &amp;quot;Module:title/exists&amp;quot;&lt;br /&gt;
local title_new_title_module = &amp;quot;Module:title/newTitle&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local error = error&lt;br /&gt;
local full_url = mw.uri.fullUrl&lt;br /&gt;
local get_current_title = mw.title.getCurrentTitle&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local ipairs = ipairs&lt;br /&gt;
local list_to_text = mw.text.listToText&lt;br /&gt;
local new_message = mw.message.new&lt;br /&gt;
local pcall = pcall&lt;br /&gt;
local require = require&lt;br /&gt;
local tonumber = tonumber&lt;br /&gt;
local tostring = tostring&lt;br /&gt;
local type = type&lt;br /&gt;
local unpack = unpack or table.unpack -- Lua 5.2 compatibility&lt;br /&gt;
&lt;br /&gt;
local function Array(...)&lt;br /&gt;
	Array = require(array_module)&lt;br /&gt;
	return Array(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function categorize_module(...)&lt;br /&gt;
	categorize_module = require(module_categorization_module).categorize&lt;br /&gt;
	return categorize_module(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function endswith(...)&lt;br /&gt;
	endswith = require(string_endswith_module)&lt;br /&gt;
	return endswith(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function expand_template(...)&lt;br /&gt;
	expand_template = require(frame_module).expandTemplate&lt;br /&gt;
	return expand_template(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function find_templates(...)&lt;br /&gt;
	find_templates = require(template_parser_module).find_templates&lt;br /&gt;
	return find_templates(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function full_link(...)&lt;br /&gt;
	full_link = require(links_module).full_link&lt;br /&gt;
	return full_link(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_lang(...)&lt;br /&gt;
	get_lang = require(languages_module).getByCode&lt;br /&gt;
	return get_lang(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_pagetype(...)&lt;br /&gt;
	get_pagetype = require(pages_module).get_pagetype&lt;br /&gt;
	return get_pagetype(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_script(...)&lt;br /&gt;
	get_script = require(scripts_module).getByCode&lt;br /&gt;
	return get_script(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gline(...)&lt;br /&gt;
	gline = require(string_gline_module)&lt;br /&gt;
	return gline(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_callable(...)&lt;br /&gt;
	is_callable = require(fun_is_callable_module)&lt;br /&gt;
	return is_callable(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_documentation(...)&lt;br /&gt;
	is_documentation = require(pages_module).is_documentation&lt;br /&gt;
	return is_documentation(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_sandbox(...)&lt;br /&gt;
	is_sandbox = require(pages_module).is_sandbox&lt;br /&gt;
	return is_sandbox(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function new_title(...)&lt;br /&gt;
	new_title = require(title_new_title_module)&lt;br /&gt;
	return new_title(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function number_list_show_table(...)&lt;br /&gt;
	number_list_show_table = require(number_list_show_module).table&lt;br /&gt;
	return number_list_show_table(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function preprocess(...)&lt;br /&gt;
	preprocess = require(frame_module).preprocess&lt;br /&gt;
	return preprocess(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function process_params(...)&lt;br /&gt;
	process_params = require(parameters_module).process&lt;br /&gt;
	return process_params(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function safe_load_data(...)&lt;br /&gt;
	safe_load_data = require(load_module).safe_load_data&lt;br /&gt;
	return safe_load_data(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split(...)&lt;br /&gt;
	split = require(string_utilities_module).split&lt;br /&gt;
	return split(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function startswith(...)&lt;br /&gt;
	startswith = require(string_startswith_module)&lt;br /&gt;
	return startswith(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function string_insert(...)&lt;br /&gt;
	string_insert = require(string_insert_module)&lt;br /&gt;
	return string_insert(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function title_exists(...)&lt;br /&gt;
	title_exists = require(title_exists_module)&lt;br /&gt;
	return title_exists(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ugsub(...)&lt;br /&gt;
	ugsub = require(string_utilities_module).gsub&lt;br /&gt;
	return ugsub(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function umatch(...)&lt;br /&gt;
	umatch = require(string_utilities_module).match&lt;br /&gt;
	return umatch(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local skins = {&lt;br /&gt;
	[&amp;quot;common&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
	[&amp;quot;vector&amp;quot;] = &amp;quot;Vector&amp;quot;,&lt;br /&gt;
	[&amp;quot;monobook&amp;quot;] = &amp;quot;Monobook&amp;quot;,&lt;br /&gt;
	[&amp;quot;cologneblue&amp;quot;] = &amp;quot;Cologne Blue&amp;quot;,&lt;br /&gt;
	[&amp;quot;modern&amp;quot;] = &amp;quot;Modern&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function compare_pages(page1, page2, text)&lt;br /&gt;
	return &amp;quot;[&amp;quot; .. tostring(&lt;br /&gt;
			full_url(&amp;quot;Special:ComparePages&amp;quot;, { page1 = page1, page2 = page2 }))&lt;br /&gt;
		.. &amp;quot; &amp;quot; .. text .. &amp;quot;]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Avoid transcluding [[Module:languages/cache]] everywhere.&lt;br /&gt;
local lang_cache = setmetatable({}, {&lt;br /&gt;
	__index = function(self, k)&lt;br /&gt;
		return require(&amp;quot;Module:languages/cache&amp;quot;)[k]&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
local function zh_link(word)&lt;br /&gt;
	return full_link {&lt;br /&gt;
		lang = lang_cache.zh,&lt;br /&gt;
		term = word&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_languages_data_documentation(title, cats, division)&lt;br /&gt;
	local doc_template, module_cat&lt;br /&gt;
	if endswith(division, &amp;quot;/extra&amp;quot;) then&lt;br /&gt;
		division = division:sub(1, -7)&lt;br /&gt;
		doc_template = &amp;quot;language extradata documentation&amp;quot;&lt;br /&gt;
		module_cat = &amp;quot;Language extra data modules&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		doc_template = &amp;quot;language data documentation&amp;quot;&lt;br /&gt;
		module_cat = &amp;quot;Language data modules&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local sort_key&lt;br /&gt;
	if division == &amp;quot;exceptional&amp;quot; then&lt;br /&gt;
		sort_key = &amp;quot;x&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		sort_key = division:gsub(&amp;quot;/&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	cats:insert(module_cat .. &amp;quot;|&amp;quot; .. sort_key)&lt;br /&gt;
	return {&lt;br /&gt;
		title = doc_template&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_Unicode_data_documentation(title, cats)&lt;br /&gt;
	local subpage, first_three_of_code_point&lt;br /&gt;
	= title.fullText:match(&amp;quot;^Module:Unicode data/([^/]+)/(%x%x%x)$&amp;quot;)&lt;br /&gt;
	if subpage == &amp;quot;names&amp;quot; or subpage == &amp;quot;images&amp;quot; or subpage == &amp;quot;emoji images&amp;quot; then&lt;br /&gt;
		local low, high =&lt;br /&gt;
			tonumber(first_three_of_code_point .. &amp;quot;000&amp;quot;, 16),&lt;br /&gt;
			tonumber(first_three_of_code_point .. &amp;quot;FFF&amp;quot;, 16)&lt;br /&gt;
		local text, text_type&lt;br /&gt;
		if subpage == &amp;quot;names&amp;quot; then&lt;br /&gt;
			text_type = &amp;quot;titles of images&amp;quot;&lt;br /&gt;
		elseif subpage == &amp;quot;images&amp;quot; then&lt;br /&gt;
			text_type = &amp;quot;titles of images&amp;quot;&lt;br /&gt;
		elseif subpage == &amp;quot;emoji images&amp;quot; then&lt;br /&gt;
			text_type = &amp;quot;emoji-style images&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		text = string.format(&lt;br /&gt;
			&amp;quot;This data module contains the &amp;quot; .. text_type .. &amp;quot; of &amp;quot; ..&lt;br /&gt;
			&amp;quot;[[Appendix:Unicode|Unicode]] code points within the range U+%04X to U+%04X.&amp;quot;,&lt;br /&gt;
			low, high)&lt;br /&gt;
		if subpage == &amp;quot;images&amp;quot; and safe_load_data(&amp;quot;Module:Unicode data/emoji images/&amp;quot; .. first_three_of_code_point) then&lt;br /&gt;
			text = text ..&lt;br /&gt;
				&amp;quot; This list includes the text variants of emojis. For the list of emoji variants of those characters, see [[Module:Unicode data/emoji images/&amp;quot; ..&lt;br /&gt;
				first_three_of_code_point .. &amp;quot;]].&amp;quot;&lt;br /&gt;
		elseif subpage == &amp;quot;emoji images&amp;quot; then&lt;br /&gt;
			text = text ..&lt;br /&gt;
				&amp;quot; For text-style images, see [[Module:Unicode data/images/&amp;quot; .. first_three_of_code_point .. &amp;quot;]].&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return text&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function insert_lang_data_module_cats(cats, langcode, overall_data_module_cat)&lt;br /&gt;
	local lang = lang_cache[langcode]&lt;br /&gt;
	if lang then&lt;br /&gt;
		local langname&lt;br /&gt;
		if lang._fullCode then&lt;br /&gt;
			langname = lang_cache[lang._fullCode]:getCanonicalName()&lt;br /&gt;
		else&lt;br /&gt;
			langname = lang:getCanonicalName()&lt;br /&gt;
		end&lt;br /&gt;
		cats:insert(overall_data_module_cat .. &amp;quot;|&amp;quot; .. langname)&lt;br /&gt;
		cats:insert(langname .. &amp;quot; modules&amp;quot;)&lt;br /&gt;
		cats:insert(langname .. &amp;quot; data modules&amp;quot;)&lt;br /&gt;
		return lang, langname&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
This provides categories and documentation for various data modules, so that [[Category:Uncategorized modules]] isn&#039;t&lt;br /&gt;
unnecessarily cluttered. It is a list of tables, each of which have the following possible fields:&lt;br /&gt;
&lt;br /&gt;
`regex` (required): A Lua pattern to match the module&#039;s title. If it matches, the data in this entry will be used.&lt;br /&gt;
	Any captures in the pattern can by referenced in the `cat` field using %1 for the first capture, %2 for the&lt;br /&gt;
	second, etc. (often used for creating the sortkey for the category). In addition, the captures are passed to the&lt;br /&gt;
	`process` function as the third and subsequent parameters.&lt;br /&gt;
&lt;br /&gt;
`process` (optional): This may be a function or a string. If it is a function, it is called as follows:&lt;br /&gt;
	   `process(TITLE, CATS, CAPTURE1, CAPTURE2, ...)`&lt;br /&gt;
	where:&lt;br /&gt;
	   * TITLE is a title object describing the module&#039;s title; see&lt;br /&gt;
		 [https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Title_objects].&lt;br /&gt;
	   * CATS is an array object (see [[Module:array]]) of categories that the module will be added to.&lt;br /&gt;
	   * CAPTURE1, CAPTURE2, ... contain any captures in the `regex` field.&lt;br /&gt;
	The return value of `process` should either be a string (which will be used as the module&#039;s documentation), or a&lt;br /&gt;
	table specifying the name of a template to expand to get the documentation, along with the arguments to that&lt;br /&gt;
	template. In the latter format, the template name (bare, without the &amp;quot;Template:&amp;quot; prefix) should be in the `title`&lt;br /&gt;
	field, and any arguments should be in `args; in this case, the template name will be listed above the generated&lt;br /&gt;
	documentation as the source of the documentation, along with an edit button to edit the template&#039;s contents.&lt;br /&gt;
	If, however, the return value of the `process` function is a string, any template invocations will be expanded&lt;br /&gt;
	using frame:preprocess(), and [[Module:documentation]] will be listed as the source of the documentation.&lt;br /&gt;
&lt;br /&gt;
	If `process` itself is a string rather than a function, it should name a submodule under&lt;br /&gt;
	[[Module:documentation/functions/]] which returns a function, of the same type as described above. This submodule&lt;br /&gt;
	will be specified as the source of the documentation (unless it returns a table naming a template to expand to get&lt;br /&gt;
	the documentation, as described above).&lt;br /&gt;
&lt;br /&gt;
	If `process` is omitted entirely, the module will have no documentation.&lt;br /&gt;
&lt;br /&gt;
`cat` (optional): A string naming the category into which the module should be placed, or a list of such strings.&lt;br /&gt;
	Captures specified in `regex` may be referenced in this string using %1 for the first capture, %2 for the second,&lt;br /&gt;
	etc. It is also possible to add categories in the `process` function by inserting them into the passed-in CATS&lt;br /&gt;
	array (the second parameter).&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local module_regex = {&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(3/%l/extra)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(3/%l)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(2/extra)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(2)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(exceptional/extra)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(exceptional)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Language and script modules&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:scripts/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Language and script modules&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:data tables/data..?.?.?$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Reference module sharded data tables&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/dial%-pron/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Chinese dialectal pronunciation data modules&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh dial or syn&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/dial%-syn/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Chinese dialect synonyms data modules&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh dial or syn&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/glyph%-data/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Chinese historical character forms data modules&amp;quot;,&lt;br /&gt;
		process = function(title, cats)&lt;br /&gt;
			local character = title.fullText:match(&amp;quot;^Module:zh/data/glyph%-data/(.+)&amp;quot;)&lt;br /&gt;
			if character then&lt;br /&gt;
				return (&amp;quot;This module contains data on historical forms of the Chinese character %s.&amp;quot;)&lt;br /&gt;
					:format(zh_link(character))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/ltc%-pron/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Middle Chinese pronunciation data modules|%1&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/och%-pron%-BS/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Old Chinese (Baxter-Sagart) pronunciation data modules|%1&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/och%-pron%-ZS/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Old Chinese (Zhengzhang) pronunciation data modules|%1&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		-- capture rest of zh/data submodules&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Chinese data modules|%1&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:mul/guoxue%-data/cjk%-?(.*)$&amp;quot;,&lt;br /&gt;
		process = &amp;quot;guoxue-data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:Unicode data/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Unicode data modules|%1&amp;quot;,&lt;br /&gt;
		process = make_Unicode_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:number list/data/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Number data modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				return (&amp;quot;This module contains data on various types of numbers in %s.\n%s&amp;quot;)&lt;br /&gt;
					:format(lang:makeCategoryLink(), number_list_show_table() or &amp;quot;&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:accel/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats)&lt;br /&gt;
			local lang_code = title.subpageText&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				cats:insert(lang:getCanonicalName() .. &amp;quot; modules|accel&amp;quot;)&lt;br /&gt;
				cats:insert((&amp;quot;Accel submodules|%s&amp;quot;):format(lang:getCanonicalName()))&lt;br /&gt;
				return (&amp;quot;This module contains new entry creation rules for %s; see [[WT:ACCEL]] for an overview, and [[Module:accel]] for information on creating new rules.&amp;quot;)&lt;br /&gt;
					:format(lang:makeCategoryLink())&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:inc%-ash/dial/data/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Ashokan Prakrit modules|%1&amp;quot;,&lt;br /&gt;
		process = function(title, cats)&lt;br /&gt;
			local word = title.fullText:match(&amp;quot;^Module:inc%-ash/dial/data/(.+)$&amp;quot;)&lt;br /&gt;
			if word then&lt;br /&gt;
				local lang = lang_cache[&amp;quot;inc-ash&amp;quot;]&lt;br /&gt;
				return (&amp;quot;This module contains data on the pronunciation of %s in dialects of %s.&amp;quot;)&lt;br /&gt;
					:format(full_link({ term = word, lang = lang }, &amp;quot;term&amp;quot;),&lt;br /&gt;
						lang:makeCategoryLink())&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^.+%-translit$&amp;quot;,&lt;br /&gt;
		process = &amp;quot;translit&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:form of/lang%-data/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang, langname = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Language-specific form-of modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				-- FIXME, display more info.&lt;br /&gt;
				return &amp;quot;This module contains language-specific form-of data (tags, shortcuts, base lemma params. etc.) for &amp;quot; ..&lt;br /&gt;
					langname .. &amp;quot;.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:labels/data/lang/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Language-specific label data modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				return {&lt;br /&gt;
					title = &amp;quot;label language-specific data documentation&amp;quot;,&lt;br /&gt;
					args = { [1] = lang_code },&lt;br /&gt;
				}&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:category tree/lang/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang, langname = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Category tree data modules/lang&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				return &amp;quot;This module handles generating the descriptions and categorization for &amp;quot; ..&lt;br /&gt;
					langname .. &amp;quot; category pages &amp;quot;&lt;br /&gt;
					.. &amp;quot;of the format \&amp;quot;&amp;quot; .. langname .. &amp;quot; LABEL\&amp;quot; where LABEL can be any text. Examples are &amp;quot;&lt;br /&gt;
					.. &amp;quot;[[:Category:Bulgarian conjugation 2.1 verbs]] and [[:Category:Russian velar-stem neuter-form nouns]]. &amp;quot;&lt;br /&gt;
					.. &amp;quot;This module is part of the category tree system, which is a general framework for generating the &amp;quot;&lt;br /&gt;
					.. &amp;quot;descriptions and categorization of category pages.\n\n&amp;quot;&lt;br /&gt;
					.. &amp;quot;For more information, see [[wikt:Module:category tree/lang/documentation]].\n\n&amp;quot;&lt;br /&gt;
					.. &amp;quot;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; If you add a new language-specific module, you must add the language code to the &amp;quot;&lt;br /&gt;
					.. &amp;quot;list at the top of [[wikt:Module:category tree/lang]] in order for the module to be recognized.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:category tree/topic/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, submodule)&lt;br /&gt;
			cats:insert(&amp;quot;Category tree data modules/topic| &amp;quot;)&lt;br /&gt;
			return {&lt;br /&gt;
				title = &amp;quot;topic cat data submodule documentation&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:category tree/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, submodule)&lt;br /&gt;
			cats:insert(&amp;quot;Category tree data modules| &amp;quot;)&lt;br /&gt;
			return {&lt;br /&gt;
				title = &amp;quot;category tree data submodule documentation&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:ja/data/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Japanese data modules|%1&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:fi%-dialects/data/feature/Kettunen1940 ([0-9]+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Finnish dialectal data atlas modules|%1&amp;quot;,&lt;br /&gt;
		process = function(title, cats, shard)&lt;br /&gt;
			return &amp;quot;This module contains shard &amp;quot; .. shard .. &amp;quot; of the online version of Lauri Kettunen&#039;s 1940 work &amp;quot; ..&lt;br /&gt;
				&amp;quot;&#039;&#039;Suomen murteet III A. Murrekartasto&#039;&#039; (\&amp;quot;Finnish dialects III A: Dialect atlas\&amp;quot;). &amp;quot; ..&lt;br /&gt;
				&amp;quot;It was imported and converted from urn:nbn:fi:csc-kata20151130145346403821, published by the &amp;quot; ..&lt;br /&gt;
				&amp;quot;&#039;&#039;Kotimaisten kielten keskus&#039;&#039; under the CC BY 4.0 license.&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:fi%-dialects/data/feature/(.+)&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Finnish dialectal data modules|%1&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:fi%-dialects/data/word/(.+)&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Finnish dialectal data modules|%1&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:Swadesh/data/([%l-]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang, langname = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Swadesh modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				return &amp;quot;This module contains the [[Swadesh list]] of basic vocabulary in &amp;quot; .. langname .. &amp;quot;.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:Swadesh/data/([%l-]+)/([^/]*)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code, variety)&lt;br /&gt;
			local lang, langname = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Swadesh modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				local prefix = &amp;quot;This module contains the [[Swadesh list]] of basic vocabulary in the &amp;quot;&lt;br /&gt;
				local etym_lang = get_lang(variety, nil, &amp;quot;allow etym&amp;quot;)&lt;br /&gt;
				if etym_lang then&lt;br /&gt;
					return (&amp;quot;%s %s variety of %s.&amp;quot;):format(prefix, etym_lang:getCanonicalName(), langname)&lt;br /&gt;
				end&lt;br /&gt;
				local script = get_script(variety)&lt;br /&gt;
				if script then&lt;br /&gt;
					return (&amp;quot;%s %s %s script.&amp;quot;):format(prefix, langname, script:getCanonicalName())&lt;br /&gt;
				end&lt;br /&gt;
				return (&amp;quot;%s %s variety of %s.&amp;quot;):format(prefix, variety, langname)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:typing%-aids&amp;quot;,&lt;br /&gt;
		process = function(title, cats)&lt;br /&gt;
			local data_suffix = title.fullText:match(&amp;quot;^Module:typing%-aids/data/(.+)$&amp;quot;)&lt;br /&gt;
			local sortkey&lt;br /&gt;
			if data_suffix then&lt;br /&gt;
				if data_suffix:find &amp;quot;^[%l-]+$&amp;quot; then&lt;br /&gt;
					local lang = get_lang(data_suffix)&lt;br /&gt;
					if lang then&lt;br /&gt;
						sortkey = lang:getCanonicalName()&lt;br /&gt;
						cats:insert(sortkey .. &amp;quot; data modules&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
				elseif data_suffix:find &amp;quot;^%u%l%l%l$&amp;quot; then&lt;br /&gt;
					local script = get_script(data_suffix)&lt;br /&gt;
					if script then&lt;br /&gt;
						sortkey = script:getCanonicalName()&lt;br /&gt;
						cats:insert(script:getCategoryName())&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				cats:insert(&amp;quot;Character insertion data modules|&amp;quot; .. (sortkey or data_suffix))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:R:([%l-]+):(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code, refname)&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				cats:insert(lang:getCanonicalName() .. &amp;quot; modules|&amp;quot; .. refname)&lt;br /&gt;
				cats:insert((&amp;quot;Reference modules|%s&amp;quot;):format(lang:getCanonicalName()))&lt;br /&gt;
				return &amp;quot;This module implements the reference template {{temp|R:&amp;quot; .. lang_code .. &amp;quot;:&amp;quot; .. refname .. &amp;quot;}}.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:Quotations/([%l-]+)/?(.*)&amp;quot;,&lt;br /&gt;
		process = &amp;quot;Quotation&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:affix/lang%-data/([%l-]+)&amp;quot;,&lt;br /&gt;
		process = &amp;quot;affix lang-data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:dialect synonyms/([%l-]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				local langname = lang:getCanonicalName()&lt;br /&gt;
				cats:insert(&amp;quot;Dialect synonyms data modules|&amp;quot; .. langname)&lt;br /&gt;
				cats:insert(langname .. &amp;quot; dialect synonyms data modules| &amp;quot;)&lt;br /&gt;
				return &amp;quot;This module contains data on specific varieties of &amp;quot; .. langname .. &amp;quot;, for use by &amp;quot; ..&lt;br /&gt;
					&amp;quot;{{tl|dialect synonyms}}. The actual synonyms themselves are contained in submodules.\n\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;==== Language data module structure ====\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.title&amp;lt;/code&amp;gt; — optional; table title template (e.g. \&amp;quot;Regional synonyms of %s\&amp;quot;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.columns&amp;lt;/code&amp;gt; — optional; list of column headers for location hierarchy (e.g. {\&amp;quot;Dialect group\&amp;quot;, \&amp;quot;Dialect\&amp;quot;, \&amp;quot;Location\&amp;quot;}).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.notes&amp;lt;/code&amp;gt; — optional; table of note keys to text.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.sources&amp;lt;/code&amp;gt; — optional; table of source keys to text.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.note_aliases&amp;lt;/code&amp;gt; — optional; alias map for notes.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.varieties&amp;lt;/code&amp;gt; — required; nested table of variety nodes. Each node must have &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;; array part holds children. Node keys can include &amp;lt;code&amp;gt;text_display&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wikidata&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;, and language-specific keys (e.g. &amp;lt;code&amp;gt;persian&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;armenian&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chinese&amp;lt;/code&amp;gt;).\n\n&amp;quot; ..&lt;br /&gt;
					expand_template({ title = &#039;dial syn&#039;, args = { lang_code, [&amp;quot;demo mode&amp;quot;] = &amp;quot;y&amp;quot; } })&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:dialect synonyms/([%l-]+)/([^/]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code, term)&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				local langname = lang:getCanonicalName()&lt;br /&gt;
				cats:insert(&amp;quot;Dialect synonyms data modules|&amp;quot; .. langname)&lt;br /&gt;
				cats:insert(langname .. &amp;quot; dialect synonyms data modules|&amp;quot; .. term)&lt;br /&gt;
				return (&amp;quot;%s\n\n%s&amp;quot;):format(&lt;br /&gt;
					&amp;quot;==== Term/sense module structure ====\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.title&amp;lt;/code&amp;gt; — optional; custom table title (e.g. \&amp;quot;Realization of &#039;strong R&#039; between vowels\&amp;quot;). Overrides the language default.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.meaning&amp;lt;/code&amp;gt; — optional; meaning/gloss (alternative to &amp;lt;code&amp;gt;gloss&amp;lt;/code&amp;gt;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.gloss&amp;lt;/code&amp;gt; — optional; short meaning for the table.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.note&amp;lt;/code&amp;gt; — optional; single note key or string, or list of note keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.notes&amp;lt;/code&amp;gt; — optional; list of note keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.source&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;export.sources&amp;lt;/code&amp;gt; — optional; source keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.last_column&amp;lt;/code&amp;gt; — optional; label for the data column (default \&amp;quot;Words\&amp;quot;; e.g. \&amp;quot;Realization\&amp;quot;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.syns&amp;lt;/code&amp;gt; — required; table mapping variety/location names (keys from the language data module) to a list of term entries. Each entry can be a string or a table (e.g. &amp;lt;code&amp;gt;{ ipa = \&amp;quot;[ɽ]\&amp;quot; }&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;{ term = \&amp;quot;word\&amp;quot; }&amp;lt;/code&amp;gt;).\n\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;Example (custom title and data column, IPA realizations):\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;&amp;lt;pre&amp;gt;\nlocal export = {}\n\nexport.title = \&amp;quot;Realization of &#039;strong R&#039; between vowels\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;export.meaning = \&amp;quot;\&amp;quot;\nexport.note = \&amp;quot;realization of &#039;strong R&#039; between vowels\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;export.last_column = \&amp;quot;Realization\&amp;quot;\n\nexport.syns = {\n\t[\&amp;quot;ALERS-158\&amp;quot;] = { { ipa = \&amp;quot;[ɽ]\&amp;quot; } },\n\t[\&amp;quot;ALERS-175\&amp;quot;] = { { ipa = \&amp;quot;[x]\&amp;quot; } },\n}\n\nreturn export\n&amp;lt;/pre&amp;gt;\n\n&amp;quot;,&lt;br /&gt;
					expand_template({ title = &#039;dial syn&#039;, args = { lang_code, term } }))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:dialect synonyms/([%l-]+)/([^/]+)/([^/]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code, term, id)&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				local langname = lang:getCanonicalName()&lt;br /&gt;
				cats:insert(&amp;quot;Dialect synonyms data modules|&amp;quot; .. langname)&lt;br /&gt;
				cats:insert(langname .. &amp;quot; dialect synonyms data modules|&amp;quot; .. term)&lt;br /&gt;
				return (&amp;quot;%s\n\n%s&amp;quot;):format(&lt;br /&gt;
					&amp;quot;==== Term/sense module structure ====\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.title&amp;lt;/code&amp;gt; — optional; custom table title (e.g. \&amp;quot;Realization of &#039;strong R&#039; between vowels\&amp;quot;). Overrides the language default.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.meaning&amp;lt;/code&amp;gt; — optional; meaning/gloss (alternative to &amp;lt;code&amp;gt;gloss&amp;lt;/code&amp;gt;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.gloss&amp;lt;/code&amp;gt; — optional; short meaning for the table.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.note&amp;lt;/code&amp;gt; — optional; single note key or string, or list of note keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.notes&amp;lt;/code&amp;gt; — optional; list of note keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.source&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;export.sources&amp;lt;/code&amp;gt; — optional; source keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.last_column&amp;lt;/code&amp;gt; — optional; label for the data column (default \&amp;quot;Words\&amp;quot;; e.g. \&amp;quot;Realization\&amp;quot;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.syns&amp;lt;/code&amp;gt; — required; table mapping variety/location names (keys from the language data module) to a list of term entries. Each entry can be a string or a table (e.g. &amp;lt;code&amp;gt;{ ipa = \&amp;quot;[ɽ]\&amp;quot; }&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;{ term = \&amp;quot;word\&amp;quot; }&amp;lt;/code&amp;gt;).\n\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;Example (custom title and data column, IPA realizations):\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;&amp;lt;pre&amp;gt;\nlocal export = {}\n\nexport.title = \&amp;quot;Realization of &#039;strong R&#039; between vowels\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;export.meaning = \&amp;quot;\&amp;quot;\nexport.note = \&amp;quot;realization of &#039;strong R&#039; between vowels\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;export.last_column = \&amp;quot;Realization\&amp;quot;\n\nexport.syns = {\n\t[\&amp;quot;ALERS-158\&amp;quot;] = { { ipa = \&amp;quot;[ɽ]\&amp;quot; } },\n\t[\&amp;quot;ALERS-175\&amp;quot;] = { { ipa = \&amp;quot;[x]\&amp;quot; } },\n}\n\nreturn export\n&amp;lt;/pre&amp;gt;\n\n&amp;quot;,&lt;br /&gt;
					expand_template({ title = &#039;dial syn&#039;, args = { lang_code, term, id = id } }))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:bibliography/data/([%l-]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			if lang_code == &amp;quot;preload&amp;quot; then&lt;br /&gt;
				return &#039;Used as a base model for other languages when the button &amp;quot;create new language submodule&amp;quot; is clicked.&#039;&lt;br /&gt;
			end&lt;br /&gt;
			local page = require(title.fullText).bib_page&lt;br /&gt;
			if not page then&lt;br /&gt;
				page = lang_cache[lang_code]:getCanonicalName()&lt;br /&gt;
				if page then&lt;br /&gt;
					cats:insert(page .. &amp;quot; modules&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			cats:insert(&amp;quot;Reference modules&amp;quot;)&lt;br /&gt;
			return &amp;quot;This module holds bibliographical data for &amp;quot; ..&lt;br /&gt;
				page .. &amp;quot;. For the formatted bibliography see &#039;&#039;&#039;[[Appendix:Bibliography/&amp;quot; .. page .. &amp;quot;]]&#039;&#039;&#039;.&amp;quot;&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function export.show(frame)&lt;br /&gt;
	local boolean_default_false = { type = &amp;quot;boolean&amp;quot;, default = false }&lt;br /&gt;
	local args = process_params(frame.args, {&lt;br /&gt;
		[&amp;quot;hr&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;for&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;from&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;allowondoc&amp;quot;] = boolean_default_false, -- Don&#039;t throw an error if used on a documentation subpage.&lt;br /&gt;
		[&amp;quot;notsubpage&amp;quot;] = boolean_default_false,&lt;br /&gt;
		[&amp;quot;nodoc&amp;quot;] = boolean_default_false,&lt;br /&gt;
		[&amp;quot;nolinks&amp;quot;] = boolean_default_false, -- suppress all &amp;quot;Useful links&amp;quot;&lt;br /&gt;
		[&amp;quot;nosandbox&amp;quot;] = boolean_default_false, -- supress sandbox&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	local output = Array(&#039;\n&amp;lt;div class=&amp;quot;documentation&amp;quot; style=&amp;quot;display:block; clear:both&amp;quot;&amp;gt;\n&#039;)&lt;br /&gt;
	local cats = Array()&lt;br /&gt;
&lt;br /&gt;
	local nodoc = args.nodoc&lt;br /&gt;
&lt;br /&gt;
	if (not args.hr) or (args.hr == &amp;quot;above&amp;quot;) then&lt;br /&gt;
		output:insert(&amp;quot;----\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local title = args[&amp;quot;for&amp;quot;] and new_title(args[&amp;quot;for&amp;quot;]) or get_current_title()&lt;br /&gt;
	local doc_title = args.from ~= &amp;quot;-&amp;quot; and new_title(args.from or title.fullText .. &#039;/doc&#039;) or nil&lt;br /&gt;
	local contentModel = title.contentModel&lt;br /&gt;
	local pagetype, is_script_or_stylesheet = get_pagetype(title)&lt;br /&gt;
	local preload, fallback_docs, doc_content, old_doc_title, user_name, skin_name, needs_doc&lt;br /&gt;
	local doc_content_source = &amp;quot;Module:documentation&amp;quot;&lt;br /&gt;
	local auto_generated_cat_source&lt;br /&gt;
	local cats_auto_generated = false&lt;br /&gt;
&lt;br /&gt;
	if not args.allowondoc and is_documentation(title) then&lt;br /&gt;
		-- TODO: merge with {{documentation subpage}}, and choose behaviour based on the page type.&lt;br /&gt;
		error(&amp;quot;This template should not be used on a documentation page. Please use [[Template:documentation subpage]].&amp;quot;)&lt;br /&gt;
	elseif is_sandbox(title) then&lt;br /&gt;
		local sandbox_ns = title.nsText&lt;br /&gt;
		preload = (&amp;quot;Template:documentation/preload%s%sSandbox&amp;quot;):format(&lt;br /&gt;
			sandbox_ns == &amp;quot;Module&amp;quot; and sandbox_ns or &amp;quot;Template&amp;quot;,&lt;br /&gt;
			title.rootText:match(&amp;quot;^[Uu]ser:(.+)&amp;quot;) and &amp;quot;User&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
		)&lt;br /&gt;
	elseif pagetype:match(&amp;quot;%f[%w]gadget%f[%W]&amp;quot;) then&lt;br /&gt;
		preload = &amp;quot;Template:documentation/preloadGadget&amp;quot;&lt;br /&gt;
	elseif pagetype:match(&amp;quot;%f[%w]script%f[%W]&amp;quot;) then -- .js&lt;br /&gt;
		if title.nsText == &amp;quot;MediaWiki&amp;quot; then&lt;br /&gt;
			preload = &amp;quot;Template:documentation/preloadMediaWikiJavaScript&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			preload = &amp;quot;Template:documentation/preloadTemplate&amp;quot; -- XXX&lt;br /&gt;
			if title.nsText == &amp;quot;User&amp;quot; then&lt;br /&gt;
				user_name = title.rootText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		is_script_or_stylesheet = true&lt;br /&gt;
	elseif pagetype:match(&amp;quot;%f[%w]stylesheet%f[%W]&amp;quot;) then -- .css&lt;br /&gt;
		preload = &amp;quot;Template:documentation/preloadTemplate&amp;quot; -- XXX&lt;br /&gt;
		if title.nsText == &amp;quot;User&amp;quot; then&lt;br /&gt;
			user_name = title.rootText&lt;br /&gt;
		end&lt;br /&gt;
		is_script_or_stylesheet = true&lt;br /&gt;
	elseif contentModel == &amp;quot;Scribunto&amp;quot; then -- Exclude pages in Module: which aren&#039;t Scribunto.&lt;br /&gt;
		preload = &amp;quot;Template:documentation/preloadModule&amp;quot;&lt;br /&gt;
	elseif pagetype:match(&amp;quot;%f[%w]template%f[%W]&amp;quot;) or pagetype:match(&amp;quot;%f[%w]project%f[%W]&amp;quot;) then&lt;br /&gt;
		preload = &amp;quot;Template:documentation/preloadTemplate&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if doc_title and doc_title.isRedirect then&lt;br /&gt;
		old_doc_title = doc_title&lt;br /&gt;
		doc_title = doc_title.redirectTarget&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output:insert(&amp;quot;&amp;lt;dl class=\&amp;quot;plainlinks\&amp;quot; style=\&amp;quot;font-size: smaller;\&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local function get_module_doc_and_cats(categories_only)&lt;br /&gt;
		cats_auto_generated = true&lt;br /&gt;
		local automatic_cats = nil&lt;br /&gt;
		if user_name then&lt;br /&gt;
			fallback_docs = &amp;quot;documentation/fallback/user module&amp;quot;&lt;br /&gt;
			automatic_cats = { &amp;quot;User sandbox modules&amp;quot; }&lt;br /&gt;
		else&lt;br /&gt;
			for _, data in ipairs(module_regex) do&lt;br /&gt;
				local captures = { umatch(title.fullText, data.regex) }&lt;br /&gt;
				if #captures &amp;gt; 0 then&lt;br /&gt;
					local cat, process_function&lt;br /&gt;
					if is_callable(data.process) then&lt;br /&gt;
						process_function = data.process&lt;br /&gt;
					elseif type(data.process) == &amp;quot;string&amp;quot; then&lt;br /&gt;
						doc_content_source = &amp;quot;Module:documentation/functions/&amp;quot; .. data.process&lt;br /&gt;
						process_function = require(doc_content_source)&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					if process_function then&lt;br /&gt;
						doc_content = process_function(title, cats, unpack(captures))&lt;br /&gt;
					end&lt;br /&gt;
					if type(doc_content) == &amp;quot;table&amp;quot; then&lt;br /&gt;
						doc_content_source = doc_content.title and &amp;quot;Template:&amp;quot; .. doc_content.title or doc_content_source&lt;br /&gt;
						doc_content = expand_template(doc_content)&lt;br /&gt;
					elseif doc_content ~= nil then&lt;br /&gt;
						doc_content = preprocess(doc_content)&lt;br /&gt;
					end&lt;br /&gt;
					cat = data.cat&lt;br /&gt;
&lt;br /&gt;
					if cat then&lt;br /&gt;
						if type(cat) == &amp;quot;string&amp;quot; then&lt;br /&gt;
							cat = { cat }&lt;br /&gt;
						end&lt;br /&gt;
						for _, c in ipairs(cat) do&lt;br /&gt;
							insert(cats, (ugsub(title.fullText, data.regex, c)))&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if title.subpageText == &amp;quot;templates&amp;quot; then&lt;br /&gt;
			cats:insert(&amp;quot;Template interface modules&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if automatic_cats then&lt;br /&gt;
			for _, c in ipairs(automatic_cats) do&lt;br /&gt;
				cats:insert(c)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #cats == 0 then&lt;br /&gt;
			local auto_cats = categorize_module(frame, &amp;quot;return raw&amp;quot;, &amp;quot;noerror&amp;quot;)&lt;br /&gt;
			if #auto_cats &amp;gt; 0 then&lt;br /&gt;
				auto_generated_cat_source = &amp;quot;Module:module categorization&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			for _, category in ipairs(auto_cats) do&lt;br /&gt;
				cats:insert(category)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- meaning module is not in user’s sandbox or one of many datamodule boring series&lt;br /&gt;
		needs_doc = not categories_only and not (automatic_cats or doc_content or fallback_docs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Override automatic documentation, if present.&lt;br /&gt;
	if doc_title and doc_title.exists then&lt;br /&gt;
		local cats_auto_generated_text = &amp;quot;&amp;quot;&lt;br /&gt;
		if contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			local doc_page_content = doc_title.content&lt;br /&gt;
			-- Track then do nothing if there are uses of includeonly. The&lt;br /&gt;
			-- pattern is slightly too permissive, but any false-positives are&lt;br /&gt;
			-- obvious typos that should be corrected.&lt;br /&gt;
			if doc_page_content:lower():match(&amp;quot;&amp;lt;/?includeonly%f[%s/&amp;gt;][^&amp;gt;]*&amp;gt;&amp;quot;) then&lt;br /&gt;
			else&lt;br /&gt;
				-- Check for uses of {{module cat}}. find_templates treats the&lt;br /&gt;
				-- input as transcluded by default (i.e. it parses the wikitext&lt;br /&gt;
				-- which will be transcluded through to the module page).&lt;br /&gt;
				local module_cat&lt;br /&gt;
				for template in find_templates(doc_page_content) do&lt;br /&gt;
					if template:get_name() == &amp;quot;module cat&amp;quot; then&lt;br /&gt;
						module_cat = true&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not module_cat then&lt;br /&gt;
					get_module_doc_and_cats(&amp;quot;categories only&amp;quot;)&lt;br /&gt;
					auto_generated_cat_source = auto_generated_cat_source or doc_content_source&lt;br /&gt;
					cats_auto_generated_text = &amp;quot; Categories were auto-generated by [[&amp;quot; ..&lt;br /&gt;
						auto_generated_cat_source .. &amp;quot;]]. &amp;lt;sup&amp;gt;[[&amp;quot; ..&lt;br /&gt;
						new_title(auto_generated_cat_source):fullUrl { action = &amp;quot;edit&amp;quot; } .. &amp;quot; edit]]&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		output:insert(&lt;br /&gt;
			&amp;quot;&amp;lt;dd&amp;gt;&amp;lt;i style=\&amp;quot;font-size: larger;\&amp;quot;&amp;gt;The following &amp;quot; ..&lt;br /&gt;
			&amp;quot;[[wikt:Help:Documenting templates and modules|documentation]] is located at [[&amp;quot; ..&lt;br /&gt;
			doc_title.fullText .. &amp;quot;]]. &amp;quot; .. &amp;quot;&amp;lt;sup&amp;gt;[[&amp;quot; .. doc_title:fullUrl { action = &amp;quot;edit&amp;quot; } .. &amp;quot; edit]]&amp;lt;/sup&amp;gt;&amp;quot; ..&lt;br /&gt;
			cats_auto_generated_text .. &amp;quot;&amp;lt;/i&amp;gt;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		if contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			get_module_doc_and_cats(false)&lt;br /&gt;
		elseif title.nsText == &amp;quot;Template&amp;quot; then&lt;br /&gt;
			--cats:insert(&amp;quot;Uncategorized templates&amp;quot;)&lt;br /&gt;
			needs_doc = not (fallback_docs or nodoc)&lt;br /&gt;
		elseif user_name and is_script_or_stylesheet then&lt;br /&gt;
			skin_name = skins[title.text:sub(#title.rootText + 1):match(&amp;quot;^/(%l+)%.[jc]ss?$&amp;quot;)]&lt;br /&gt;
			if skin_name then&lt;br /&gt;
				fallback_docs = &amp;quot;documentation/fallback/user &amp;quot; .. contentModel&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if doc_content then&lt;br /&gt;
			output:insert(&lt;br /&gt;
				&amp;quot;&amp;lt;dd&amp;gt;&amp;lt;i style=\&amp;quot;font-size: larger;\&amp;quot;&amp;gt;The following &amp;quot; ..&lt;br /&gt;
				&amp;quot;[[wikt:Help:Documenting templates and modules|documentation]] is &amp;quot; ..&lt;br /&gt;
				&amp;quot;generated by [[&amp;quot; .. doc_content_source .. &amp;quot;]]. &amp;lt;sup&amp;gt;[[&amp;quot; ..&lt;br /&gt;
				new_title(doc_content_source):fullUrl { action = &amp;quot;edit&amp;quot; } ..&lt;br /&gt;
				&amp;quot; edit]]&amp;lt;/sup&amp;gt; &amp;lt;/i&amp;gt;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
		elseif not nodoc then&lt;br /&gt;
			if doc_title then&lt;br /&gt;
				output:insert(&lt;br /&gt;
					&amp;quot;&amp;lt;dd&amp;gt;&amp;lt;i style=\&amp;quot;font-size: larger;\&amp;quot;&amp;gt;This &amp;quot; .. pagetype ..&lt;br /&gt;
					&amp;quot; lacks a [[wikt:Help:Documenting templates and modules|documentation subpage]]. &amp;quot; ..&lt;br /&gt;
					(fallback_docs and &amp;quot;You may &amp;quot; or &amp;quot;Please &amp;quot;) ..&lt;br /&gt;
					&amp;quot;[&amp;quot; .. doc_title:fullUrl { action = &amp;quot;edit&amp;quot;, preload = preload }&lt;br /&gt;
					.. &amp;quot; create it].&amp;lt;/i&amp;gt;&amp;lt;/dd&amp;gt;\n&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				output:insert(&lt;br /&gt;
					&amp;quot;&amp;lt;dd&amp;gt;&amp;lt;i style=\&amp;quot;font-size: larger; color: var(--wikt-palette-red-9,#FF0000);\&amp;quot;&amp;gt;Unable to auto-generate &amp;quot; ..&lt;br /&gt;
					&amp;quot;documentation for this &amp;quot; .. pagetype .. &amp;quot;.&amp;lt;/i&amp;gt;&amp;lt;/dd&amp;gt;\n&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if startswith(title.fullText, &amp;quot;MediaWiki:Gadget-&amp;quot;) then&lt;br /&gt;
		local is_gadget = false&lt;br /&gt;
		for line in gline(new_title(&amp;quot;MediaWiki:Gadgets-definition&amp;quot;).content) do&lt;br /&gt;
			local gadget, items = line:match(&amp;quot;^%*%s*(%a[%w_-]*)%[.-%]|(.+)$&amp;quot;)&lt;br /&gt;
			if not gadget then&lt;br /&gt;
				gadget, items = line:match(&amp;quot;^%*%s*(%a[%w_-]*)|(.+)$&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			if gadget then&lt;br /&gt;
				items = Array(split(items, &amp;quot;|&amp;quot;))&lt;br /&gt;
				for i, item in ipairs(items) do&lt;br /&gt;
					if title.fullText == (&amp;quot;MediaWiki:Gadget-&amp;quot; .. item) then&lt;br /&gt;
						is_gadget = true&lt;br /&gt;
&lt;br /&gt;
						output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;This script is a part of the &amp;lt;code&amp;gt;&amp;quot;)&lt;br /&gt;
						output:insert(gadget)&lt;br /&gt;
						output:insert(&amp;quot;&amp;lt;/code&amp;gt; gadget ([&amp;quot;)&lt;br /&gt;
						output:insert(tostring(full_url(&amp;quot;MediaWiki:Gadgets-definition&amp;quot;, { action = &amp;quot;edit&amp;quot; })))&lt;br /&gt;
						output:insert(&amp;quot; edit definitions])&#039;&#039; &amp;lt;dl&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
						output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;Description ([&amp;quot;)&lt;br /&gt;
						output:insert(tostring(full_url(&amp;quot;MediaWiki:Gadget-&amp;quot; .. gadget, { action = &amp;quot;edit&amp;quot; })))&lt;br /&gt;
						output:insert(&amp;quot; edit])&#039;&#039;: &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
						output:insert(preprocess(new_message(&#039;Gadget-&#039; .. gadget):plain()))&lt;br /&gt;
						output:insert(&amp;quot; &amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
						items:remove(i)&lt;br /&gt;
						if #items &amp;gt; 0 then&lt;br /&gt;
							for j, item in ipairs(items) do&lt;br /&gt;
								items[j] = &#039;[[MediaWiki:Gadget-&#039; .. item .. &#039;|&#039; .. item .. &#039;]]&#039;&lt;br /&gt;
							end&lt;br /&gt;
							output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;Other parts&#039;&#039;: &amp;quot;)&lt;br /&gt;
							output:insert(list_to_text(items))&lt;br /&gt;
							output:insert(&amp;quot;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
						end&lt;br /&gt;
&lt;br /&gt;
						output:insert(&amp;quot;&amp;lt;/dl&amp;gt;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if not is_gadget then&lt;br /&gt;
			output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;This script is not a part of any [&amp;quot;)&lt;br /&gt;
			output:insert(tostring(full_url(&amp;quot;Special:Gadgets&amp;quot;, { uselang = &amp;quot;en&amp;quot; })))&lt;br /&gt;
			output:insert(&#039; gadget] ([&#039;)&lt;br /&gt;
			output:insert(tostring(full_url(&amp;quot;MediaWiki:Gadgets-definition&amp;quot;, { action = &amp;quot;edit&amp;quot; })))&lt;br /&gt;
			output:insert(&#039; edit definitions]).&amp;lt;/dd&amp;gt;&#039;)&lt;br /&gt;
			-- else&lt;br /&gt;
			-- cats:insert(&amp;quot;Wiktionary gadgets&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if old_doc_title then&lt;br /&gt;
		output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;Redirected from&#039;&#039; [&amp;quot;)&lt;br /&gt;
		output:insert(old_doc_title:fullUrl { redirect = &amp;quot;no&amp;quot; })&lt;br /&gt;
		output:insert(&amp;quot; &amp;quot;)&lt;br /&gt;
		output:insert(old_doc_title.fullText)&lt;br /&gt;
		output:insert(&amp;quot;] ([&amp;quot;)&lt;br /&gt;
		output:insert(old_doc_title:fullUrl { action = &amp;quot;edit&amp;quot; })&lt;br /&gt;
		output:insert(&amp;quot; edit]).&amp;lt;/dd&amp;gt;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args.nolinks then&lt;br /&gt;
		local links = Array()&lt;br /&gt;
&lt;br /&gt;
		if title.isSubpage and not args.notsubpage then&lt;br /&gt;
			links:insert(&amp;quot;[[:&amp;quot; .. title.nsText .. &amp;quot;:&amp;quot; .. title.rootText .. &amp;quot;|root page]]&amp;quot;)&lt;br /&gt;
			links:insert(&amp;quot;[[Special:PrefixIndex/&amp;quot; .. title.nsText .. &amp;quot;:&amp;quot; .. title.rootText .. &amp;quot;/|root page’s subpages]]&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			links:insert(&amp;quot;[[Special:PrefixIndex/&amp;quot; .. title.fullText .. &amp;quot;/|subpage list]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		links:insert(&lt;br /&gt;
			&amp;quot;[&amp;quot; ..&lt;br /&gt;
			tostring(full_url(&amp;quot;Special:WhatLinksHere/&amp;quot; .. title.fullText, { hidetrans = true, hideredirs = true })) ..&lt;br /&gt;
			&amp;quot; links]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if contentModel ~= &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			links:insert(&lt;br /&gt;
				&amp;quot;[&amp;quot; ..&lt;br /&gt;
				tostring(full_url(&amp;quot;Special:WhatLinksHere/&amp;quot; .. title.fullText, { hidelinks = true, hidetrans = true })) ..&lt;br /&gt;
				&amp;quot; redirects]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if is_script_or_stylesheet then&lt;br /&gt;
			if user_name then&lt;br /&gt;
				links:insert(&amp;quot;[[Special:MyPage&amp;quot; .. title.text:sub(#title.rootText + 1) .. &amp;quot;|your own]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			links:insert(&lt;br /&gt;
				&amp;quot;[&amp;quot; ..&lt;br /&gt;
				tostring(full_url(&amp;quot;Special:WhatLinksHere/&amp;quot; .. title.fullText, { hidelinks = true, hideredirs = true })) ..&lt;br /&gt;
				&amp;quot; transclusions]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			local is_testcases = title.isSubpage and title.subpageText == &amp;quot;testcases&amp;quot;&lt;br /&gt;
			local without_subpage = title.nsText .. &amp;quot;:&amp;quot; .. title.baseText&lt;br /&gt;
			if is_testcases then&lt;br /&gt;
				links:insert(&amp;quot;[[:&amp;quot; .. without_subpage .. &amp;quot;|tested module]]&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				links:insert(&amp;quot;[[&amp;quot; .. title.fullText .. &amp;quot;/testcases|testcases]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if user_name then&lt;br /&gt;
				links:insert(&amp;quot;[[User:&amp;quot; .. user_name .. &amp;quot;|user page]]&amp;quot;)&lt;br /&gt;
				links:insert(&amp;quot;[[User talk:&amp;quot; .. user_name .. &amp;quot;|user talk page]]&amp;quot;)&lt;br /&gt;
				links:insert(&amp;quot;[[Special:PrefixIndex/User:&amp;quot; .. user_name .. &amp;quot;/|userspace]]&amp;quot;)&lt;br /&gt;
				-- If sandbox module, add a link to the module that this is a sandbox of.&lt;br /&gt;
				-- Exclude user sandbox modules like [[User:Dine2016/sandbox]].&lt;br /&gt;
			elseif title.text:find(&amp;quot;^sandbox%d*/&amp;quot;) or title.text:find(&amp;quot;/sandbox%d*%f[/%z]&amp;quot;) then&lt;br /&gt;
				cats:insert(&amp;quot;Sandbox modules&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
				-- Sandbox modules don’t really need documentation.&lt;br /&gt;
				needs_doc = false&lt;br /&gt;
&lt;br /&gt;
				-- Don&#039;t track user sandbox modules.&lt;br /&gt;
				local text_title = new_title(title.text)&lt;br /&gt;
				if not (text_title and text_title.nsText == &amp;quot;User&amp;quot;) then&lt;br /&gt;
					local diff&lt;br /&gt;
					local sandbox_of = title.text:match(&amp;quot;^(.*)/sandbox%d*%f[/%z]&amp;quot;)&lt;br /&gt;
					if sandbox_of then&lt;br /&gt;
					else&lt;br /&gt;
						sandbox_of = title.text:match(&amp;quot;^sandbox%d*/(.*)$&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
					if not sandbox_of then&lt;br /&gt;
						error((&amp;quot;Internal error: Something wrong, couldn&#039;t extract sandbox-of module from title &#039;%s&#039;&amp;quot;)&lt;br /&gt;
							:format(title.text))&lt;br /&gt;
					end&lt;br /&gt;
					sandbox_of = title.nsText .. &amp;quot;:&amp;quot; .. sandbox_of&lt;br /&gt;
					if title_exists(sandbox_of) then&lt;br /&gt;
						diff = &amp;quot; (&amp;quot; .. compare_pages(title.fullText, sandbox_of, &amp;quot;diff&amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					links:insert(&amp;quot;[[:&amp;quot; .. sandbox_of .. &amp;quot;|sandbox of]]&amp;quot; .. (diff or &amp;quot;&amp;quot;))&lt;br /&gt;
				end&lt;br /&gt;
				-- If not a sandbox module, add link to sandbox module.&lt;br /&gt;
				-- Sometimes there are multiple sandboxes for a single module:&lt;br /&gt;
				-- [[Module:sandbox/sa-pronunc]],  [[Module:sandbox2/sa-pronunc]].&lt;br /&gt;
			else&lt;br /&gt;
				local sandbox_title&lt;br /&gt;
				local user_prefix, user_rest = title.text:match(&amp;quot;^(User:.-/)(.*)$&amp;quot;)&lt;br /&gt;
				if not user_prefix then&lt;br /&gt;
					user_prefix = &amp;quot;&amp;quot;&lt;br /&gt;
					user_rest = title.text&lt;br /&gt;
				end&lt;br /&gt;
				sandbox_title = title.nsText .. &amp;quot;:&amp;quot; .. user_prefix .. &amp;quot;sandbox/&amp;quot; .. user_rest&lt;br /&gt;
				local sandbox_link = &amp;quot;[[:&amp;quot; .. sandbox_title .. &amp;quot;|sandbox]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
				local diff&lt;br /&gt;
				if title_exists(sandbox_title) then&lt;br /&gt;
					diff = &amp;quot; (&amp;quot; .. compare_pages(title.fullText, sandbox_title, &amp;quot;diff&amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				links:insert(sandbox_link .. (diff or &amp;quot;&amp;quot;))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if title.nsText == &amp;quot;Template&amp;quot; then&lt;br /&gt;
			-- Error search: all(any namespace), hastemplate (show pages using the template), insource (show source code), incategory (any/specific error) -- [[mw:Help:CirrusSearch]], [[w:Help:Searching/Regex]]&lt;br /&gt;
			-- apparently same with/without: &amp;amp;profile=advanced&amp;amp;fulltext=1&lt;br /&gt;
			local errorq = &#039;searchengineselect=mediawiki&amp;amp;search=all: hastemplate:\&amp;quot;&#039; ..&lt;br /&gt;
				title.rootText .. &#039;\&amp;quot; insource:\&amp;quot;&#039; .. title.rootText .. &#039;\&amp;quot; incategory:&#039;&lt;br /&gt;
			local eincategory =&lt;br /&gt;
			&amp;quot;Pages_with_module_errors|ParserFunction_errors|DisplayTitle_errors|Pages_with_ISBN_errors|Pages_with_ISSN_errors|Pages_with_reference_errors|Pages_with_syntax_highlighting_errors|Pages_with_TemplateStyles_errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			links:insert(&lt;br /&gt;
				&#039;[&#039; .. tostring(full_url(&#039;Special:Search&#039;, errorq .. eincategory)) .. &#039; errors]&#039;&lt;br /&gt;
				.. &#039; (&#039; ..&lt;br /&gt;
				&#039;[&#039; .. tostring(full_url(&#039;Special:Search&#039;, errorq .. &#039;ParserFunction_errors&#039;)) .. &#039; parser]&#039;&lt;br /&gt;
				.. &#039;/&#039; ..&lt;br /&gt;
				&#039;[&#039; .. tostring(full_url(&#039;Special:Search&#039;, errorq .. &#039;Pages_with_module_errors&#039;)) .. &#039; module]&#039;&lt;br /&gt;
				.. &#039;)&#039;&lt;br /&gt;
			)&lt;br /&gt;
&lt;br /&gt;
			if title.isSubpage and title.text:find(&amp;quot;/sandbox%d*%f[/%z]&amp;quot;) then -- This is a sandbox template.&lt;br /&gt;
				-- At the moment there are no user sandbox templates with subpage&lt;br /&gt;
				-- “/sandbox”.&lt;br /&gt;
				cats:insert(&amp;quot;Sandbox templates&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
				-- Sandbox templates don’t really need documentation.&lt;br /&gt;
				needs_doc = false&lt;br /&gt;
&lt;br /&gt;
				-- Will behave badly if “/sandbox” occurs twice in title!&lt;br /&gt;
				local sandbox_of = title.fullText:gsub(&amp;quot;/sandbox%d*%f[/%z]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
				local diff&lt;br /&gt;
				if title_exists(sandbox_of) then&lt;br /&gt;
					diff = &amp;quot; (&amp;quot; .. compare_pages(title.fullText, sandbox_of, &amp;quot;diff&amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				links:insert(&amp;quot;[[:&amp;quot; .. sandbox_of .. &amp;quot;|sandbox of]]&amp;quot; .. (diff or &amp;quot;&amp;quot;))&lt;br /&gt;
				-- This is a template that can have a sandbox.&lt;br /&gt;
			elseif not args.nosandbox then -- unless we tell it not to&lt;br /&gt;
				local sandbox_title = title.fullText .. &amp;quot;/sandbox&amp;quot;&lt;br /&gt;
&lt;br /&gt;
				local diff&lt;br /&gt;
				if title_exists(sandbox_title) then&lt;br /&gt;
					diff = &amp;quot; (&amp;quot; .. compare_pages(title.fullText, sandbox_title, &amp;quot;diff&amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				links:insert(&amp;quot;[[:&amp;quot; .. sandbox_title .. &amp;quot;|sandbox]]&amp;quot; .. (diff or &amp;quot;&amp;quot;))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #links &amp;gt; 0 then&lt;br /&gt;
			output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;Useful links&#039;&#039;: &amp;quot; .. links:concat(&amp;quot; • &amp;quot;) .. &amp;quot;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output:insert(&amp;quot;&amp;lt;/dl&amp;gt;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Show error from [[Module:category tree/topic cat/data]] on its submodules&#039;&lt;br /&gt;
	-- documentation to, for instance, warn about duplicate labels.&lt;br /&gt;
	if startswith(title.fullText, &amp;quot;Module:category tree/topic/&amp;quot;) then&lt;br /&gt;
		local ok, err = pcall(require, &amp;quot;Module:category tree/topic/data&amp;quot;)&lt;br /&gt;
		if not ok then&lt;br /&gt;
			output:insert(&#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&#039; .. err .. &#039;&amp;lt;/span&amp;gt;\n\n&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if doc_title and doc_title.exists then&lt;br /&gt;
		-- Override automatic documentation, if present.&lt;br /&gt;
		doc_content = expand_template { title = doc_title.fullText }&lt;br /&gt;
	elseif not doc_content and fallback_docs then&lt;br /&gt;
		doc_content = expand_template {&lt;br /&gt;
			title = fallback_docs,&lt;br /&gt;
			args = {&lt;br /&gt;
				[&#039;user&#039;] = user_name,&lt;br /&gt;
				[&#039;page&#039;] = title.fullText,&lt;br /&gt;
				[&#039;skin name&#039;] = skin_name,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if doc_content then&lt;br /&gt;
		output:insert(doc_content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output:insert((&#039;\n&amp;lt;%s style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&#039;):format(args.hr == &amp;quot;below&amp;quot; and &amp;quot;hr&amp;quot; or &amp;quot;br&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
	if cats_auto_generated and not cats[1] and (not doc_content or not doc_content:find(&amp;quot;%[%[Category:&amp;quot;)) then&lt;br /&gt;
		if contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			cats:insert(&amp;quot;Uncategorized modules&amp;quot;)&lt;br /&gt;
			-- elseif title.nsText == &amp;quot;Template&amp;quot; then&lt;br /&gt;
			-- cats:insert(&amp;quot;Uncategorized templates&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if needs_doc then&lt;br /&gt;
		cats:insert(&amp;quot;Templates and modules needing documentation&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(cats) do&lt;br /&gt;
		output:insert(&amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output:insert(&amp;quot;&amp;lt;/div&amp;gt;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	return output:concat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.module_auto_doc_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(&#039;{|class=&amp;quot;wikitable&amp;quot;&#039;)&lt;br /&gt;
	ins(&amp;quot;! Regex !! Category !! Handling modules&amp;quot;)&lt;br /&gt;
	for _, spec in ipairs(module_regex) do&lt;br /&gt;
		local cat_text&lt;br /&gt;
		local cats = spec.cat&lt;br /&gt;
		if cats then&lt;br /&gt;
			local cat_parts = {}&lt;br /&gt;
			if type(cats) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				cats = { cats }&lt;br /&gt;
			end&lt;br /&gt;
			for _, cat in ipairs(cats) do&lt;br /&gt;
				insert(cat_parts, (&amp;quot;&amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;):format((cat:gsub(&amp;quot;|&amp;quot;, &amp;quot;&amp;amp;#124;&amp;quot;))))&lt;br /&gt;
			end&lt;br /&gt;
			cat_text = concat(cat_parts, &amp;quot;, &amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			cat_text = &amp;quot;&#039;&#039;(unspecified)&#039;&#039;&amp;quot;&lt;br /&gt;
		end&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; || %s || %s&amp;quot;):format(spec.regex, cat_text,&lt;br /&gt;
			is_callable(spec.process) and &amp;quot;&#039;&#039;(handled internally)&#039;&#039;&amp;quot; or&lt;br /&gt;
			type(spec.process) == &amp;quot;string&amp;quot; and (&amp;quot;[[Module:documentation/functions/%s]]&amp;quot;):format(spec.process) or&lt;br /&gt;
			&amp;quot;&#039;&#039;(no documentation generator)&#039;&#039;&amp;quot;))&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;
-- Used by {{translit module documentation}}.&lt;br /&gt;
function export.translitModuleLangList(frame)&lt;br /&gt;
	local pagename, subpage&lt;br /&gt;
&lt;br /&gt;
	if frame.args[1] then&lt;br /&gt;
		pagename = frame.args[1]&lt;br /&gt;
	else&lt;br /&gt;
		local title = get_current_title()&lt;br /&gt;
		subpage = title.subpageText&lt;br /&gt;
		pagename = title.text&lt;br /&gt;
&lt;br /&gt;
		if subpage ~= pagename then&lt;br /&gt;
			pagename = title.rootText&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local translitModule = pagename&lt;br /&gt;
&lt;br /&gt;
	local languageObjects = require(&amp;quot;Module:languages/byTranslitModule&amp;quot;)(translitModule)&lt;br /&gt;
	local codeInPagename = pagename:match(&amp;quot;^([%l-]+)%-.*translit$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local categories = Array()&lt;br /&gt;
	local codeInPagenameInList = false&lt;br /&gt;
	if codeInPagename then&lt;br /&gt;
		if languageObjects[1] and subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
			local agreement = languageObjects[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
			categories:insert(&amp;quot;[[Category:Transliteration modules used by &amp;quot; ..&lt;br /&gt;
				#languageObjects .. &amp;quot; language&amp;quot; .. agreement .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		languageObjects = Array(languageObjects)&lt;br /&gt;
			:filter(&lt;br /&gt;
				function(lang)&lt;br /&gt;
					local result = lang:getCode() ~= codeInPagename&lt;br /&gt;
					codeInPagenameInList = codeInPagenameInList or result&lt;br /&gt;
					return result&lt;br /&gt;
				end)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
		for script_code in pagename:gmatch(&amp;quot;%f[^-%z]%u%l%l%l%f[-]&amp;quot;) do&lt;br /&gt;
			local script = get_script(script_code)&lt;br /&gt;
			if script then&lt;br /&gt;
				categories:insert(&amp;quot;[[Category:&amp;quot; .. script:getCategoryName() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; and not title_exists(&amp;quot;Module:&amp;quot; .. pagename .. &amp;quot;/testcases&amp;quot;) then&lt;br /&gt;
		categories:insert(&amp;quot;[[Category:Transliteration modules without a testcases subpage]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not languageObjects[1] then&lt;br /&gt;
		return categories:concat()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langs = Array(languageObjects)&lt;br /&gt;
		:sort(&lt;br /&gt;
			function(lang1, lang2)&lt;br /&gt;
				return lang1:getCode() &amp;lt; lang2:getCode()&lt;br /&gt;
			end)&lt;br /&gt;
		-- This will not error because languageObjects is not empty.&lt;br /&gt;
		:map(languageObjects[1].makeCategoryLink)&lt;br /&gt;
		:serialCommaJoin()&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;It is &amp;quot; .. (codeInPagenameInList and &amp;quot;also&amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
		&amp;quot; used to transliterate &amp;quot; .. langs .. &amp;quot;.&amp;quot; .. categories:concat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by {{strip diacritics module documentation}}.&lt;br /&gt;
function export.stripDiacriticsModuleLangList(frame)&lt;br /&gt;
	local pagename, subpage&lt;br /&gt;
&lt;br /&gt;
	if frame.args[1] then&lt;br /&gt;
		pagename = frame.args[1]&lt;br /&gt;
	else&lt;br /&gt;
		local title = get_current_title()&lt;br /&gt;
		subpage = title.subpageText&lt;br /&gt;
		pagename = title.text&lt;br /&gt;
&lt;br /&gt;
		if subpage ~= pagename then&lt;br /&gt;
			pagename = title.rootText&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local stripDiacriticsModule = pagename&lt;br /&gt;
&lt;br /&gt;
	local languageObjects = require(&amp;quot;Module:languages/byStripDiacriticsModule&amp;quot;)(stripDiacriticsModule)&lt;br /&gt;
	local codeInPagename = pagename:match(&amp;quot;^([%l-]+)%-.*stripdiacritics$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local categories = Array()&lt;br /&gt;
	local codeInPagenameInList = false&lt;br /&gt;
	if codeInPagename then&lt;br /&gt;
		if languageObjects[1] and subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
			local agreement = languageObjects[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
			categories:insert(&amp;quot;[[Category:Diacritic-stripping modules used by &amp;quot; ..&lt;br /&gt;
				#languageObjects .. &amp;quot; language&amp;quot; .. agreement .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		languageObjects = Array(languageObjects)&lt;br /&gt;
			:filter(&lt;br /&gt;
				function(lang)&lt;br /&gt;
					local result = lang:getCode() ~= codeInPagename&lt;br /&gt;
					codeInPagenameInList = codeInPagenameInList or result&lt;br /&gt;
					return result&lt;br /&gt;
				end)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
		for script_code in pagename:gmatch(&amp;quot;%f[^-%z]%u%l%l%l%f[-]&amp;quot;) do&lt;br /&gt;
			local script = get_script(script_code)&lt;br /&gt;
			if script then&lt;br /&gt;
				categories:insert(&amp;quot;[[Category:&amp;quot; .. script:getCategoryName() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; and not title_exists(&amp;quot;Module:&amp;quot; .. pagename .. &amp;quot;/testcases&amp;quot;) then&lt;br /&gt;
		categories:insert(&amp;quot;[[Category:Diacritic-stripping modules without a testcases subpage]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not languageObjects[1] then&lt;br /&gt;
		return categories:concat()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langs = Array(languageObjects)&lt;br /&gt;
		:sort(&lt;br /&gt;
			function(lang1, lang2)&lt;br /&gt;
				return lang1:getCode() &amp;lt; lang2:getCode()&lt;br /&gt;
			end)&lt;br /&gt;
		-- This will not error because languageObjects is not empty.&lt;br /&gt;
		:map(languageObjects[1].makeCategoryLink)&lt;br /&gt;
		:serialCommaJoin()&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;It is &amp;quot; .. (codeInPagenameInList and &amp;quot;also&amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
		&amp;quot; used to strip diacritics for &amp;quot; .. langs .. &amp;quot;.&amp;quot; .. categories:concat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by {{sortkey module documentation}}.&lt;br /&gt;
function export.sortkeyModuleLangList(frame)&lt;br /&gt;
	local pagename, subpage&lt;br /&gt;
&lt;br /&gt;
	if frame.args[1] then&lt;br /&gt;
		pagename = frame.args[1]&lt;br /&gt;
	else&lt;br /&gt;
		local title = get_current_title()&lt;br /&gt;
		subpage = title.subpageText&lt;br /&gt;
		pagename = title.text&lt;br /&gt;
&lt;br /&gt;
		if subpage ~= pagename then&lt;br /&gt;
			pagename = title.rootText&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local sortkeyModule = pagename&lt;br /&gt;
&lt;br /&gt;
	local languageObjects = require(&amp;quot;Module:languages/bySortkeyModule&amp;quot;)(sortkeyModule)&lt;br /&gt;
	local codeInPagename = pagename:match(&amp;quot;^([%l-]+)%-.*sortkey$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local categories = Array()&lt;br /&gt;
	local codeInPagenameInList = false&lt;br /&gt;
	if codeInPagename then&lt;br /&gt;
		if languageObjects[1] and subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
			local agreement = languageObjects[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
			categories:insert(&amp;quot;[[Category:Sortkey-generating modules used by &amp;quot; ..&lt;br /&gt;
				#languageObjects .. &amp;quot; language&amp;quot; .. agreement .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		languageObjects = Array(languageObjects)&lt;br /&gt;
			:filter(&lt;br /&gt;
				function(lang)&lt;br /&gt;
					local result = lang:getCode() ~= codeInPagename&lt;br /&gt;
					codeInPagenameInList = codeInPagenameInList or result&lt;br /&gt;
					return result&lt;br /&gt;
				end)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
		for script_code in pagename:gmatch(&amp;quot;%f[^-%z]%u%l%l%l%f[-]&amp;quot;) do&lt;br /&gt;
			local script = get_script(script_code)&lt;br /&gt;
			if script then&lt;br /&gt;
				categories:insert(&amp;quot;[[Category:&amp;quot; .. script:getCategoryName() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; and not title_exists(&amp;quot;Module:&amp;quot; .. pagename .. &amp;quot;/testcases&amp;quot;) then&lt;br /&gt;
		categories:insert(&amp;quot;[[Category:Sortkey-generating modules without a testcases subpage]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not languageObjects[1] then&lt;br /&gt;
		return categories:concat()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langs = Array(languageObjects)&lt;br /&gt;
		:sort(&lt;br /&gt;
			function(lang1, lang2)&lt;br /&gt;
				return lang1:getCode() &amp;lt; lang2:getCode()&lt;br /&gt;
			end)&lt;br /&gt;
		-- This will not error because languageObjects is not empty.&lt;br /&gt;
		:map(languageObjects[1].makeCategoryLink)&lt;br /&gt;
		:serialCommaJoin()&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;It is &amp;quot; .. (codeInPagenameInList and &amp;quot;also&amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
		&amp;quot; used to sort &amp;quot; .. langs .. &amp;quot;.&amp;quot; .. categories:concat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:documentation&amp;diff=491920</id>
		<title>Module:documentation</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:documentation&amp;diff=491920"/>
		<updated>2026-03-28T23:02:22Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local array_module = &amp;quot;Module:array&amp;quot;&lt;br /&gt;
local frame_module = &amp;quot;Module:frame&amp;quot;&lt;br /&gt;
local fun_is_callable_module = &amp;quot;Module:fun/isCallable&amp;quot;&lt;br /&gt;
local languages_module = &amp;quot;Module:languages&amp;quot;&lt;br /&gt;
local links_module = &amp;quot;Module:links&amp;quot;&lt;br /&gt;
local load_module = &amp;quot;Module:load&amp;quot;&lt;br /&gt;
local module_categorization_module = &amp;quot;Module:module categorization&amp;quot;&lt;br /&gt;
local number_list_show_module = &amp;quot;Module:number list/show&amp;quot;&lt;br /&gt;
local pages_module = &amp;quot;Module:pages&amp;quot;&lt;br /&gt;
local parameters_module = &amp;quot;Module:parameters&amp;quot;&lt;br /&gt;
local scripts_module = &amp;quot;Module:scripts&amp;quot;&lt;br /&gt;
local string_endswith_module = &amp;quot;Module:string/endswith&amp;quot;&lt;br /&gt;
local string_gline_module = &amp;quot;Module:string/gline&amp;quot;&lt;br /&gt;
local string_insert_module = &amp;quot;Module:string/insert&amp;quot;&lt;br /&gt;
local string_startswith_module = &amp;quot;Module:string/startswith&amp;quot;&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
local template_parser_module = &amp;quot;Module:template parser&amp;quot;&lt;br /&gt;
local title_exists_module = &amp;quot;Module:title/exists&amp;quot;&lt;br /&gt;
local title_new_title_module = &amp;quot;Module:title/newTitle&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local error = error&lt;br /&gt;
local full_url = mw.uri.fullUrl&lt;br /&gt;
local get_current_title = mw.title.getCurrentTitle&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local ipairs = ipairs&lt;br /&gt;
local list_to_text = mw.text.listToText&lt;br /&gt;
local new_message = mw.message.new&lt;br /&gt;
local pcall = pcall&lt;br /&gt;
local require = require&lt;br /&gt;
local tonumber = tonumber&lt;br /&gt;
local tostring = tostring&lt;br /&gt;
local type = type&lt;br /&gt;
local unpack = unpack or table.unpack -- Lua 5.2 compatibility&lt;br /&gt;
&lt;br /&gt;
local function Array(...)&lt;br /&gt;
	Array = require(array_module)&lt;br /&gt;
	return Array(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function categorize_module(...)&lt;br /&gt;
	categorize_module = require(module_categorization_module).categorize&lt;br /&gt;
	return categorize_module(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function endswith(...)&lt;br /&gt;
	endswith = require(string_endswith_module)&lt;br /&gt;
	return endswith(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function expand_template(...)&lt;br /&gt;
	expand_template = require(frame_module).expandTemplate&lt;br /&gt;
	return expand_template(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function find_templates(...)&lt;br /&gt;
	find_templates = require(template_parser_module).find_templates&lt;br /&gt;
	return find_templates(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function full_link(...)&lt;br /&gt;
	full_link = require(links_module).full_link&lt;br /&gt;
	return full_link(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_lang(...)&lt;br /&gt;
	get_lang = require(languages_module).getByCode&lt;br /&gt;
	return get_lang(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_pagetype(...)&lt;br /&gt;
	get_pagetype = require(pages_module).get_pagetype&lt;br /&gt;
	return get_pagetype(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_script(...)&lt;br /&gt;
	get_script = require(scripts_module).getByCode&lt;br /&gt;
	return get_script(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gline(...)&lt;br /&gt;
	gline = require(string_gline_module)&lt;br /&gt;
	return gline(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_callable(...)&lt;br /&gt;
	is_callable = require(fun_is_callable_module)&lt;br /&gt;
	return is_callable(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_documentation(...)&lt;br /&gt;
	is_documentation = require(pages_module).is_documentation&lt;br /&gt;
	return is_documentation(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_sandbox(...)&lt;br /&gt;
	is_sandbox = require(pages_module).is_sandbox&lt;br /&gt;
	return is_sandbox(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function new_title(...)&lt;br /&gt;
	new_title = require(title_new_title_module)&lt;br /&gt;
	return new_title(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function number_list_show_table(...)&lt;br /&gt;
	number_list_show_table = require(number_list_show_module).table&lt;br /&gt;
	return number_list_show_table(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function preprocess(...)&lt;br /&gt;
	preprocess = require(frame_module).preprocess&lt;br /&gt;
	return preprocess(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function process_params(...)&lt;br /&gt;
	process_params = require(parameters_module).process&lt;br /&gt;
	return process_params(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function safe_load_data(...)&lt;br /&gt;
	safe_load_data = require(load_module).safe_load_data&lt;br /&gt;
	return safe_load_data(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split(...)&lt;br /&gt;
	split = require(string_utilities_module).split&lt;br /&gt;
	return split(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function startswith(...)&lt;br /&gt;
	startswith = require(string_startswith_module)&lt;br /&gt;
	return startswith(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function string_insert(...)&lt;br /&gt;
	string_insert = require(string_insert_module)&lt;br /&gt;
	return string_insert(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function title_exists(...)&lt;br /&gt;
	title_exists = require(title_exists_module)&lt;br /&gt;
	return title_exists(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ugsub(...)&lt;br /&gt;
	ugsub = require(string_utilities_module).gsub&lt;br /&gt;
	return ugsub(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function umatch(...)&lt;br /&gt;
	umatch = require(string_utilities_module).match&lt;br /&gt;
	return umatch(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local skins = {&lt;br /&gt;
	[&amp;quot;common&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
	[&amp;quot;vector&amp;quot;] = &amp;quot;Vector&amp;quot;,&lt;br /&gt;
	[&amp;quot;monobook&amp;quot;] = &amp;quot;Monobook&amp;quot;,&lt;br /&gt;
	[&amp;quot;cologneblue&amp;quot;] = &amp;quot;Cologne Blue&amp;quot;,&lt;br /&gt;
	[&amp;quot;modern&amp;quot;] = &amp;quot;Modern&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function compare_pages(page1, page2, text)&lt;br /&gt;
	return &amp;quot;[&amp;quot; .. tostring(&lt;br /&gt;
			full_url(&amp;quot;Special:ComparePages&amp;quot;, { page1 = page1, page2 = page2 }))&lt;br /&gt;
		.. &amp;quot; &amp;quot; .. text .. &amp;quot;]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Avoid transcluding [[Module:languages/cache]] everywhere.&lt;br /&gt;
local lang_cache = setmetatable({}, {&lt;br /&gt;
	__index = function(self, k)&lt;br /&gt;
		return require(&amp;quot;Module:languages/cache&amp;quot;)[k]&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
local function zh_link(word)&lt;br /&gt;
	return full_link {&lt;br /&gt;
		lang = lang_cache.zh,&lt;br /&gt;
		term = word&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_languages_data_documentation(title, cats, division)&lt;br /&gt;
	local doc_template, module_cat&lt;br /&gt;
	if endswith(division, &amp;quot;/extra&amp;quot;) then&lt;br /&gt;
		division = division:sub(1, -7)&lt;br /&gt;
		doc_template = &amp;quot;language extradata documentation&amp;quot;&lt;br /&gt;
		module_cat = &amp;quot;Language extra data modules&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		doc_template = &amp;quot;language data documentation&amp;quot;&lt;br /&gt;
		module_cat = &amp;quot;Language data modules&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local sort_key&lt;br /&gt;
	if division == &amp;quot;exceptional&amp;quot; then&lt;br /&gt;
		sort_key = &amp;quot;x&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		sort_key = division:gsub(&amp;quot;/&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	cats:insert(module_cat .. &amp;quot;|&amp;quot; .. sort_key)&lt;br /&gt;
	return {&lt;br /&gt;
		title = doc_template&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_Unicode_data_documentation(title, cats)&lt;br /&gt;
	local subpage, first_three_of_code_point&lt;br /&gt;
	= title.fullText:match(&amp;quot;^Module:Unicode data/([^/]+)/(%x%x%x)$&amp;quot;)&lt;br /&gt;
	if subpage == &amp;quot;names&amp;quot; or subpage == &amp;quot;images&amp;quot; or subpage == &amp;quot;emoji images&amp;quot; then&lt;br /&gt;
		local low, high =&lt;br /&gt;
			tonumber(first_three_of_code_point .. &amp;quot;000&amp;quot;, 16),&lt;br /&gt;
			tonumber(first_three_of_code_point .. &amp;quot;FFF&amp;quot;, 16)&lt;br /&gt;
		local text, text_type&lt;br /&gt;
		if subpage == &amp;quot;names&amp;quot; then&lt;br /&gt;
			text_type = &amp;quot;titles of images&amp;quot;&lt;br /&gt;
		elseif subpage == &amp;quot;images&amp;quot; then&lt;br /&gt;
			text_type = &amp;quot;titles of images&amp;quot;&lt;br /&gt;
		elseif subpage == &amp;quot;emoji images&amp;quot; then&lt;br /&gt;
			text_type = &amp;quot;emoji-style images&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		text = string.format(&lt;br /&gt;
			&amp;quot;This data module contains the &amp;quot; .. text_type .. &amp;quot; of &amp;quot; ..&lt;br /&gt;
			&amp;quot;[[Appendix:Unicode|Unicode]] code points within the range U+%04X to U+%04X.&amp;quot;,&lt;br /&gt;
			low, high)&lt;br /&gt;
		if subpage == &amp;quot;images&amp;quot; and safe_load_data(&amp;quot;Module:Unicode data/emoji images/&amp;quot; .. first_three_of_code_point) then&lt;br /&gt;
			text = text ..&lt;br /&gt;
				&amp;quot; This list includes the text variants of emojis. For the list of emoji variants of those characters, see [[Module:Unicode data/emoji images/&amp;quot; ..&lt;br /&gt;
				first_three_of_code_point .. &amp;quot;]].&amp;quot;&lt;br /&gt;
		elseif subpage == &amp;quot;emoji images&amp;quot; then&lt;br /&gt;
			text = text ..&lt;br /&gt;
				&amp;quot; For text-style images, see [[Module:Unicode data/images/&amp;quot; .. first_three_of_code_point .. &amp;quot;]].&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return text&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function insert_lang_data_module_cats(cats, langcode, overall_data_module_cat)&lt;br /&gt;
	local lang = lang_cache[langcode]&lt;br /&gt;
	if lang then&lt;br /&gt;
		local langname&lt;br /&gt;
		if lang._fullCode then&lt;br /&gt;
			langname = lang_cache[lang._fullCode]:getCanonicalName()&lt;br /&gt;
		else&lt;br /&gt;
			langname = lang:getCanonicalName()&lt;br /&gt;
		end&lt;br /&gt;
		cats:insert(overall_data_module_cat .. &amp;quot;|&amp;quot; .. langname)&lt;br /&gt;
		cats:insert(langname .. &amp;quot; modules&amp;quot;)&lt;br /&gt;
		cats:insert(langname .. &amp;quot; data modules&amp;quot;)&lt;br /&gt;
		return lang, langname&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
This provides categories and documentation for various data modules, so that [[Category:Uncategorized modules]] isn&#039;t&lt;br /&gt;
unnecessarily cluttered. It is a list of tables, each of which have the following possible fields:&lt;br /&gt;
&lt;br /&gt;
`regex` (required): A Lua pattern to match the module&#039;s title. If it matches, the data in this entry will be used.&lt;br /&gt;
	Any captures in the pattern can by referenced in the `cat` field using %1 for the first capture, %2 for the&lt;br /&gt;
	second, etc. (often used for creating the sortkey for the category). In addition, the captures are passed to the&lt;br /&gt;
	`process` function as the third and subsequent parameters.&lt;br /&gt;
&lt;br /&gt;
`process` (optional): This may be a function or a string. If it is a function, it is called as follows:&lt;br /&gt;
	   `process(TITLE, CATS, CAPTURE1, CAPTURE2, ...)`&lt;br /&gt;
	where:&lt;br /&gt;
	   * TITLE is a title object describing the module&#039;s title; see&lt;br /&gt;
		 [https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Title_objects].&lt;br /&gt;
	   * CATS is an array object (see [[Module:array]]) of categories that the module will be added to.&lt;br /&gt;
	   * CAPTURE1, CAPTURE2, ... contain any captures in the `regex` field.&lt;br /&gt;
	The return value of `process` should either be a string (which will be used as the module&#039;s documentation), or a&lt;br /&gt;
	table specifying the name of a template to expand to get the documentation, along with the arguments to that&lt;br /&gt;
	template. In the latter format, the template name (bare, without the &amp;quot;Template:&amp;quot; prefix) should be in the `title`&lt;br /&gt;
	field, and any arguments should be in `args; in this case, the template name will be listed above the generated&lt;br /&gt;
	documentation as the source of the documentation, along with an edit button to edit the template&#039;s contents.&lt;br /&gt;
	If, however, the return value of the `process` function is a string, any template invocations will be expanded&lt;br /&gt;
	using frame:preprocess(), and [[Module:documentation]] will be listed as the source of the documentation.&lt;br /&gt;
&lt;br /&gt;
	If `process` itself is a string rather than a function, it should name a submodule under&lt;br /&gt;
	[[Module:documentation/functions/]] which returns a function, of the same type as described above. This submodule&lt;br /&gt;
	will be specified as the source of the documentation (unless it returns a table naming a template to expand to get&lt;br /&gt;
	the documentation, as described above).&lt;br /&gt;
&lt;br /&gt;
	If `process` is omitted entirely, the module will have no documentation.&lt;br /&gt;
&lt;br /&gt;
`cat` (optional): A string naming the category into which the module should be placed, or a list of such strings.&lt;br /&gt;
	Captures specified in `regex` may be referenced in this string using %1 for the first capture, %2 for the second,&lt;br /&gt;
	etc. It is also possible to add categories in the `process` function by inserting them into the passed-in CATS&lt;br /&gt;
	array (the second parameter).&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local module_regex = {&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(3/%l/extra)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(3/%l)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(2/extra)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(2)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(exceptional/extra)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/data/(exceptional)$&amp;quot;,&lt;br /&gt;
		process = make_languages_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:languages/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Language and script modules&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:scripts/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Language and script modules&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:data tables/data..?.?.?$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Reference module sharded data tables&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/dial%-pron/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Chinese dialectal pronunciation data modules&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh dial or syn&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/dial%-syn/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Chinese dialect synonyms data modules&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh dial or syn&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/glyph%-data/.+$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Chinese historical character forms data modules&amp;quot;,&lt;br /&gt;
		process = function(title, cats)&lt;br /&gt;
			local character = title.fullText:match(&amp;quot;^Module:zh/data/glyph%-data/(.+)&amp;quot;)&lt;br /&gt;
			if character then&lt;br /&gt;
				return (&amp;quot;This module contains data on historical forms of the Chinese character %s.&amp;quot;)&lt;br /&gt;
					:format(zh_link(character))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/ltc%-pron/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Middle Chinese pronunciation data modules|%1&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/och%-pron%-BS/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Old Chinese (Baxter-Sagart) pronunciation data modules|%1&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/och%-pron%-ZS/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Old Chinese (Zhengzhang) pronunciation data modules|%1&amp;quot;,&lt;br /&gt;
		process = &amp;quot;zh data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		-- capture rest of zh/data submodules&lt;br /&gt;
		regex = &amp;quot;^Module:zh/data/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Chinese data modules|%1&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:mul/guoxue%-data/cjk%-?(.*)$&amp;quot;,&lt;br /&gt;
		process = &amp;quot;guoxue-data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:Unicode data/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Unicode data modules|%1&amp;quot;,&lt;br /&gt;
		process = make_Unicode_data_documentation,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:number list/data/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Number data modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				return (&amp;quot;This module contains data on various types of numbers in %s.\n%s&amp;quot;)&lt;br /&gt;
					:format(lang:makeCategoryLink(), number_list_show_table() or &amp;quot;&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:accel/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats)&lt;br /&gt;
			local lang_code = title.subpageText&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				cats:insert(lang:getCanonicalName() .. &amp;quot; modules|accel&amp;quot;)&lt;br /&gt;
				cats:insert((&amp;quot;Accel submodules|%s&amp;quot;):format(lang:getCanonicalName()))&lt;br /&gt;
				return (&amp;quot;This module contains new entry creation rules for %s; see [[WT:ACCEL]] for an overview, and [[Module:accel]] for information on creating new rules.&amp;quot;)&lt;br /&gt;
					:format(lang:makeCategoryLink())&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:inc%-ash/dial/data/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Ashokan Prakrit modules|%1&amp;quot;,&lt;br /&gt;
		process = function(title, cats)&lt;br /&gt;
			local word = title.fullText:match(&amp;quot;^Module:inc%-ash/dial/data/(.+)$&amp;quot;)&lt;br /&gt;
			if word then&lt;br /&gt;
				local lang = lang_cache[&amp;quot;inc-ash&amp;quot;]&lt;br /&gt;
				return (&amp;quot;This module contains data on the pronunciation of %s in dialects of %s.&amp;quot;)&lt;br /&gt;
					:format(full_link({ term = word, lang = lang }, &amp;quot;term&amp;quot;),&lt;br /&gt;
						lang:makeCategoryLink())&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^.+%-translit$&amp;quot;,&lt;br /&gt;
		process = &amp;quot;translit&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:form of/lang%-data/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang, langname = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Language-specific form-of modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				-- FIXME, display more info.&lt;br /&gt;
				return &amp;quot;This module contains language-specific form-of data (tags, shortcuts, base lemma params. etc.) for &amp;quot; ..&lt;br /&gt;
					langname .. &amp;quot;.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:labels/data/lang/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Language-specific label data modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				return {&lt;br /&gt;
					title = &amp;quot;label language-specific data documentation&amp;quot;,&lt;br /&gt;
					args = { [1] = lang_code },&lt;br /&gt;
				}&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:category tree/lang/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang, langname = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Category tree data modules/lang&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				return &amp;quot;This module handles generating the descriptions and categorization for &amp;quot; ..&lt;br /&gt;
					langname .. &amp;quot; category pages &amp;quot;&lt;br /&gt;
					.. &amp;quot;of the format \&amp;quot;&amp;quot; .. langname .. &amp;quot; LABEL\&amp;quot; where LABEL can be any text. Examples are &amp;quot;&lt;br /&gt;
					.. &amp;quot;[[:Category:Bulgarian conjugation 2.1 verbs]] and [[:Category:Russian velar-stem neuter-form nouns]]. &amp;quot;&lt;br /&gt;
					.. &amp;quot;This module is part of the category tree system, which is a general framework for generating the &amp;quot;&lt;br /&gt;
					.. &amp;quot;descriptions and categorization of category pages.\n\n&amp;quot;&lt;br /&gt;
					.. &amp;quot;For more information, see [[Module:category tree/lang/documentation]].\n\n&amp;quot;&lt;br /&gt;
					.. &amp;quot;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; If you add a new language-specific module, you must add the language code to the &amp;quot;&lt;br /&gt;
					.. &amp;quot;list at the top of [[Module:category tree/lang]] in order for the module to be recognized.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:category tree/topic/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, submodule)&lt;br /&gt;
			cats:insert(&amp;quot;Category tree data modules/topic| &amp;quot;)&lt;br /&gt;
			return {&lt;br /&gt;
				title = &amp;quot;topic cat data submodule documentation&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:category tree/(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, submodule)&lt;br /&gt;
			cats:insert(&amp;quot;Category tree data modules| &amp;quot;)&lt;br /&gt;
			return {&lt;br /&gt;
				title = &amp;quot;category tree data submodule documentation&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:ja/data/(.+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Japanese data modules|%1&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:fi%-dialects/data/feature/Kettunen1940 ([0-9]+)$&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Finnish dialectal data atlas modules|%1&amp;quot;,&lt;br /&gt;
		process = function(title, cats, shard)&lt;br /&gt;
			return &amp;quot;This module contains shard &amp;quot; .. shard .. &amp;quot; of the online version of Lauri Kettunen&#039;s 1940 work &amp;quot; ..&lt;br /&gt;
				&amp;quot;&#039;&#039;Suomen murteet III A. Murrekartasto&#039;&#039; (\&amp;quot;Finnish dialects III A: Dialect atlas\&amp;quot;). &amp;quot; ..&lt;br /&gt;
				&amp;quot;It was imported and converted from urn:nbn:fi:csc-kata20151130145346403821, published by the &amp;quot; ..&lt;br /&gt;
				&amp;quot;&#039;&#039;Kotimaisten kielten keskus&#039;&#039; under the CC BY 4.0 license.&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:fi%-dialects/data/feature/(.+)&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Finnish dialectal data modules|%1&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:fi%-dialects/data/word/(.+)&amp;quot;,&lt;br /&gt;
		cat = &amp;quot;Finnish dialectal data modules|%1&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:Swadesh/data/([%l-]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang, langname = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Swadesh modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				return &amp;quot;This module contains the [[Swadesh list]] of basic vocabulary in &amp;quot; .. langname .. &amp;quot;.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:Swadesh/data/([%l-]+)/([^/]*)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code, variety)&lt;br /&gt;
			local lang, langname = insert_lang_data_module_cats(cats, lang_code, &amp;quot;Swadesh modules&amp;quot;)&lt;br /&gt;
			if lang then&lt;br /&gt;
				local prefix = &amp;quot;This module contains the [[Swadesh list]] of basic vocabulary in the &amp;quot;&lt;br /&gt;
				local etym_lang = get_lang(variety, nil, &amp;quot;allow etym&amp;quot;)&lt;br /&gt;
				if etym_lang then&lt;br /&gt;
					return (&amp;quot;%s %s variety of %s.&amp;quot;):format(prefix, etym_lang:getCanonicalName(), langname)&lt;br /&gt;
				end&lt;br /&gt;
				local script = get_script(variety)&lt;br /&gt;
				if script then&lt;br /&gt;
					return (&amp;quot;%s %s %s script.&amp;quot;):format(prefix, langname, script:getCanonicalName())&lt;br /&gt;
				end&lt;br /&gt;
				return (&amp;quot;%s %s variety of %s.&amp;quot;):format(prefix, variety, langname)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:typing%-aids&amp;quot;,&lt;br /&gt;
		process = function(title, cats)&lt;br /&gt;
			local data_suffix = title.fullText:match(&amp;quot;^Module:typing%-aids/data/(.+)$&amp;quot;)&lt;br /&gt;
			local sortkey&lt;br /&gt;
			if data_suffix then&lt;br /&gt;
				if data_suffix:find &amp;quot;^[%l-]+$&amp;quot; then&lt;br /&gt;
					local lang = get_lang(data_suffix)&lt;br /&gt;
					if lang then&lt;br /&gt;
						sortkey = lang:getCanonicalName()&lt;br /&gt;
						cats:insert(sortkey .. &amp;quot; data modules&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
				elseif data_suffix:find &amp;quot;^%u%l%l%l$&amp;quot; then&lt;br /&gt;
					local script = get_script(data_suffix)&lt;br /&gt;
					if script then&lt;br /&gt;
						sortkey = script:getCanonicalName()&lt;br /&gt;
						cats:insert(script:getCategoryName())&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				cats:insert(&amp;quot;Character insertion data modules|&amp;quot; .. (sortkey or data_suffix))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:R:([%l-]+):(.+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code, refname)&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				cats:insert(lang:getCanonicalName() .. &amp;quot; modules|&amp;quot; .. refname)&lt;br /&gt;
				cats:insert((&amp;quot;Reference modules|%s&amp;quot;):format(lang:getCanonicalName()))&lt;br /&gt;
				return &amp;quot;This module implements the reference template {{temp|R:&amp;quot; .. lang_code .. &amp;quot;:&amp;quot; .. refname .. &amp;quot;}}.&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:Quotations/([%l-]+)/?(.*)&amp;quot;,&lt;br /&gt;
		process = &amp;quot;Quotation&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:affix/lang%-data/([%l-]+)&amp;quot;,&lt;br /&gt;
		process = &amp;quot;affix lang-data&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:dialect synonyms/([%l-]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				local langname = lang:getCanonicalName()&lt;br /&gt;
				cats:insert(&amp;quot;Dialect synonyms data modules|&amp;quot; .. langname)&lt;br /&gt;
				cats:insert(langname .. &amp;quot; dialect synonyms data modules| &amp;quot;)&lt;br /&gt;
				return &amp;quot;This module contains data on specific varieties of &amp;quot; .. langname .. &amp;quot;, for use by &amp;quot; ..&lt;br /&gt;
					&amp;quot;{{tl|dialect synonyms}}. The actual synonyms themselves are contained in submodules.\n\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;==== Language data module structure ====\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.title&amp;lt;/code&amp;gt; — optional; table title template (e.g. \&amp;quot;Regional synonyms of %s\&amp;quot;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.columns&amp;lt;/code&amp;gt; — optional; list of column headers for location hierarchy (e.g. {\&amp;quot;Dialect group\&amp;quot;, \&amp;quot;Dialect\&amp;quot;, \&amp;quot;Location\&amp;quot;}).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.notes&amp;lt;/code&amp;gt; — optional; table of note keys to text.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.sources&amp;lt;/code&amp;gt; — optional; table of source keys to text.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.note_aliases&amp;lt;/code&amp;gt; — optional; alias map for notes.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.varieties&amp;lt;/code&amp;gt; — required; nested table of variety nodes. Each node must have &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;; array part holds children. Node keys can include &amp;lt;code&amp;gt;text_display&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;color&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wikidata&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;, and language-specific keys (e.g. &amp;lt;code&amp;gt;persian&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;armenian&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chinese&amp;lt;/code&amp;gt;).\n\n&amp;quot; ..&lt;br /&gt;
					expand_template({ title = &#039;dial syn&#039;, args = { lang_code, [&amp;quot;demo mode&amp;quot;] = &amp;quot;y&amp;quot; } })&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:dialect synonyms/([%l-]+)/([^/]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code, term)&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				local langname = lang:getCanonicalName()&lt;br /&gt;
				cats:insert(&amp;quot;Dialect synonyms data modules|&amp;quot; .. langname)&lt;br /&gt;
				cats:insert(langname .. &amp;quot; dialect synonyms data modules|&amp;quot; .. term)&lt;br /&gt;
				return (&amp;quot;%s\n\n%s&amp;quot;):format(&lt;br /&gt;
					&amp;quot;==== Term/sense module structure ====\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.title&amp;lt;/code&amp;gt; — optional; custom table title (e.g. \&amp;quot;Realization of &#039;strong R&#039; between vowels\&amp;quot;). Overrides the language default.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.meaning&amp;lt;/code&amp;gt; — optional; meaning/gloss (alternative to &amp;lt;code&amp;gt;gloss&amp;lt;/code&amp;gt;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.gloss&amp;lt;/code&amp;gt; — optional; short meaning for the table.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.note&amp;lt;/code&amp;gt; — optional; single note key or string, or list of note keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.notes&amp;lt;/code&amp;gt; — optional; list of note keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.source&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;export.sources&amp;lt;/code&amp;gt; — optional; source keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.last_column&amp;lt;/code&amp;gt; — optional; label for the data column (default \&amp;quot;Words\&amp;quot;; e.g. \&amp;quot;Realization\&amp;quot;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.syns&amp;lt;/code&amp;gt; — required; table mapping variety/location names (keys from the language data module) to a list of term entries. Each entry can be a string or a table (e.g. &amp;lt;code&amp;gt;{ ipa = \&amp;quot;[ɽ]\&amp;quot; }&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;{ term = \&amp;quot;word\&amp;quot; }&amp;lt;/code&amp;gt;).\n\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;Example (custom title and data column, IPA realizations):\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;&amp;lt;pre&amp;gt;\nlocal export = {}\n\nexport.title = \&amp;quot;Realization of &#039;strong R&#039; between vowels\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;export.meaning = \&amp;quot;\&amp;quot;\nexport.note = \&amp;quot;realization of &#039;strong R&#039; between vowels\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;export.last_column = \&amp;quot;Realization\&amp;quot;\n\nexport.syns = {\n\t[\&amp;quot;ALERS-158\&amp;quot;] = { { ipa = \&amp;quot;[ɽ]\&amp;quot; } },\n\t[\&amp;quot;ALERS-175\&amp;quot;] = { { ipa = \&amp;quot;[x]\&amp;quot; } },\n}\n\nreturn export\n&amp;lt;/pre&amp;gt;\n\n&amp;quot;,&lt;br /&gt;
					expand_template({ title = &#039;dial syn&#039;, args = { lang_code, term } }))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:dialect synonyms/([%l-]+)/([^/]+)/([^/]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code, term, id)&lt;br /&gt;
			local lang = lang_cache[lang_code]&lt;br /&gt;
			if lang then&lt;br /&gt;
				local langname = lang:getCanonicalName()&lt;br /&gt;
				cats:insert(&amp;quot;Dialect synonyms data modules|&amp;quot; .. langname)&lt;br /&gt;
				cats:insert(langname .. &amp;quot; dialect synonyms data modules|&amp;quot; .. term)&lt;br /&gt;
				return (&amp;quot;%s\n\n%s&amp;quot;):format(&lt;br /&gt;
					&amp;quot;==== Term/sense module structure ====\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.title&amp;lt;/code&amp;gt; — optional; custom table title (e.g. \&amp;quot;Realization of &#039;strong R&#039; between vowels\&amp;quot;). Overrides the language default.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.meaning&amp;lt;/code&amp;gt; — optional; meaning/gloss (alternative to &amp;lt;code&amp;gt;gloss&amp;lt;/code&amp;gt;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.gloss&amp;lt;/code&amp;gt; — optional; short meaning for the table.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.note&amp;lt;/code&amp;gt; — optional; single note key or string, or list of note keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.notes&amp;lt;/code&amp;gt; — optional; list of note keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.source&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;export.sources&amp;lt;/code&amp;gt; — optional; source keys.\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.last_column&amp;lt;/code&amp;gt; — optional; label for the data column (default \&amp;quot;Words\&amp;quot;; e.g. \&amp;quot;Realization\&amp;quot;).\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;* &amp;lt;code&amp;gt;export.syns&amp;lt;/code&amp;gt; — required; table mapping variety/location names (keys from the language data module) to a list of term entries. Each entry can be a string or a table (e.g. &amp;lt;code&amp;gt;{ ipa = \&amp;quot;[ɽ]\&amp;quot; }&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;{ term = \&amp;quot;word\&amp;quot; }&amp;lt;/code&amp;gt;).\n\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;Example (custom title and data column, IPA realizations):\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;&amp;lt;pre&amp;gt;\nlocal export = {}\n\nexport.title = \&amp;quot;Realization of &#039;strong R&#039; between vowels\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;export.meaning = \&amp;quot;\&amp;quot;\nexport.note = \&amp;quot;realization of &#039;strong R&#039; between vowels\&amp;quot;\n&amp;quot; ..&lt;br /&gt;
					&amp;quot;export.last_column = \&amp;quot;Realization\&amp;quot;\n\nexport.syns = {\n\t[\&amp;quot;ALERS-158\&amp;quot;] = { { ipa = \&amp;quot;[ɽ]\&amp;quot; } },\n\t[\&amp;quot;ALERS-175\&amp;quot;] = { { ipa = \&amp;quot;[x]\&amp;quot; } },\n}\n\nreturn export\n&amp;lt;/pre&amp;gt;\n\n&amp;quot;,&lt;br /&gt;
					expand_template({ title = &#039;dial syn&#039;, args = { lang_code, term, id = id } }))&lt;br /&gt;
			end&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		regex = &amp;quot;^Module:bibliography/data/([%l-]+)$&amp;quot;,&lt;br /&gt;
		process = function(title, cats, lang_code)&lt;br /&gt;
			if lang_code == &amp;quot;preload&amp;quot; then&lt;br /&gt;
				return &#039;Used as a base model for other languages when the button &amp;quot;create new language submodule&amp;quot; is clicked.&#039;&lt;br /&gt;
			end&lt;br /&gt;
			local page = require(title.fullText).bib_page&lt;br /&gt;
			if not page then&lt;br /&gt;
				page = lang_cache[lang_code]:getCanonicalName()&lt;br /&gt;
				if page then&lt;br /&gt;
					cats:insert(page .. &amp;quot; modules&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			cats:insert(&amp;quot;Reference modules&amp;quot;)&lt;br /&gt;
			return &amp;quot;This module holds bibliographical data for &amp;quot; ..&lt;br /&gt;
				page .. &amp;quot;. For the formatted bibliography see &#039;&#039;&#039;[[Appendix:Bibliography/&amp;quot; .. page .. &amp;quot;]]&#039;&#039;&#039;.&amp;quot;&lt;br /&gt;
		end,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function export.show(frame)&lt;br /&gt;
	local boolean_default_false = { type = &amp;quot;boolean&amp;quot;, default = false }&lt;br /&gt;
	local args = process_params(frame.args, {&lt;br /&gt;
		[&amp;quot;hr&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;for&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;from&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;allowondoc&amp;quot;] = boolean_default_false, -- Don&#039;t throw an error if used on a documentation subpage.&lt;br /&gt;
		[&amp;quot;notsubpage&amp;quot;] = boolean_default_false,&lt;br /&gt;
		[&amp;quot;nodoc&amp;quot;] = boolean_default_false,&lt;br /&gt;
		[&amp;quot;nolinks&amp;quot;] = boolean_default_false, -- suppress all &amp;quot;Useful links&amp;quot;&lt;br /&gt;
		[&amp;quot;nosandbox&amp;quot;] = boolean_default_false, -- supress sandbox&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	local output = Array(&#039;\n&amp;lt;div class=&amp;quot;documentation&amp;quot; style=&amp;quot;display:block; clear:both&amp;quot;&amp;gt;\n&#039;)&lt;br /&gt;
	local cats = Array()&lt;br /&gt;
&lt;br /&gt;
	local nodoc = args.nodoc&lt;br /&gt;
&lt;br /&gt;
	if (not args.hr) or (args.hr == &amp;quot;above&amp;quot;) then&lt;br /&gt;
		output:insert(&amp;quot;----\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local title = args[&amp;quot;for&amp;quot;] and new_title(args[&amp;quot;for&amp;quot;]) or get_current_title()&lt;br /&gt;
	local doc_title = args.from ~= &amp;quot;-&amp;quot; and new_title(args.from or title.fullText .. &#039;/documentation&#039;) or nil&lt;br /&gt;
	local contentModel = title.contentModel&lt;br /&gt;
	local pagetype, is_script_or_stylesheet = get_pagetype(title)&lt;br /&gt;
	local preload, fallback_docs, doc_content, old_doc_title, user_name, skin_name, needs_doc&lt;br /&gt;
	local doc_content_source = &amp;quot;Module:documentation&amp;quot;&lt;br /&gt;
	local auto_generated_cat_source&lt;br /&gt;
	local cats_auto_generated = false&lt;br /&gt;
&lt;br /&gt;
	if not args.allowondoc and is_documentation(title) then&lt;br /&gt;
		-- TODO: merge with {{documentation subpage}}, and choose behaviour based on the page type.&lt;br /&gt;
		error(&amp;quot;This template should not be used on a documentation page. Please use [[Template:documentation subpage]].&amp;quot;)&lt;br /&gt;
	elseif is_sandbox(title) then&lt;br /&gt;
		local sandbox_ns = title.nsText&lt;br /&gt;
		preload = (&amp;quot;Template:documentation/preload%s%sSandbox&amp;quot;):format(&lt;br /&gt;
			sandbox_ns == &amp;quot;Module&amp;quot; and sandbox_ns or &amp;quot;Template&amp;quot;,&lt;br /&gt;
			title.rootText:match(&amp;quot;^[Uu]ser:(.+)&amp;quot;) and &amp;quot;User&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
		)&lt;br /&gt;
	elseif pagetype:match(&amp;quot;%f[%w]gadget%f[%W]&amp;quot;) then&lt;br /&gt;
		preload = &amp;quot;Template:documentation/preloadGadget&amp;quot;&lt;br /&gt;
	elseif pagetype:match(&amp;quot;%f[%w]script%f[%W]&amp;quot;) then -- .js&lt;br /&gt;
		if title.nsText == &amp;quot;MediaWiki&amp;quot; then&lt;br /&gt;
			preload = &amp;quot;Template:documentation/preloadMediaWikiJavaScript&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			preload = &amp;quot;Template:documentation/preloadTemplate&amp;quot; -- XXX&lt;br /&gt;
			if title.nsText == &amp;quot;User&amp;quot; then&lt;br /&gt;
				user_name = title.rootText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		is_script_or_stylesheet = true&lt;br /&gt;
	elseif pagetype:match(&amp;quot;%f[%w]stylesheet%f[%W]&amp;quot;) then -- .css&lt;br /&gt;
		preload = &amp;quot;Template:documentation/preloadTemplate&amp;quot; -- XXX&lt;br /&gt;
		if title.nsText == &amp;quot;User&amp;quot; then&lt;br /&gt;
			user_name = title.rootText&lt;br /&gt;
		end&lt;br /&gt;
		is_script_or_stylesheet = true&lt;br /&gt;
	elseif contentModel == &amp;quot;Scribunto&amp;quot; then -- Exclude pages in Module: which aren&#039;t Scribunto.&lt;br /&gt;
		preload = &amp;quot;Template:documentation/preloadModule&amp;quot;&lt;br /&gt;
	elseif pagetype:match(&amp;quot;%f[%w]template%f[%W]&amp;quot;) or pagetype:match(&amp;quot;%f[%w]project%f[%W]&amp;quot;) then&lt;br /&gt;
		preload = &amp;quot;Template:documentation/preloadTemplate&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if doc_title and doc_title.isRedirect then&lt;br /&gt;
		old_doc_title = doc_title&lt;br /&gt;
		doc_title = doc_title.redirectTarget&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output:insert(&amp;quot;&amp;lt;dl class=\&amp;quot;plainlinks\&amp;quot; style=\&amp;quot;font-size: smaller;\&amp;quot;&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local function get_module_doc_and_cats(categories_only)&lt;br /&gt;
		cats_auto_generated = true&lt;br /&gt;
		local automatic_cats = nil&lt;br /&gt;
		if user_name then&lt;br /&gt;
			fallback_docs = &amp;quot;documentation/fallback/user module&amp;quot;&lt;br /&gt;
			automatic_cats = { &amp;quot;User sandbox modules&amp;quot; }&lt;br /&gt;
		else&lt;br /&gt;
			for _, data in ipairs(module_regex) do&lt;br /&gt;
				local captures = { umatch(title.fullText, data.regex) }&lt;br /&gt;
				if #captures &amp;gt; 0 then&lt;br /&gt;
					local cat, process_function&lt;br /&gt;
					if is_callable(data.process) then&lt;br /&gt;
						process_function = data.process&lt;br /&gt;
					elseif type(data.process) == &amp;quot;string&amp;quot; then&lt;br /&gt;
						doc_content_source = &amp;quot;Module:documentation/functions/&amp;quot; .. data.process&lt;br /&gt;
						process_function = require(doc_content_source)&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					if process_function then&lt;br /&gt;
						doc_content = process_function(title, cats, unpack(captures))&lt;br /&gt;
					end&lt;br /&gt;
					if type(doc_content) == &amp;quot;table&amp;quot; then&lt;br /&gt;
						doc_content_source = doc_content.title and &amp;quot;Template:&amp;quot; .. doc_content.title or doc_content_source&lt;br /&gt;
						doc_content = expand_template(doc_content)&lt;br /&gt;
					elseif doc_content ~= nil then&lt;br /&gt;
						doc_content = preprocess(doc_content)&lt;br /&gt;
					end&lt;br /&gt;
					cat = data.cat&lt;br /&gt;
&lt;br /&gt;
					if cat then&lt;br /&gt;
						if type(cat) == &amp;quot;string&amp;quot; then&lt;br /&gt;
							cat = { cat }&lt;br /&gt;
						end&lt;br /&gt;
						for _, c in ipairs(cat) do&lt;br /&gt;
							insert(cats, (ugsub(title.fullText, data.regex, c)))&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if title.subpageText == &amp;quot;templates&amp;quot; then&lt;br /&gt;
			cats:insert(&amp;quot;Template interface modules&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if automatic_cats then&lt;br /&gt;
			for _, c in ipairs(automatic_cats) do&lt;br /&gt;
				cats:insert(c)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #cats == 0 then&lt;br /&gt;
			local auto_cats = categorize_module(frame, &amp;quot;return raw&amp;quot;, &amp;quot;noerror&amp;quot;)&lt;br /&gt;
			if #auto_cats &amp;gt; 0 then&lt;br /&gt;
				auto_generated_cat_source = &amp;quot;Module:module categorization&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			for _, category in ipairs(auto_cats) do&lt;br /&gt;
				cats:insert(category)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- meaning module is not in user’s sandbox or one of many datamodule boring series&lt;br /&gt;
		needs_doc = not categories_only and not (automatic_cats or doc_content or fallback_docs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Override automatic documentation, if present.&lt;br /&gt;
	if doc_title and doc_title.exists then&lt;br /&gt;
		local cats_auto_generated_text = &amp;quot;&amp;quot;&lt;br /&gt;
		if contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			local doc_page_content = doc_title.content&lt;br /&gt;
			-- Track then do nothing if there are uses of includeonly. The&lt;br /&gt;
			-- pattern is slightly too permissive, but any false-positives are&lt;br /&gt;
			-- obvious typos that should be corrected.&lt;br /&gt;
			if doc_page_content:lower():match(&amp;quot;&amp;lt;/?includeonly%f[%s/&amp;gt;][^&amp;gt;]*&amp;gt;&amp;quot;) then&lt;br /&gt;
			else&lt;br /&gt;
				-- Check for uses of {{module cat}}. find_templates treats the&lt;br /&gt;
				-- input as transcluded by default (i.e. it parses the wikitext&lt;br /&gt;
				-- which will be transcluded through to the module page).&lt;br /&gt;
				local module_cat&lt;br /&gt;
				for template in find_templates(doc_page_content) do&lt;br /&gt;
					if template:get_name() == &amp;quot;module cat&amp;quot; then&lt;br /&gt;
						module_cat = true&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not module_cat then&lt;br /&gt;
					get_module_doc_and_cats(&amp;quot;categories only&amp;quot;)&lt;br /&gt;
					auto_generated_cat_source = auto_generated_cat_source or doc_content_source&lt;br /&gt;
					cats_auto_generated_text = &amp;quot; Categories were auto-generated by [[&amp;quot; ..&lt;br /&gt;
						auto_generated_cat_source .. &amp;quot;]]. &amp;lt;sup&amp;gt;[[&amp;quot; ..&lt;br /&gt;
						new_title(auto_generated_cat_source):fullUrl { action = &amp;quot;edit&amp;quot; } .. &amp;quot; edit]]&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		output:insert(&lt;br /&gt;
			&amp;quot;&amp;lt;dd&amp;gt;&amp;lt;i style=\&amp;quot;font-size: larger;\&amp;quot;&amp;gt;The following &amp;quot; ..&lt;br /&gt;
			&amp;quot;[[wikt:Help:Documenting templates and modules|documentation]] is located at [[&amp;quot; ..&lt;br /&gt;
			doc_title.fullText .. &amp;quot;]]. &amp;quot; .. &amp;quot;&amp;lt;sup&amp;gt;[[&amp;quot; .. doc_title:fullUrl { action = &amp;quot;edit&amp;quot; } .. &amp;quot; edit]]&amp;lt;/sup&amp;gt;&amp;quot; ..&lt;br /&gt;
			cats_auto_generated_text .. &amp;quot;&amp;lt;/i&amp;gt;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		if contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			get_module_doc_and_cats(false)&lt;br /&gt;
		elseif title.nsText == &amp;quot;Template&amp;quot; then&lt;br /&gt;
			--cats:insert(&amp;quot;Uncategorized templates&amp;quot;)&lt;br /&gt;
			needs_doc = not (fallback_docs or nodoc)&lt;br /&gt;
		elseif user_name and is_script_or_stylesheet then&lt;br /&gt;
			skin_name = skins[title.text:sub(#title.rootText + 1):match(&amp;quot;^/(%l+)%.[jc]ss?$&amp;quot;)]&lt;br /&gt;
			if skin_name then&lt;br /&gt;
				fallback_docs = &amp;quot;documentation/fallback/user &amp;quot; .. contentModel&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if doc_content then&lt;br /&gt;
			output:insert(&lt;br /&gt;
				&amp;quot;&amp;lt;dd&amp;gt;&amp;lt;i style=\&amp;quot;font-size: larger;\&amp;quot;&amp;gt;The following &amp;quot; ..&lt;br /&gt;
				&amp;quot;[[wikt:Help:Documenting templates and modules|documentation]] is &amp;quot; ..&lt;br /&gt;
				&amp;quot;generated by [[&amp;quot; .. doc_content_source .. &amp;quot;]]. &amp;lt;sup&amp;gt;[[&amp;quot; ..&lt;br /&gt;
				new_title(doc_content_source):fullUrl { action = &amp;quot;edit&amp;quot; } ..&lt;br /&gt;
				&amp;quot; edit]]&amp;lt;/sup&amp;gt; &amp;lt;/i&amp;gt;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
		elseif not nodoc then&lt;br /&gt;
			if doc_title then&lt;br /&gt;
				output:insert(&lt;br /&gt;
					&amp;quot;&amp;lt;dd&amp;gt;&amp;lt;i style=\&amp;quot;font-size: larger;\&amp;quot;&amp;gt;This &amp;quot; .. pagetype ..&lt;br /&gt;
					&amp;quot; lacks a [[wikt:Help:Documenting templates and modules|documentation subpage]]. &amp;quot; ..&lt;br /&gt;
					(fallback_docs and &amp;quot;You may &amp;quot; or &amp;quot;Please &amp;quot;) ..&lt;br /&gt;
					&amp;quot;[&amp;quot; .. doc_title:fullUrl { action = &amp;quot;edit&amp;quot;, preload = preload }&lt;br /&gt;
					.. &amp;quot; create it].&amp;lt;/i&amp;gt;&amp;lt;/dd&amp;gt;\n&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				output:insert(&lt;br /&gt;
					&amp;quot;&amp;lt;dd&amp;gt;&amp;lt;i style=\&amp;quot;font-size: larger; color: var(--wikt-palette-red-9,#FF0000);\&amp;quot;&amp;gt;Unable to auto-generate &amp;quot; ..&lt;br /&gt;
					&amp;quot;documentation for this &amp;quot; .. pagetype .. &amp;quot;.&amp;lt;/i&amp;gt;&amp;lt;/dd&amp;gt;\n&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if startswith(title.fullText, &amp;quot;MediaWiki:Gadget-&amp;quot;) then&lt;br /&gt;
		local is_gadget = false&lt;br /&gt;
		for line in gline(new_title(&amp;quot;MediaWiki:Gadgets-definition&amp;quot;).content) do&lt;br /&gt;
			local gadget, items = line:match(&amp;quot;^%*%s*(%a[%w_-]*)%[.-%]|(.+)$&amp;quot;)&lt;br /&gt;
			if not gadget then&lt;br /&gt;
				gadget, items = line:match(&amp;quot;^%*%s*(%a[%w_-]*)|(.+)$&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			if gadget then&lt;br /&gt;
				items = Array(split(items, &amp;quot;|&amp;quot;))&lt;br /&gt;
				for i, item in ipairs(items) do&lt;br /&gt;
					if title.fullText == (&amp;quot;MediaWiki:Gadget-&amp;quot; .. item) then&lt;br /&gt;
						is_gadget = true&lt;br /&gt;
&lt;br /&gt;
						output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;This script is a part of the &amp;lt;code&amp;gt;&amp;quot;)&lt;br /&gt;
						output:insert(gadget)&lt;br /&gt;
						output:insert(&amp;quot;&amp;lt;/code&amp;gt; gadget ([&amp;quot;)&lt;br /&gt;
						output:insert(tostring(full_url(&amp;quot;MediaWiki:Gadgets-definition&amp;quot;, { action = &amp;quot;edit&amp;quot; })))&lt;br /&gt;
						output:insert(&amp;quot; edit definitions])&#039;&#039; &amp;lt;dl&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
						output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;Description ([&amp;quot;)&lt;br /&gt;
						output:insert(tostring(full_url(&amp;quot;MediaWiki:Gadget-&amp;quot; .. gadget, { action = &amp;quot;edit&amp;quot; })))&lt;br /&gt;
						output:insert(&amp;quot; edit])&#039;&#039;: &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
						output:insert(preprocess(new_message(&#039;Gadget-&#039; .. gadget):plain()))&lt;br /&gt;
						output:insert(&amp;quot; &amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
						items:remove(i)&lt;br /&gt;
						if #items &amp;gt; 0 then&lt;br /&gt;
							for j, item in ipairs(items) do&lt;br /&gt;
								items[j] = &#039;[[MediaWiki:Gadget-&#039; .. item .. &#039;|&#039; .. item .. &#039;]]&#039;&lt;br /&gt;
							end&lt;br /&gt;
							output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;Other parts&#039;&#039;: &amp;quot;)&lt;br /&gt;
							output:insert(list_to_text(items))&lt;br /&gt;
							output:insert(&amp;quot;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
						end&lt;br /&gt;
&lt;br /&gt;
						output:insert(&amp;quot;&amp;lt;/dl&amp;gt;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if not is_gadget then&lt;br /&gt;
			output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;This script is not a part of any [&amp;quot;)&lt;br /&gt;
			output:insert(tostring(full_url(&amp;quot;Special:Gadgets&amp;quot;, { uselang = &amp;quot;en&amp;quot; })))&lt;br /&gt;
			output:insert(&#039; gadget] ([&#039;)&lt;br /&gt;
			output:insert(tostring(full_url(&amp;quot;MediaWiki:Gadgets-definition&amp;quot;, { action = &amp;quot;edit&amp;quot; })))&lt;br /&gt;
			output:insert(&#039; edit definitions]).&amp;lt;/dd&amp;gt;&#039;)&lt;br /&gt;
			-- else&lt;br /&gt;
			-- cats:insert(&amp;quot;Wiktionary gadgets&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if old_doc_title then&lt;br /&gt;
		output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;Redirected from&#039;&#039; [&amp;quot;)&lt;br /&gt;
		output:insert(old_doc_title:fullUrl { redirect = &amp;quot;no&amp;quot; })&lt;br /&gt;
		output:insert(&amp;quot; &amp;quot;)&lt;br /&gt;
		output:insert(old_doc_title.fullText)&lt;br /&gt;
		output:insert(&amp;quot;] ([&amp;quot;)&lt;br /&gt;
		output:insert(old_doc_title:fullUrl { action = &amp;quot;edit&amp;quot; })&lt;br /&gt;
		output:insert(&amp;quot; edit]).&amp;lt;/dd&amp;gt;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args.nolinks then&lt;br /&gt;
		local links = Array()&lt;br /&gt;
&lt;br /&gt;
		if title.isSubpage and not args.notsubpage then&lt;br /&gt;
			links:insert(&amp;quot;[[:&amp;quot; .. title.nsText .. &amp;quot;:&amp;quot; .. title.rootText .. &amp;quot;|root page]]&amp;quot;)&lt;br /&gt;
			links:insert(&amp;quot;[[Special:PrefixIndex/&amp;quot; .. title.nsText .. &amp;quot;:&amp;quot; .. title.rootText .. &amp;quot;/|root page’s subpages]]&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			links:insert(&amp;quot;[[Special:PrefixIndex/&amp;quot; .. title.fullText .. &amp;quot;/|subpage list]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		links:insert(&lt;br /&gt;
			&amp;quot;[&amp;quot; ..&lt;br /&gt;
			tostring(full_url(&amp;quot;Special:WhatLinksHere/&amp;quot; .. title.fullText, { hidetrans = true, hideredirs = true })) ..&lt;br /&gt;
			&amp;quot; links]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if contentModel ~= &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			links:insert(&lt;br /&gt;
				&amp;quot;[&amp;quot; ..&lt;br /&gt;
				tostring(full_url(&amp;quot;Special:WhatLinksHere/&amp;quot; .. title.fullText, { hidelinks = true, hidetrans = true })) ..&lt;br /&gt;
				&amp;quot; redirects]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if is_script_or_stylesheet then&lt;br /&gt;
			if user_name then&lt;br /&gt;
				links:insert(&amp;quot;[[Special:MyPage&amp;quot; .. title.text:sub(#title.rootText + 1) .. &amp;quot;|your own]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			links:insert(&lt;br /&gt;
				&amp;quot;[&amp;quot; ..&lt;br /&gt;
				tostring(full_url(&amp;quot;Special:WhatLinksHere/&amp;quot; .. title.fullText, { hidelinks = true, hideredirs = true })) ..&lt;br /&gt;
				&amp;quot; transclusions]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			local is_testcases = title.isSubpage and title.subpageText == &amp;quot;testcases&amp;quot;&lt;br /&gt;
			local without_subpage = title.nsText .. &amp;quot;:&amp;quot; .. title.baseText&lt;br /&gt;
			if is_testcases then&lt;br /&gt;
				links:insert(&amp;quot;[[:&amp;quot; .. without_subpage .. &amp;quot;|tested module]]&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				links:insert(&amp;quot;[[&amp;quot; .. title.fullText .. &amp;quot;/testcases|testcases]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if user_name then&lt;br /&gt;
				links:insert(&amp;quot;[[User:&amp;quot; .. user_name .. &amp;quot;|user page]]&amp;quot;)&lt;br /&gt;
				links:insert(&amp;quot;[[User talk:&amp;quot; .. user_name .. &amp;quot;|user talk page]]&amp;quot;)&lt;br /&gt;
				links:insert(&amp;quot;[[Special:PrefixIndex/User:&amp;quot; .. user_name .. &amp;quot;/|userspace]]&amp;quot;)&lt;br /&gt;
				-- If sandbox module, add a link to the module that this is a sandbox of.&lt;br /&gt;
				-- Exclude user sandbox modules like [[User:Dine2016/sandbox]].&lt;br /&gt;
			elseif title.text:find(&amp;quot;^sandbox%d*/&amp;quot;) or title.text:find(&amp;quot;/sandbox%d*%f[/%z]&amp;quot;) then&lt;br /&gt;
				cats:insert(&amp;quot;Sandbox modules&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
				-- Sandbox modules don’t really need documentation.&lt;br /&gt;
				needs_doc = false&lt;br /&gt;
&lt;br /&gt;
				-- Don&#039;t track user sandbox modules.&lt;br /&gt;
				local text_title = new_title(title.text)&lt;br /&gt;
				if not (text_title and text_title.nsText == &amp;quot;User&amp;quot;) then&lt;br /&gt;
					local diff&lt;br /&gt;
					local sandbox_of = title.text:match(&amp;quot;^(.*)/sandbox%d*%f[/%z]&amp;quot;)&lt;br /&gt;
					if sandbox_of then&lt;br /&gt;
					else&lt;br /&gt;
						sandbox_of = title.text:match(&amp;quot;^sandbox%d*/(.*)$&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
					if not sandbox_of then&lt;br /&gt;
						error((&amp;quot;Internal error: Something wrong, couldn&#039;t extract sandbox-of module from title &#039;%s&#039;&amp;quot;)&lt;br /&gt;
							:format(title.text))&lt;br /&gt;
					end&lt;br /&gt;
					sandbox_of = title.nsText .. &amp;quot;:&amp;quot; .. sandbox_of&lt;br /&gt;
					if title_exists(sandbox_of) then&lt;br /&gt;
						diff = &amp;quot; (&amp;quot; .. compare_pages(title.fullText, sandbox_of, &amp;quot;diff&amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					links:insert(&amp;quot;[[:&amp;quot; .. sandbox_of .. &amp;quot;|sandbox of]]&amp;quot; .. (diff or &amp;quot;&amp;quot;))&lt;br /&gt;
				end&lt;br /&gt;
				-- If not a sandbox module, add link to sandbox module.&lt;br /&gt;
				-- Sometimes there are multiple sandboxes for a single module:&lt;br /&gt;
				-- [[Module:sandbox/sa-pronunc]],  [[Module:sandbox2/sa-pronunc]].&lt;br /&gt;
			else&lt;br /&gt;
				local sandbox_title&lt;br /&gt;
				local user_prefix, user_rest = title.text:match(&amp;quot;^(User:.-/)(.*)$&amp;quot;)&lt;br /&gt;
				if not user_prefix then&lt;br /&gt;
					user_prefix = &amp;quot;&amp;quot;&lt;br /&gt;
					user_rest = title.text&lt;br /&gt;
				end&lt;br /&gt;
				sandbox_title = title.nsText .. &amp;quot;:&amp;quot; .. user_prefix .. &amp;quot;sandbox/&amp;quot; .. user_rest&lt;br /&gt;
				local sandbox_link = &amp;quot;[[:&amp;quot; .. sandbox_title .. &amp;quot;|sandbox]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
				local diff&lt;br /&gt;
				if title_exists(sandbox_title) then&lt;br /&gt;
					diff = &amp;quot; (&amp;quot; .. compare_pages(title.fullText, sandbox_title, &amp;quot;diff&amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				links:insert(sandbox_link .. (diff or &amp;quot;&amp;quot;))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if title.nsText == &amp;quot;Template&amp;quot; then&lt;br /&gt;
			-- Error search: all(any namespace), hastemplate (show pages using the template), insource (show source code), incategory (any/specific error) -- [[mw:Help:CirrusSearch]], [[w:Help:Searching/Regex]]&lt;br /&gt;
			-- apparently same with/without: &amp;amp;profile=advanced&amp;amp;fulltext=1&lt;br /&gt;
			local errorq = &#039;searchengineselect=mediawiki&amp;amp;search=all: hastemplate:\&amp;quot;&#039; ..&lt;br /&gt;
				title.rootText .. &#039;\&amp;quot; insource:\&amp;quot;&#039; .. title.rootText .. &#039;\&amp;quot; incategory:&#039;&lt;br /&gt;
			local eincategory =&lt;br /&gt;
			&amp;quot;Pages_with_module_errors|ParserFunction_errors|DisplayTitle_errors|Pages_with_ISBN_errors|Pages_with_ISSN_errors|Pages_with_reference_errors|Pages_with_syntax_highlighting_errors|Pages_with_TemplateStyles_errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			links:insert(&lt;br /&gt;
				&#039;[&#039; .. tostring(full_url(&#039;Special:Search&#039;, errorq .. eincategory)) .. &#039; errors]&#039;&lt;br /&gt;
				.. &#039; (&#039; ..&lt;br /&gt;
				&#039;[&#039; .. tostring(full_url(&#039;Special:Search&#039;, errorq .. &#039;ParserFunction_errors&#039;)) .. &#039; parser]&#039;&lt;br /&gt;
				.. &#039;/&#039; ..&lt;br /&gt;
				&#039;[&#039; .. tostring(full_url(&#039;Special:Search&#039;, errorq .. &#039;Pages_with_module_errors&#039;)) .. &#039; module]&#039;&lt;br /&gt;
				.. &#039;)&#039;&lt;br /&gt;
			)&lt;br /&gt;
&lt;br /&gt;
			if title.isSubpage and title.text:find(&amp;quot;/sandbox%d*%f[/%z]&amp;quot;) then -- This is a sandbox template.&lt;br /&gt;
				-- At the moment there are no user sandbox templates with subpage&lt;br /&gt;
				-- “/sandbox”.&lt;br /&gt;
				cats:insert(&amp;quot;Sandbox templates&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
				-- Sandbox templates don’t really need documentation.&lt;br /&gt;
				needs_doc = false&lt;br /&gt;
&lt;br /&gt;
				-- Will behave badly if “/sandbox” occurs twice in title!&lt;br /&gt;
				local sandbox_of = title.fullText:gsub(&amp;quot;/sandbox%d*%f[/%z]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
				local diff&lt;br /&gt;
				if title_exists(sandbox_of) then&lt;br /&gt;
					diff = &amp;quot; (&amp;quot; .. compare_pages(title.fullText, sandbox_of, &amp;quot;diff&amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				links:insert(&amp;quot;[[:&amp;quot; .. sandbox_of .. &amp;quot;|sandbox of]]&amp;quot; .. (diff or &amp;quot;&amp;quot;))&lt;br /&gt;
				-- This is a template that can have a sandbox.&lt;br /&gt;
			elseif not args.nosandbox then -- unless we tell it not to&lt;br /&gt;
				local sandbox_title = title.fullText .. &amp;quot;/sandbox&amp;quot;&lt;br /&gt;
&lt;br /&gt;
				local diff&lt;br /&gt;
				if title_exists(sandbox_title) then&lt;br /&gt;
					diff = &amp;quot; (&amp;quot; .. compare_pages(title.fullText, sandbox_title, &amp;quot;diff&amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				links:insert(&amp;quot;[[:&amp;quot; .. sandbox_title .. &amp;quot;|sandbox]]&amp;quot; .. (diff or &amp;quot;&amp;quot;))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #links &amp;gt; 0 then&lt;br /&gt;
			output:insert(&amp;quot;&amp;lt;dd&amp;gt; &#039;&#039;Useful links&#039;&#039;: &amp;quot; .. links:concat(&amp;quot; • &amp;quot;) .. &amp;quot;&amp;lt;/dd&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output:insert(&amp;quot;&amp;lt;/dl&amp;gt;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Show error from [[Module:category tree/topic cat/data]] on its submodules&#039;&lt;br /&gt;
	-- documentation to, for instance, warn about duplicate labels.&lt;br /&gt;
	if startswith(title.fullText, &amp;quot;Module:category tree/topic/&amp;quot;) then&lt;br /&gt;
		local ok, err = pcall(require, &amp;quot;Module:category tree/topic/data&amp;quot;)&lt;br /&gt;
		if not ok then&lt;br /&gt;
			output:insert(&#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&#039; .. err .. &#039;&amp;lt;/span&amp;gt;\n\n&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if doc_title and doc_title.exists then&lt;br /&gt;
		-- Override automatic documentation, if present.&lt;br /&gt;
		doc_content = expand_template { title = doc_title.fullText }&lt;br /&gt;
	elseif not doc_content and fallback_docs then&lt;br /&gt;
		doc_content = expand_template {&lt;br /&gt;
			title = fallback_docs,&lt;br /&gt;
			args = {&lt;br /&gt;
				[&#039;user&#039;] = user_name,&lt;br /&gt;
				[&#039;page&#039;] = title.fullText,&lt;br /&gt;
				[&#039;skin name&#039;] = skin_name,&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if doc_content then&lt;br /&gt;
		output:insert(doc_content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output:insert((&#039;\n&amp;lt;%s style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&#039;):format(args.hr == &amp;quot;below&amp;quot; and &amp;quot;hr&amp;quot; or &amp;quot;br&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
	if cats_auto_generated and not cats[1] and (not doc_content or not doc_content:find(&amp;quot;%[%[Category:&amp;quot;)) then&lt;br /&gt;
		if contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			cats:insert(&amp;quot;Uncategorized modules&amp;quot;)&lt;br /&gt;
			-- elseif title.nsText == &amp;quot;Template&amp;quot; then&lt;br /&gt;
			-- cats:insert(&amp;quot;Uncategorized templates&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if needs_doc then&lt;br /&gt;
		cats:insert(&amp;quot;Templates and modules needing documentation&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(cats) do&lt;br /&gt;
		output:insert(&amp;quot;[[Category:&amp;quot; .. cat .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	output:insert(&amp;quot;&amp;lt;/div&amp;gt;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	return output:concat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.module_auto_doc_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(&#039;{|class=&amp;quot;wikitable&amp;quot;&#039;)&lt;br /&gt;
	ins(&amp;quot;! Regex !! Category !! Handling modules&amp;quot;)&lt;br /&gt;
	for _, spec in ipairs(module_regex) do&lt;br /&gt;
		local cat_text&lt;br /&gt;
		local cats = spec.cat&lt;br /&gt;
		if cats then&lt;br /&gt;
			local cat_parts = {}&lt;br /&gt;
			if type(cats) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				cats = { cats }&lt;br /&gt;
			end&lt;br /&gt;
			for _, cat in ipairs(cats) do&lt;br /&gt;
				insert(cat_parts, (&amp;quot;&amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;):format((cat:gsub(&amp;quot;|&amp;quot;, &amp;quot;&amp;amp;#124;&amp;quot;))))&lt;br /&gt;
			end&lt;br /&gt;
			cat_text = concat(cat_parts, &amp;quot;, &amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			cat_text = &amp;quot;&#039;&#039;(unspecified)&#039;&#039;&amp;quot;&lt;br /&gt;
		end&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; || %s || %s&amp;quot;):format(spec.regex, cat_text,&lt;br /&gt;
			is_callable(spec.process) and &amp;quot;&#039;&#039;(handled internally)&#039;&#039;&amp;quot; or&lt;br /&gt;
			type(spec.process) == &amp;quot;string&amp;quot; and (&amp;quot;[[Module:documentation/functions/%s]]&amp;quot;):format(spec.process) or&lt;br /&gt;
			&amp;quot;&#039;&#039;(no documentation generator)&#039;&#039;&amp;quot;))&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;
-- Used by {{translit module documentation}}.&lt;br /&gt;
function export.translitModuleLangList(frame)&lt;br /&gt;
	local pagename, subpage&lt;br /&gt;
&lt;br /&gt;
	if frame.args[1] then&lt;br /&gt;
		pagename = frame.args[1]&lt;br /&gt;
	else&lt;br /&gt;
		local title = get_current_title()&lt;br /&gt;
		subpage = title.subpageText&lt;br /&gt;
		pagename = title.text&lt;br /&gt;
&lt;br /&gt;
		if subpage ~= pagename then&lt;br /&gt;
			pagename = title.rootText&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local translitModule = pagename&lt;br /&gt;
&lt;br /&gt;
	local languageObjects = require(&amp;quot;Module:languages/byTranslitModule&amp;quot;)(translitModule)&lt;br /&gt;
	local codeInPagename = pagename:match(&amp;quot;^([%l-]+)%-.*translit$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local categories = Array()&lt;br /&gt;
	local codeInPagenameInList = false&lt;br /&gt;
	if codeInPagename then&lt;br /&gt;
		if languageObjects[1] and subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
			local agreement = languageObjects[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
			categories:insert(&amp;quot;[[Category:Transliteration modules used by &amp;quot; ..&lt;br /&gt;
				#languageObjects .. &amp;quot; language&amp;quot; .. agreement .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		languageObjects = Array(languageObjects)&lt;br /&gt;
			:filter(&lt;br /&gt;
				function(lang)&lt;br /&gt;
					local result = lang:getCode() ~= codeInPagename&lt;br /&gt;
					codeInPagenameInList = codeInPagenameInList or result&lt;br /&gt;
					return result&lt;br /&gt;
				end)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
		for script_code in pagename:gmatch(&amp;quot;%f[^-%z]%u%l%l%l%f[-]&amp;quot;) do&lt;br /&gt;
			local script = get_script(script_code)&lt;br /&gt;
			if script then&lt;br /&gt;
				categories:insert(&amp;quot;[[Category:&amp;quot; .. script:getCategoryName() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; and not title_exists(&amp;quot;Module:&amp;quot; .. pagename .. &amp;quot;/testcases&amp;quot;) then&lt;br /&gt;
		categories:insert(&amp;quot;[[Category:Transliteration modules without a testcases subpage]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not languageObjects[1] then&lt;br /&gt;
		return categories:concat()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langs = Array(languageObjects)&lt;br /&gt;
		:sort(&lt;br /&gt;
			function(lang1, lang2)&lt;br /&gt;
				return lang1:getCode() &amp;lt; lang2:getCode()&lt;br /&gt;
			end)&lt;br /&gt;
		-- This will not error because languageObjects is not empty.&lt;br /&gt;
		:map(languageObjects[1].makeCategoryLink)&lt;br /&gt;
		:serialCommaJoin()&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;It is &amp;quot; .. (codeInPagenameInList and &amp;quot;also&amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
		&amp;quot; used to transliterate &amp;quot; .. langs .. &amp;quot;.&amp;quot; .. categories:concat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by {{strip diacritics module documentation}}.&lt;br /&gt;
function export.stripDiacriticsModuleLangList(frame)&lt;br /&gt;
	local pagename, subpage&lt;br /&gt;
&lt;br /&gt;
	if frame.args[1] then&lt;br /&gt;
		pagename = frame.args[1]&lt;br /&gt;
	else&lt;br /&gt;
		local title = get_current_title()&lt;br /&gt;
		subpage = title.subpageText&lt;br /&gt;
		pagename = title.text&lt;br /&gt;
&lt;br /&gt;
		if subpage ~= pagename then&lt;br /&gt;
			pagename = title.rootText&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local stripDiacriticsModule = pagename&lt;br /&gt;
&lt;br /&gt;
	local languageObjects = require(&amp;quot;Module:languages/byStripDiacriticsModule&amp;quot;)(stripDiacriticsModule)&lt;br /&gt;
	local codeInPagename = pagename:match(&amp;quot;^([%l-]+)%-.*stripdiacritics$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local categories = Array()&lt;br /&gt;
	local codeInPagenameInList = false&lt;br /&gt;
	if codeInPagename then&lt;br /&gt;
		if languageObjects[1] and subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
			local agreement = languageObjects[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
			categories:insert(&amp;quot;[[Category:Diacritic-stripping modules used by &amp;quot; ..&lt;br /&gt;
				#languageObjects .. &amp;quot; language&amp;quot; .. agreement .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		languageObjects = Array(languageObjects)&lt;br /&gt;
			:filter(&lt;br /&gt;
				function(lang)&lt;br /&gt;
					local result = lang:getCode() ~= codeInPagename&lt;br /&gt;
					codeInPagenameInList = codeInPagenameInList or result&lt;br /&gt;
					return result&lt;br /&gt;
				end)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
		for script_code in pagename:gmatch(&amp;quot;%f[^-%z]%u%l%l%l%f[-]&amp;quot;) do&lt;br /&gt;
			local script = get_script(script_code)&lt;br /&gt;
			if script then&lt;br /&gt;
				categories:insert(&amp;quot;[[Category:&amp;quot; .. script:getCategoryName() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; and not title_exists(&amp;quot;Module:&amp;quot; .. pagename .. &amp;quot;/testcases&amp;quot;) then&lt;br /&gt;
		categories:insert(&amp;quot;[[Category:Diacritic-stripping modules without a testcases subpage]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not languageObjects[1] then&lt;br /&gt;
		return categories:concat()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langs = Array(languageObjects)&lt;br /&gt;
		:sort(&lt;br /&gt;
			function(lang1, lang2)&lt;br /&gt;
				return lang1:getCode() &amp;lt; lang2:getCode()&lt;br /&gt;
			end)&lt;br /&gt;
		-- This will not error because languageObjects is not empty.&lt;br /&gt;
		:map(languageObjects[1].makeCategoryLink)&lt;br /&gt;
		:serialCommaJoin()&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;It is &amp;quot; .. (codeInPagenameInList and &amp;quot;also&amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
		&amp;quot; used to strip diacritics for &amp;quot; .. langs .. &amp;quot;.&amp;quot; .. categories:concat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by {{sortkey module documentation}}.&lt;br /&gt;
function export.sortkeyModuleLangList(frame)&lt;br /&gt;
	local pagename, subpage&lt;br /&gt;
&lt;br /&gt;
	if frame.args[1] then&lt;br /&gt;
		pagename = frame.args[1]&lt;br /&gt;
	else&lt;br /&gt;
		local title = get_current_title()&lt;br /&gt;
		subpage = title.subpageText&lt;br /&gt;
		pagename = title.text&lt;br /&gt;
&lt;br /&gt;
		if subpage ~= pagename then&lt;br /&gt;
			pagename = title.rootText&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local sortkeyModule = pagename&lt;br /&gt;
&lt;br /&gt;
	local languageObjects = require(&amp;quot;Module:languages/bySortkeyModule&amp;quot;)(sortkeyModule)&lt;br /&gt;
	local codeInPagename = pagename:match(&amp;quot;^([%l-]+)%-.*sortkey$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local categories = Array()&lt;br /&gt;
	local codeInPagenameInList = false&lt;br /&gt;
	if codeInPagename then&lt;br /&gt;
		if languageObjects[1] and subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
			local agreement = languageObjects[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
			categories:insert(&amp;quot;[[Category:Sortkey-generating modules used by &amp;quot; ..&lt;br /&gt;
				#languageObjects .. &amp;quot; language&amp;quot; .. agreement .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		languageObjects = Array(languageObjects)&lt;br /&gt;
			:filter(&lt;br /&gt;
				function(lang)&lt;br /&gt;
					local result = lang:getCode() ~= codeInPagename&lt;br /&gt;
					codeInPagenameInList = codeInPagenameInList or result&lt;br /&gt;
					return result&lt;br /&gt;
				end)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; then&lt;br /&gt;
		for script_code in pagename:gmatch(&amp;quot;%f[^-%z]%u%l%l%l%f[-]&amp;quot;) do&lt;br /&gt;
			local script = get_script(script_code)&lt;br /&gt;
			if script then&lt;br /&gt;
				categories:insert(&amp;quot;[[Category:&amp;quot; .. script:getCategoryName() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if subpage ~= &amp;quot;documentation&amp;quot; and not title_exists(&amp;quot;Module:&amp;quot; .. pagename .. &amp;quot;/testcases&amp;quot;) then&lt;br /&gt;
		categories:insert(&amp;quot;[[Category:Sortkey-generating modules without a testcases subpage]]&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not languageObjects[1] then&lt;br /&gt;
		return categories:concat()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langs = Array(languageObjects)&lt;br /&gt;
		:sort(&lt;br /&gt;
			function(lang1, lang2)&lt;br /&gt;
				return lang1:getCode() &amp;lt; lang2:getCode()&lt;br /&gt;
			end)&lt;br /&gt;
		-- This will not error because languageObjects is not empty.&lt;br /&gt;
		:map(languageObjects[1].makeCategoryLink)&lt;br /&gt;
		:serialCommaJoin()&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;It is &amp;quot; .. (codeInPagenameInList and &amp;quot;also&amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
		&amp;quot; used to sort &amp;quot; .. langs .. &amp;quot;.&amp;quot; .. categories:concat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology/templates&amp;diff=491562</id>
		<title>Module:etymology/templates</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/templates&amp;diff=491562"/>
		<updated>2026-03-25T16:31:27Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local require_when_needed = require(&amp;quot;Module:require when needed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&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 insert = table.insert&lt;br /&gt;
local process_params = require_when_needed(&amp;quot;Module:parameters&amp;quot;, &amp;quot;process&amp;quot;)&lt;br /&gt;
local trim = mw.text.trim&lt;br /&gt;
local lower = mw.ustring.lower&lt;br /&gt;
local dump = mw.dumpObject&lt;br /&gt;
&lt;br /&gt;
local etymology_module = &amp;quot;Module:etymology&amp;quot;&lt;br /&gt;
local etymology_specialized_module = &amp;quot;Module:etymology/specialized&amp;quot;&lt;br /&gt;
local parameter_utilities_module = &amp;quot;Module:parameter utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- For testing&lt;br /&gt;
local force_cat = false&lt;br /&gt;
&lt;br /&gt;
local allowed_conjs = {&amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;/&amp;quot;, &amp;quot;~&amp;quot;, &amp;quot;;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
local function parse_etym_args(parent_args, base_params, has_dest_lang)&lt;br /&gt;
	local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local sourcearg, termarg&lt;br /&gt;
	if has_dest_lang then&lt;br /&gt;
		sourcearg, termarg = 2, 3&lt;br /&gt;
	else&lt;br /&gt;
		sourcearg, termarg = 1, 2&lt;br /&gt;
	end&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = base_params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = termarg,&lt;br /&gt;
		track_module = &amp;quot;etymology&amp;quot;,&lt;br /&gt;
		lang = function(args)&lt;br /&gt;
			return args[sourcearg][#args[sourcearg]]&lt;br /&gt;
		end,&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
		-- Don&#039;t do this, doesn&#039;t seem to make sense.&lt;br /&gt;
		-- parse_lang_prefix = true,&lt;br /&gt;
		make_separate_g_into_list = true,&lt;br /&gt;
		splitchar = &amp;quot;,&amp;quot;,&lt;br /&gt;
		subitem_param_handling = &amp;quot;last&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	-- If term param 3= is empty, there will be no terms in terms.terms. To facilitate further code and for&lt;br /&gt;
	-- compatibility,, insert one. It will display as &amp;lt;small&amp;gt;[Term?]&amp;lt;/small&amp;gt;.&lt;br /&gt;
	if not terms.terms[1] then&lt;br /&gt;
		terms.terms[1] = {&lt;br /&gt;
			lang = args[sourcearg][#args[sourcearg]],&lt;br /&gt;
			sc = args.sc,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return terms.terms, args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function export.parse_2_lang_args(parent_args, has_text, no_family)&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[2] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			sublist = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			family = not no_family,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[3] = true,&lt;br /&gt;
		[4] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[5] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
		[&amp;quot;senseid&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;p&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = boolean,&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;sourceconj&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;conj&amp;quot;] = {set = allowed_conjs, default = &amp;quot;,&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	if has_text then&lt;br /&gt;
		params[&amp;quot;notext&amp;quot;] = boolean&lt;br /&gt;
		params[&amp;quot;nocap&amp;quot;] = boolean&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return parse_etym_args(parent_args, params, &amp;quot;has dest lang&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of deprecated {{etyl}}. Provided to make histories more legible.&lt;br /&gt;
function export.etyl(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = {type = &amp;quot;language&amp;quot;, default = &amp;quot;en&amp;quot;},&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = {},&lt;br /&gt;
	}&lt;br /&gt;
	-- Empty language means English, but &amp;quot;-&amp;quot; means no language. Yes, confusing...&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	if args[2] and trim(args[2]) == &amp;quot;-&amp;quot; then&lt;br /&gt;
		params[2] = nil&lt;br /&gt;
		args = process_params({&lt;br /&gt;
			[1] = args[1],&lt;br /&gt;
			[&amp;quot;sort&amp;quot;] = args.sort&lt;br /&gt;
		}, params)&lt;br /&gt;
	else&lt;br /&gt;
		args = process_params(args, params)&lt;br /&gt;
	end&lt;br /&gt;
	return require(etymology_module).format_source {&lt;br /&gt;
		lang = args[2],&lt;br /&gt;
		source = args[1],&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of {{derived}}/{{der}}.&lt;br /&gt;
function export.derived(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	&lt;br /&gt;
	local processes = {&lt;br /&gt;
		[&amp;quot;c&amp;quot;] = &amp;quot;terms calqued&amp;quot;, [&amp;quot;i&amp;quot;] = &amp;quot;terms inherited&amp;quot;, [&amp;quot;b&amp;quot;] = &amp;quot;terms borrowed&amp;quot;, [&amp;quot;lb&amp;quot;] = &amp;quot;learned borrowings&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return require(etymology_module).format_derived {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
		borrowing_type = processes[args.p] or nil,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implementation of {{borrowed}}/{{bor}}.&lt;br /&gt;
function export.borrowed(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	return require(etymology_module).format_borrowed {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.inherited(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	local sources = args[2]&lt;br /&gt;
	if sources[2] then&lt;br /&gt;
		-- Because this doesn&#039;t really make sense.&lt;br /&gt;
		error(&amp;quot;[[Template:inherited]] doesn&#039;t support multiple comma-separated sources&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return require(etymology_module).format_inherited {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.cognate(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			sublist = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			family = true,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[2] = true,&lt;br /&gt;
		[3] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[4] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
		sourceconj = true,&lt;br /&gt;
		[&amp;quot;conj&amp;quot;] = {set = allowed_conjs, default = &amp;quot;,&amp;quot;},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = parse_etym_args(parent_args, params, false)&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_cognate {&lt;br /&gt;
		sources = args[1],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.noncognate(frame)&lt;br /&gt;
	return export.cognate(frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Supports various specialized types of borrowings, according to `frame.args.bortype`:&lt;br /&gt;
--   &amp;quot;learned&amp;quot; = {{lbor}}/{{learned borrowing}}&lt;br /&gt;
--   &amp;quot;semi-learned&amp;quot; = {{slbor}}/{{semi-learned borrowing}}&lt;br /&gt;
--   &amp;quot;orthographic&amp;quot; = {{obor}}/{{orthographic borrowing}}&lt;br /&gt;
--   &amp;quot;unadapted&amp;quot; = {{ubor}}/{{unadapted borrowing}}&lt;br /&gt;
--   &amp;quot;calque&amp;quot; = {{cal}}/{{calque}}&lt;br /&gt;
--   &amp;quot;partial-calque&amp;quot; = {{pcal}}/{{partial calque}}&lt;br /&gt;
--   &amp;quot;semantic-loan&amp;quot; = {{sl}}/{{semantic loan}}&lt;br /&gt;
--   &amp;quot;transliteration&amp;quot; = {{translit}}/{{transliteration}}&lt;br /&gt;
--   &amp;quot;phono-semantic-matching&amp;quot; = {{psm}}/{{phono-semantic matching}}&lt;br /&gt;
function export.specialized_borrowing(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args, &amp;quot;has text&amp;quot;)&lt;br /&gt;
	local m_etymology_specialized = require(etymology_specialized_module)&lt;br /&gt;
	return m_etymology_specialized.specialized_borrowing {&lt;br /&gt;
		bortype = frame.args.bortype,&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocap = args.nocap,&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		senseid = args.senseid,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{abbrev}}, {{back-formation}}, {{clipping}}, {{ellipsis}},&lt;br /&gt;
-- {{rebracketing}} and {{reduplication}} that have a single associated term.&lt;br /&gt;
function export.misc_variant(frame)&lt;br /&gt;
	local iparams = {&lt;br /&gt;
		[&amp;quot;ignore-params&amp;quot;] = true,&lt;br /&gt;
		text = {required = true},&lt;br /&gt;
		oftext = true,&lt;br /&gt;
		cat = {list = true}, -- allow and compress holes&lt;br /&gt;
		conj = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local iargs = process_params(frame.args, iparams)&lt;br /&gt;
&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = true,&lt;br /&gt;
		[3] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[4] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
		nocap = boolean, -- should be processed in the template itself&lt;br /&gt;
		notext = boolean,&lt;br /&gt;
		nocat = boolean,&lt;br /&gt;
		conj = {set = allowed_conjs},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- |ignore-params= parameter to module invocation specifies&lt;br /&gt;
	-- additional parameter names to allow  in template invocation, separated by&lt;br /&gt;
	-- commas. They must consist of ASCII letters or numbers or hyphens.&lt;br /&gt;
	local ignore_params = iargs[&amp;quot;ignore-params&amp;quot;]&lt;br /&gt;
	if ignore_params then&lt;br /&gt;
		ignore_params = trim(ignore_params)&lt;br /&gt;
		if not ignore_params:match(&amp;quot;^[%w%-,]+$&amp;quot;) then&lt;br /&gt;
			error(&amp;quot;Invalid characters in |ignore-params=: &amp;quot; .. ignore_params:gsub(&amp;quot;[%w%-,]+&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		for param in ignore_params:gmatch(&amp;quot;[%w%-]+&amp;quot;) do&lt;br /&gt;
			if params[param] then&lt;br /&gt;
				error(&amp;quot;Duplicate param |&amp;quot; .. param&lt;br /&gt;
					.. &amp;quot; in |ignore-params=: already specified in params&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			params[param] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 2,&lt;br /&gt;
		track_module = &amp;quot;etymology&amp;quot;,&lt;br /&gt;
		-- Don&#039;t set lang here as we want to know whether there was a lang prefix or not.&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
		parse_lang_prefix = true,&lt;br /&gt;
		allow_multiple_lang_prefixes = true,&lt;br /&gt;
		make_separate_g_into_list = true,&lt;br /&gt;
		splitchar = &amp;quot;,&amp;quot;,&lt;br /&gt;
		subitem_param_handling = &amp;quot;last&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_misc_variant {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		text = iargs.text,&lt;br /&gt;
		oftext = iargs.oftext,&lt;br /&gt;
		terms = terms.terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		conj = args.conj or iargs.conj or &amp;quot;and&amp;quot;,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		cats = iargs.cat,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{doublet}} that can take multiple terms. Doesn&#039;t handle {{blend}}&lt;br /&gt;
-- or {{univerbation}}, which display + signs between elements and use compound_like in [[Module:affix/templates]].&lt;br /&gt;
function export.misc_variant_multiple_terms(frame)&lt;br /&gt;
	local iparams = {&lt;br /&gt;
		text = {required = true},&lt;br /&gt;
		oftext = true,&lt;br /&gt;
		cat = {list = true}, -- allow and compress holes&lt;br /&gt;
		conj = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local iargs = process_params(frame.args, iparams)&lt;br /&gt;
&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, template_default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = {list = true, allow_holes = true},&lt;br /&gt;
		nocap = boolean, -- should be processed in the template itself&lt;br /&gt;
		notext = boolean,&lt;br /&gt;
		nocat = boolean,&lt;br /&gt;
		conj = {set = allowed_conjs},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		-- We want to require an index for all params.&lt;br /&gt;
		{default = true, require_index = true},&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 2,&lt;br /&gt;
		parse_lang_prefix = true,&lt;br /&gt;
		allow_multiple_lang_prefixes = true,&lt;br /&gt;
		track_module = &amp;quot;etymology-templates-doublet&amp;quot;,&lt;br /&gt;
		disallow_custom_separators = true,&lt;br /&gt;
		-- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do&lt;br /&gt;
		-- {{suffix|lang||foo}} to generate &amp;quot;+ -foo&amp;quot;.&lt;br /&gt;
		dont_skip_items = true,&lt;br /&gt;
		-- Don&#039;t set lang here as we want to know whether there was a lang prefix or not.&lt;br /&gt;
		sc = &amp;quot;sc.default&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_misc_variant {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		text = iargs.text,&lt;br /&gt;
		oftext = iargs.oftext,&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		conj = args.conj or iargs.conj or &amp;quot;and&amp;quot;,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		cats = iargs.cat,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{unknown}} that have no associated terms.&lt;br /&gt;
do&lt;br /&gt;
	local function get_args(frame)&lt;br /&gt;
		local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
		local params = {&lt;br /&gt;
			[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
			[&amp;quot;title&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;nocap&amp;quot;] = boolean, -- should be processed in the template itself&lt;br /&gt;
			[&amp;quot;notext&amp;quot;] = boolean,&lt;br /&gt;
			[&amp;quot;nocat&amp;quot;] = boolean,&lt;br /&gt;
			[&amp;quot;sort&amp;quot;] = true,&lt;br /&gt;
		}&lt;br /&gt;
		if frame.args.title2_alias then&lt;br /&gt;
			params[2] = {alias_of = &amp;quot;title&amp;quot;}&lt;br /&gt;
		end&lt;br /&gt;
		return process_params(frame:getParent().args, params)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function export.misc_variant_no_term(frame)&lt;br /&gt;
		local args = get_args(frame)&lt;br /&gt;
&lt;br /&gt;
		return require(etymology_module).format_misc_variant_no_term {&lt;br /&gt;
			lang = args[1],&lt;br /&gt;
			notext = args.notext,&lt;br /&gt;
			title = args.title or frame.args.text,&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			cat = frame.args.cat,&lt;br /&gt;
			sort_key = args.sort,&lt;br /&gt;
			force_cat = force_cat,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- This function works similarly to misc_variant_no_term(), but with some automatic linking to the glossary in&lt;br /&gt;
	-- `title`.&lt;br /&gt;
	function export.onomatopoeia(frame)&lt;br /&gt;
		local args = get_args(frame)&lt;br /&gt;
&lt;br /&gt;
		local title = args.title&lt;br /&gt;
		if title and (lower(title) == &amp;quot;imitative&amp;quot; or lower(title) == &amp;quot;imitation&amp;quot;) then&lt;br /&gt;
			title = &amp;quot;[[wikt:Appendix:Glossary#imitative|&amp;quot; .. title .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return require(etymology_module).format_misc_variant_no_term {&lt;br /&gt;
			lang = args[1],&lt;br /&gt;
			notext = args.notext,&lt;br /&gt;
			title = title or frame.args.text,&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			cat = frame.args.cat,&lt;br /&gt;
			sort_key = args.sort,&lt;br /&gt;
			force_cat = force_cat,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology/templates&amp;diff=491556</id>
		<title>Module:etymology/templates</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/templates&amp;diff=491556"/>
		<updated>2026-03-25T16:20:52Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local require_when_needed = require(&amp;quot;Module:require when needed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&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 insert = table.insert&lt;br /&gt;
local process_params = require_when_needed(&amp;quot;Module:parameters&amp;quot;, &amp;quot;process&amp;quot;)&lt;br /&gt;
local trim = mw.text.trim&lt;br /&gt;
local lower = mw.ustring.lower&lt;br /&gt;
local dump = mw.dumpObject&lt;br /&gt;
&lt;br /&gt;
local etymology_module = &amp;quot;Module:etymology&amp;quot;&lt;br /&gt;
local etymology_specialized_module = &amp;quot;Module:etymology/specialized&amp;quot;&lt;br /&gt;
local parameter_utilities_module = &amp;quot;Module:parameter utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- For testing&lt;br /&gt;
local force_cat = false&lt;br /&gt;
&lt;br /&gt;
local allowed_conjs = {&amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;/&amp;quot;, &amp;quot;~&amp;quot;, &amp;quot;;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
local function parse_etym_args(parent_args, base_params, has_dest_lang)&lt;br /&gt;
	local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local sourcearg, termarg&lt;br /&gt;
	if has_dest_lang then&lt;br /&gt;
		sourcearg, termarg = 2, 3&lt;br /&gt;
	else&lt;br /&gt;
		sourcearg, termarg = 1, 2&lt;br /&gt;
	end&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = base_params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = termarg,&lt;br /&gt;
		track_module = &amp;quot;etymology&amp;quot;,&lt;br /&gt;
		lang = function(args)&lt;br /&gt;
			return args[sourcearg][#args[sourcearg]]&lt;br /&gt;
		end,&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
		-- Don&#039;t do this, doesn&#039;t seem to make sense.&lt;br /&gt;
		-- parse_lang_prefix = true,&lt;br /&gt;
		make_separate_g_into_list = true,&lt;br /&gt;
		splitchar = &amp;quot;,&amp;quot;,&lt;br /&gt;
		subitem_param_handling = &amp;quot;last&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	-- If term param 3= is empty, there will be no terms in terms.terms. To facilitate further code and for&lt;br /&gt;
	-- compatibility,, insert one. It will display as &amp;lt;small&amp;gt;[Term?]&amp;lt;/small&amp;gt;.&lt;br /&gt;
	if not terms.terms[1] then&lt;br /&gt;
		terms.terms[1] = {&lt;br /&gt;
			lang = args[sourcearg][#args[sourcearg]],&lt;br /&gt;
			sc = args.sc,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return terms.terms, args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function export.parse_2_lang_args(parent_args, has_text, no_family)&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[2] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			sublist = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			family = not no_family,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[3] = true,&lt;br /&gt;
		[4] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[5] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
		[&amp;quot;senseid&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = boolean,&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;sourceconj&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;conj&amp;quot;] = {set = allowed_conjs, default = &amp;quot;,&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	if has_text then&lt;br /&gt;
		params[&amp;quot;notext&amp;quot;] = boolean&lt;br /&gt;
		params[&amp;quot;nocap&amp;quot;] = boolean&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return parse_etym_args(parent_args, params, &amp;quot;has dest lang&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of deprecated {{etyl}}. Provided to make histories more legible.&lt;br /&gt;
function export.etyl(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = {type = &amp;quot;language&amp;quot;, default = &amp;quot;en&amp;quot;},&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = {},&lt;br /&gt;
	}&lt;br /&gt;
	-- Empty language means English, but &amp;quot;-&amp;quot; means no language. Yes, confusing...&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	if args[2] and trim(args[2]) == &amp;quot;-&amp;quot; then&lt;br /&gt;
		params[2] = nil&lt;br /&gt;
		args = process_params({&lt;br /&gt;
			[1] = args[1],&lt;br /&gt;
			[&amp;quot;sort&amp;quot;] = args.sort&lt;br /&gt;
		}, params)&lt;br /&gt;
	else&lt;br /&gt;
		args = process_params(args, params)&lt;br /&gt;
	end&lt;br /&gt;
	return require(etymology_module).format_source {&lt;br /&gt;
		lang = args[2],&lt;br /&gt;
		source = args[1],&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of {{derived}}/{{der}}.&lt;br /&gt;
function export.derived(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	&lt;br /&gt;
	local processes = {&lt;br /&gt;
		[&amp;quot;c&amp;quot;] = &amp;quot;calqued&amp;quot;, [&amp;quot;i&amp;quot;] = &amp;quot;inherited&amp;quot;, [&amp;quot;b&amp;quot;] = &amp;quot;borrowed&amp;quot;, [&amp;quot;lb&amp;quot;] = &amp;quot;learned borrowing&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return require(etymology_module).format_derived {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
		borrowing_type = processes[args.p] or nil,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implementation of {{borrowed}}/{{bor}}.&lt;br /&gt;
function export.borrowed(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	return require(etymology_module).format_borrowed {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.inherited(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	local sources = args[2]&lt;br /&gt;
	if sources[2] then&lt;br /&gt;
		-- Because this doesn&#039;t really make sense.&lt;br /&gt;
		error(&amp;quot;[[Template:inherited]] doesn&#039;t support multiple comma-separated sources&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return require(etymology_module).format_inherited {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.cognate(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			sublist = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			family = true,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[2] = true,&lt;br /&gt;
		[3] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[4] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
		sourceconj = true,&lt;br /&gt;
		[&amp;quot;conj&amp;quot;] = {set = allowed_conjs, default = &amp;quot;,&amp;quot;},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = parse_etym_args(parent_args, params, false)&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_cognate {&lt;br /&gt;
		sources = args[1],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.noncognate(frame)&lt;br /&gt;
	return export.cognate(frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Supports various specialized types of borrowings, according to `frame.args.bortype`:&lt;br /&gt;
--   &amp;quot;learned&amp;quot; = {{lbor}}/{{learned borrowing}}&lt;br /&gt;
--   &amp;quot;semi-learned&amp;quot; = {{slbor}}/{{semi-learned borrowing}}&lt;br /&gt;
--   &amp;quot;orthographic&amp;quot; = {{obor}}/{{orthographic borrowing}}&lt;br /&gt;
--   &amp;quot;unadapted&amp;quot; = {{ubor}}/{{unadapted borrowing}}&lt;br /&gt;
--   &amp;quot;calque&amp;quot; = {{cal}}/{{calque}}&lt;br /&gt;
--   &amp;quot;partial-calque&amp;quot; = {{pcal}}/{{partial calque}}&lt;br /&gt;
--   &amp;quot;semantic-loan&amp;quot; = {{sl}}/{{semantic loan}}&lt;br /&gt;
--   &amp;quot;transliteration&amp;quot; = {{translit}}/{{transliteration}}&lt;br /&gt;
--   &amp;quot;phono-semantic-matching&amp;quot; = {{psm}}/{{phono-semantic matching}}&lt;br /&gt;
function export.specialized_borrowing(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args, &amp;quot;has text&amp;quot;)&lt;br /&gt;
	local m_etymology_specialized = require(etymology_specialized_module)&lt;br /&gt;
	return m_etymology_specialized.specialized_borrowing {&lt;br /&gt;
		bortype = frame.args.bortype,&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocap = args.nocap,&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		senseid = args.senseid,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{abbrev}}, {{back-formation}}, {{clipping}}, {{ellipsis}},&lt;br /&gt;
-- {{rebracketing}} and {{reduplication}} that have a single associated term.&lt;br /&gt;
function export.misc_variant(frame)&lt;br /&gt;
	local iparams = {&lt;br /&gt;
		[&amp;quot;ignore-params&amp;quot;] = true,&lt;br /&gt;
		text = {required = true},&lt;br /&gt;
		oftext = true,&lt;br /&gt;
		cat = {list = true}, -- allow and compress holes&lt;br /&gt;
		conj = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local iargs = process_params(frame.args, iparams)&lt;br /&gt;
&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = true,&lt;br /&gt;
		[3] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[4] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
		nocap = boolean, -- should be processed in the template itself&lt;br /&gt;
		notext = boolean,&lt;br /&gt;
		nocat = boolean,&lt;br /&gt;
		conj = {set = allowed_conjs},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- |ignore-params= parameter to module invocation specifies&lt;br /&gt;
	-- additional parameter names to allow  in template invocation, separated by&lt;br /&gt;
	-- commas. They must consist of ASCII letters or numbers or hyphens.&lt;br /&gt;
	local ignore_params = iargs[&amp;quot;ignore-params&amp;quot;]&lt;br /&gt;
	if ignore_params then&lt;br /&gt;
		ignore_params = trim(ignore_params)&lt;br /&gt;
		if not ignore_params:match(&amp;quot;^[%w%-,]+$&amp;quot;) then&lt;br /&gt;
			error(&amp;quot;Invalid characters in |ignore-params=: &amp;quot; .. ignore_params:gsub(&amp;quot;[%w%-,]+&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		for param in ignore_params:gmatch(&amp;quot;[%w%-]+&amp;quot;) do&lt;br /&gt;
			if params[param] then&lt;br /&gt;
				error(&amp;quot;Duplicate param |&amp;quot; .. param&lt;br /&gt;
					.. &amp;quot; in |ignore-params=: already specified in params&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			params[param] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 2,&lt;br /&gt;
		track_module = &amp;quot;etymology&amp;quot;,&lt;br /&gt;
		-- Don&#039;t set lang here as we want to know whether there was a lang prefix or not.&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
		parse_lang_prefix = true,&lt;br /&gt;
		allow_multiple_lang_prefixes = true,&lt;br /&gt;
		make_separate_g_into_list = true,&lt;br /&gt;
		splitchar = &amp;quot;,&amp;quot;,&lt;br /&gt;
		subitem_param_handling = &amp;quot;last&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_misc_variant {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		text = iargs.text,&lt;br /&gt;
		oftext = iargs.oftext,&lt;br /&gt;
		terms = terms.terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		conj = args.conj or iargs.conj or &amp;quot;and&amp;quot;,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		cats = iargs.cat,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{doublet}} that can take multiple terms. Doesn&#039;t handle {{blend}}&lt;br /&gt;
-- or {{univerbation}}, which display + signs between elements and use compound_like in [[Module:affix/templates]].&lt;br /&gt;
function export.misc_variant_multiple_terms(frame)&lt;br /&gt;
	local iparams = {&lt;br /&gt;
		text = {required = true},&lt;br /&gt;
		oftext = true,&lt;br /&gt;
		cat = {list = true}, -- allow and compress holes&lt;br /&gt;
		conj = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local iargs = process_params(frame.args, iparams)&lt;br /&gt;
&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, template_default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = {list = true, allow_holes = true},&lt;br /&gt;
		nocap = boolean, -- should be processed in the template itself&lt;br /&gt;
		notext = boolean,&lt;br /&gt;
		nocat = boolean,&lt;br /&gt;
		conj = {set = allowed_conjs},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		-- We want to require an index for all params.&lt;br /&gt;
		{default = true, require_index = true},&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 2,&lt;br /&gt;
		parse_lang_prefix = true,&lt;br /&gt;
		allow_multiple_lang_prefixes = true,&lt;br /&gt;
		track_module = &amp;quot;etymology-templates-doublet&amp;quot;,&lt;br /&gt;
		disallow_custom_separators = true,&lt;br /&gt;
		-- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do&lt;br /&gt;
		-- {{suffix|lang||foo}} to generate &amp;quot;+ -foo&amp;quot;.&lt;br /&gt;
		dont_skip_items = true,&lt;br /&gt;
		-- Don&#039;t set lang here as we want to know whether there was a lang prefix or not.&lt;br /&gt;
		sc = &amp;quot;sc.default&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_misc_variant {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		text = iargs.text,&lt;br /&gt;
		oftext = iargs.oftext,&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		conj = args.conj or iargs.conj or &amp;quot;and&amp;quot;,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		cats = iargs.cat,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{unknown}} that have no associated terms.&lt;br /&gt;
do&lt;br /&gt;
	local function get_args(frame)&lt;br /&gt;
		local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
		local params = {&lt;br /&gt;
			[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
			[&amp;quot;title&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;nocap&amp;quot;] = boolean, -- should be processed in the template itself&lt;br /&gt;
			[&amp;quot;notext&amp;quot;] = boolean,&lt;br /&gt;
			[&amp;quot;nocat&amp;quot;] = boolean,&lt;br /&gt;
			[&amp;quot;sort&amp;quot;] = true,&lt;br /&gt;
		}&lt;br /&gt;
		if frame.args.title2_alias then&lt;br /&gt;
			params[2] = {alias_of = &amp;quot;title&amp;quot;}&lt;br /&gt;
		end&lt;br /&gt;
		return process_params(frame:getParent().args, params)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function export.misc_variant_no_term(frame)&lt;br /&gt;
		local args = get_args(frame)&lt;br /&gt;
&lt;br /&gt;
		return require(etymology_module).format_misc_variant_no_term {&lt;br /&gt;
			lang = args[1],&lt;br /&gt;
			notext = args.notext,&lt;br /&gt;
			title = args.title or frame.args.text,&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			cat = frame.args.cat,&lt;br /&gt;
			sort_key = args.sort,&lt;br /&gt;
			force_cat = force_cat,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- This function works similarly to misc_variant_no_term(), but with some automatic linking to the glossary in&lt;br /&gt;
	-- `title`.&lt;br /&gt;
	function export.onomatopoeia(frame)&lt;br /&gt;
		local args = get_args(frame)&lt;br /&gt;
&lt;br /&gt;
		local title = args.title&lt;br /&gt;
		if title and (lower(title) == &amp;quot;imitative&amp;quot; or lower(title) == &amp;quot;imitation&amp;quot;) then&lt;br /&gt;
			title = &amp;quot;[[wikt:Appendix:Glossary#imitative|&amp;quot; .. title .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return require(etymology_module).format_misc_variant_no_term {&lt;br /&gt;
			lang = args[1],&lt;br /&gt;
			notext = args.notext,&lt;br /&gt;
			title = title or frame.args.text,&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			cat = frame.args.cat,&lt;br /&gt;
			sort_key = args.sort,&lt;br /&gt;
			force_cat = force_cat,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:labels/data/topical&amp;diff=491554</id>
		<title>Module:labels/data/topical</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:labels/data/topical&amp;diff=491554"/>
		<updated>2026-03-25T16:14:09Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local labels = {}&lt;br /&gt;
&lt;br /&gt;
-- To sort these, you first have to convert each label section into a single line, and then sort the lines, and undo&lt;br /&gt;
-- the single-line conversion. This can be done using Vim commands, something like this:&lt;br /&gt;
-- 1. Mark the first line to be changed using `ma`.&lt;br /&gt;
-- 2. Go to the last line and use `&#039;a,.s/\n/\\n/g` to convert newlines to \n sequences.&lt;br /&gt;
-- 3. Use `&#039;a,.s/\\n\\n/\r/g` to convert sequences of two \n&#039;s (marking section divisions) back to newlines.&lt;br /&gt;
-- 4. Go to the last line again and use `&#039;a,.!sort -f -d` to sort. The `-f` makes it case-insensitive and the `-d`&lt;br /&gt;
--    selects &amp;quot;dictionary order&amp;quot;, which is needed to get &#039;yoga&#039; to sort before &#039;yoga pose&#039; instead of the other way&lt;br /&gt;
--    around.&lt;br /&gt;
-- 5. Go to the last line again and use `&#039;a,.s/\\n/\r/g` to convert \n sequences back to newlines.&lt;br /&gt;
-- 6. Go to the last line again and use `&#039;a,.s/^labels/\rlabels/` to put an extra newline before each section.&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;3D printing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;3D printer&amp;quot;, &amp;quot;3D printers&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;3D printing#Noun&amp;quot;,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	Wikidata = &amp;quot;Q229367&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ABDL&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;AB/DL&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Abrahamism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;Abrahamism#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;accounting&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;accounting#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;acoustics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;acting&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;acting#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;advertising&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;advertising#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;aeronautics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;aerospace&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;aesthetic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;aesthetics&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Aesthetics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;age regression&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;agere&amp;quot;, &amp;quot;agereg&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Age regression&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ageplay&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;age play&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;agriculture&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;farming&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Ahmadiyya&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Ahmadiyyat&amp;quot;, &amp;quot;Ahmadi&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;aircraft&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;alchemy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;alcoholic beverages&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;alcohol&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:alcoholic#Adjective|alcoholic]] [[wikt:beverage]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;alcoholism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;algebra&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;algebraic geometry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;algebraic topology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;alternative history&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;alt hist&amp;quot;, &amp;quot;alternate history&amp;quot;},&lt;br /&gt;
	Wikidata = &amp;quot;Q224989&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;alternative medicine&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;alt-right&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;altright&amp;quot;, &amp;quot;Alt-right&amp;quot;, &amp;quot;Altright&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;amateur radio&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ham radio&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;American football&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Football (American)&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;amino acid&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Amino acids&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;analytic geometry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Geometry&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;analytical chemistry&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:analytical]] [[wikt:chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;anarchism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;anatomy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Ancient Greece&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ancient Greece&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Ancient Rome&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ancient Rome&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Anglicanism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Anglican&amp;quot;, &amp;quot;Anglicanist&amp;quot;, &amp;quot;Anglican Church&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;animation&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;anime&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Japanese fiction&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;anthropology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Arabian god&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Arabian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Arabian deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;arachnology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;archaeological culture&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;archeological culture&amp;quot;, &amp;quot;archaeological cultures&amp;quot;, &amp;quot;archeological cultures&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:archaeology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Archaeological cultures&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;archaeology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;archeology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;archery&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;architectural element&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;architectural elements&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:architecture]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Architectural elements&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;architecture&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Argentine politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Argentina politics&amp;quot;, &amp;quot;Argentinian politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Argentina&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;arithmetic&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Armenian mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Armenian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;art&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;arts&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;art#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Arthurian legend&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Arthurian mythology&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Matter_of_Britain#Arthurian_legend&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Arthurian mythology&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;artificial intelligence&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;AI&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;artillery&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[weaponry]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;artistic work&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:art#Noun|art]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Artistic works&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;asterism&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:uranography]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Asterisms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;asteroid&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:astronomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = {&amp;quot;Asteroids&amp;quot;, &amp;quot;Astronomy&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;astrology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;horoscope&amp;quot;, &amp;quot;zodiac&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;astronautics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;rocketry&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;astronomy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;astrophysics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Asturian mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Asturian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;athletics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Australian Aboriginal mythology&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Australian politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Australia&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Australian rules football&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;autism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;auto parts&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:automotive]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;automotive&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;automotives&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;automotive parts&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:automotive]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;aviation&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;air transport&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;backgammon&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bacteria&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:bacteriology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bacteriology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;badminton&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Baháʼí Faith&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Baháʼí&amp;quot;, &amp;quot;Bahaʼi&amp;quot;, &amp;quot;Bahá&#039;í&amp;quot;, &amp;quot;Baha&#039;i&amp;quot;, &amp;quot;Bahai&amp;quot;, &amp;quot;Bahaʼi Faith&amp;quot;, &amp;quot;Bahá&#039;í Faith&amp;quot;, &amp;quot;Baha&#039;i Faith&amp;quot;, &amp;quot;Bahai Faith&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;baking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;baking#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ball games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ball sports&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:ball game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ballet&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ballistics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Bangladeshi politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Bangladesh&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;banking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;banking#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;baseball&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;basketball&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;BDSM&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;beekeeping&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;melittology&amp;quot;, &amp;quot;apiology&amp;quot;, &amp;quot;apidology&amp;quot;}, -- could potentially be split out&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;beer&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;betting&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;bet&amp;quot;, &amp;quot;bets&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:gambling#Noun|gambling]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;biblical&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Bible&amp;quot;, &amp;quot;bible&amp;quot;, &amp;quot;Biblical&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;Bible&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Bible&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;biblical character&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Biblical character&amp;quot;, &amp;quot;biblical figure&amp;quot;, &amp;quot;Biblical figure&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Bible|biblical]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Biblical characters&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bibliography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bicycle parts&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;bicycle part&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[w:List of bicycle parts|cycling]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;billiards&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cue sports&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bingo&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;biochemistry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;biology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;biological&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;biotechnology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;biotechnological&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;birdwatching&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;birding&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;birdwatching#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;blacksmithing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;blacksmith&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;blogging&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;blog&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;blogging#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Internet&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;board games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;board game&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:board game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;board sports&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;boardsport&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bodybuilding&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;bodybuilding#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;book of the Bible&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;book of the bible&amp;quot;, &amp;quot;books of the Bible&amp;quot;, &amp;quot;books of the bible&amp;quot;, &amp;quot;Biblical book&amp;quot;, &amp;quot;biblical book&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Bible|biblical]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Books of the Bible&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bookbinding&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;botany&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bowling&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;bowling#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bowls&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;lawn bowls&amp;quot;, &amp;quot;crown green bowls&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Bowls (game)&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;boxing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;boxing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;brass instruments&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;brass instrument&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:music]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Brazilian politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Brazil&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;brewing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;brewing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bridge&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;bridge#English:_game&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;broadcasting&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;broadcasting#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bryology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Buddhism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Buddhist deity&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Buddhist god&amp;quot;, &amp;quot;Buddhist goddess&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Buddhism]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Buddhist deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Bulgarian politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Bulgaria&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;bullfighting&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;bullfight&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;business&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;professional&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Byzantine Empire&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Byzantine&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;calculus&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;calligraphy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Calvinism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Calvinist&amp;quot;, &amp;quot;Reformed Christianity&amp;quot;, &amp;quot;Calvinist Church&amp;quot;, &amp;quot;Reformed Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Canadian football&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Canadian politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Canada&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Candomblé&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;candomblé&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;canid&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:zoology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Canids&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;canoeing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;canoe&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;canoeing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Water sports&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;capitalism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;capitalist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;carbohydrate&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;carbohydrates&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Carbohydrates&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;carboxylic acid&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;carboxylic acids&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:organic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Carboxylic acids&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;card games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cards&amp;quot;, &amp;quot;card game&amp;quot;, &amp;quot;playing card&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:card game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cardiology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;carpentry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cartography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cartomancy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;castells&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;category theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Catholicism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;catholicism&amp;quot;, &amp;quot;Catholic&amp;quot;, &amp;quot;catholic&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;caving&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;caving#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cellular automata&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Celtic mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Celtic]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ceramics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cheerleading&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;cheerleading#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chemical element&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Chemical elements&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chemical engineering&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chemistry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;chemical&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chess&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;children&#039;s games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;children&#039;s game&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:children|children&#039;s]] [[wikt:game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chilean politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Chile&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese astronomy&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:astronomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese calligraphy&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:calligraphy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Calligraphy&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese constellation&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:astronomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Constellations&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese folk religion&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:folk religion]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Religion&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese linguistics&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:linguistics]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Linguistics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese philosophy&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:philosophy]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese phonetics&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:phonetics]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese religion&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:religion]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Religion&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Chinese star&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Chinese]] [[wikt:astronomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Stars&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Christianity&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;christianity&amp;quot;, &amp;quot;Christian&amp;quot;, &amp;quot;christian&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Church of England&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;C of E&amp;quot;, &amp;quot;CofE&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Church of the East&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cinematography&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;filmology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cladistics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Taxonomy&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;classical mechanics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;classical studies&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;climate change&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;climatology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;climbing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;rock climbing&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;climbing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;clinical psychology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:clinical]] [[wikt:psychology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;clothing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;clothing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cloud computing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Computing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cockfighting&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cockfight&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;codicology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;coenzyme&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;coenzymes&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Coenzymes&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;coins&amp;quot;] = { -- Do not merge with &amp;quot;numismatics&amp;quot;, as the category is different.&lt;br /&gt;
	aliases = {&amp;quot;coin&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:numismatics]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;collectible card games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;trading card games&amp;quot;, &amp;quot;collectible cards&amp;quot;, &amp;quot;trading cards&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;combinatorics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;comedy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;comics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;commerce&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;commercial law&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:commercial#Adjective|commercial]] [[wikt:law]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;communication&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;communications&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;communism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Communism&amp;quot;, &amp;quot;communist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;compilation&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;compiler&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:software]] [[wikt:compilation]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;complex analysis&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computational linguistics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computer chess&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computer games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;computer game&amp;quot;, &amp;quot;computer gaming&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:computer game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Video games&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computer graphics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computer hardware&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:computer]] [[wikt:hardware]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computer languages&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;computer language&amp;quot;, &amp;quot;programming language&amp;quot;, &amp;quot;programming languages&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:computer language]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computer science&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;comp sci&amp;quot;, &amp;quot;CompSci&amp;quot;, &amp;quot;compsci&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computer security&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;computer&amp;quot;, &amp;quot;computers&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;computing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;computing theory&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;comptheory&amp;quot;, &amp;quot;computability theory&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:computing#Noun|computing]] [[wikt:theory]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Theory of computing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;conchology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Confucianism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;conlanging&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;conlang&amp;quot;, &amp;quot;conlanger&amp;quot;, &amp;quot;constructed languages&amp;quot;, &amp;quot;constructed language&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;conservatism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;conservative&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;conspiracy theories&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;conspiracy theory&amp;quot;, &amp;quot;conspiracy&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;conspiracy theory#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;constellation&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:astronomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Constellations&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;construction&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;control theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cooking&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;culinary&amp;quot;, &amp;quot;cuisine&amp;quot;, &amp;quot;cookery&amp;quot;, &amp;quot;gastronomy&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;cooking#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cookware&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;bakeware&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:cooking#Noun|cooking]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Cookware and bakeware&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Coptic Orthodoxy&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Coptic Orthodox&amp;quot;, &amp;quot;Coptic Orthodox Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;copyright&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;copyright law&amp;quot;, &amp;quot;intellectual property&amp;quot;, &amp;quot;intellectual property law&amp;quot;, &amp;quot;IP law&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:copyright]] [[wikt:law]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;copyright license&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;copyright licenses&amp;quot;, &amp;quot;license&amp;quot;, &amp;quot;copyright licence&amp;quot;, &amp;quot;copyright licences&amp;quot;, &amp;quot;licence&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[w:Copyright license|copyright law]]&amp;quot;,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = &amp;quot;Copyright licenses&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cosmetics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cosmetology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cosmology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;creationism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;baraminology&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;creationism#English&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cribbage&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cricket&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;crime&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;criminal&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;criminal law&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;criminology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;crochet&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;crocheting&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;croquet&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;crosswording&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;crosswords&amp;quot;, &amp;quot;cruciverbalism&amp;quot;, &amp;quot;cryptic crosswords&amp;quot;, &amp;quot;crossword puzzles&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cryptocurrencies&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cryptocurrency&amp;quot;, &amp;quot;crypto&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;cryptocurrency&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Cryptocurrency&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cryptography&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cryptographic&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cryptozoology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;crystallography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cultural anthropology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;curling&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;currencies&amp;quot;] = { -- Do not merge with &amp;quot;numismatics&amp;quot;, as the category is different.&lt;br /&gt;
	aliases = {&amp;quot;currency&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:numismatics]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cybernetics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cybernetic&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cybersecurity&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Networking&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cycle racing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cycle sport&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;cycle sport&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cycling&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;bicycling&amp;quot;, &amp;quot;bicycle&amp;quot;, &amp;quot;bike&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;cycling#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cytology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cell biology&amp;quot;, &amp;quot;cellular biology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dance&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;dancing&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;dance#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dances&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:dance#Noun|dance]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;darts&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;data management&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;data modeling&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;databases&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;database&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:database]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;decision theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;deltiology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;demography&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;demographics&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;demonym&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;demonyms&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Demonyms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;demoscene&amp;quot;] = {&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dentistry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;dentist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dermatology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;design&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;design#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dice games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;dice&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:dice game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dictation&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;differential geometry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;diplomacy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;disc golf&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;disease&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;diseases&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:pathology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Diseases&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;divination&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;diving&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;diving#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dominoes&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dou dizhu&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;drama&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dressage&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;E number&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:food]] [[wikt:manufacture]]&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;European food additive numbers&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;early Christianity&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;early christianity&amp;quot;, &amp;quot;Early Christianity&amp;quot;, &amp;quot;early Church&amp;quot;, &amp;quot;early church&amp;quot;, &amp;quot;Early Church&amp;quot;, &amp;quot;the early Church&amp;quot;, &amp;quot;the early church&amp;quot;, &amp;quot;the Early Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;earth science&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Earth sciences&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Eastern Catholicism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Eastern Catholic&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Eastern Christianity&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Eastern christianity&amp;quot;, &amp;quot;Eastern Christian&amp;quot;, &amp;quot;Eastern christian&amp;quot;, &amp;quot;Eastern Church&amp;quot;, &amp;quot;Eastern church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Eastern Orthodoxy&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Eastern Orthodox&amp;quot;, &amp;quot;Eastern Orthodox Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;eating disorders&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;eating disorder&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:eating disorder]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ecology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;economics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;education&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Egyptian god&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Egyptian goddess&amp;quot;, &amp;quot;Egyptian deity&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Egyptian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Egyptian deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Egyptian mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Egyptian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Egyptology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	aliases = {&amp;quot;Ancient Egypt&amp;quot;},&lt;br /&gt;
	topical_categories = &amp;quot;Ancient Egypt&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;electrencephalography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;electrical engineering&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;electricity&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;electrical&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;electrochemistry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;electrochemical&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;electrodynamics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;electromagnetism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;electronics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;element symbol&amp;quot;] = {&lt;br /&gt;
	-- Compare &amp;quot;systematic element symbol&amp;quot; and &amp;quot;obsolete element symbol&amp;quot;.&lt;br /&gt;
	display = &amp;quot;[[wikt:chemistry]]&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;Symbols for chemical elements&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;embryology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;emergency medicine&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;emergency services&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;endocrinology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;engineering&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;engineering#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;enterprise engineering&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;entomology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;enzyme&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;enzymes&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Enzymes&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;epidemiology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;epigraphy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;epistemology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;equestrianism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;equestrian&amp;quot;, &amp;quot;horses&amp;quot;, &amp;quot;horsemanship&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;espionage&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ethics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ethical&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ethnography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ethology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;EU politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;European Union politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of the European Union&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;European folklore&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:European]] [[wikt:folklore]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;European politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Europe&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;European Union&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;EU&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Evangelicalism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Evangelical&amp;quot;, &amp;quot;evangelical&amp;quot;, &amp;quot;Evangelical Christianity&amp;quot;, &amp;quot;Evangelical Christian&amp;quot;, &amp;quot;Evangelical Protestantism&amp;quot;, &amp;quot;Evangelical Protestant&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;evolutionary theory&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;evolutionary biology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;exercise&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;eye color&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;eye colour&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:eye]] [[wikt:color]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Eye colors&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;eyewear&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fairy tale&amp;quot;] = { -- names of fairy tales&lt;br /&gt;
	aliases = {&amp;quot;fairytale&amp;quot;, &amp;quot;fairy-tale&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fairy tales&amp;quot;] = { -- relating to fairy tales&lt;br /&gt;
	aliases = {&amp;quot;fairytales&amp;quot;, &amp;quot;fairy-tales&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;falconry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fantasy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;farriery&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fascism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fashion&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fatty acid&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:organic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Fatty acids&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;felid&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cat&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:zoology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Felids&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;feminism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fencing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;fencing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;feudalism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fiction&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;fictional&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fictional character&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:fiction]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Fictional characters&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;field hockey&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;figure of speech&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:rhetoric]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Figures of speech&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;figure skating&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;file format&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;File formats&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;film&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;film#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;film genre&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cinema&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:film#Noun|film]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Film genres&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;finance&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;finance#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Finnic mythology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Finnish mythology&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Finnic]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;firearms&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;firearm&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:firearm]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;firefighting&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fish&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:zoology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fishing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;angling&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;fishing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;flamenco&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fluid dynamics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fluid mechanics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Mechanics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;folklore&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;footwear&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;forestry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Forteana&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Freemasonry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;freemasonry&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;French politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of France&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;functional analysis&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;functional group prefix&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:organic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Functional group prefixes&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;functional group suffix&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:organic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Functional group suffixes&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;functional programming&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Programming&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;furniture&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;furry fandom&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;furry&amp;quot;, &amp;quot;furry community&amp;quot;, &amp;quot;fursuit&amp;quot;, &amp;quot;kemonā&amp;quot;, &amp;quot;kemona&amp;quot;, &amp;quot;kemono&amp;quot;, &amp;quot;kemonomimi&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:furry#Noun|furry]] [[wikt:fandom]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fuzzy logic&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Gaelic football&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;galaxy&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:astronomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Galaxies&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gambling&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;gambling#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;game theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;game&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;game#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gaming&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;gaming#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gender critical&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;gender-critical&amp;quot;, &amp;quot;gender critical feminism&amp;quot;, &amp;quot;gender-critical feminism&amp;quot;, &amp;quot;GC&amp;quot;, &amp;quot;GCF&amp;quot;, &amp;quot;trans-exclusionary radical feminism&amp;quot;, &amp;quot;TERF&amp;quot;, &amp;quot;TERFism&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;gender-critical#Adjective&amp;quot;,&lt;br /&gt;
	Wikipedia = &amp;quot;Gender-critical feminism&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Gender-critical feminism&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;genealogy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;general semantics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;genetic disorder&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:medical]] [[wikt:genetics]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Genetic disorders&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;genetics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;geography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;geological period&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	display =&amp;quot;[[wikt:geology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Geological periods&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;geology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;geometry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;geometric&amp;quot;, &amp;quot;geometrical&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;geomorphology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;geopolitics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;German politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Germany&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Germanic god&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Germanic goddess&amp;quot;, &amp;quot;Germanic deity&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Germanic]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Germanic deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Germanic paganism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Asatru&amp;quot;, &amp;quot;Ásatrú&amp;quot;, &amp;quot;Germanic neopaganism&amp;quot;, &amp;quot;Germanic Paganism&amp;quot;, &amp;quot;Heathenry&amp;quot;, &amp;quot;heathenry&amp;quot;, &amp;quot;Norse neopaganism&amp;quot;, &amp;quot;Norse paganism&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Germanic#Adjective|Germanic]] [[wikt:paganism]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gerontology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gladiatorial combat&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;glassblowing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Gnosticism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;gnosticism&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;go&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Go&amp;quot;, &amp;quot;game of go&amp;quot;, &amp;quot;game of Go&amp;quot;},&lt;br /&gt;
	display = &amp;quot;{{l|en|go|id=game}}&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;golf&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;golfing&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;government&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;grammar&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;grammatical&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;grammatical case&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:grammar]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Grammatical cases&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;grammatical mood&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:grammar]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Grammatical moods&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;graph theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;graphic design&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;graphical user interface&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;GUI&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Greek god&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Greek goddess&amp;quot;, &amp;quot;Greek deity&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Greek]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Greek deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Greek mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Greek]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Greek Orthodoxy&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Greek Orthodox&amp;quot;, &amp;quot;Greek Orthodox Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;group theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gun mechanisms&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;firearm mechanism&amp;quot;, &amp;quot;firearm mechanisms&amp;quot;, &amp;quot;gun mechanism&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:firearm]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gun sports&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;shooting sports&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:gun]] [[wikt:sport]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gymnastics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gynaecology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;gynecology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hair color&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;hair colour&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:hair]] [[wikt:color]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Hair colors&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hairdressing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hanafuda&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hand games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;hand game&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:hand]] [[wikt:game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;handball&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Hawaiian mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Hawaiian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;headwear&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:clothing#Noun|clothing]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;healthcare&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;helminthology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hematology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;haematology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;heraldic charge&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;heraldiccharge&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:heraldry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Heraldic charges&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;heraldry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;herbalism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;herpetology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Hindu god&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Hinduism]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Hindu deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Hinduism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Hindutva&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;historical currencies&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;historical currency&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:numismatics]]&amp;quot;,&lt;br /&gt;
	sense_categories = &amp;quot;historical&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Historical currencies&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;historical linguistics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Linguistics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;historical period&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;historical periods&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:history]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Historical periods&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;historiography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;history&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hockey&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:field hockey]] or [[wikt:ice hockey]]&amp;quot;,&lt;br /&gt;
	topical_categories = {&amp;quot;Field hockey&amp;quot;, &amp;quot;Ice hockey&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;homeopathy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Hong Kong politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;HK politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Hong Kong&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hormone&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Hormones&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;horse color&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;horse colour&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:horse]] [[wikt:color]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Horse colors&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;horse racing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;horticulture&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;gardening&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;HTML&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;Hypertext Markup Language&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;human resources&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;HR&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;humanities&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hunting&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;hunting#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hurling&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;hurling#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hydroacoustics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hydrocarbon chain prefix&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:organic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Hydrocarbon chain prefixes&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hydrocarbon chain suffix&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:organic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Hydrocarbon chain suffixes&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hydrology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ice hockey&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ichthyology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;idol fandom&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;idol&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:idol]] [[wikt:fandom]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;immunochemistry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;immunology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;import/export&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;import&amp;quot;, &amp;quot;export&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:import#Noun|import]]/[[wikt:export#Noun|export]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;incoterm&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Incoterm]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Incoterms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Indian politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of India&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Indo-European studies&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;indo-european studies&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Indonesian politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Indonesia politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Indonesia&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;information science&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;information technology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;IT&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Computing&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;information theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;inheritance law&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;inorganic chemistry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;inorganic compound&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:inorganic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Inorganic compounds&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;insurance&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;international law&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;international relations&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;international standards&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;international standard&amp;quot;, &amp;quot;ISO&amp;quot;, &amp;quot;International Organization for Standardization&amp;quot;, &amp;quot;International Organisation for Standardisation&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;International standard&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Internet&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;internet&amp;quot;, &amp;quot;online&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Iranian mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Iranian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Irish mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Irish]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Irish politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of the Republic of Ireland&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Islam&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;islam&amp;quot;, &amp;quot;Islamic&amp;quot;, &amp;quot;Muslim&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Islamic finance&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Islamic banking&amp;quot;, &amp;quot;Muslim finance&amp;quot;, &amp;quot;Muslim banking&amp;quot;, &amp;quot;Sharia-compliant finance&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Islamic law&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Islamic legal&amp;quot;, &amp;quot;Sharia&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;isotope&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:physics]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Isotopes&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Jainism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Japanese fiction&amp;quot;] = {&lt;br /&gt;
	-- aliases = {&amp;quot;anime&amp;quot;, &amp;quot;manga&amp;quot;, &amp;quot;anime and manga&amp;quot;, &amp;quot;manga and anime&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Japanese#Adjective|Japanese]] [[wikt:fiction]]&amp;quot;,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Japanese god&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Japanese#Adjective|Japanese]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Japanese deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Japanese mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Japanese#Adjective|Japanese]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Japanese politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Japan&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Japanese pornography&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Japanese porn&amp;quot;, &amp;quot;hentai&amp;quot;, &amp;quot;adult anime&amp;quot;, &amp;quot;erotic anime&amp;quot;, &amp;quot;ero anime&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Japanese#Adjective|Japanese]] [[wikt:pornography]]&amp;quot;,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Java programming language&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;JavaPL&amp;quot;, &amp;quot;Java PL&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Java (programming language)&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;jazz&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;jazz#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;jewelry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;jewellery&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Jewish law&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Halacha&amp;quot;, &amp;quot;Halachah&amp;quot;, &amp;quot;Halakha&amp;quot;, &amp;quot;Halakhah&amp;quot;, &amp;quot;halacha&amp;quot;, &amp;quot;halachah&amp;quot;, &amp;quot;halakha&amp;quot;, &amp;quot;halakhah&amp;quot;, &amp;quot;Jewish Law&amp;quot;, &amp;quot;jewish law&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Jewish]] [[wikt:law]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;journalism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Mass media&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Judaism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;judo&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;juggling&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;juggling#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;karuta&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;kendo&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;knitting&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;knitting#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Korean mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Korean#Adjective|Korean]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;labour&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;labor&amp;quot;, &amp;quot;labour movement&amp;quot;, &amp;quot;labor movement&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;labour law&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;labor law&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Law&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;lacrosse&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;landforms&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:geography]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;law&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;legal&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;law#English&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;law enforcement&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;police&amp;quot;, &amp;quot;policing&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;leatherworking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;leftism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;leftist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;letterpress&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;metal type&amp;quot;, &amp;quot;metal typesetting&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:letterpress]] [[wikt:typography]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Typography&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;lexicography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;LGBTQ&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;LGBT&amp;quot;, &amp;quot;LGBT+&amp;quot;, &amp;quot;LGBT*&amp;quot;, &amp;quot;LGBTQ+&amp;quot;, &amp;quot;LGBTQ*&amp;quot;, &amp;quot;LGBTQIA&amp;quot;, &amp;quot;LGBTQIA+&amp;quot;, &amp;quot;LGBTQIA*&amp;quot;, &amp;quot;queer&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;liberalism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;liberal&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;library science&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;lichenology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;limnology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Ecology&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;linear algebra&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;vector algebra&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;linguistic morphology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:linguistic]] [[wikt:morphology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;linguistics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;linguistic&amp;quot;, &amp;quot;philology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;lipid&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;lipids&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Lipids&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;literature&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;logic&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;logical fallacy&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;fallacies&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:rhetoric]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Logical fallacies&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;logistics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;luge&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Lutheranism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Lutheran&amp;quot;, &amp;quot;Lutheranist&amp;quot;, &amp;quot;Lutheran Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;lutherie&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;machine learning&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ML&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;machining&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;machining#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;macroeconomics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Economics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mahjong&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;malacology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Malaysian politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Malaysia politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Malaysia&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mammalogy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;management&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;manga&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Japanese comics&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Japanese fiction&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;manhua&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Chinese comics&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Chinese fiction&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;manhwa&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Korean comics&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Korean fiction&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Manichaeism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;manufacturing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;manufacturing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Maoism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Maoist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;marching&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;marching#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;marine biology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;coral science&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;marketing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;marketing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;martial arts&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Marxism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Marxist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;masonry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;massage&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;materials science&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mathematical analysis&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;analysis&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mathematics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;math&amp;quot;, &amp;quot;maths&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;measure theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mechanical engineering&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mechanics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;media&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mediaeval folklore&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;medieval folklore&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:mediaeval]] [[wikt:folklore]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;European folklore&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;medical genetics&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:medical]] [[wikt:genetics]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;medical sign&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;medical symptoms&amp;quot;, &amp;quot;symptom&amp;quot;, &amp;quot;symptoms&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:medicine]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Medical signs and symptoms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;medicine&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;medical&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Meitei god&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Meitei goddess&amp;quot;, &amp;quot;Meitei deity&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Meitei]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Meitei deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mental health&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Mesopotamian god&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Mesopotamian goddess&amp;quot;, &amp;quot;Mesopotamian diety&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Mesopotamian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Mesopotamian deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Mesopotamian mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Mesopotamian]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;metadata&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Data management&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;metallurgy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;metalworking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;metamaterial&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:physics]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Metamaterials&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;metaphysics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;meteorology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Methodism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Methodist&amp;quot;, &amp;quot;methodism&amp;quot;, &amp;quot;methodist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;metrology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Mexican politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Mexico politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Mexico&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;microbiology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;microelectronics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;micronationalism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;micronation&amp;quot;, &amp;quot;micronations&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;microscopy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;military&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;army&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;military ranks&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;military rank&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:military]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;military unit&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:military]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Military units&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;milling&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Minecraft&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;&#039;&#039;[[wikt:Minecraft]]&#039;&#039;&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mineral&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:mineralogy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Minerals&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mineralogy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mining&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;mining#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mobile phones&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cell phone&amp;quot;, &amp;quot;cell phones&amp;quot;, &amp;quot;mobile phone&amp;quot;, &amp;quot;mobile telephony&amp;quot;, &amp;quot;smartphone&amp;quot;, &amp;quot;smartphones&amp;quot;, &amp;quot;mobile&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:mobile telephone|mobile telephony]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;molecular biology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;monarchy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;money&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Mormonism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;motor racing&amp;quot;] = {&lt;br /&gt;
	-- There are other types of racing, but 99% of the time &amp;quot;racing&amp;quot; on its own refers to motorsports.&lt;br /&gt;
	aliases = {&amp;quot;motor sport&amp;quot;, &amp;quot;motorsport&amp;quot;, &amp;quot;motorsports&amp;quot;, &amp;quot;racing&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;motorcycling&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;motorcycle&amp;quot;, &amp;quot;motorcycles&amp;quot;, &amp;quot;motorbike&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;motorcycling#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Motorcycles&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;multiplicity&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;plurality&amp;quot;, &amp;quot;polypsychism&amp;quot;, &amp;quot;dissociative identity disorder&amp;quot;, &amp;quot;DID&amp;quot;},&lt;br /&gt;
	display = &amp;quot;{{l|en|multiplicity|id=multiple personalities}}&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Multiplicity (psychology)&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;muscle&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;muscles&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:anatomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Muscles&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mushroom&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;mushrooms&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:mycology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Mushrooms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;music&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;musical&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;music genre&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:music]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Musical genres&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;music industry&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;musical instruments&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;musical instrument&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:music]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;musician&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:music]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Musicians&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;musicology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Music&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mycology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mysticism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mythological creature&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;mythological creatures&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Mythological creatures&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mythology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nanotechnology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;narratology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nautical&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Navajo mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Navajo]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;navigation&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Nazism&amp;quot;] = { -- see also Neo-Nazism&lt;br /&gt;
	aliases = {&amp;quot;nazism&amp;quot;, &amp;quot;Nazi&amp;quot;, &amp;quot;nazi&amp;quot;, &amp;quot;Nazis&amp;quot;, &amp;quot;nazis&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nematology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Zoology&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neo-Nazism&amp;quot;] = { -- Often used to indicate Nazi-used jargon; compare &amp;quot;white supremacist ideology&amp;quot;&lt;br /&gt;
	aliases = {&amp;quot;Neo-Nazism&amp;quot;, &amp;quot;Neo-nazism&amp;quot;, &amp;quot;neo-nazism&amp;quot;, &amp;quot;Neo-Nazi&amp;quot;, &amp;quot;Neo-nazi&amp;quot;, &amp;quot;neo-Nazi&amp;quot;, &amp;quot;neo-nazi&amp;quot;, &amp;quot;Neo-Nazis&amp;quot;, &amp;quot;Neo-nazis&amp;quot;, &amp;quot;neo-Nazis&amp;quot;, &amp;quot;neo-nazis&amp;quot;, &amp;quot;NeoNazism&amp;quot;, &amp;quot;Neonazism&amp;quot;, &amp;quot;neoNazism&amp;quot;, &amp;quot;neonazism&amp;quot;, &amp;quot;NeoNazi&amp;quot;, &amp;quot;Neonazi&amp;quot;, &amp;quot;neoNazi&amp;quot;, &amp;quot;neonazi&amp;quot;, &amp;quot;NeoNazis&amp;quot;, &amp;quot;Neonazis&amp;quot;, &amp;quot;neoNazis&amp;quot;, &amp;quot;neonazis&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;netball&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;networking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;networking#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neuroanatomy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neurology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neuroscience&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neurosurgery&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neurotoxin&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:neurotoxicology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Neurotoxins&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neurotransmitter&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Neurotransmitters&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;New Zealand politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of New Zealand&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;newspapers&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:newspaper]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Norse god&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Norse goddess&amp;quot;, &amp;quot;Norse deity&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Norse]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Norse deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Norse mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Norse]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nuclear energy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nuclear physics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;number theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;numismatics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Currency&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nutrition&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;object-oriented programming&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;object-oriented&amp;quot;, &amp;quot;OOP&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;obsolete element symbol&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:chemistry]], [[wikt:obsolete]]&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;Obsolete symbols for chemical elements&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;obstetrics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;obstetric&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;occult&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;oceanography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Odinani&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Odinala&amp;quot;, &amp;quot;Omenala&amp;quot;, &amp;quot;Odinana&amp;quot;, &amp;quot;Omenana&amp;quot;, &amp;quot;Igbo religion&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;oil industry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;oil&amp;quot;, &amp;quot;oil drilling&amp;quot;, &amp;quot;petroleum industry&amp;quot;, &amp;quot;petroleum&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;oncology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;online gaming&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;online games&amp;quot;, &amp;quot;MMO&amp;quot;, &amp;quot;MMORPG&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:online]] [[wikt:gaming#Noun|gaming]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Video games&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;onomastics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;opera&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;operating systems&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:operating system]]s&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Software&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ophthalmology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;optics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;organic chemistry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;organic compound&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:organic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Organic compounds&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Oriental Orthodoxy&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Oriental Orthodox&amp;quot;, &amp;quot;Oriental Orthodox Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ornithology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;orthodontics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Dentistry&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;orthography&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;paganism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;pagan&amp;quot;, &amp;quot;neopagan&amp;quot;, &amp;quot;neopaganism&amp;quot;, &amp;quot;neo-pagan&amp;quot;, &amp;quot;neo-paganism&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pain&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:medicine]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;paintball&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;painting&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;painting#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Pakistani politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Pakistan&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;palaeography&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;paleography&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;paleontology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;palaeontology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Palestinian politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Palestine politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of the Palestinian National Authority&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;palmistry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;palynology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;papermaking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;paraphilia&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;paraphilias&amp;quot;, &amp;quot;paraphilic&amp;quot;, &amp;quot;fetish&amp;quot;, &amp;quot;fetishes&amp;quot;, &amp;quot;fetishism&amp;quot;, &amp;quot;fetishistic&amp;quot;, &amp;quot;fetishization&amp;quot;, &amp;quot;fetishisation&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;paraphilia#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Paraphilias&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;parapsychology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;parasitology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;part of speech&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;PoS&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:grammar]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Parts of speech&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;particle&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;subatomic particle&amp;quot;, &amp;quot;subatomic particles&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:particle physics]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Subatomic particles&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;particle physics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pasteurization&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;pasteurisation&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;patent law&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;patents&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:patent#Noun|patent]] [[wikt:law]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pathology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pensions&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;pension&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:pension]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;percussion instruments&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;percussion instrument&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:music]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;perfumery&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Peruvian politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Peru&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pesäpallo&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;pesapallo&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;petrochemistry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;petrology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pharmaceutical drug&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:pharmacology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Pharmaceutical drugs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pharmaceutical effect&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:pharmacology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Pharmaceutical effects&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pharmacology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pharmacy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pharyngology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;philately&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Philippine politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Filipino politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of the Philippines&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Philmont Scout Ranch&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Philmont&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;philosophy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;phonetics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;phonetic&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;phonology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;phonological&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;photography&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;photograph&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;phrenology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;physical chemistry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;physics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;physiology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;phytopathology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pinball&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;planetology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;plant&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;plants&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:botany]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Plants&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;plant disease&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;plant diseases&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:phytopathology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Plant diseases&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;plastic surgery&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;playground games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;playground game&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:playground]] [[wikt:game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;poetry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;poison&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:toxicology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Poisons&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Pokémon&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Pokemon&amp;quot;},&lt;br /&gt;
	display = &amp;quot;&#039;&#039;[[w:Pokémon|Pokémon]]&#039;&#039;&amp;quot;,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;poker&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;poker slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:poker]] [[wikt:slang]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Poker&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;political science&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;political subdivision&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:government]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Political subdivisions&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;political&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pornography&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;porn&amp;quot;, &amp;quot;porno&amp;quot;, &amp;quot;adult video&amp;quot;, &amp;quot;adult videos&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Portuguese folklore&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Portuguese#Adjective|Portuguese]] [[wikt:folklore]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;European folklore&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Portuguese politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Portugal&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;post&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;mail&amp;quot;, &amp;quot;postal&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:postal]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;postal abbreviation&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;postal abbr&amp;quot;, &amp;quot;postal abbrev&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:postal]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Postal abbreviations&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;potential theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pottery&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Ceramics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pragmatics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;printing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;printing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;probability theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;professional wrestling&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;pro wrestling&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;programming&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;computer programming&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;programming#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;property law&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;land law&amp;quot;, &amp;quot;real estate law&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;prosody&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;protein&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;proteins&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Proteins&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Protestantism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;protestantism&amp;quot;, &amp;quot;Protestant&amp;quot;, &amp;quot;protestant&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pseudoscience&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;psychiatry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;psychoanalysis&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;psychology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;psychotherapy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;publishing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;publishing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pulmonology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pyrotechnics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	aliases = { &amp;quot;firework&amp;quot;, &amp;quot;fireworks&amp;quot; },&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;QAnon&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Qanon&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Quakerism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;quantum computing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;quantum mechanics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;quantum physics&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Quimbanda&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;radiation&amp;quot;] = {&lt;br /&gt;
	-- TODO: What kind of topic is &amp;quot;radiation&amp;quot;? Is it specific kinds of radiation? That would be a set-type category.&lt;br /&gt;
	display = &amp;quot;[[wikt:physics]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;radio&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Raëlism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rail transport&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;rail&amp;quot;, &amp;quot;railroading&amp;quot;, &amp;quot;railroads&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Rail transportation&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Rastafari&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Rasta&amp;quot;, &amp;quot;rasta&amp;quot;, &amp;quot;Rastafarian&amp;quot;, &amp;quot;rastafarian&amp;quot;, &amp;quot;Rastafarianism&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;real estate&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;real tennis&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Tennis&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;recreational mathematics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Mathematics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Reddit&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;regular expressions&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;regex&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:regular expression]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;relativity&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;religion&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rhetoric&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rhythmic gymnastics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;road transport&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;roads&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;robotics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rock&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;rocks&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:geology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Rocks&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rock paper scissors&amp;quot;] = {&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;roleplaying games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;role playing games&amp;quot;, &amp;quot;role-playing games&amp;quot;, &amp;quot;RPG&amp;quot;, &amp;quot;RPGs&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:roleplaying game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Role-playing games&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;roller derby&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Roman Catholicism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Roman Catholic&amp;quot;, &amp;quot;Roman Catholic Church&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Roman Empire&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Roman god&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Roman goddess&amp;quot;, &amp;quot;Roman deity&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Roman]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Roman deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Roman mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Roman]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Roman numerals&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Roman numeral]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;roofing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;roofing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rosiculture&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rowing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;rowing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Rubik&#039;s Cube&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Rubik&#039;s cubes&amp;quot;, &amp;quot;Magic Cube&amp;quot;, &amp;quot;magic cube&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;Rubik&#039;s cube&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rugby&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rugby league&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rugby union&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Russian Orthodoxy&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Russian Orthodox&amp;quot;, &amp;quot;Russian Orthodox Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sailing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;sailing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;schools&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:education]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;science fiction&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;scifi&amp;quot;, &amp;quot;sci fi&amp;quot;, &amp;quot;sci-fi&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sciences&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;science&amp;quot;, &amp;quot;scientific&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Scientology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Scots law&amp;quot;] = {&lt;br /&gt;
	-- Note: this is the usual term, not &amp;quot;Scottish law&amp;quot;.&lt;br /&gt;
	aliases = {&amp;quot;Scottish law&amp;quot;, &amp;quot;Scotland law&amp;quot;, &amp;quot;Scots Law&amp;quot;, &amp;quot;Scottish Law&amp;quot;, &amp;quot;Scotland Law&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Scouting&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;scouting&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:scouting]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Scrabble&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;&#039;&#039;[[wikt:Scrabble]]&#039;&#039;&amp;quot;,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;scrapbooks&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:scrapbook]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sculpture&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;seduction community&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;pickup artist&amp;quot;, &amp;quot;pickup artists&amp;quot;, &amp;quot;pickup artistry&amp;quot;, &amp;quot;pickup community&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;seismology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;self-harm&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;selfharm&amp;quot;, &amp;quot;self harm&amp;quot;, &amp;quot;self-harm community&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;semantics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;semiconductors&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:semiconductor]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;semiotics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;SEO&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;search engine optimization&amp;quot;,&lt;br /&gt;
	topical_categories = {&amp;quot;Internet&amp;quot;, &amp;quot;Marketing&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;set theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sewing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;sewing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sex&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sex position&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:sex]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Sex positions&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sexology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sexuality&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Shaivism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;shamanism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Shamanism&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Shi&#039;ism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Shia&amp;quot;, &amp;quot;Shi&#039;ite&amp;quot;, &amp;quot;Shi&#039;i&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Shia Islam]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Shinto&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ship parts&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:nautical]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Ship parts&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;shipping&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;shipping#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;shoemaking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;shogi&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;signal processing&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Sikhism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Sikh&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Singaporean politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Singapore&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;singing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;singing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;skateboarding&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;skateboarding#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;skating&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;skating#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;skeleton&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:anatomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;skiing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;skiing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;skydiving&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;skydiving#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Slavic god&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Slavic]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Slavic deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Slavic mythology&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Slavic]] [[wikt:mythology]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;smoking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;smoking#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;snooker&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;snooker#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;snowboarding&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;snowboarding#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;soccer&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;football&amp;quot;, &amp;quot;association football&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Football (soccer)&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;social media&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;social sciences&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;social science&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:social science]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;socialism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sociolinguistics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sociology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;softball&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;software&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;software architecture&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = {&amp;quot;Software engineering&amp;quot;, &amp;quot;Programming&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;software engineering&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;software development&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;soil science&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sound&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;sound#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sound engineering&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;South Korean idol fandom&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Korean idol fandom&amp;quot;, &amp;quot;Korean idol&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:South Korean]] [[wikt:idol]] [[wikt:fandom]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;South Park&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;&#039;&#039;[[w:South Park|South Park]]&#039;&#039;&amp;quot;,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Soviet Union&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;USSR&amp;quot;, &amp;quot;Soviet&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;space flight&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;spaceflight&amp;quot;, &amp;quot;space travel&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Space&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;space science&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;space&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Space&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Spanish politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Spain&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;spectroscopy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;speedrunning&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;speedrun&amp;quot;, &amp;quot;speedruns&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;spinning&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;spiritualism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sports&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;sport&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;square dancing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;square dance&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;squash&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Squash (sport)&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;standard of identity&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:standard of identity|standards of identity]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Standards of identity&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;star&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:astronomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Stars&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Star Wars&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;&#039;&#039;[[wikt:Star Wars]]&#039;&#039;&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;statistical mechanics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;statistics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;steroid&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Steroids&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;steroid hormone&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;steroid drug&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]], [[wikt:steroids]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Hormones&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;stock market&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;stock ticker symbol&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;stock symbol&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Stock symbols for companies&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;string instruments&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;string instrument&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:music]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;subculture&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Culture&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Sufism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Sufi Islam&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sugar acid&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:organic chemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Sugar acids&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sumo&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;supply chain&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;surface feature&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:planetology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Planetary nomenclature&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;surfing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;surf&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;surfing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;surgery&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;surveying&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;surveying#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sushi&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;swimming&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;swimming#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Swiss politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Switzerland&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;swords&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[sword]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Syriac Orthodoxy&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Syriac Orthodox&amp;quot;, &amp;quot;Syriac Orthodox Church&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;systematic element symbol&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:chemistry]]&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;Systematic chemical symbols&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;systematics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Taxonomy&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;systems engineering&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;systems theory&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;table tennis&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Taoism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Daoism&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;tarot&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Cartomancy&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;taxation&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;tax&amp;quot;, &amp;quot;taxes&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;taxonomic name&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:taxonomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Taxonomic names&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;taxonomy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;technology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;telecommunications&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;telecommunication&amp;quot;, &amp;quot;telecom&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;telegraphy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;telephony&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;telephone&amp;quot;, &amp;quot;telephones&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;television&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;TV&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;tennis&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;teratology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Tetris&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;textiles&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;textual criticism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;theater&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;theatre&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;theology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;thermodynamics&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Thracian god&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Thracian goddess&amp;quot;, &amp;quot;Thracian deity&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[w:Thracian religion|Thracian religion]]&amp;quot;,&lt;br /&gt;
	Wikipedia = &amp;quot;Thracian religion&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Thracian deities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Tibetan Buddhism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Buddhism&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;tiddlywinks&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;TikTok aesthetic&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:TikTok]] aesthetic&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Aesthetics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;timber industry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;timber&amp;quot;, &amp;quot;wood industry&amp;quot;, &amp;quot;lumber industry&amp;quot;, &amp;quot;lumber&amp;quot;, &amp;quot;logging&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;time&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;tincture&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:heraldry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Heraldic tinctures&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;topology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;tort law&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Law&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;tourism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;tourist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;toxicology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;trading&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;trade&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;trading#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;trading cards&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:trading card]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;traditional Chinese medicine&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;TCM&amp;quot;, &amp;quot;Chinese medicine&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;traditional Korean medicine&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Korean medicine&amp;quot;},&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;transgender&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;trans&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;translation studies&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;transport&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;transportation&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;traumatology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Emergency medicine&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;travel&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;travelling&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;trigonometric function&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:trigonometry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Trigonometric functions&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;trigonometry&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;trust law&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Law&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Tumblr aesthetic&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Tumblr]] [[wikt:aesthetic]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Aesthetics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Twitter&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;twitter&amp;quot;, &amp;quot;X&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;Twitter#Proper noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;two-up&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;typography&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;typesetting&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ufology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;UK politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of the United Kingdom&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Umbanda&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;underwater diving&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;scuba&amp;quot;, &amp;quot;scuba diving&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:underwater]] [[wikt:diving#Noun|diving]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Unicode&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Unicode standard&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;United Nations&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;UN&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:United Nations|UN]]&amp;quot;,&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;urban studies&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;urbanism&amp;quot;, &amp;quot;urban planning&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;urology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;US politics&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of the United States&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Vaishnavism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Vaishnavist&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Valentinianism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;valentinianism&amp;quot;, &amp;quot;Valentinianist&amp;quot;, &amp;quot;valentinianist&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Vedic religion&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Vedic Hinduism&amp;quot;, &amp;quot;Vedism&amp;quot;, &amp;quot;Vedicism&amp;quot;, &amp;quot;Ancient Hinduism&amp;quot;, &amp;quot;ancient Hinduism&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Historical Vedic religion&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;vegetable&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;vegetables&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Vegetables&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;vehicles&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;vehicle&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:vehicle]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Venezuelan politics&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Venezuela politics&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Politics of Venezuela&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;veterinary disease&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:veterinary medicine]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Veterinary diseases&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;veterinary medicine&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;veterinary&amp;quot;, &amp;quot;vet&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;video compression&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;video game genre&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:video game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Video game genres&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;video games&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;video game&amp;quot;, &amp;quot;video gaming&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:video game]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;virology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;virus&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:virology]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Viruses&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;vitamin&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:biochemistry]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Vitamins&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;viticulture&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = {&amp;quot;Horticulture&amp;quot;, &amp;quot;Wine&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;volcanology&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;vulcanology&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;volleyball&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;voodoo&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;VTuber&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Virtual YouTuber&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Virtual YouTuber&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;war&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;warfare&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;water sports&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;watersport&amp;quot;, &amp;quot;watersports&amp;quot;, &amp;quot;water sport&amp;quot;},&lt;br /&gt;
	Wiktionary = &amp;quot;watersport&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;watercraft&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:nautical]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;weaponry&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;weapon&amp;quot;, &amp;quot;weapons&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Weapons&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;weather&amp;quot;] = {&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;weaving&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;weaving#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;web design&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
	aliases = {&amp;quot;Web design&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;web development&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = {&amp;quot;Programming&amp;quot;, &amp;quot;Web design&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;weightlifting&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;white supremacy&amp;quot;] = { -- Often used to indicate Nazi-used jargon; compare &amp;quot;neo-Nazism&amp;quot;&lt;br /&gt;
	aliases = {&amp;quot;white nationalism&amp;quot;, &amp;quot;white nationalist&amp;quot;, &amp;quot;white power&amp;quot;, &amp;quot;white racism&amp;quot;, &amp;quot;white supremacist ideology&amp;quot;, &amp;quot;white supremacism&amp;quot;, &amp;quot;white supremacist&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = &amp;quot;White supremacist ideology&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Wicca&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;wiki jargon&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;wiki&amp;quot;, &amp;quot;wikis&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wiki]] [[wikt:jargon]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Wiki&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Wikimedia jargon&amp;quot;] = {&lt;br /&gt;
	aliases = {&lt;br /&gt;
		&amp;quot;Wikimedia&amp;quot;, &amp;quot;Wiktionary&amp;quot;, &amp;quot;Wiktionary jargon&amp;quot;, &amp;quot;Wikipedia&amp;quot;, &amp;quot;Wikipedia jargon&amp;quot;,&lt;br /&gt;
		&amp;quot;WMF&amp;quot;, &amp;quot;WMF jargon&amp;quot; -- technically not correct&lt;br /&gt;
	},&lt;br /&gt;
	display = &amp;quot;[[w:Wikimedia movement|Wikimedia]] [[wikt:jargon]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Wikimedia&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;wind instruments&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;wind instrument&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:music]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;wine&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;oenology&amp;quot;, &amp;quot;winemaking&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;winter sports&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[winter sport]]s&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;woodwind instruments&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;woodwind instrument&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:music]]&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;woodworking&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;World War I&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;World War 1&amp;quot;, &amp;quot;WWI&amp;quot;, &amp;quot;WW I&amp;quot;, &amp;quot;WW1&amp;quot;, &amp;quot;WW 1&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;World War II&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;World War 2&amp;quot;, &amp;quot;WWII&amp;quot;, &amp;quot;WW II&amp;quot;, &amp;quot;WW2&amp;quot;, &amp;quot;WW 2&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;wrestling&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;wrestling#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;writing&amp;quot;] = {&lt;br /&gt;
	Wiktionary = &amp;quot;writing#Noun&amp;quot;,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;xiangqi&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Chinese chess&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Yazidism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Yezidism&amp;quot;},&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;yoga&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;yoga pose&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;asana&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:yoga]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Yoga poses&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;zodiac constellations&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:astronomy]]&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Constellations in the zodiac&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;zoology&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;zootomy&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = &amp;quot;Animal body parts&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Zoroastrianism&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	topical_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Deprecated/do not use warning (ambiguous, unsuitable etc)&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;deprecated label&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;emergency&amp;quot;, &amp;quot;greekmyth&amp;quot;, &amp;quot;industry&amp;quot;, &amp;quot;morphology&amp;quot;, &amp;quot;musici&amp;quot;, &amp;quot;quantum&amp;quot;, &amp;quot;vector&amp;quot;},&lt;br /&gt;
	display = &amp;quot;&amp;lt;span style=\&amp;quot;color:var(--wikt-palette-red,red);\&amp;quot;&amp;gt;&amp;lt;b&amp;gt;deprecated label&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;,&lt;br /&gt;
	deprecated = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return require(&amp;quot;Module:labels&amp;quot;).finalize_data(labels)&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:labels/data/regional&amp;diff=491553</id>
		<title>Module:labels/data/regional</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:labels/data/regional&amp;diff=491553"/>
		<updated>2026-03-25T16:13:24Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local labels = {}&lt;br /&gt;
&lt;br /&gt;
------------------------------------------ Generic ------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--not sure where to put this&lt;br /&gt;
labels[&amp;quot;Classical&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;classical&amp;quot;},&lt;br /&gt;
	-- &amp;quot;ar&amp;quot;, ca&amp;quot;, &amp;quot;fa&amp;quot;, &amp;quot;id&amp;quot;, la&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;az&amp;quot;, &amp;quot;ja&amp;quot;, &amp;quot;jv&amp;quot;, &amp;quot;kum&amp;quot;, &amp;quot;ms&amp;quot;, &amp;quot;quc&amp;quot;, &amp;quot;sa&amp;quot;, &amp;quot;tl&amp;quot;},&lt;br /&gt;
	special_display = &amp;quot;[[wikt:Classical &amp;lt;canonical_name&amp;gt;]]&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Epigraphic&amp;quot;] = {&lt;br /&gt;
	langs = {&amp;quot;grc&amp;quot;, &amp;quot;pgd&amp;quot;, &amp;quot;pra&amp;quot;, &amp;quot;sa&amp;quot;},&lt;br /&gt;
	special_display = &amp;quot;[[w:Epigraphy|Epigraphic &amp;lt;canonical_name&amp;gt;]]&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;regional&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;regionally&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:regional#English|regional]]&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------------------------ Places ------------------------------------------&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Anatri&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Lower Chuvash&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;cv&amp;quot;}, -- e.g. вот &amp;quot;fire&amp;quot; vs the Upper Chuvash / literary standard вут &lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Australia&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;AU&amp;quot;, &amp;quot;Australian&amp;quot;},&lt;br /&gt;
	-- &amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;mt&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific modules&lt;br /&gt;
	langs = {&amp;quot;el&amp;quot;, &amp;quot;it&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;ru&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Australian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Black Isle&amp;quot;] = {&lt;br /&gt;
	langs = {&amp;quot;sco&amp;quot;}, -- conceivably also en, gd, perhaps enm, but -sche could only find sco&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Bogor&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Brazil&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Brazilian&amp;quot;},&lt;br /&gt;
	-- &amp;quot;pt&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;ja&amp;quot;, &amp;quot;mch&amp;quot;, &amp;quot;vec&amp;quot;, &amp;quot;yi&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Brazilian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Brebes&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Brebian&amp;quot;},&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = &amp;quot;Brebes Regency&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Britain&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Brit&amp;quot;, &amp;quot;British&amp;quot;, &amp;quot;Great Britain&amp;quot;},&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;bn&amp;quot;, &amp;quot;ur&amp;quot;, &amp;quot;vi&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Great Britain&amp;quot;,&lt;br /&gt;
	regional_categories = &amp;quot;British&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Bukovina&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Bucovina&amp;quot;, &amp;quot;Bukovinian&amp;quot;, &amp;quot;Bukowina&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;pl&amp;quot;, &amp;quot;ro&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Bukovinian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Burundi&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Burundian&amp;quot;},&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Burundian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Canada&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Canadian&amp;quot;},&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;gd&amp;quot;, &amp;quot;haa&amp;quot;, &amp;quot;is&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;ru&amp;quot;, &amp;quot;tli&amp;quot;, &amp;quot;vi&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Canadian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;China&amp;quot;] = {&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;ko&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;ja&amp;quot;, &amp;quot;khb&amp;quot;, &amp;quot;kk&amp;quot;, &amp;quot;mhx&amp;quot;, &amp;quot;mn&amp;quot;, &amp;quot;ug&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Chinese&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Cisalpine&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;xcg&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;cel-gau&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Cisalpine Gaulish&amp;quot;,&lt;br /&gt;
	regional_categories = &amp;quot;Cisalpine&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Congo&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Democratic Republic of the Congo&amp;quot;, &amp;quot;Democratic Republic of Congo&amp;quot;, &amp;quot;DR Congo&amp;quot;, &amp;quot;Congo-Kinshasa&amp;quot;, &amp;quot;Republic of the Congo&amp;quot;, &amp;quot;Republic of Congo&amp;quot;, &amp;quot;Congo-Brazzaville&amp;quot;, &amp;quot;Congolese&amp;quot;}, -- these could be split if need be&lt;br /&gt;
	-- &amp;quot;fr&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;avu&amp;quot;, &amp;quot;yom&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Congolese&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Cyprus&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cypriot&amp;quot;, &amp;quot;Cypriot&amp;quot;},&lt;br /&gt;
	-- &amp;quot;ar&amp;quot;, tr&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;el&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Cypriot&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Dobruja&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Dobrogea&amp;quot;, &amp;quot;Dobrujan&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;crh&amp;quot;, &amp;quot;ro&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Dobrujan&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Durban&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Europe&amp;quot;] = {&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;pt&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;ur&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;European&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;France&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;French&amp;quot;},&lt;br /&gt;
	-- &amp;quot;fr&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;la&amp;quot;, &amp;quot;lad&amp;quot;, &amp;quot;nrf&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;yi&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;French&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;India&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Indian&amp;quot;},&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;pa&amp;quot;, &amp;quot;pt&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;bn&amp;quot;, &amp;quot;dv&amp;quot;, &amp;quot;fa&amp;quot;, &amp;quot;ml&amp;quot;, &amp;quot;ta&amp;quot;, &amp;quot;ur&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Indian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Indonesia&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Indonesian&amp;quot;},&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;id&amp;quot;, &amp;quot;jv&amp;quot;, &amp;quot;ms&amp;quot;, &amp;quot;nl&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Indonesian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Israel&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Israeli&amp;quot;},&lt;br /&gt;
	-- &amp;quot;ar&amp;quot;, en&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;ajp&amp;quot;, &amp;quot;he&amp;quot;, &amp;quot;ru&amp;quot;, &amp;quot;yi&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Israeli&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Kalix&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- FIXME: Move to Uyghur label data module&lt;br /&gt;
labels[&amp;quot;Kazakhstan&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Kazakhstani&amp;quot;, &amp;quot;Kazakh&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;ug&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Kazakhstani&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Kemaliye&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Kitti&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = &amp;quot;Kitti, Federated States of Micronesia&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Kukkuzi&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Lucknow&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Luleå&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Lulea&amp;quot;},&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Lviv&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Lvov&amp;quot;, &amp;quot;Lwow&amp;quot;, &amp;quot;Lwów&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;pl&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Muş&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Mush&amp;quot;},&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Myanmar&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Myanmarese&amp;quot;, &amp;quot;Burma&amp;quot;, &amp;quot;Burmese&amp;quot;},&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;my&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module; FIXME: move ksw and mnw to lang-specific modules&lt;br /&gt;
	langs = {&amp;quot;ksw&amp;quot;, &amp;quot;mnw&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Nigeria&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Nigerian&amp;quot;},&lt;br /&gt;
	-- &amp;quot;ar&amp;quot;, en&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;ff&amp;quot;, &amp;quot;guw&amp;quot;, &amp;quot;ha&amp;quot;, &amp;quot;yo&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Nigerian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Palestine&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Palestinian&amp;quot;},&lt;br /&gt;
	-- &amp;quot;ar&amp;quot;, &amp;quot;en&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;ajp&amp;quot;, &amp;quot;arc&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Palestinian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Priangan&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = &amp;quot;Parahyangan&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Rome&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Roma&amp;quot;, &amp;quot;Romano&amp;quot;},&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Roman&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Scania&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Scanian&amp;quot;, &amp;quot;Skanian&amp;quot;, &amp;quot;Skåne&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;gmq-oda&amp;quot;, &amp;quot;sv&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Scanian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Silesia German, Silesia Polish; for differentiation between sli &amp;quot;Silesian East Central German&amp;quot;&lt;br /&gt;
-- don&#039;t add Silesian as alias&lt;br /&gt;
labels[&amp;quot;Silesia&amp;quot;] = {&lt;br /&gt;
	langs = {&amp;quot;de&amp;quot;, &amp;quot;pl&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;South Africa&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;South African&amp;quot;},&lt;br /&gt;
	-- &amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;pt&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;af&amp;quot;, &amp;quot;nl&amp;quot;, &amp;quot;st&amp;quot;, &amp;quot;te&amp;quot;, &amp;quot;yi&amp;quot;, &amp;quot;zu&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;South African&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Spain&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Spanish&amp;quot;, &amp;quot;ES&amp;quot;},&lt;br /&gt;
	-- &amp;quot;ca&amp;quot;, &amp;quot;es&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;la&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Spanish&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Surati&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = &amp;quot;Surat district&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Surgut&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Suriname&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Surinamese&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;car&amp;quot;, &amp;quot;hns&amp;quot;, &amp;quot;jv&amp;quot;, &amp;quot;nl&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Surinamese&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Thailand&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Thai&amp;quot;},&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;khb&amp;quot;, &amp;quot;mnw&amp;quot;, &amp;quot;th&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Thai&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Transalpine&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;xtg&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;cel-gau&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Transalpine Gaulish&amp;quot;,&lt;br /&gt;
	regional_categories = &amp;quot;Transalpine&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;UK&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;United Kingdom&amp;quot;},&lt;br /&gt;
	-- &amp;quot;en&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;bn&amp;quot;, &amp;quot;ur&amp;quot;, &amp;quot;vi&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;United Kingdom&amp;quot;,&lt;br /&gt;
	regional_categories = &amp;quot;British&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Old Ukrainian&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;US&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;U.S.&amp;quot;, &amp;quot;United States&amp;quot;, &amp;quot;United States of America&amp;quot;, &amp;quot;USA&amp;quot;, &amp;quot;America&amp;quot;, &amp;quot;American&amp;quot;}, -- America/American: should these be aliases of &#039;North America&#039;?&lt;br /&gt;
	-- DO NOT include &amp;quot;es&amp;quot; here, otherwise {{lb|es|American}} will categorize in [[:Category:American Spanish]]; see [[:Category:United States Spanish]].&lt;br /&gt;
	-- &amp;quot;de&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;pt&amp;quot;, &amp;quot;zh&amp;quot; handled in lang-specific module&lt;br /&gt;
	langs = {&amp;quot;hi&amp;quot;, &amp;quot;is&amp;quot;, &amp;quot;it&amp;quot;, &amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;nl&amp;quot;, &amp;quot;ru&amp;quot;, &amp;quot;tli&amp;quot;, &amp;quot;ur&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;yi&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;United States&amp;quot;,&lt;br /&gt;
	regional_categories = &amp;quot;American&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Vilhelmina&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Viryal&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Upper Chuvash&amp;quot;},&lt;br /&gt;
	langs = {&amp;quot;cv&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Wallonia&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Wallonian&amp;quot;},&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = &amp;quot;Wallonian&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Special Region of Yogyakarta&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;SR Yogyakarta&amp;quot;},&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Zakarpattia&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = &amp;quot;Zakarpattia Oblast&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed&lt;br /&gt;
labels[&amp;quot;Zululand&amp;quot;] = {&lt;br /&gt;
	langs = {},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------------------------ Chinese romanizations ------------------------------------------&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Hanyu Pinyin&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Hanyu pinyin&amp;quot;, &amp;quot;Pinyin&amp;quot;, &amp;quot;pinyin&amp;quot;},&lt;br /&gt;
	Wikidata = &amp;quot;Q42222&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Postal Romanization&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Postal romanization&amp;quot;, &amp;quot;postal romanization&amp;quot;, &amp;quot;Postal&amp;quot;, &amp;quot;postal&amp;quot;},&lt;br /&gt;
	Wikidata = &amp;quot;Q151868&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Tongyong Pinyin&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Tongyong pinyin&amp;quot;},&lt;br /&gt;
	Wikidata = &amp;quot;Q700739&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Wade–Giles&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Wade-Giles&amp;quot;},&lt;br /&gt;
	Wikidata = &amp;quot;Q208442&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return require(&amp;quot;Module:labels&amp;quot;).finalize_data(labels)&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:labels/data/qualifiers&amp;diff=491552</id>
		<title>Module:labels/data/qualifiers</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:labels/data/qualifiers&amp;diff=491552"/>
		<updated>2026-03-25T16:12:11Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local labels = {}&lt;br /&gt;
&lt;br /&gt;
-- Qualifiers and similar labels.&lt;br /&gt;
&lt;br /&gt;
-- NOTE: This module is loaded both by [[Module:labels]] and by [[Module:accent qualifier]].&lt;br /&gt;
&lt;br /&gt;
-- Helper labels&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;_&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;&amp;quot;,&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;,&amp;quot;] = { -- forced comma&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
	omit_preSpace = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;;&amp;quot;] = {&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
	omit_preSpace = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;:&amp;quot;] = {&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
	omit_preSpace = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;-&amp;quot;] = { -- hyphen&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
	omit_preSpace = true,&lt;br /&gt;
	omit_postSpace = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;–&amp;quot;] = { -- en dash&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
	omit_preSpace = true,&lt;br /&gt;
	omit_postSpace = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;—&amp;quot;] = { -- em dash&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
	omit_preSpace = true,&lt;br /&gt;
	omit_postSpace = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;also&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;and&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;&amp;amp;&amp;quot;},&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- e.g. &amp;quot;informal, but formal in Louisiana&amp;quot;&lt;br /&gt;
labels[&amp;quot;but&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;by&amp;quot;] = {&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- e.g. &amp;quot;except in&amp;quot;, &amp;quot;except with&amp;quot; etc.&lt;br /&gt;
labels[&amp;quot;except&amp;quot;] = {&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;or&amp;quot;] = {&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;outside&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;except in&amp;quot;},&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;with&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;+&amp;quot;},&lt;br /&gt;
	omit_preComma = true,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Qualifier labels&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;attested in&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chiefly&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;mainly&amp;quot;, &amp;quot;mostly&amp;quot;, &amp;quot;primarily&amp;quot;, &amp;quot;Chiefly&amp;quot;},&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;especially&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;excluding&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;exclusively&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;strictly&amp;quot;},&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;extremely&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;formerly&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;frequently&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- e.g. &amp;quot;highly nonstandard&amp;quot;&lt;br /&gt;
labels[&amp;quot;highly&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;in&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;in a&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;in an&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;in the&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;including&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- e.g. &amp;quot;less common&amp;quot;&lt;br /&gt;
labels[&amp;quot;less&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- e.g. &amp;quot;many dialects&amp;quot;&lt;br /&gt;
labels[&amp;quot;many&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;markedly&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mildly&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- e.g. &amp;quot;more common&amp;quot;&lt;br /&gt;
labels[&amp;quot;more&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;now&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;nowadays&amp;quot;},&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;occasionally&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;of&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;of a&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;of an&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;of the&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;often&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;commonly&amp;quot;},&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;originally&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- e.g. &amp;quot;law, otherwise archaic&amp;quot;&lt;br /&gt;
labels[&amp;quot;otherwise&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;particularly&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;possibly&amp;quot;] = {&lt;br /&gt;
--	aliases = {&amp;quot;perhaps&amp;quot;},&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;predominantly&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rarely&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rather&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;relatively&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;slightly&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sometimes&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;somewhat&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;strongly&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;the&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- e.g. &amp;quot;then colloquial, now dated&amp;quot;&lt;br /&gt;
labels[&amp;quot;then&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;typically&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;usually&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;very&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;with a&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;with an&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;with the&amp;quot;] = {&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;with respect to&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;wrt&amp;quot;},&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return require(&amp;quot;Module:labels&amp;quot;).finalize_data(labels)&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:labels&amp;diff=491551</id>
		<title>Module:labels</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:labels&amp;diff=491551"/>
		<updated>2026-03-25T16:11:35Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
export.lang_specific_data_list_module = &amp;quot;Module:labels/data/lang&amp;quot;&lt;br /&gt;
export.lang_specific_data_modules_prefix = &amp;quot;Module:labels/data/lang/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local load_module = &amp;quot;Module:load&amp;quot;&lt;br /&gt;
local parse_utilities_module = &amp;quot;Module:parse utilities&amp;quot;&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
local utilities_module = &amp;quot;Module:utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local require_when_needed = require(&amp;quot;Module:require when needed&amp;quot;)&lt;br /&gt;
local unpack = unpack or table.unpack -- Lua 5.2 compatibility&lt;br /&gt;
local dump = mw.dumpObject&lt;br /&gt;
&lt;br /&gt;
local m_lang_specific_data = mw.loadData(export.lang_specific_data_list_module)&lt;br /&gt;
local m_table = require_when_needed(&amp;quot;Module:table&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
--[==[ intro:&lt;br /&gt;
Labels go through several stages of processing to get from the original (raw) label specified in the Wikicode to the&lt;br /&gt;
final (formatted) label displayed to the user. The following terminology will help keep things straight:&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;raw label&amp;quot; is the label specified in the Wikicode.&lt;br /&gt;
* The &amp;quot;non-canonical label&amp;quot; is the label extracted from the raw label, used for looking up in the label modules in order&lt;br /&gt;
  to fetch the associated label data structure and determine the canonical form of the label. Normally this is the same&lt;br /&gt;
  as the raw label, but it will be different if the raw label is of the form `!&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;` (e.g. `!Australian`)&lt;br /&gt;
  `&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;!&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` (e.g. `Southern US!Southern`). The former syntax indicates that the label&lt;br /&gt;
  should display as-is instead of in its canonical form (which in the example given is `Australia`), and the latter&lt;br /&gt;
  syntax indicates that the label should display in the form specified after the exclamation point.&lt;br /&gt;
* The &amp;quot;canonical label&amp;quot; is the result of applying alias resolution to the non-canonical label. Normally, the&lt;br /&gt;
  canonical label rather than the non-canonical label is what is shown to the user.&lt;br /&gt;
* The &amp;quot;display form of the label&amp;quot; is what is shown to the user, not considering links and HTML that may wrap the&lt;br /&gt;
  display form to get the formatted form of the label. The display form comes from the `.display` field of the module&lt;br /&gt;
  label data for the label; if no such field exists in the label data, it is normally the canonical label. However, if&lt;br /&gt;
  the display override exists (see below), it takes precedence over the `.display` field or canonical label when&lt;br /&gt;
  determining the display form of the label.&lt;br /&gt;
* The &amp;quot;display override&amp;quot;, if specified, overrides all other means of determining the display form of the label. It is&lt;br /&gt;
  specified in two circumstances, i.e. in the `!&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;` and `&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;!&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` raw label&lt;br /&gt;
  formats (i.e. in the same cirumstances where the raw label and non-canonical label are different).&lt;br /&gt;
* The &amp;quot;formatted form of the label&amp;quot; is the final form of the label shown directly to the user. It generally appears to&lt;br /&gt;
  the user as the display form of the label, but in the Wikicode, the formatted form may wrap the display form with a&lt;br /&gt;
  link to Wikipedia, the Wiktionary glossary or another Wiktionary entry, and that link in turn may be wrapped in an&lt;br /&gt;
  HTML span with a &amp;quot;deprecated&amp;quot; CSS class attached, causing the label to display differently (to indicate that it is&lt;br /&gt;
  deprecated).&lt;br /&gt;
]==]&lt;br /&gt;
&lt;br /&gt;
-- for testing&lt;br /&gt;
local force_cat = false&lt;br /&gt;
&lt;br /&gt;
local m_headword_data = mw.loadData(&amp;quot;Module:headword/data&amp;quot;)&lt;br /&gt;
local SUBPAGENAME = m_headword_data.pagename&lt;br /&gt;
&lt;br /&gt;
-- Disable tracking on heavy pages to save time.&lt;br /&gt;
local pages_where_tracking_is_disabled = m_headword_data.large_pages&lt;br /&gt;
&lt;br /&gt;
local function ucfirst(txt)&lt;br /&gt;
	return mw.getContentLanguage():ucfirst(txt)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local mode_to_outer_class = {&lt;br /&gt;
	[&amp;quot;label&amp;quot;] = &amp;quot;usage-label-sense&amp;quot;,&lt;br /&gt;
	[&amp;quot;term-label&amp;quot;] = &amp;quot;usage-label-term&amp;quot;,&lt;br /&gt;
	[&amp;quot;accent&amp;quot;] = &amp;quot;usage-label-accent&amp;quot;,&lt;br /&gt;
	[&amp;quot;form-of&amp;quot;] = &amp;quot;usage-label-form-of&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local mode_to_property_prefix = {&lt;br /&gt;
	[&amp;quot;label&amp;quot;] = false,&lt;br /&gt;
	[&amp;quot;term-label&amp;quot;] = false, -- handled specially&lt;br /&gt;
	[&amp;quot;accent&amp;quot;] = &amp;quot;accent_&amp;quot;,&lt;br /&gt;
	[&amp;quot;form-of&amp;quot;] = &amp;quot;form_of_&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function validate_mode(mode)&lt;br /&gt;
	mode = mode or &amp;quot;label&amp;quot;&lt;br /&gt;
	if not mode_to_outer_class[mode] then&lt;br /&gt;
		local allowed_values = {}&lt;br /&gt;
		for key, _ in pairs(mode_to_outer_class) do&lt;br /&gt;
			insert(allowed_values, &amp;quot;&#039;&amp;quot; .. key .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(allowed_values)&lt;br /&gt;
		error((&amp;quot;Invalid value &#039;%s&#039; for `mode`; should be one of %s&amp;quot;):format(mode, table.concat(allowed_values, &amp;quot;, &amp;quot;)))&lt;br /&gt;
	end&lt;br /&gt;
	return mode&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getprop(labdata, mode, prop)&lt;br /&gt;
	local mode_prefix = mode_to_property_prefix[mode]&lt;br /&gt;
	return mode_prefix and labdata[mode_prefix .. prop] or labdata[prop]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function check_type(label, lang, prop, value, expected_types)&lt;br /&gt;
	if value == nil or expected_types == nil then&lt;br /&gt;
		return value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(expected_types) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		expected_types = {expected_types}&lt;br /&gt;
	end&lt;br /&gt;
	local valtype = type(value)&lt;br /&gt;
	local matches = false&lt;br /&gt;
	for _, expected_type in ipairs(expected_types) do&lt;br /&gt;
		if type(expected_type) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			if valtype == expected_type then&lt;br /&gt;
				matches = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		elseif value == expected_type then&lt;br /&gt;
			matches = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not matches then&lt;br /&gt;
		local function join_untagged_or(elements)&lt;br /&gt;
			return m_table.serialCommaJoin(elements, {conj = &amp;quot;or&amp;quot;, dontTag = true})&lt;br /&gt;
		end&lt;br /&gt;
		local quoted_types = {}&lt;br /&gt;
		local quoted_values = {}&lt;br /&gt;
		for _, expected_type in ipairs(expected_types) do&lt;br /&gt;
			if type(expected_type) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				insert(quoted_types, &amp;quot;&#039;&amp;quot; .. expected_type .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				insert(quoted_values, &amp;quot;&#039;&amp;quot; .. dump(expected_type) .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local possible_matches = {}&lt;br /&gt;
		if quoted_types[1] then&lt;br /&gt;
			insert(possible_matches, (&amp;quot;be of type%s %s&amp;quot;):format(&lt;br /&gt;
				quoted_types[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;, join_untagged_or(quoted_types)))&lt;br /&gt;
		end&lt;br /&gt;
		if quoted_values[1] then&lt;br /&gt;
			insert(possible_matches, (&amp;quot;have  the value%s %s&amp;quot;):format(&lt;br /&gt;
				quoted_values[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;, join_untagged_or(quoted_values)))&lt;br /&gt;
		end&lt;br /&gt;
		error((&amp;quot;Internal error: For label &#039;%s&#039;, langcode &#039;%s&#039;, property &#039;%s&#039; should %s but is of type &#039;%s&#039; with value %s&amp;quot;):format(&lt;br /&gt;
			label, lang and lang:getCode() or &amp;quot;UNKNOWN&amp;quot;, prop, join_untagged_or(possible_matches), valtype, dump(value)))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- HACK! For languages in any of the given families, check the specified-language Wikipedia for appropriate&lt;br /&gt;
-- Wikipedia articles for the language in question (esp. useful for obscure etymology-only languages that may not&lt;br /&gt;
-- have English articles for them, like many Chinese lects).&lt;br /&gt;
local families_to_wikipedia_languages = {&lt;br /&gt;
	{&amp;quot;zhx&amp;quot;, &amp;quot;zh&amp;quot;},&lt;br /&gt;
	{&amp;quot;sem-arb&amp;quot;, &amp;quot;ar&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Given language `lang` (a full language, etymology-language or family), fetch a list of Wikimedia languages to check&lt;br /&gt;
when converting a Wikidata item to a Wikipedia article. English is always first, followed by the Wikimedia language&lt;br /&gt;
code(s) of `lang` if `lang` is a language (which may or may not be the same as `lang`&#039;s Wiktionary code), followed&lt;br /&gt;
by the macrolanguage of `lang` for certain languages and families (currently, only languages and families in the Chinese&lt;br /&gt;
and Arabic families). If `lang` is nil, only return English. Note that the same code may occur more than once in the&lt;br /&gt;
list. This is exported because it&#039;s also used by [[Module:category tree/poscatboiler/data/language varieties]].&lt;br /&gt;
]==]&lt;br /&gt;
function export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang)&lt;br /&gt;
	local wikipedia_langs = {}&lt;br /&gt;
	insert(wikipedia_langs, &amp;quot;en&amp;quot;)&lt;br /&gt;
	if lang then&lt;br /&gt;
		local article_lang = lang&lt;br /&gt;
		while article_lang do&lt;br /&gt;
			if article_lang:hasType(&amp;quot;language&amp;quot;) then&lt;br /&gt;
				local wmcodes = article_lang:getWikimediaLanguageCodes()&lt;br /&gt;
				for _, wmcode in ipairs(wmcodes) do&lt;br /&gt;
					insert(wikipedia_langs, wmcode)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			article_lang = article_lang:getParent()&lt;br /&gt;
		end&lt;br /&gt;
		for _, family_to_wp_lang in ipairs(families_to_wikipedia_languages) do&lt;br /&gt;
			local family, wp_lang = unpack(family_to_wp_lang)&lt;br /&gt;
			if lang:inFamily(family) then&lt;br /&gt;
				insert(wikipedia_langs, wp_lang)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return wikipedia_langs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Fetch the categories to add to a page, given that the label whose canonical form is `canon_label` with language `lang`&lt;br /&gt;
has been seen. `labdata` is the label data structure for `label`, fetched from the appropriate submodule. `mode`&lt;br /&gt;
specifies how the label was invoked (see {get_label_info()} for more information). The return value is a list of the&lt;br /&gt;
actual categories, unless `for_doc` is specified, in which case the categories returned are marked up for display on a&lt;br /&gt;
documentation page. If `for_doc` is given, `lang` may be nil to format the categories in a language-independent fashion;&lt;br /&gt;
otherwise, it must be specified. If `category_types` is specified, it should be a set object (i.e. with category types&lt;br /&gt;
as keys and {true} as values), and only categories of the specified types will be returned.&lt;br /&gt;
]==]&lt;br /&gt;
function export.fetch_categories(canon_label, labdata, lang, mode, for_doc, category_types)&lt;br /&gt;
	local categories = {}&lt;br /&gt;
&lt;br /&gt;
	mode = validate_mode(mode)&lt;br /&gt;
	local langcode, canonical_name&lt;br /&gt;
	if lang then&lt;br /&gt;
		langcode = lang:getFullCode()&lt;br /&gt;
		canonical_name = lang:getFullName()&lt;br /&gt;
	elseif for_doc then&lt;br /&gt;
		langcode = &amp;quot;&amp;lt;var&amp;gt;[langcode]&amp;lt;/var&amp;gt;&amp;quot;&lt;br /&gt;
		canonical_name = &amp;quot;&amp;lt;var&amp;gt;[language name]&amp;lt;/var&amp;gt;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;quot;Internal error: Must specify `lang` unless `for_doc` is given&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function labprop(prop, expected_types)&lt;br /&gt;
		local retval = getprop(labdata, mode, prop)&lt;br /&gt;
		check_type(canon_label, lang, prop, retval, expected_types)&lt;br /&gt;
		return retval&lt;br /&gt;
	end&lt;br /&gt;
	local empty_list = {}&lt;br /&gt;
	local function get_cats(cat_type)&lt;br /&gt;
		if category_types and not category_types[cat_type] then&lt;br /&gt;
			return empty_list&lt;br /&gt;
		end&lt;br /&gt;
		local cats = labprop(cat_type)&lt;br /&gt;
		if not cats then&lt;br /&gt;
			return empty_list&lt;br /&gt;
		end&lt;br /&gt;
		if type(cats) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
			return {cats}&lt;br /&gt;
		end&lt;br /&gt;
		return cats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local topical_categories = get_cats(&amp;quot;topical_categories&amp;quot;)&lt;br /&gt;
	local sense_categories = get_cats(&amp;quot;sense_categories&amp;quot;)&lt;br /&gt;
	local pos_categories = get_cats(&amp;quot;pos_categories&amp;quot;)&lt;br /&gt;
	local regional_categories = get_cats(&amp;quot;regional_categories&amp;quot;)&lt;br /&gt;
	local plain_categories = get_cats(&amp;quot;plain_categories&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local function insert_cat(cat, sense_cat)&lt;br /&gt;
		if for_doc then&lt;br /&gt;
			cat = &amp;quot;&amp;lt;code&amp;gt;&amp;quot; .. cat .. &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
			if sense_cat then&lt;br /&gt;
				if mode == &amp;quot;term-label&amp;quot; then&lt;br /&gt;
					cat = cat .. &amp;quot; (using {{tl|tlb}})&amp;quot;&lt;br /&gt;
				else&lt;br /&gt;
					cat = cat .. &amp;quot; (using {{tl|lb}} or form-of template)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				cat = mw.getCurrentFrame():preprocess(cat)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		insert(categories, cat)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(topical_categories) do&lt;br /&gt;
		insert_cat(langcode .. &amp;quot;:&amp;quot; .. (cat == true and ucfirst(canon_label) or cat))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(sense_categories) do&lt;br /&gt;
		if cat == true then&lt;br /&gt;
			cat = canon_label&lt;br /&gt;
		end&lt;br /&gt;
		cat = mode == &amp;quot;term-label&amp;quot; and cat .. &amp;quot; terms&amp;quot; or &amp;quot;terms with &amp;quot; .. cat .. &amp;quot; senses&amp;quot;&lt;br /&gt;
		insert_cat(canonical_name .. &amp;quot; &amp;quot; .. cat, true)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(pos_categories) do&lt;br /&gt;
		insert_cat(canonical_name .. &amp;quot; &amp;quot; .. (cat == true and canon_label or cat))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(regional_categories) do&lt;br /&gt;
		insert_cat((cat == true and ucfirst(canon_label) or cat) .. &amp;quot; &amp;quot; .. canonical_name)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(plain_categories) do&lt;br /&gt;
		insert_cat(cat == true and ucfirst(canon_label) or cat)&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;
Return the list of all labels data modules for a label whose language is `lang`. The return value is a list of&lt;br /&gt;
module names, with overriding modules earlier in the list (that is, if a label occurs in two modules in the list,&lt;br /&gt;
the earlier-listed module takes precedence). If `lang` is nil, only return non-language-specific submodules.&lt;br /&gt;
]==]&lt;br /&gt;
function export.get_submodules(lang)&lt;br /&gt;
	local submodules = {&lt;br /&gt;
		&amp;quot;Module:labels/data&amp;quot;,&lt;br /&gt;
		&amp;quot;Module:labels/data/qualifiers&amp;quot;,&lt;br /&gt;
		&amp;quot;Module:labels/data/regional&amp;quot;,&lt;br /&gt;
		&amp;quot;Module:labels/data/topical&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if not lang then&lt;br /&gt;
		return submodules&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- get language-specific labels from data module&lt;br /&gt;
	local langcode = lang:getFullCode()&lt;br /&gt;
&lt;br /&gt;
	if m_lang_specific_data.langs_with_lang_specific_modules[langcode] then&lt;br /&gt;
		-- prefer per-language label in order to pick subvariety labels over regional ones&lt;br /&gt;
		insert(submodules, 1, export.lang_specific_data_modules_prefix .. langcode)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return submodules&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return the formatted form of a label `label` (which should be the canonical form of the label; see comment at top),&lt;br /&gt;
given (a) the label data structure `labdata` from one of the data modules; (b) the language object `lang` of the&lt;br /&gt;
language being processed, or nil for no language; (c) `deprecated` (true if the label is deprecated, otherwise the&lt;br /&gt;
deprecation information is taken from `labdata`); (d) `override_display` (if specified, override the display form of the&lt;br /&gt;
label with the specified string, instead of any value in `labdata.display` or `labdata.special_display` or the canonical&lt;br /&gt;
label in `label` itself); (e) `mode` (same as `data.mode` passed to {get_label_info()}). Returns two values: the&lt;br /&gt;
formatted label form and a boolean indicating whether the label is deprecated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE: Under normal circumstances, do not use this.&#039;&#039;&#039; Instead, use {get_label_info()}, which searches all the data&lt;br /&gt;
modules for a given label and handles other complications.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_label(label, labdata, lang, deprecated, override_display, mode)&lt;br /&gt;
	local formatted_label&lt;br /&gt;
&lt;br /&gt;
	mode = validate_mode(mode)&lt;br /&gt;
	local function labprop(prop, expected_types)&lt;br /&gt;
		local retval = getprop(labdata, mode, prop)&lt;br /&gt;
		check_type(label, lang, prop, retval, expected_types)&lt;br /&gt;
		return retval&lt;br /&gt;
	end&lt;br /&gt;
	deprecated = deprecated or labprop(&amp;quot;deprecated&amp;quot;)&lt;br /&gt;
	if not override_display and labprop(&amp;quot;special_display&amp;quot;) then&lt;br /&gt;
		local function add_language_name(str)&lt;br /&gt;
			if str == &amp;quot;canonical_name&amp;quot; then&lt;br /&gt;
				if lang then&lt;br /&gt;
					return lang:getFullName()&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;&amp;lt;code&amp;gt;&amp;lt;var&amp;gt;[language name]&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		formatted_label = labprop(&amp;quot;special_display&amp;quot;, &amp;quot;string&amp;quot;):gsub(&amp;quot;&amp;lt;(.-)&amp;gt;&amp;quot;, add_language_name)&lt;br /&gt;
	else&lt;br /&gt;
		--[=[&lt;br /&gt;
			We proceed as follows:&lt;br /&gt;
			1. The display form comes from either (a) the `override_display` variable if set (this happens when&lt;br /&gt;
			   the user uses a label like &#039;!British&#039;); (b) the `display` property, if set; or (c) the label iself.&lt;br /&gt;
			2. If the display form contains a link, use it directly and ignore the other display-related settings.&lt;br /&gt;
			   (NOTE: Settings `Wikipedia` and `Wikidata` may still be used on the category page itself, by the&lt;br /&gt;
			   category tree code.)&lt;br /&gt;
			3. Otherwise, use one of the other display-related settings, in the following order:&lt;br /&gt;
			   `glossary` &amp;gt; `Wiktionary` &amp;gt; `Wikipedia` &amp;gt; `Wikidata`. Specifically:&lt;br /&gt;
			   a. If any of the values is equal to `true`, that is equivalent to specifying a string consisting of&lt;br /&gt;
				  the canonical label.&lt;br /&gt;
			   b. If `glossary` is set, it specifies the anchor in [[Appendix:Glossary]].&lt;br /&gt;
			   c. If `Wiktionary` is set, it specifies an arbitrary Wiktionary page or page + anchor (e.g. a&lt;br /&gt;
				  separate Appendix entry).&lt;br /&gt;
			   d. If `Wikipedia` is set, it specifies an arbitrary Wikipedia article, or a list of such items (in&lt;br /&gt;
				  this case, we select the first one, but the category tree uses all of them).&lt;br /&gt;
			   e. If `Wikidata` is set, it specifies an arbitrary Wikidata item to retrieve a Wikipedia article from,&lt;br /&gt;
				  or a list of such items (in this case, we select the first one, but the category tree uses all of&lt;br /&gt;
				  them). If the item is of the form `wmcode:id`, the Wikipedia article corresponding to `id` in the&lt;br /&gt;
				  `wmcode`-language Wikipedia is fetched if available. Otherwise, the English-language Wikipedia&lt;br /&gt;
				  article corresponding to `id` is retrieved if available, falling back to the Wikimedia language(s)&lt;br /&gt;
				  corresponding to `lang` and then (in certain cases) to the macrolanguage that `lang` is part of.&lt;br /&gt;
&lt;br /&gt;
			Note that if `mode` is specified, prefixed properties (e.g. `accent_display` for `mode` == &amp;quot;accent&amp;quot;,&lt;br /&gt;
			`form_display` for `mode` == &amp;quot;form&amp;quot;) are checked before the bare equivalent (e.g. `display`).&lt;br /&gt;
		]=]&lt;br /&gt;
		local display = override_display or labprop(&amp;quot;display&amp;quot;, &amp;quot;string&amp;quot;) or label&lt;br /&gt;
&lt;br /&gt;
		-- There are several &#039;Foo spelling&#039; labels specially designed for use in the |from= param in&lt;br /&gt;
		-- {{alternative form of}}, {{standard spelling of}} and the like. Often the display includes the word&lt;br /&gt;
		-- &amp;quot;spelling&amp;quot; at the end (e.g. if it&#039;s defaulted), which is useful when the label is used with {{tl|lb}} or&lt;br /&gt;
		-- {{tl|tlb}}; but it causes redundancy when used with the form-of templates, which add the word &amp;quot;form&amp;quot;,&lt;br /&gt;
		-- &amp;quot;spelling&amp;quot;, &amp;quot;standard spelling&amp;quot;, etc. after the label.&lt;br /&gt;
		if mode == &amp;quot;form-of&amp;quot; then&lt;br /&gt;
			display = display:gsub(&amp;quot; spelling$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if display:find(&amp;quot;%[%[&amp;quot;) then&lt;br /&gt;
			formatted_label = display&lt;br /&gt;
		else&lt;br /&gt;
			local glossary = labprop(&amp;quot;glossary&amp;quot;, {&amp;quot;string&amp;quot;, true})&lt;br /&gt;
			local Wiktionary = labprop(&amp;quot;Wiktionary&amp;quot;, {&amp;quot;string&amp;quot;, true})&lt;br /&gt;
			local Wikipedia = labprop(&amp;quot;Wikipedia&amp;quot;, {&amp;quot;string&amp;quot;, true, &amp;quot;table&amp;quot;})&lt;br /&gt;
			local Wikidata = labprop(&amp;quot;Wikidata&amp;quot;, {&amp;quot;string&amp;quot;, true, &amp;quot;table&amp;quot;})&lt;br /&gt;
			if glossary then&lt;br /&gt;
				local glossary_entry = glossary == true and label or glossary&lt;br /&gt;
				formatted_label = &amp;quot;[[wikt:Appendix:Glossary#&amp;quot; .. glossary_entry .. &amp;quot;|&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			elseif Wiktionary then&lt;br /&gt;
				local Wiktionary_entry = Wiktionary == true and label or Wiktionary&lt;br /&gt;
				if Wiktionary == display then&lt;br /&gt;
					formatted_label = &amp;quot;[[wikt:&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
				else&lt;br /&gt;
					formatted_label = &amp;quot;[[wikt:&amp;quot; .. Wiktionary_entry .. &amp;quot;|&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			elseif Wikipedia then&lt;br /&gt;
				if type(Wikipedia) == &amp;quot;table&amp;quot; then&lt;br /&gt;
					Wikipedia = Wikipedia[1]&lt;br /&gt;
				end&lt;br /&gt;
				local Wikipedia_entry = Wikipedia == true and label or Wikipedia&lt;br /&gt;
				formatted_label = &amp;quot;[[w:&amp;quot; .. Wikipedia_entry .. &amp;quot;|&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			elseif Wikidata then&lt;br /&gt;
				if not mw.wikibase then&lt;br /&gt;
					error((&amp;quot;Unable to retrieve data from Wikidata ID for label &#039;%s&#039;; `mw.wikibase` not defined&amp;quot;&lt;br /&gt;
						):format(label))&lt;br /&gt;
				end&lt;br /&gt;
				local function make_formatted_label(wmcode, id)&lt;br /&gt;
					local article = mw.wikibase.sitelink(id, wmcode .. &amp;quot;wiki&amp;quot;)&lt;br /&gt;
					if article then&lt;br /&gt;
						local link = wmcode == &amp;quot;en&amp;quot; and &amp;quot;w:&amp;quot; .. article or &amp;quot;w:&amp;quot; .. wmcode .. &amp;quot;:&amp;quot; .. article&lt;br /&gt;
						return (&amp;quot;[[%s|%s]]&amp;quot;):format(link, display)&lt;br /&gt;
					else&lt;br /&gt;
						return nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if type(Wikidata) == &amp;quot;table&amp;quot; then&lt;br /&gt;
					Wikidata = Wikidata[1]&lt;br /&gt;
				end&lt;br /&gt;
				local wmcode, id = Wikidata:match(&amp;quot;^(.*):(.*)$&amp;quot;)&lt;br /&gt;
				if wmcode then&lt;br /&gt;
					formatted_label = make_formatted_label(wmcode, id)&lt;br /&gt;
				else&lt;br /&gt;
					local langs_to_check = export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang)&lt;br /&gt;
					for _, wmcode in ipairs(langs_to_check) do&lt;br /&gt;
						formatted_label = make_formatted_label(wmcode, Wikidata)&lt;br /&gt;
						if formatted_label then&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				formatted_label = formatted_label or display&lt;br /&gt;
			else&lt;br /&gt;
				formatted_label = display&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if deprecated then&lt;br /&gt;
		formatted_label = &#039;&amp;lt;span class=&amp;quot;deprecated-label&amp;quot;&amp;gt;&#039; .. formatted_label .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return formatted_label, deprecated&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return information on a label. On input `data` is an object with the following fields:&lt;br /&gt;
* `label`: The raw label to return information on.&lt;br /&gt;
* `lang`: The language of the label. Must be specified unless `for_doc` is given.&lt;br /&gt;
* `mode`: How the label was invoked. One of the following:&lt;br /&gt;
  ** {nil} or {&amp;quot;label&amp;quot;}: invoked through {{tl|lb}} or another template whose labels in the same fashion, e.g.&lt;br /&gt;
     {{tl|alt}}, {{tl|quote}} or {{tl|syn}};&lt;br /&gt;
  ** {&amp;quot;term-label&amp;quot;}: invoked through {{tl|tlb}};&lt;br /&gt;
  ** {&amp;quot;accent&amp;quot;}: invoked through {{tl|a}} or the {{para|a}} or {{para|aa}} parameters of other pronunciation templates,&lt;br /&gt;
     such as {{tl|IPA}}, {{tl|rhymes}} or {{tl|homophones}};&lt;br /&gt;
  ** {&amp;quot;form-of&amp;quot;}: invoked through {{tl|alt form}}, {{tl|standard spelling of}} or other form-of template.&lt;br /&gt;
  This changes the display and/or categorization of a minority of labels. (The majority work the same for all modes.)&lt;br /&gt;
* `for_doc`: Data is being fetched for documentation purposes. This causes the raw categories returned in&lt;br /&gt;
  `categories` to be formatted for documentation display.&lt;br /&gt;
* `nocat`: If true, don&#039;t add the label to any categories.&lt;br /&gt;
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion&lt;br /&gt;
   pages).&lt;br /&gt;
* `notrack`: Disable all tracking for this label.&lt;br /&gt;
* `sort`: Sort key for categorization.&lt;br /&gt;
* `already_seen`: An object used to track labels already seen, so they aren&#039;t displayed twice. Tracking is according&lt;br /&gt;
  to the display form of the label, so if two labels have the same display form, the second one won&#039;t be displayed&lt;br /&gt;
  (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn&#039;t happen.&lt;br /&gt;
&lt;br /&gt;
The return value is an object with the following fields:&lt;br /&gt;
* `raw_text`: If specified, the object does not describe a label but simply raw text surrounding labels. This occurs&lt;br /&gt;
  when double angle bracket (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;) notation is used. {get_label_info()} does not currently return objects with this&lt;br /&gt;
  field set, but {process_raw_labels()} does. The value is {&amp;quot;begin&amp;quot;} (this is the first raw text portion derived from&lt;br /&gt;
  a double angle bracket spec, provided there are at least two raw text portions); {&amp;quot;end&amp;quot;} (this is the last raw text&lt;br /&gt;
  portion derived from a double angle bracket spec, provided there are at least two portions); {&amp;quot;middle&amp;quot;} (this is&lt;br /&gt;
  neither the first nor the last raw text portion); or {&amp;quot;only&amp;quot;} (this is a raw text portion standing by itself). The&lt;br /&gt;
  particular value determines the handling of commas and spaces on one or both sides of the raw text. If this field is&lt;br /&gt;
  specified, only the `label` field (containing the actual raw text) and the `category` field (containing an empty list)&lt;br /&gt;
  are set; all other fields are {nil}.&lt;br /&gt;
* `raw_label`: The raw label that was passed in.&lt;br /&gt;
* `non_canonical`: The label prior to canonicalization (i.e. alias resolution). Usually this is the same as `raw_label`,&lt;br /&gt;
  but if the raw label was preceded by an exclamation point (meaning &amp;quot;display the raw label as-is&amp;quot;), this field will&lt;br /&gt;
  contain the label stripped of the exclamation point, and if the raw label is of the form&lt;br /&gt;
  `&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;!&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` (meaning &amp;quot;display the label in the specified form&amp;quot;), this field will contain the&lt;br /&gt;
  label before the exclamation point.&lt;br /&gt;
* `canonical`: If the label in `non_canonical` is an alias, this contains the canonical name of the label; otherwise it&lt;br /&gt;
  will be {nil}.&lt;br /&gt;
* `override_display`: If specified, this contains a string that overrides the normal display form of the label. The&lt;br /&gt;
  display form of a label is the `.display` field of the label data if present, and otherwise is normally the canonical&lt;br /&gt;
  form of the label (i.e. after alias resolution). (This is not the same as the formatted form of the label, found in&lt;br /&gt;
  `label`, which is the final form shown to the user and includes links to Wikipedia, the glossary, etc. as well as an&lt;br /&gt;
  HTML wrapper if the label is deprecated.) If `override_display` is specified, however, this is used in place of the&lt;br /&gt;
  normal display form of the label. This currently happens in two circumstances: (1) the label was preceded by ! to&lt;br /&gt;
  indicate that the raw label should be displayed rather than the canonical form; (2) the label was given in the form&lt;br /&gt;
  `&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;!&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` (meaning &amp;quot;display the label in the specified `&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` form&amp;quot;).&lt;br /&gt;
* `label`: The formatted form of the label. This is what is actually shown to the user. If the label is recognized&lt;br /&gt;
  (found in some module), this will typically be in the form of a link.&lt;br /&gt;
* `categories`: A list of the categories to add the label to; an empty list if `nocat` was specified.&lt;br /&gt;
* `formatted_categories`: A string containing the formatted categories; {nil} if `nocat` or `for_doc` was specified,&lt;br /&gt;
  or if `categories` is empty. Currently will be an empty string if there are categories to format but the namespace is&lt;br /&gt;
  one that normally excludes categories (e.g. userspace and discussion pages), and `force_cat` isn&#039;t specified.&lt;br /&gt;
* `deprecated`: True if the label is deprecated.&lt;br /&gt;
* `recognized`: If true, the label was found in some module.&lt;br /&gt;
* `data`: The data structure for the label, as fetched from the label modules. For unrecognized labels, this will&lt;br /&gt;
  be an empty object.&lt;br /&gt;
]==]&lt;br /&gt;
function export.get_label_info(data)&lt;br /&gt;
	if not data.label then&lt;br /&gt;
		error(&amp;quot;`data` must now be an object containing the params&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local mode = validate_mode(data.mode)&lt;br /&gt;
	local ret = {categories = {}}&lt;br /&gt;
	local label = data.label&lt;br /&gt;
	local raw_label = label&lt;br /&gt;
	ret.raw_label = raw_label&lt;br /&gt;
	local override_display&lt;br /&gt;
	if label:find(&amp;quot;^!&amp;quot;) then&lt;br /&gt;
		label = label:gsub(&amp;quot;^!&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		override_display = label&lt;br /&gt;
	elseif label:find(&amp;quot;![^%s]&amp;quot;) then&lt;br /&gt;
		label, override_display = label:match(&amp;quot;^(.-)!([^%s].*)$&amp;quot;)&lt;br /&gt;
		if not label then&lt;br /&gt;
			error((&amp;quot;Internal error: This Lua pattern should never fail to match for label &#039;%s&#039;&amp;quot;):format(raw_label))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local non_canonical = label&lt;br /&gt;
	ret.non_canonical = non_canonical&lt;br /&gt;
	local deprecated = false&lt;br /&gt;
	local labdata&lt;br /&gt;
	local submodule&lt;br /&gt;
	local data_langcode = data.lang and data.lang:getCode() or nil&lt;br /&gt;
&lt;br /&gt;
	local submodules_to_check = export.get_submodules(data.lang)&lt;br /&gt;
	for _, submodule_to_check in ipairs(submodules_to_check) do&lt;br /&gt;
		submodule = mw.loadData(submodule_to_check)&lt;br /&gt;
		local this_labdata = submodule[label]&lt;br /&gt;
		local resolved_label&lt;br /&gt;
		if type(this_labdata) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			resolved_label = this_labdata&lt;br /&gt;
			this_labdata = submodule[this_labdata]&lt;br /&gt;
			if not this_labdata then&lt;br /&gt;
				error((&amp;quot;Internal error: Label alias &#039;%s&#039; points to &#039;%s&#039;, which is undefined in module [[%s]]&amp;quot;):format(&lt;br /&gt;
					label, resolved_label, submodule_to_check))&lt;br /&gt;
			end&lt;br /&gt;
			if type(this_labdata) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				error((&amp;quot;Internal error: Label alias &#039;%s&#039; points to &#039;%s&#039;, which is also an alias (of &#039;%s&#039;) in module [[%s]]&amp;quot;):format(&lt;br /&gt;
					label, resolved_label, this_labdata, submodule_to_check))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if this_labdata then&lt;br /&gt;
			-- Make sure either there&#039;s no lang restriction, or we&#039;re processing lang-independent, or our language&lt;br /&gt;
			-- is among the listed languages. Otherwise, continue processing (which could conceivably pick up a&lt;br /&gt;
			-- lang-appropriate version of the label in another label data module).&lt;br /&gt;
			local lablangs = getprop(this_labdata, mode, &amp;quot;langs&amp;quot;)&lt;br /&gt;
			if not lablangs or not data_langcode then&lt;br /&gt;
				labdata = this_labdata&lt;br /&gt;
				label = resolved_label or label&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			local lang_in_list = false&lt;br /&gt;
			for _, langcode in ipairs(lablangs) do&lt;br /&gt;
				if langcode == data_langcode then&lt;br /&gt;
					lang_in_list = true&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if lang_in_list then&lt;br /&gt;
				labdata = this_labdata&lt;br /&gt;
				label = resolved_label or label&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if labdata then&lt;br /&gt;
		ret.recognized = true&lt;br /&gt;
	else&lt;br /&gt;
		labdata = {}&lt;br /&gt;
		ret.recognized = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function labprop(prop)&lt;br /&gt;
		return getprop(labdata, mode, prop)&lt;br /&gt;
	end&lt;br /&gt;
	if labprop(&amp;quot;deprecated&amp;quot;) then&lt;br /&gt;
		deprecated = true&lt;br /&gt;
	end&lt;br /&gt;
	if label ~= non_canonical then&lt;br /&gt;
		-- Note that this is an alias and store the canonical version.&lt;br /&gt;
		ret.canonical = label&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local formatted_label&lt;br /&gt;
	formatted_label, deprecated = export.format_label(label, labdata, data.lang, deprecated, override_display, mode)&lt;br /&gt;
	ret.deprecated = deprecated&lt;br /&gt;
	if deprecated then&lt;br /&gt;
		if not data.nocat then&lt;br /&gt;
			local depcat = &amp;quot;Entries with deprecated labels&amp;quot;&lt;br /&gt;
			if data.for_doc then&lt;br /&gt;
				depcat = &amp;quot;&amp;lt;code&amp;gt;&amp;quot; .. depcat .. &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			insert(ret.categories, depcat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local label_for_already_seen =&lt;br /&gt;
		(labprop(&amp;quot;topical_categories&amp;quot;) or labprop(&amp;quot;regional_categories&amp;quot;)&lt;br /&gt;
		or labprop(&amp;quot;plain_categories&amp;quot;) or labprop(&amp;quot;pos_categories&amp;quot;)&lt;br /&gt;
		or labprop(&amp;quot;sense_categories&amp;quot;)) and formatted_label&lt;br /&gt;
		or nil&lt;br /&gt;
&lt;br /&gt;
	-- Track label text. If label text was previously used, don&#039;t show it, but include the categories.&lt;br /&gt;
	-- For an example, see [[hypocretin]].&lt;br /&gt;
	if data.already_seen and data.already_seen[label_for_already_seen] then&lt;br /&gt;
		ret.label = &amp;quot;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		if formatted_label:find(&amp;quot;{&amp;quot;) then&lt;br /&gt;
			formatted_label = mw.getCurrentFrame():preprocess(formatted_label)&lt;br /&gt;
		end&lt;br /&gt;
		ret.label = formatted_label&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if data.nocat then&lt;br /&gt;
		-- do nothing&lt;br /&gt;
	else&lt;br /&gt;
		local cats = export.fetch_categories(label, labdata, data.lang, mode, data.for_doc)&lt;br /&gt;
		for _, cat in ipairs(cats) do&lt;br /&gt;
			insert(ret.categories, cat)&lt;br /&gt;
		end&lt;br /&gt;
		if not ret.categories[1] or data.for_doc then&lt;br /&gt;
			-- Don&#039;t try to format categories if we&#039;re doing this for documentation ({{label/doc}}), because there&lt;br /&gt;
			-- will be HTML in the categories.&lt;br /&gt;
			-- do nothing&lt;br /&gt;
		else&lt;br /&gt;
			ret.formatted_categories = require(utilities_module).format_categories(ret.categories, data.lang,&lt;br /&gt;
				data.sort, nil, force_cat or data.force_cat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret.data = labdata&lt;br /&gt;
&lt;br /&gt;
	if label_for_already_seen and data.already_seen then&lt;br /&gt;
		data.already_seen[label_for_already_seen] = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Split a string containing comma-separated raw labels into the individual labels. This will not split on a comma&lt;br /&gt;
followed by whitespace, and it will not split inside of matched &amp;lt;...&amp;gt; or [...]. The code is written to be efficient, so&lt;br /&gt;
that it does not load modules (e.g. [[Module:parse utilities]]) unnecessarily.&lt;br /&gt;
]==]&lt;br /&gt;
function export.split_labels_on_comma(term)&lt;br /&gt;
	if term:find(&amp;quot;[%[&amp;lt;]&amp;quot;) then&lt;br /&gt;
		-- Do it the &amp;quot;hard way&amp;quot;. We don&#039;t want to split anything inside of &amp;lt;...&amp;gt; or &amp;lt;&amp;lt;...&amp;gt;&amp;gt; even if there are commas&lt;br /&gt;
		-- inside of the angle brackets. For good measure we do the same for [...] and [[...]]. We first parse balanced&lt;br /&gt;
		-- segment runs involving either [...] or &amp;lt;...&amp;gt;. Then we split alternating runs on comma (but not on&lt;br /&gt;
		-- comma+whitespace). Then we rejoin the split runs. For example, given the following:&lt;br /&gt;
		-- &amp;quot;regional,older &amp;lt;&amp;lt;non-rhotic,and,non-hoarse-horse&amp;gt;&amp;gt; speakers&amp;quot;, the first call to&lt;br /&gt;
		-- parse_multi_delimiter_balanced_segment_run() produces&lt;br /&gt;
		--&lt;br /&gt;
		-- {&amp;quot;regional,older &amp;quot;, &amp;quot;&amp;lt;&amp;lt;non-rhotic,and,non-hoarse-horse&amp;gt;&amp;gt;&amp;quot;, &amp;quot; speakers&amp;quot;}&lt;br /&gt;
		--&lt;br /&gt;
		-- After calling split_alternating_runs_on_comma(), we get the following:&lt;br /&gt;
		--&lt;br /&gt;
		-- {{&amp;quot;regional&amp;quot;}, {&amp;quot;older &amp;quot;, &amp;quot;&amp;lt;&amp;lt;non-rhotic,and,non-hoarse-horse&amp;gt;&amp;gt;&amp;quot;, &amp;quot; speakers&amp;quot;}}&lt;br /&gt;
		--&lt;br /&gt;
		-- After rejoining each group, we get:&lt;br /&gt;
		--&lt;br /&gt;
		-- {&amp;quot;regional&amp;quot;, &amp;quot;older &amp;lt;&amp;lt;non-rhotic,and,non-hoarse-horse&amp;gt;&amp;gt; speakers&amp;quot;}&lt;br /&gt;
		--&lt;br /&gt;
		-- which is the desired output. When processing the second &amp;quot;label&amp;quot; string, the code in process_raw_labels()&lt;br /&gt;
		-- will do a similar process to this to pull out the labels inside of the &amp;lt;&amp;lt;...&amp;gt;&amp;gt; notation.&lt;br /&gt;
		local put = require(parse_utilities_module)&lt;br /&gt;
		local segments = put.parse_multi_delimiter_balanced_segment_run(term, {{&amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;}, {&amp;quot;[&amp;quot;, &amp;quot;]&amp;quot;}})&lt;br /&gt;
		-- This won&#039;t split on comma+whitespace.&lt;br /&gt;
		local comma_separated_groups = put.split_alternating_runs_on_comma(segments)&lt;br /&gt;
		for i, group in ipairs(comma_separated_groups) do&lt;br /&gt;
			comma_separated_groups[i] = table.concat(group)&lt;br /&gt;
		end&lt;br /&gt;
		return comma_separated_groups&lt;br /&gt;
	elseif term:find(&amp;quot;,%s&amp;quot;) then&lt;br /&gt;
		-- This won&#039;t split on comma+whitespace.&lt;br /&gt;
		return require(parse_utilities_module).split_on_comma(term)&lt;br /&gt;
	elseif term:find(&amp;quot;,&amp;quot;) then&lt;br /&gt;
		return require(string_utilities_module).split(term, &amp;quot;,&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		return {term}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return a list of objects corresponding to a set of raw labels. Each object returned is of the format returned by&lt;br /&gt;
{get_label_info()}. This is similar to looping over the labels and calling {get_label_info()} on each one, but it also&lt;br /&gt;
correctly handles embedded double angle bracket specs &amp;lt;&amp;lt;...&amp;gt;&amp;gt; found in the labels. (In such a case, there will be more&lt;br /&gt;
objects returned than raw labels passed in.) On input, `data` is an object with the following fields:&lt;br /&gt;
* `labels`: The list of labels to process.&lt;br /&gt;
* `lang`: The language of the labels. Must be specified.&lt;br /&gt;
* `mode`: How the label was invoked; see {get_label_info()} for more information.&lt;br /&gt;
* `nocat`: If true, don&#039;t add the label to any categories.&lt;br /&gt;
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion&lt;br /&gt;
   pages).&lt;br /&gt;
* `notrack`: Disable all tracking for this label.&lt;br /&gt;
* `sort`: Sort key for categorization.&lt;br /&gt;
* `already_seen`: An object used to track labels already seen, so they aren&#039;t displayed twice. Tracking is according&lt;br /&gt;
  to the display form of the label, so if two labels have the same display form, the second one won&#039;t be displayed&lt;br /&gt;
  (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn&#039;t happen.&lt;br /&gt;
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this&lt;br /&gt;
  function running.&lt;br /&gt;
]==]&lt;br /&gt;
function export.process_raw_labels(data)&lt;br /&gt;
	local label_infos = {}&lt;br /&gt;
&lt;br /&gt;
	if not data.ok_to_destructively_modify then&lt;br /&gt;
		data = m_table.shallowCopy(data)&lt;br /&gt;
		data.ok_to_destructively_modify = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function get_info_and_insert(label)&lt;br /&gt;
		-- Reuse this structure to save memory.&lt;br /&gt;
		data.label = label&lt;br /&gt;
		insert(label_infos, export.get_label_info(data))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, label in ipairs(data.labels) do&lt;br /&gt;
		if label:find(&amp;quot;&amp;lt;&amp;lt;&amp;quot;) then&lt;br /&gt;
			local segments = require(string_utilities_module).split(label, &amp;quot;&amp;lt;&amp;lt;(.-)&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
			for i, segment in ipairs(segments) do&lt;br /&gt;
				if i % 2 == 1 then&lt;br /&gt;
					local raw_text_type = i == 1 and &amp;quot;begin&amp;quot; or i == #segments and &amp;quot;end&amp;quot; or &amp;quot;middle&amp;quot;&lt;br /&gt;
					insert(label_infos, {raw_text = raw_text_type, label = segment, categories = {}})&lt;br /&gt;
				else&lt;br /&gt;
					local segment_labels = export.split_labels_on_comma(segment)&lt;br /&gt;
					for _, segment_label in ipairs(segment_labels) do&lt;br /&gt;
						get_info_and_insert(segment_label)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			get_info_and_insert(label)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return label_infos&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Split a comma-separated string of raw labels and process each label to get a list of objects suitable for passing to&lt;br /&gt;
{format_processed_labels()}. Each object returned is of the format returned by {get_label_info()}. This is equivalent to&lt;br /&gt;
calling {split_labels_on_comma()} followed by {process_raw_labels()}. On input, `data` is an object with the following&lt;br /&gt;
fields:&lt;br /&gt;
* `labels`: The string containing the raw comma-separated labels.&lt;br /&gt;
* `lang`: The language of the labels. Must be specified.&lt;br /&gt;
* `mode`: How the label was invoked; see {get_label_info()} for more information.&lt;br /&gt;
* `nocat`: If true, don&#039;t add the label to any categories.&lt;br /&gt;
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion&lt;br /&gt;
   pages).&lt;br /&gt;
* `notrack`: Disable all tracking for this label.&lt;br /&gt;
* `sort`: Sort key for categorization.&lt;br /&gt;
* `already_seen`: An object used to track labels already seen, so they aren&#039;t displayed twice. Tracking is according&lt;br /&gt;
  to the display form of the label, so if two labels have the same display form, the second one won&#039;t be displayed&lt;br /&gt;
  (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn&#039;t happen.&lt;br /&gt;
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this&lt;br /&gt;
  function running.&lt;br /&gt;
]==]&lt;br /&gt;
function export.split_and_process_raw_labels(data)&lt;br /&gt;
	if not data.ok_to_destructively_modify then&lt;br /&gt;
		data = m_table.shallowCopy(data)&lt;br /&gt;
		data.ok_to_destructively_modify = true&lt;br /&gt;
	end&lt;br /&gt;
	data.labels = export.split_labels_on_comma(data.labels)&lt;br /&gt;
	return export.process_raw_labels(data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format one or more already-processed labels for display and categorization. &amp;quot;Already-processed&amp;quot; means that&lt;br /&gt;
{get_label_info()} or {process_raw_labels()} has been called on the raw labels to convert them into objects containing&lt;br /&gt;
information on how to display and categorize the labels. This is a lower-level alternative to {show_labels()} and is&lt;br /&gt;
meant for modules such as [[Module:alternative forms]], [[Module:quote]] and [[Module:etymology/templates/descendant]]&lt;br /&gt;
that support displaying labels along with some other information.&lt;br /&gt;
&lt;br /&gt;
On input `data` is an object with the following fields:&lt;br /&gt;
* `labels`: List of the label objects to format, in the format returned by {get_label_info()}.&lt;br /&gt;
* `lang`: The language of the labels.&lt;br /&gt;
* `open`: Open bracket or parenthesis to display before the concatenated labels. If specified, it is wrapped in the&lt;br /&gt;
  {&amp;quot;ib-brac&amp;quot;} and {&amp;quot;label-brac&amp;quot;} CSS classes. If {nil} or {false}, no open bracket is displayed.&lt;br /&gt;
* `close`: Close bracket or parenthesis to display after the concatenated labels. If specified, it is wrapped in the&lt;br /&gt;
  {&amp;quot;ib-brac&amp;quot;} and {&amp;quot;label-brac&amp;quot;} CSS classes. If {nil} or {false}, no close bracket is displayed.&lt;br /&gt;
* `no_ib_content`: By default, the concatenated formatted labels inside of the open/close brackets are wrapped in the&lt;br /&gt;
  {&amp;quot;ib-content&amp;quot;} and {&amp;quot;label-content&amp;quot;} CSS classes. Specify this to suppress this wrapping.&lt;br /&gt;
* `raw`: Suppress all CSS wrapping of content, including open/close parentheses, content and comma delimiters (which&lt;br /&gt;
  are normally wrapped in {&amp;quot;ib-comma&amp;quot;} and {&amp;quot;label-comma&amp;quot;} CSS classes).&lt;br /&gt;
* `ok_to_destructively_modify`: If set, the `data` structure, and the `data.labels` table inside of it, will be&lt;br /&gt;
  destructively modified in the process of this function running.&lt;br /&gt;
* `split_output`: If not given, the return value is a concatenation of the formatted concatenated labels and formatted&lt;br /&gt;
  categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is&lt;br /&gt;
  the value {&amp;quot;raw&amp;quot;}, the categories are returned in list form, where the list elements are strings f the form suitable&lt;br /&gt;
  for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the&lt;br /&gt;
  categories are returned as a pre-formatted concatenated string.&lt;br /&gt;
&lt;br /&gt;
The return value (or the first return value, if `split_output` is given) is a string containing the contenated labels,&lt;br /&gt;
optionally surrounded by open/close brackets or parentheses. Normally, labels are separated by comma-space sequences,&lt;br /&gt;
but this may be suppressed for certain labels. If `nocat` wasn&#039;t given to {get_label_info()} or {process_raw_labels()},&lt;br /&gt;
and `split_output` wasn&#039;t given, the label objects will contain formatted categories in them, which will be inserted&lt;br /&gt;
into the returned text. (Use `split_output` if you need the categories returned separately.) The concatenated text&lt;br /&gt;
inside of the open/close brackets is normally wrapped in the {&amp;quot;ib-content&amp;quot;} CSS class, but this can be suppressed, as&lt;br /&gt;
mentioned above.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_processed_labels(data)&lt;br /&gt;
	if not data.labels then&lt;br /&gt;
		error(&amp;quot;`data` must now be an object containing the params&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not data.ok_to_destructively_modify then&lt;br /&gt;
		data = m_table.shallowCopy(data)&lt;br /&gt;
		data.labels = m_table.deepCopy(data.labels)&lt;br /&gt;
		data.ok_to_destructively_modify = true&lt;br /&gt;
	end&lt;br /&gt;
	local labels = data.labels&lt;br /&gt;
	if not labels[1] then&lt;br /&gt;
		error(&amp;quot;You must specify at least one label.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Show the labels&lt;br /&gt;
	local omit_preComma = false&lt;br /&gt;
	local omit_postComma = true&lt;br /&gt;
	local omit_preSpace = false&lt;br /&gt;
	local omit_postSpace = true&lt;br /&gt;
&lt;br /&gt;
	for _, label in ipairs(labels) do&lt;br /&gt;
		omit_preComma = omit_postComma&lt;br /&gt;
		omit_preSpace = omit_postSpace&lt;br /&gt;
&lt;br /&gt;
		local raw_text_omit_before = label.raw_text == &amp;quot;middle&amp;quot; or label.raw_text == &amp;quot;end&amp;quot;&lt;br /&gt;
		local raw_text_omit_after = label.raw_text == &amp;quot;middle&amp;quot; or label.raw_text == &amp;quot;begin&amp;quot;&lt;br /&gt;
		label.omit_comma = omit_preComma or (label.data and label.data.omit_preComma) or raw_text_omit_before&lt;br /&gt;
		omit_postComma = (label.data and label.data.omit_postComma) or raw_text_omit_after&lt;br /&gt;
		label.omit_space = omit_preSpace or (label.data and label.data.omit_preSpace) or raw_text_omit_before&lt;br /&gt;
		omit_postSpace = (label.data and label.data.omit_postSpace) or raw_text_omit_after&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if data.lang then&lt;br /&gt;
		local lang_functions_module = export.lang_specific_data_modules_prefix .. data.lang:getCode() .. &amp;quot;/functions&amp;quot;&lt;br /&gt;
		local m_lang_functions = require(load_module).safe_require(lang_functions_module)&lt;br /&gt;
		if m_lang_functions and m_lang_functions.postprocess_handlers then&lt;br /&gt;
			for _, handler in ipairs(m_lang_functions.postprocess_handlers) do&lt;br /&gt;
				handler(data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function wrap_css(txt, suffix)&lt;br /&gt;
		if data.raw then&lt;br /&gt;
			return txt&lt;br /&gt;
		end&lt;br /&gt;
		return (&amp;quot;&amp;lt;span class=\&amp;quot;ib-%s label-%s\&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;quot;):format(suffix, suffix, txt)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local categories = nil&lt;br /&gt;
	local formatted_categories = split_output and split_output ~= &amp;quot;raw&amp;quot; and {} or nil&lt;br /&gt;
	for i, labelinfo in ipairs(labels) do&lt;br /&gt;
		local label&lt;br /&gt;
		-- Need to check for &#039;not raw_text&#039; here because blank labels may legitimately occur as raw text if a double&lt;br /&gt;
		-- angle bracket spec occurs at the beginning of a label. In this case we&#039;ve already taken into account the&lt;br /&gt;
		-- context and don&#039;t want to leave out a preceding comma and space e.g. in a case like&lt;br /&gt;
		-- {{lb|en|rare|&amp;lt;&amp;lt;dialect&amp;gt;&amp;gt; or &amp;lt;&amp;lt;eye dialect&amp;gt;&amp;gt;}}. FIXME: We should reconsider whether we need this special case&lt;br /&gt;
		-- at all.&lt;br /&gt;
		if labelinfo.label == &amp;quot;&amp;quot; and not labelinfo.raw_text then&lt;br /&gt;
			label = &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			label = (labelinfo.omit_comma and &amp;quot;&amp;quot; or wrap_css(&amp;quot;,&amp;quot;, &amp;quot;comma&amp;quot;)) ..&lt;br /&gt;
					(labelinfo.omit_space and &amp;quot;&amp;quot; or &amp;quot;&amp;amp;#32;&amp;quot;) ..&lt;br /&gt;
					labelinfo.label&lt;br /&gt;
		end&lt;br /&gt;
		if split_output then&lt;br /&gt;
			labels[i] = label&lt;br /&gt;
			if split_output == &amp;quot;raw&amp;quot; then&lt;br /&gt;
				if labelinfo.categories and labelinfo.categories[1] then&lt;br /&gt;
					if categories then&lt;br /&gt;
						m_table.extend(categories, labelinfo.categories)&lt;br /&gt;
					else&lt;br /&gt;
						categories = labelinfo.categories&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			elseif labelinfo.formatted_categories then&lt;br /&gt;
				insert(formatted_categories, labelinfo.formatted_categories)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			labels[i] = label .. (labelinfo.formatted_categories or &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function wrap_open_close(val)&lt;br /&gt;
		if val then&lt;br /&gt;
			return wrap_css(val, &amp;quot;brac&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local concatenated_labels = table.concat(labels, &amp;quot;&amp;quot;)&lt;br /&gt;
	if not data.no_ib_content then&lt;br /&gt;
		concatenated_labels = wrap_css(concatenated_labels, &amp;quot;content&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret_labels = wrap_open_close(data.open) .. concatenated_labels .. wrap_open_close(data.close)&lt;br /&gt;
	if split_output == &amp;quot;raw&amp;quot; then&lt;br /&gt;
		return ret_labels, categories&lt;br /&gt;
	elseif split_output then&lt;br /&gt;
		return ret_labels, concat(formatted_categories)&lt;br /&gt;
	else&lt;br /&gt;
		return ret_labels&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format one or more labels for display and categorization. This provides the implementation of the&lt;br /&gt;
{{tl|label}}/{{tl|lb}}, {{tl|term label}}/{{tl|tlb}} and {{tl|accent}}/{{tl|a}} templates, and can also be called from a&lt;br /&gt;
module. The return value is a string to be inserted into the generated page, including the display and categories. On&lt;br /&gt;
input `data` is an object with the following fields:&lt;br /&gt;
* `labels`: List of the labels to format.&lt;br /&gt;
* `lang`: The language of the labels.&lt;br /&gt;
* `mode`: How the label was invoked; see {get_label_info()} for more information.&lt;br /&gt;
* `nocat`: If true, don&#039;t add the labels to any categories.&lt;br /&gt;
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion&lt;br /&gt;
   pages).&lt;br /&gt;
* `notrack`: Disable all tracking for these labels.&lt;br /&gt;
* `sort`: Sort key for categorization.&lt;br /&gt;
* `no_track_already_seen`: Don&#039;t track already-seen labels. If not specified, already-seen labels are not displayed&lt;br /&gt;
  again, but still categorize. See the documentation of {get_label_info()}.&lt;br /&gt;
* `open`: Open bracket or parenthesis to display before the concatenated labels. If {nil}, defaults to an open&lt;br /&gt;
  parenthesis. Set to {false} to disable.&lt;br /&gt;
* `close`: Close bracket or parenthesis to display after the concatenated labels. If {nil}, defaults to a close&lt;br /&gt;
  parenthesis. Set to {false} to disable.&lt;br /&gt;
* `no_ib_content`: As in `format_processed_labels()`.&lt;br /&gt;
* `raw`: As in `format_processed_labels()`. Also suppress wrapping the entire formatted result in a usage label CSS&lt;br /&gt;
  class (see below).&lt;br /&gt;
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this&lt;br /&gt;
  function running.&lt;br /&gt;
&lt;br /&gt;
Compared with {format_processed_labels()}, this function has the following differences:&lt;br /&gt;
# The labels specified in `labels` are raw labels (i.e. strings) rather than formatted objects.&lt;br /&gt;
# The open and close brackets default to parentheses (&amp;quot;round brackets&amp;quot;) rather than not being displayed by default.&lt;br /&gt;
# Tracking of already-seen labels is enabled unless explicitly turned off using `no_track_already_seen`.&lt;br /&gt;
# The entire formatted result is wrapped in a {&amp;quot;usage-label-&amp;lt;var&amp;gt;type&amp;lt;/var&amp;gt;&amp;quot;} CSS class (depending on the value of&lt;br /&gt;
  `mode`), unless `raw` is given.&lt;br /&gt;
]==]&lt;br /&gt;
function export.show_labels(data)&lt;br /&gt;
	if not data.labels then&lt;br /&gt;
		error(&amp;quot;`data` must now be an object containing the params&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not data.ok_to_destructively_modify then&lt;br /&gt;
		data = m_table.shallowCopy(data)&lt;br /&gt;
		data.ok_to_destructively_modify = true&lt;br /&gt;
	end&lt;br /&gt;
	local labels = data.labels&lt;br /&gt;
	if not labels[1] then&lt;br /&gt;
		error(&amp;quot;You must specify at least one label.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local mode = validate_mode(data.mode)&lt;br /&gt;
&lt;br /&gt;
	if not data.no_track_already_seen then&lt;br /&gt;
		data.already_seen = {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	data.labels = export.process_raw_labels(data)&lt;br /&gt;
	if data.open == nil then&lt;br /&gt;
		data.open = &amp;quot;(&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if data.close == nil then&lt;br /&gt;
		data.close = &amp;quot;)&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local formatted = export.format_processed_labels(data)&lt;br /&gt;
	if data.raw then&lt;br /&gt;
		return formatted&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;lt;span class=\&amp;quot;&amp;quot; .. mode_to_outer_class[mode] .. &amp;quot;\&amp;quot;&amp;gt;&amp;quot; .. formatted .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Helper function for the data modules.]==]&lt;br /&gt;
function export.alias(labels, key, aliases)&lt;br /&gt;
	m_table.alias(labels, key, aliases)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Split the display form of a label. Returns two values: `link` and `display`. If the display form consists of a&lt;br /&gt;
two-part link, `link` is the first part and `display` is the second part. If the display form consists of a&lt;br /&gt;
single-part link, `link` and `display` are the same. Otherwise (the display form is not a link or contains an&lt;br /&gt;
embedded link), `link` is the same as the passed-in `label` and `display` is nil.&lt;br /&gt;
]==]&lt;br /&gt;
function export.split_display_form(label)&lt;br /&gt;
	if not label:find(&amp;quot;%[%[&amp;quot;) then&lt;br /&gt;
		return label, nil&lt;br /&gt;
	end&lt;br /&gt;
	local link, display = label:match(&amp;quot;^%[%[([^%[%]|]+)|([^%[%]|]+)%]%]$&amp;quot;)&lt;br /&gt;
	if link then&lt;br /&gt;
		return link, display&lt;br /&gt;
	end&lt;br /&gt;
	link = label:match(&amp;quot;^%[%[([^%[%]|])+%]%]$&amp;quot;)&lt;br /&gt;
	if link then&lt;br /&gt;
		return link, link&lt;br /&gt;
	end&lt;br /&gt;
	return label, nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Combine the `link` and `display` parts of the display form of a label as returned by {split_display_form()}.&lt;br /&gt;
If `display` is nil, `link` is returned directly. Otherwise, a one-part or two-part link is constructed&lt;br /&gt;
depending on whether `link` and `display` are the same. (As a special case, if both consist of a blank string,&lt;br /&gt;
the return value is a blank string rather than a malformed link.)&lt;br /&gt;
]==]&lt;br /&gt;
function export.combine_display_form_parts(link, display)&lt;br /&gt;
	if not display then&lt;br /&gt;
		return link&lt;br /&gt;
	end&lt;br /&gt;
	if link == display then&lt;br /&gt;
		if link == &amp;quot;&amp;quot; then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			return (&amp;quot;[[%s]]&amp;quot;):format(link)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return (&amp;quot;[[%s|%s]]&amp;quot;):format(link, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Used to finalize the data into the form that is actually returned.]==]&lt;br /&gt;
function export.finalize_data(labels)&lt;br /&gt;
	local shallow_copy = m_table.shallowCopy&lt;br /&gt;
	local aliases = {}&lt;br /&gt;
	for label, data in pairs(labels) do&lt;br /&gt;
		if type(data) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			if data.aliases then&lt;br /&gt;
				for _, alias in ipairs(data.aliases) do&lt;br /&gt;
					aliases[alias] = label&lt;br /&gt;
				end&lt;br /&gt;
				data.aliases = nil&lt;br /&gt;
			end&lt;br /&gt;
			if data.deprecated_aliases then&lt;br /&gt;
				local data2 = shallow_copy(data)&lt;br /&gt;
				data2.deprecated = true&lt;br /&gt;
				data2.canonical = label&lt;br /&gt;
				for _, alias in ipairs(data2.deprecated_aliases) do&lt;br /&gt;
					aliases[alias] = data2&lt;br /&gt;
				end&lt;br /&gt;
				data.deprecated_aliases = nil&lt;br /&gt;
				data2.deprecated_aliases = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for label, data in pairs(aliases) do&lt;br /&gt;
		labels[label] = data&lt;br /&gt;
	end&lt;br /&gt;
	return labels&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:labels/data&amp;diff=491550</id>
		<title>Module:labels/data</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:labels/data&amp;diff=491550"/>
		<updated>2026-03-25T16:10:26Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local labels = {}&lt;br /&gt;
&lt;br /&gt;
-- Grammatical labels&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;abbreviation&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;abbreviations&amp;quot;, &amp;quot;abbreviated&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;abbreviations&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;abstract noun&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;abstract&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;abstract nouns&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;abstract verb&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;abstract&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;abstract verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;acronym&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;acronyms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;active voice&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;active&amp;quot;, &amp;quot;in active&amp;quot;, &amp;quot;in the active&amp;quot;, &amp;quot;in active voice&amp;quot;, &amp;quot;in the active voice&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ambitransitive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = {&amp;quot;transitive verbs&amp;quot;, &amp;quot;intransitive verbs&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;angry register&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;angry&amp;quot;, &amp;quot;anger&amp;quot;, &amp;quot;said in anger&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;angry register terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;animate&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;indicative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;in the indicative&amp;quot;, &amp;quot;indicative mood&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;indicative mood&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;subjunctive&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;in the subjunctive&amp;quot;, &amp;quot;subjunctive mood&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;subjunctive mood&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;imperative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;in the imperative&amp;quot;, &amp;quot;imperative mood&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;imperative mood&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;jussive&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;in the jussive&amp;quot;, &amp;quot;jussive mood&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;jussive mood&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;atelic&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;attenuative&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;attenuative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;attributive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;attributively&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;attributive&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;auxiliary&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;auxiliary verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cardinal&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;cardinal number&amp;quot;, &amp;quot;cardinal numeral&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:cardinal number]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;cardinal numbers&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;catenative&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;catenative verb&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;causative&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;causative verb&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;causative&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;causative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cognate object&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;with cognate object&amp;quot;},&lt;br /&gt;
	display = &amp;quot;with [[w:Cognate object|cognate object]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;verbs used with cognate objects&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;collective&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	display = &amp;quot;collective&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;collective nouns&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;collectively&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;collective&amp;quot;,&lt;br /&gt;
	display = &amp;quot;collectively&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;collective nouns&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;collective number&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;collective numeral&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:collective number]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;collective numbers&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;common&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;comparable&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;completive&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;completive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;concrete verb&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;concrete&amp;quot;,&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
	pos_categories = &amp;quot;concrete verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;contraction&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;contractions&amp;quot;, &amp;quot;contracted&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;contractions&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;control verb&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;control&amp;quot;},&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	pos_categories = &amp;quot;control verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;copulative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;copular&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;copulative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;countable&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;countable nouns&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cumulative&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;cumulative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;defective adjective&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;defective a&amp;quot;, &amp;quot;defective adj&amp;quot;, &amp;quot;defective adjectives&amp;quot;},&lt;br /&gt;
	display = &amp;quot;defective&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;defective adjectives&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;defective noun&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;defective n&amp;quot;, &amp;quot;defective nouns&amp;quot;},&lt;br /&gt;
	display = &amp;quot;defective&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;defective nouns&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;defective verb&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;defective v&amp;quot;, &amp;quot;defective vb&amp;quot;, &amp;quot;defective verbs&amp;quot;},&lt;br /&gt;
	display = &amp;quot;defective&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;defective verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;deliberate misspelling&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;deliberate [[wikt:misspelling]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;delimitative&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;delimitative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;deponent&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;deponent verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;distributive&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;distributive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;distributive number&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;distributive numeral&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:distributive number]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;distributive numbers&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ditransitive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;ditransitive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dual only&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;dual-only&amp;quot;, &amp;quot;dualonly&amp;quot;, &amp;quot;duale tantum&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:dual]] only&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;dualia tantum&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dysphemistic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;dysphemism&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;dysphemism&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;dysphemisms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;by ellipsis&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ellipsis&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;ellipsis&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;ellipses&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;elongated&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;elongation&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;elongated forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;emphatic&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ergative&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;ergative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;expressive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;expressive terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;by extension&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;hence&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;feminine&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;focus&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;focus adverbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fractional&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;fractional number&amp;quot;, &amp;quot;fractional numeral&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:fractional number]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;fractional numbers&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;frequentative&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;frequentative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hedge&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;hedges&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;hedges&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ideophonic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ideophone&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;idiomatic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;idiom&amp;quot;, &amp;quot;idiomatically&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;idioms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;imperfect&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;imperfective&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;imperfective verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;impersonal&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;impersonal verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;in the singular&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;in singular&amp;quot;},&lt;br /&gt;
	display = &amp;quot;in the [[wikt:singular]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;in the dual&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;in dual&amp;quot;},&lt;br /&gt;
	display = &amp;quot;in the [[wikt:dual]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;in the plural&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;in plural&amp;quot;},&lt;br /&gt;
	display = &amp;quot;in the [[wikt:Appendix:Glossary#plural|plural]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;inanimate&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;not animate&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;inchoative&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;inchoative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;indefinite&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;indef&amp;quot;, &amp;quot;not definite&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;initialism&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;initialisms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;intensive verb&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;intensive&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;intensive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;intransitive&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;not transitive&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;intransitive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;IPA&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;International Phonetic Alphabet&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;International Phonetic Alphabet&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;IPA symbols&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;iterative&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;iterative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;litotes&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;litote&amp;quot;, &amp;quot;litotic&amp;quot;, &amp;quot;litotical&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;masculine&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mediopassive voice&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;mediopassive&amp;quot;, &amp;quot;in mediopassive&amp;quot;, &amp;quot;in the mediopassive&amp;quot;, &amp;quot;in mediopassive voice&amp;quot;, &amp;quot;in the mediopassive voice&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;meiosis&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;meioses&amp;quot;, &amp;quot;meiotic&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;meioses&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;middle voice&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;middle&amp;quot;, &amp;quot;in middle&amp;quot;, &amp;quot;in the middle&amp;quot;, &amp;quot;in middle voice&amp;quot;, &amp;quot;in the middle voice&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;misspelling&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:misspelling]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;mnemonic&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:mnemonic]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;mnemonics&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;modal&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Modality (linguistics)&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;modal adverb&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;modal adverbs&amp;quot;},&lt;br /&gt;
	display = &amp;quot;modal&amp;quot;,&lt;br /&gt;
	Wikipedia = &amp;quot;Modality (linguistics)&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;modal adverbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;modal verb&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;modal verbs&amp;quot;},&lt;br /&gt;
	display = &amp;quot;modal&amp;quot;,&lt;br /&gt;
	Wikipedia = &amp;quot;Modality (linguistics)&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;modal verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;NAPA&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Americanist_phonetic_notation&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Americanist_phonetic_notation&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;NAPA symbols&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;always in the negative&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;always in the [[wikt:Appendix:Glossary#negative polarity item|negative]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;negative polarity items&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chiefly in the negative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;chiefly used in the negative&amp;quot;, &amp;quot;negative polarity&amp;quot;, &amp;quot;negative polarity item&amp;quot;, &amp;quot;usually in the negative&amp;quot;, &amp;quot;usually used in the negative&amp;quot;},&lt;br /&gt;
	display = &amp;quot;chiefly in the [[wikt:Appendix:Glossary#negative polarity item|negative]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;negative polarity items&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chiefly in the negative plural&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;chiefly used in the negative plural&amp;quot;, &amp;quot;negative polarity plural&amp;quot;, &amp;quot;negative polarity plural item&amp;quot;, &amp;quot;usually in the negative plural&amp;quot;, &amp;quot;usually used in the negative plural&amp;quot;},&lt;br /&gt;
	display = &amp;quot;chiefly in the [[wikt:Appendix:Glossary#negative polarity item|negative]] [[wikt:Appendix:Glossary#plural|plural]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;negative polarity items&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;always in the positive&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;always in the [[wikt:Appendix:Glossary#positive polarity item|positive]]&amp;quot;,&lt;br /&gt;
--	pos_categories = {&amp;quot;positive polarity items&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chiefly in the positive&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;chiefly used in the positive&amp;quot;, &amp;quot;positive polarity&amp;quot;, &amp;quot;positive polarity item&amp;quot;, &amp;quot;usually in the positive&amp;quot;, &amp;quot;usually used in the positive&amp;quot;},&lt;br /&gt;
	display = &amp;quot;chiefly in the [[wikt:Appendix:Glossary#positive polarity item|positive]]&amp;quot;,&lt;br /&gt;
--	pos_categories = {&amp;quot;positive polarity items&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chiefly in the positive plural&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;chiefly used in the positive plural&amp;quot;, &amp;quot;positive polarity plural&amp;quot;, &amp;quot;positive polarity plural item&amp;quot;, &amp;quot;usually in the positive plural&amp;quot;, &amp;quot;usually used in the positive plural&amp;quot;},&lt;br /&gt;
	display = &amp;quot;chiefly in the [[wikt:Appendix:Glossary#positive polarity item|positive]] [[wikt:Appendix:Glossary#plural|plural]]&amp;quot;,&lt;br /&gt;
--	pos_categories = &amp;quot;positive polarity items&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neuter&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- British English (&amp;quot;ise&amp;quot;)&lt;br /&gt;
labels[&amp;quot;nominalised&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;nominalisation&amp;quot;, &amp;quot;substantivised&amp;quot;, &amp;quot;substantivisation&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;nominalization&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;nominalized adjectives&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- American English (&amp;quot;ize&amp;quot;)&lt;br /&gt;
labels[&amp;quot;nominalized&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;nominalization&amp;quot;, &amp;quot;substantivized&amp;quot;, &amp;quot;substantivization&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;nominalization&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;nominalized adjectives&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;not comparable&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;notcomp&amp;quot;, &amp;quot;incomparable&amp;quot;, &amp;quot;uncomparable&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;uncomparable&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;onomatopoeia&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;onomatopoeias&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ordinal&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ordinal number&amp;quot;, &amp;quot;ordinal numeral&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:ordinal number]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;ordinal numbers&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;partitive verb&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Appendix:Glossary#transitive|transitive]], usually [[wikt:Appendix:Finnic telic and atelic verbs|atelic]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;transitive verbs&amp;quot;, -- = &amp;quot;partitive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;perfect&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;participle&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;passive voice&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;passive&amp;quot;, &amp;quot;in passive&amp;quot;, &amp;quot;in the passive&amp;quot;, &amp;quot;in passive voice&amp;quot;, &amp;quot;in the passive voice&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;perfect&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;perfective&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;perfective verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;plural only&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;plural-only&amp;quot;, &amp;quot;pluralonly&amp;quot;, &amp;quot;plurale tantum&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Appendix:Glossary#plural|plural]] only&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;pluralia tantum&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;possessional adjective&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;possessional&amp;quot;, &amp;quot;possessional adjectives&amp;quot;},&lt;br /&gt;
	display = &amp;quot;possessional&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;possessional adjectives&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;possessive pronoun&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;possessive determiner&amp;quot;},&lt;br /&gt;
	display = &amp;quot;possessive&amp;quot;,&lt;br /&gt;
	glossary = &amp;quot;possessive determiner&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;possessive pronouns&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;postpositive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;predicative&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;predicatively&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;predicative&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;prepositive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;prescriptive&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;normative&amp;quot;, &amp;quot;prescribed&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;privative&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;privative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;procedure word&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:procedure word]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;productive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- TODO: This label is probably inappropriate for many languages&lt;br /&gt;
labels[&amp;quot;pronominal&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;pronominal verb&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pronunciation spelling&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pro-verb&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;reciprocal&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;reciprocal verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;reflexive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;reflexive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;reflexive pronoun&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;reflexive&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;reflexive pronouns&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;relational&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;relational adjectives&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;repetitive&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;repetitive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;respelling&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;reversative&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;reversative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rhetorical question&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;rhetorical questions&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rhotic&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;saturative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;sative&amp;quot;},&lt;br /&gt;
	pos_categories = &amp;quot;saturative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;semelfactive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;semelfactive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sentence adverb&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;sentence adverbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;set phrase&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:set phrase]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;simile&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;similes&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;singular only&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;singular-only&amp;quot;, &amp;quot;singulare tantum&amp;quot;, &amp;quot;no plural&amp;quot;},&lt;br /&gt;
	display = &amp;quot;singular only&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;singularia tantum&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;snowclone&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;snowclones&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;stative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;stative verb&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;stative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;strictly&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;strict&amp;quot;, &amp;quot;narrowly&amp;quot;, &amp;quot;narrow&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;substantive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	track = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;terminative&amp;quot;] = {&lt;br /&gt;
	pos_categories = &amp;quot;terminative verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;transitive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;transitive verbs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;transmission error&amp;quot;] = {&lt;br /&gt;
	Wiktionary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;unaccusative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;not accusative&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Unaccusative verb&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;uncountable&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;not countable&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;uncountable nouns&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;unergative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;not ergative&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Unergative verb&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;UPA&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Uralic Phonetic Alphabet&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Uralic Phonetic Alphabet&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;UPA symbols&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;usually plural&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;usually in the plural&amp;quot;, &amp;quot;usually in plural&amp;quot;},&lt;br /&gt;
	display = &amp;quot;usually in the [[wikt:Appendix:Glossary#plural|plural]]&amp;quot;,&lt;br /&gt;
    deprecated = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Usage labels&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;4chan&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;4chan slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[w:4chan|4chan]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;4chan slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;4chan lgbt&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;tttt&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[w:4chan|4chan]] /lgbt/ {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;4chan /lgbt/ slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ACG&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:ACG]]&amp;quot;,&lt;br /&gt;
	-- see also &amp;quot;fandom slang&amp;quot;&lt;br /&gt;
	pos_categories = &amp;quot;fandom slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;endearing&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;affectionate&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:endearing]]&amp;quot;,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	pos_categories = &amp;quot;endearing terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;endearing form&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;affectionate form&amp;quot;},&lt;br /&gt;
    display = &amp;quot;[[wikt:endearing]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;endearing forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;pre-classical&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Pre-classical&amp;quot;, &amp;quot;pre-Classical&amp;quot;, &amp;quot;Pre-Classical&amp;quot;, &amp;quot;Preclassical&amp;quot;, &amp;quot;preclassical&amp;quot;, &amp;quot;ante-classical&amp;quot;, &amp;quot;Ante-classical&amp;quot;, &amp;quot;ante-Classical&amp;quot;, &amp;quot;Ante-Classical&amp;quot;, &amp;quot;Anteclassical&amp;quot;, &amp;quot;anteclassical&amp;quot;},&lt;br /&gt;
	display = &amp;quot;pre-Classical&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;anti-LGBTQ slur&amp;quot;] = {&lt;br /&gt;
	-- don&#039;t add aliases &amp;quot;homophobia&amp;quot; or &amp;quot;transphobia&amp;quot; because these could be topical categories&lt;br /&gt;
	aliases = {&amp;quot;homophobic&amp;quot;, &amp;quot;transphobic&amp;quot;},&lt;br /&gt;
	display = &amp;quot;anti-[[wikt:LGBTQ]] [[wikt:slur]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;anti-LGBTQ slurs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;archaic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;antiquated&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	sense_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;archaic form&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;archaic&amp;quot;,&lt;br /&gt;
    display = &amp;quot;archaic&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;archaic forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Australian slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Australian]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	regional_categories = &amp;quot;Australian&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;avoidance&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;back slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;backslang&amp;quot;, &amp;quot;back-slang&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;backslang&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Bargoens&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Braille&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;British slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;UK slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:British]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Cambridge University slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;University of Cambridge slang&amp;quot;, &amp;quot;Cantab slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[w:University of Cambridge|Cambridge University]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Universities&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;cant&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;argot&amp;quot;, &amp;quot;cryptolect&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:cant]]&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;capitalized&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;capitalised&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:capitalisation|capitalized]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Castilianism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Hispanicism&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Castilianism]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;childish&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;baby talk&amp;quot;, &amp;quot;child language&amp;quot;, &amp;quot;infantile&amp;quot;, &amp;quot;puerile&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:childish]]&amp;quot;,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	pos_categories = &amp;quot;childish terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;chu Nom&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Vietnamese]] [[wikt:chữ Nôm]]&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;Vietnamese Han tu&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Cockney rhyming slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Cockney rhyming slang]]&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;colloquial&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;colloquially&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;colloquialisms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- FIXME! The following two are apparently for Persian but probably don&#039;t belong in this file.&lt;br /&gt;
labels[&amp;quot;colloquial-um&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;colloquial&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;colloquialisms containing sequence um&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;colloquial-un&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;colloquial&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;colloquialisms containing sequence un&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;corporate jargon&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;business jargon&amp;quot;, &amp;quot;corporatese&amp;quot;, &amp;quot;businessese&amp;quot;, &amp;quot;corporate speak&amp;quot;, &amp;quot;business speak&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:corporate]] [[wikt:jargon]]&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;costermongers&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;coster&amp;quot;, &amp;quot;costers&amp;quot;, &amp;quot;costermonger&amp;quot;, &amp;quot;costermongers back slang&amp;quot;, &amp;quot;costermongers&#039; back slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Appendix:Costermongers&#039; back slang|costermongers]]&amp;quot;,&lt;br /&gt;
	plain_categories = &amp;quot;Costermongers&#039; back slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;criminal slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;thieves&#039; cant&amp;quot;, &amp;quot;Thieves&#039; Cant&amp;quot;, &amp;quot;thieves cant&amp;quot;, &amp;quot;thieves&#039;&amp;quot;, &amp;quot;thieves&amp;quot;, &amp;quot;thieves&#039; cant&amp;quot;}, -- Thieves&#039; Cant is English-only, so defined in the English submodule; if other languages try to use it, it&#039;s just criminal slang&lt;br /&gt;
	display = &amp;quot;[[wikt:criminal]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Crime&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dated&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;old-fashioned&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	pos_categories = &amp;quot;dated terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dated form&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;old-fashioned form&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;dated&amp;quot;,&lt;br /&gt;
	display = &amp;quot;dated&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;dated forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- combine with previous?&lt;br /&gt;
labels[&amp;quot;dated sense&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;dated&amp;quot;,&lt;br /&gt;
	sense_categories = &amp;quot;dated&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;derogatory&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;pejorative&amp;quot;, &amp;quot;derogative&amp;quot;, &amp;quot;disparaging&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:derogatory]]&amp;quot;,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	pos_categories = &amp;quot;derogatory terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;derogatory form&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;pejorative form&amp;quot;, &amp;quot;derogative form&amp;quot;, &amp;quot;disparaging form&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:derogatory]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;derogatory forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dialect&amp;quot;] = {-- separated from &amp;quot;dialectal&amp;quot; so e.g. &amp;quot;obsolete|outside|the|_|dialect|of...&amp;quot; displays right&lt;br /&gt;
	glossary = &amp;quot;dialectal&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;dialectal terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dialectal&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	pos_categories = &amp;quot;dialectal terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dialectal form&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;dialectal&amp;quot;,&lt;br /&gt;
	display = &amp;quot;dialectal&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;dialectal forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dialects&amp;quot;] = {-- separated from &amp;quot;dialectal&amp;quot; so e.g. &amp;quot;obsolete|outside|dialects&amp;quot; displays right&lt;br /&gt;
	glossary = &amp;quot;dialectal&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;dialectal terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dis legomenon&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:dis legomenon]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;dis legomena&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;dismissal&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:dismissal]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;dismissals&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;drag slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Drag Race slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:drag]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;drag slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ecclesiastical&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:ecclesiastical#Adjective|ecclesiastical]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;ecclesiastical terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ethnic slur&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;racial slur&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:ethnic]] [[wikt:slur]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;ethnic slurs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;euphemistic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;euphemism&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;euphemism&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;euphemisms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;eye dialect&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:eye dialect]]&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;familiar&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	pos_categories = &amp;quot;familiar terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;fandom slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;fandom&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:fandom]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;figurative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;metaphorical&amp;quot;, &amp;quot;metaphoric&amp;quot;, &amp;quot;metaphor&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;figurative&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;figuratively&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;metaphorically&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;figurative&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;folk songs&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;folksongs&amp;quot;, &amp;quot;used in folk songs&amp;quot;, &amp;quot;used in folksongs&amp;quot;},&lt;br /&gt;
	pos_categories = &amp;quot;folk poetic terms&amp;quot;,&lt;br /&gt;
	display = &amp;quot;used in [[wikt:folk song]]s&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;folk tales&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;folktales&amp;quot;, &amp;quot;used in folk tales&amp;quot;, &amp;quot;used in folktales&amp;quot;},&lt;br /&gt;
	pos_categories = &amp;quot;folk poetic terms&amp;quot;,&lt;br /&gt;
	display = &amp;quot;used in [[wikt:folk tale]]s&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;folk poetic&amp;quot;] = {&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	pos_categories = &amp;quot;folk poetic terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;formal&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	pos_categories = &amp;quot;formal terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;formal form&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;formal&amp;quot;,&lt;br /&gt;
	display = &amp;quot;formal&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;formal forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gay slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:gay]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gender critical slang&amp;quot;] = {&lt;br /&gt;
    aliases = {&amp;quot;gender-critical slang&amp;quot;, &amp;quot;GC slang&amp;quot;, &amp;quot;TERF slang&amp;quot;},&lt;br /&gt;
    display = &amp;quot;[[wikt:gender-critical]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
    pos_categories = &amp;quot;gender-critical slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;gender-neutral&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;gender-neutral&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;gender-neutral terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;graffiti slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:graffiti#Noun|graffiti]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;genericized trademark&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;genericised trademark&amp;quot;, &amp;quot;generic trademark&amp;quot;, &amp;quot;proprietary eponym&amp;quot;, &amp;quot;gentrade&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:genericized trademark]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;genericized trademarks&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ghost word&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;ghost&amp;quot;},&lt;br /&gt;
	display = &amp;quot;ghost word&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;ghost words&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hapax legomenon&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;hapax&amp;quot;},&lt;br /&gt;
	display = &amp;quot;hapax legomenon&amp;quot;,&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;hapax legomena&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;higher register&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;high register&amp;quot;, &amp;quot;elevated register&amp;quot;, &amp;quot;elevated&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;higher register&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;higher register terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;historical&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;historic&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	sense_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;non-native speakers&amp;quot;] = {-- language-agnostic version&lt;br /&gt;
	aliases = {&amp;quot;NNS&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:non-native speaker]]s&amp;quot;, -- so preceded by &amp;quot;used by&amp;quot;, &amp;quot;error by children and&amp;quot;, etc? or reword?&lt;br /&gt;
	regional_categories = {&amp;quot;Non-native speakers&#039;&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- used exclusively by languages that use the &amp;quot;Jpan&amp;quot; script code&lt;br /&gt;
labels[&amp;quot;historical hiragana&amp;quot;] = {&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- used exclusively by languages that use the &amp;quot;Jpan&amp;quot; script code&lt;br /&gt;
labels[&amp;quot;historical katakana&amp;quot;] = {&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- applies to Japanese and Korean, etc., please do not confuse with &amp;quot;polite&amp;quot;&lt;br /&gt;
labels[&amp;quot;honorific&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Honorifics (linguistics)&amp;quot;,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	pos_categories = &amp;quot;honorific terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- for Ancient Greek&lt;br /&gt;
labels[&amp;quot;Homeric epithet&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Homeric Greek|Homeric]] [[w:Epithets in Homer|epithet]]&amp;quot;,&lt;br /&gt;
	omit_postComma = true,&lt;br /&gt;
	plain_categories = &amp;quot;Epic Greek&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- applies to Japanese and Korean, etc.&lt;br /&gt;
labels[&amp;quot;humble&amp;quot;] = {&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	display = &amp;quot;[[wikt:humble]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;humble terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- for Akkadian&lt;br /&gt;
labels[&amp;quot;in hendiadys&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;hendiadys&amp;quot;},&lt;br /&gt;
	display = &amp;quot;in {{w|hendiadys}}&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;terms used in hendiadys&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;humorous&amp;quot;] = {&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp; NB and cf a similar &amp;quot;jocular&amp;quot; label further up on this page&lt;br /&gt;
	aliases = {&amp;quot;humorously&amp;quot;, &amp;quot;jocular&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;humorous terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hyperbolic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;hyperbole&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;hyperboles&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hypercorrect&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;hypercorrections&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;hyperforeign&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;hyperforeign terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;imperial&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;emperor&amp;quot;, &amp;quot;empress&amp;quot;},&lt;br /&gt;
	pos_categories = &amp;quot;royal terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;incel slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:incel]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;informal&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;informally&amp;quot;, &amp;quot;not formal&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	pos_categories = &amp;quot;informal terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;informal form&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;informal&amp;quot;,&lt;br /&gt;
    display = &amp;quot;informal&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;informal forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Internet slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;internet slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Internet]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;internet slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;IRC&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:IRC]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;internet slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;ironic&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:irony|ironic]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Not the same as &amp;quot;journalism&amp;quot;, which maps to a topical category (e.g. [[:Category:en:Journalism]], instead of [[:Category:English journalistic terms]]).&lt;br /&gt;
labels[&amp;quot;journalistic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;journalese&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:journalistic]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;journalistic terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;leet&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;leetspeak&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:leetspeak]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;leetspeak&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;LGBTQ slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;LGBT slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:LGBTQ]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;literal&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;literally&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;literally&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;literally&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;literary&amp;quot;] = {&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	aliases = {&amp;quot;bookish&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;literary terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;literary form&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;bookish form&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;literary&amp;quot;,&lt;br /&gt;
	display = &amp;quot;literary&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;literary forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--see also &amp;quot;short scale&amp;quot;&lt;br /&gt;
labels[&amp;quot;long scale&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[w:Long and short scales|long scale]]&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;loosely&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;loose&amp;quot;, &amp;quot;broadly&amp;quot;, &amp;quot;broad&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Lubunyaca&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Lubunyaca]]&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;medical slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:medical]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- for Awetí, Karajá, etc., where men and women use different words&lt;br /&gt;
labels[&amp;quot;men&#039;s speech&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;male speech&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;men&#039;s speech&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;men&#039;s speech terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;metonymic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;metonymically&amp;quot;, &amp;quot;metonymy&amp;quot;, &amp;quot;metonym&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;metonyms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;military slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:military]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;minced oath&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:minced oath]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;minced oaths&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;multiplicative&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;multiplicative number&amp;quot;, &amp;quot;multiplicative numeral&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:multiplicative number]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;multiplicative numbers&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;multiplicity slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;{{l|en|multiplicity|id=multiple personalities}} {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;naval slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;navy slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:naval]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neologism&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;neologistic&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;neologisms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;neopronoun&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:neopronoun]]&amp;quot;,&lt;br /&gt;
--	pos_categories = {&amp;quot;neopronouns&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;no longer productive&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;non-productive&amp;quot;},&lt;br /&gt;
	display = &amp;quot;no longer [[wikt:Appendix:Glossary#productive|productive]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nonce word&amp;quot;] = {&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	aliases = {&amp;quot;nonce&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;nonce terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nonstandard&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;non-standard&amp;quot;, &amp;quot;substandard&amp;quot;, &amp;quot;sub-standard&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	pos_categories = &amp;quot;nonstandard terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nonstandard form&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;non-standard form&amp;quot;, &amp;quot;substandard form&amp;quot;, &amp;quot;sub-standard form&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;nonstandard&amp;quot;,&lt;br /&gt;
	display = &amp;quot;nonstandard&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;nonstandard forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;numismatic slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:numismatic]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;obsolete&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	sense_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;obsolete form&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;obsolete&amp;quot;,&lt;br /&gt;
    display = &amp;quot;obsolete&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;obsolete forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;obsolete term&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;obsolete&amp;quot;,&lt;br /&gt;
	-- combine with previous two, q.v.&lt;br /&gt;
	pos_categories = &amp;quot;obsolete terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;offensive&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	pos_categories = &amp;quot;offensive terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;officialese&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;bureaucratic&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:officialese]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;officialese terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Oxbridge slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[w:Oxbridge|Oxbridge]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Universities&amp;quot;,&lt;br /&gt;
	plain_categories = {&amp;quot;Cambridge University slang&amp;quot;, &amp;quot;Oxford University slang&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Oxford University slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;University of Oxford slang&amp;quot;, &amp;quot;Oxon slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[w:University of Oxford|Oxford University]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Universities&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;poetic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;poi&amp;quot;}, -- Only used in Ancient Greek as a holdover from [[wikt:Module:grc:Dialects]].&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;poetic terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;poetic form&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;poetic&amp;quot;,&lt;br /&gt;
    display = &amp;quot;poetic&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;poetic forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;polite&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;polite terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;post-classical&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Post-classical&amp;quot;, &amp;quot;post-Classical&amp;quot;, &amp;quot;Post-Classical&amp;quot;, &amp;quot;Postclassical&amp;quot;, &amp;quot;postclassical&amp;quot;},&lt;br /&gt;
	display = &amp;quot;post-Classical&amp;quot;,&lt;br /&gt;
	regional_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;prison slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:prison]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;proscribed&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;proscribed terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;puristic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;purism&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Linguistic purism&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;puristic terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;radio slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:radio]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Reddit slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Reddit]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rare&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;rare sense&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	sense_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rare form&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;rare&amp;quot;,&lt;br /&gt;
    display = &amp;quot;rare&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;rare forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rare term&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;rare&amp;quot;,&lt;br /&gt;
	-- see comments about &amp;quot;obsolete&amp;quot;&lt;br /&gt;
	pos_categories = &amp;quot;rare terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- cf Cockney rhyming slang&lt;br /&gt;
labels[&amp;quot;rhyming slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:rhyming slang]]&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;religious slur&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;sectarian slur&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:religious]] [[wikt:slur]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;religious slurs&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;retronym&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;retronyms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;reverential&amp;quot;] = {&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	display = &amp;quot;[[wikt:reverential]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;reverential terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;royal&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;regal&amp;quot;},&lt;br /&gt;
	pos_categories = &amp;quot;royal terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;rustic&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	aliases = {&amp;quot;rural&amp;quot;},&lt;br /&gt;
	pos_categories = &amp;quot;rustic terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;sarcastic&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:sarcastic]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;sarcastic terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;school slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;public school slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:school]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;self-deprecatory&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;self-deprecating&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:self-deprecatory]]&amp;quot;,&lt;br /&gt;
	-- should be &amp;quot;terms with X senses&amp;quot;, leaving &amp;quot;X terms&amp;quot; to the term-context temp?&lt;br /&gt;
	pos_categories = &amp;quot;self-deprecatory terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Swahili Sheng cant / argot&lt;br /&gt;
-- should this be in a language-specific module?&lt;br /&gt;
labels[&amp;quot;Sheng&amp;quot;] = {&lt;br /&gt;
	Wikipedia = &amp;quot;Sheng slang&amp;quot;,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;siglum&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;sigla&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;sigla&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--see also &amp;quot;long scale&amp;quot;&lt;br /&gt;
labels[&amp;quot;short scale&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[w:Long and short scales|short scale]]&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;slang&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;solemn&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;solemn terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Stenoscript&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;stenoscript&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:Stenoscript]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;Stenoscript abbreviations&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;superseded&amp;quot;] = {&lt;br /&gt;
	glossary = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;swear word&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;profanity&amp;quot;, &amp;quot;expletive&amp;quot;},&lt;br /&gt;
	pos_categories = &amp;quot;swear words&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;syncopated&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;syncope&amp;quot;, &amp;quot;syncopic&amp;quot;, &amp;quot;syncopation&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;syncopic forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;synecdochic&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;synecdochically&amp;quot;, &amp;quot;synecdochical&amp;quot;, &amp;quot;synecdoche&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;synecdoches&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;technical&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:technical]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;technical terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;telic&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;text messaging&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;texting&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:text messaging]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;text messaging slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;tone indicator&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:tone indicator]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;tone indicators&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;trademark&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:trademark]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;trademarks&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;transferred sense&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;terms with transferred senses&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;transferred senses&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:transferred sense#English|transferred senses]]&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;terms with transferred senses&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;transgender slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;trans slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:transgender]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;Twitch-speak&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[Twitch-speak]]&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;uds.&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:Appendix:Spanish pronouns#Ustedes and vosotros|used formally in Spain]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;uncommon&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	sense_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;uncommon form&amp;quot;] = {&lt;br /&gt;
	glossary = &amp;quot;uncommon&amp;quot;,&lt;br /&gt;
    display = &amp;quot;uncommon&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;uncommon forms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;university slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;college slang&amp;quot;, &amp;quot;student slang&amp;quot;},&lt;br /&gt;
	display = &amp;quot;[[wikt:university]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	topical_categories = &amp;quot;Universities&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;student slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;verlan&amp;quot;] = {&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;very rare&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;very [[wikt:Appendix:Glossary#rare|rare]]&amp;quot;,&lt;br /&gt;
	sense_categories = &amp;quot;rare&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;vulgar&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;coarse&amp;quot;, &amp;quot;obscene&amp;quot;, &amp;quot;profane&amp;quot;},&lt;br /&gt;
	glossary = true,&lt;br /&gt;
	pos_categories = &amp;quot;vulgarities&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;vesre&amp;quot;] = {&lt;br /&gt;
	Wikipedia = true,&lt;br /&gt;
	plain_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;youth slang&amp;quot;] = {&lt;br /&gt;
	display = &amp;quot;[[wikt:youth]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;slang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;2channel slang&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;2channel&amp;quot;, &amp;quot;2ch slang&amp;quot;},&lt;br /&gt;
	display =&amp;quot;[[w:2channel|2channel]] {{glossary|slang}}&amp;quot;,&lt;br /&gt;
	pos_categories = {&amp;quot;internet slang&amp;quot; , &amp;quot;2channel slang&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- for Awetí, Karajá, etc., where men &amp;amp; women use different words&lt;br /&gt;
labels[&amp;quot;women&#039;s speech&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;female speech&amp;quot;},&lt;br /&gt;
	glossary = &amp;quot;women&#039;s speech&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;women&#039;s speech terms&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- terms applying to Old Norse skaldic poetry&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;kenning&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Kenning&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Kenning&amp;quot;,&lt;br /&gt;
	pos_categories = &amp;quot;kennings&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;heiti&amp;quot;] = {&lt;br /&gt;
	aliases = {&amp;quot;Heiti&amp;quot;},&lt;br /&gt;
	Wikipedia = &amp;quot;Heiti&amp;quot;,&lt;br /&gt;
	pos_categories = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return require(&amp;quot;Module:labels&amp;quot;).finalize_data(labels)&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:labels&amp;diff=491549</id>
		<title>Module:labels</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:labels&amp;diff=491549"/>
		<updated>2026-03-25T16:07:41Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
export.lang_specific_data_list_module = &amp;quot;Module:labels/data/lang&amp;quot;&lt;br /&gt;
export.lang_specific_data_modules_prefix = &amp;quot;Module:labels/data/lang/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local load_module = &amp;quot;Module:load&amp;quot;&lt;br /&gt;
local parse_utilities_module = &amp;quot;Module:parse utilities&amp;quot;&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
local utilities_module = &amp;quot;Module:utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local require_when_needed = require(&amp;quot;Module:require when needed&amp;quot;)&lt;br /&gt;
local unpack = unpack or table.unpack -- Lua 5.2 compatibility&lt;br /&gt;
local dump = mw.dumpObject&lt;br /&gt;
&lt;br /&gt;
local m_lang_specific_data = mw.loadData(export.lang_specific_data_list_module)&lt;br /&gt;
local m_table = require_when_needed(&amp;quot;Module:table&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
--[==[ intro:&lt;br /&gt;
Labels go through several stages of processing to get from the original (raw) label specified in the Wikicode to the&lt;br /&gt;
final (formatted) label displayed to the user. The following terminology will help keep things straight:&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;raw label&amp;quot; is the label specified in the Wikicode.&lt;br /&gt;
* The &amp;quot;non-canonical label&amp;quot; is the label extracted from the raw label, used for looking up in the label modules in order&lt;br /&gt;
  to fetch the associated label data structure and determine the canonical form of the label. Normally this is the same&lt;br /&gt;
  as the raw label, but it will be different if the raw label is of the form `!&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;` (e.g. `!Australian`)&lt;br /&gt;
  `&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;!&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` (e.g. `Southern US!Southern`). The former syntax indicates that the label&lt;br /&gt;
  should display as-is instead of in its canonical form (which in the example given is `Australia`), and the latter&lt;br /&gt;
  syntax indicates that the label should display in the form specified after the exclamation point.&lt;br /&gt;
* The &amp;quot;canonical label&amp;quot; is the result of applying alias resolution to the non-canonical label. Normally, the&lt;br /&gt;
  canonical label rather than the non-canonical label is what is shown to the user.&lt;br /&gt;
* The &amp;quot;display form of the label&amp;quot; is what is shown to the user, not considering links and HTML that may wrap the&lt;br /&gt;
  display form to get the formatted form of the label. The display form comes from the `.display` field of the module&lt;br /&gt;
  label data for the label; if no such field exists in the label data, it is normally the canonical label. However, if&lt;br /&gt;
  the display override exists (see below), it takes precedence over the `.display` field or canonical label when&lt;br /&gt;
  determining the display form of the label.&lt;br /&gt;
* The &amp;quot;display override&amp;quot;, if specified, overrides all other means of determining the display form of the label. It is&lt;br /&gt;
  specified in two circumstances, i.e. in the `!&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;` and `&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;!&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` raw label&lt;br /&gt;
  formats (i.e. in the same cirumstances where the raw label and non-canonical label are different).&lt;br /&gt;
* The &amp;quot;formatted form of the label&amp;quot; is the final form of the label shown directly to the user. It generally appears to&lt;br /&gt;
  the user as the display form of the label, but in the Wikicode, the formatted form may wrap the display form with a&lt;br /&gt;
  link to Wikipedia, the Wiktionary glossary or another Wiktionary entry, and that link in turn may be wrapped in an&lt;br /&gt;
  HTML span with a &amp;quot;deprecated&amp;quot; CSS class attached, causing the label to display differently (to indicate that it is&lt;br /&gt;
  deprecated).&lt;br /&gt;
]==]&lt;br /&gt;
&lt;br /&gt;
-- for testing&lt;br /&gt;
local force_cat = false&lt;br /&gt;
&lt;br /&gt;
local m_headword_data = mw.loadData(&amp;quot;Module:headword/data&amp;quot;)&lt;br /&gt;
local SUBPAGENAME = m_headword_data.pagename&lt;br /&gt;
&lt;br /&gt;
-- Disable tracking on heavy pages to save time.&lt;br /&gt;
local pages_where_tracking_is_disabled = m_headword_data.large_pages&lt;br /&gt;
&lt;br /&gt;
local function ucfirst(txt)&lt;br /&gt;
	return mw.getContentLanguage():ucfirst(txt)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local mode_to_outer_class = {&lt;br /&gt;
	[&amp;quot;label&amp;quot;] = &amp;quot;usage-label-sense&amp;quot;,&lt;br /&gt;
	[&amp;quot;term-label&amp;quot;] = &amp;quot;usage-label-term&amp;quot;,&lt;br /&gt;
	[&amp;quot;accent&amp;quot;] = &amp;quot;usage-label-accent&amp;quot;,&lt;br /&gt;
	[&amp;quot;form-of&amp;quot;] = &amp;quot;usage-label-form-of&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local mode_to_property_prefix = {&lt;br /&gt;
	[&amp;quot;label&amp;quot;] = false,&lt;br /&gt;
	[&amp;quot;term-label&amp;quot;] = false, -- handled specially&lt;br /&gt;
	[&amp;quot;accent&amp;quot;] = &amp;quot;accent_&amp;quot;,&lt;br /&gt;
	[&amp;quot;form-of&amp;quot;] = &amp;quot;form_of_&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function validate_mode(mode)&lt;br /&gt;
	mode = mode or &amp;quot;label&amp;quot;&lt;br /&gt;
	if not mode_to_outer_class[mode] then&lt;br /&gt;
		local allowed_values = {}&lt;br /&gt;
		for key, _ in pairs(mode_to_outer_class) do&lt;br /&gt;
			insert(allowed_values, &amp;quot;&#039;&amp;quot; .. key .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(allowed_values)&lt;br /&gt;
		error((&amp;quot;Invalid value &#039;%s&#039; for `mode`; should be one of %s&amp;quot;):format(mode, table.concat(allowed_values, &amp;quot;, &amp;quot;)))&lt;br /&gt;
	end&lt;br /&gt;
	return mode&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getprop(labdata, mode, prop)&lt;br /&gt;
	local mode_prefix = mode_to_property_prefix[mode]&lt;br /&gt;
	return mode_prefix and labdata[mode_prefix .. prop] or labdata[prop]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function check_type(label, lang, prop, value, expected_types)&lt;br /&gt;
	if value == nil or expected_types == nil then&lt;br /&gt;
		return value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(expected_types) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		expected_types = {expected_types}&lt;br /&gt;
	end&lt;br /&gt;
	local valtype = type(value)&lt;br /&gt;
	local matches = false&lt;br /&gt;
	for _, expected_type in ipairs(expected_types) do&lt;br /&gt;
		if type(expected_type) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			if valtype == expected_type then&lt;br /&gt;
				matches = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		elseif value == expected_type then&lt;br /&gt;
			matches = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not matches then&lt;br /&gt;
		local function join_untagged_or(elements)&lt;br /&gt;
			return m_table.serialCommaJoin(elements, {conj = &amp;quot;or&amp;quot;, dontTag = true})&lt;br /&gt;
		end&lt;br /&gt;
		local quoted_types = {}&lt;br /&gt;
		local quoted_values = {}&lt;br /&gt;
		for _, expected_type in ipairs(expected_types) do&lt;br /&gt;
			if type(expected_type) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				insert(quoted_types, &amp;quot;&#039;&amp;quot; .. expected_type .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				insert(quoted_values, &amp;quot;&#039;&amp;quot; .. dump(expected_type) .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local possible_matches = {}&lt;br /&gt;
		if quoted_types[1] then&lt;br /&gt;
			insert(possible_matches, (&amp;quot;be of type%s %s&amp;quot;):format(&lt;br /&gt;
				quoted_types[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;, join_untagged_or(quoted_types)))&lt;br /&gt;
		end&lt;br /&gt;
		if quoted_values[1] then&lt;br /&gt;
			insert(possible_matches, (&amp;quot;have  the value%s %s&amp;quot;):format(&lt;br /&gt;
				quoted_values[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;, join_untagged_or(quoted_values)))&lt;br /&gt;
		end&lt;br /&gt;
		error((&amp;quot;Internal error: For label &#039;%s&#039;, langcode &#039;%s&#039;, property &#039;%s&#039; should %s but is of type &#039;%s&#039; with value %s&amp;quot;):format(&lt;br /&gt;
			label, lang and lang:getCode() or &amp;quot;UNKNOWN&amp;quot;, prop, join_untagged_or(possible_matches), valtype, dump(value)))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- HACK! For languages in any of the given families, check the specified-language Wikipedia for appropriate&lt;br /&gt;
-- Wikipedia articles for the language in question (esp. useful for obscure etymology-only languages that may not&lt;br /&gt;
-- have English articles for them, like many Chinese lects).&lt;br /&gt;
local families_to_wikipedia_languages = {&lt;br /&gt;
	{&amp;quot;zhx&amp;quot;, &amp;quot;zh&amp;quot;},&lt;br /&gt;
	{&amp;quot;sem-arb&amp;quot;, &amp;quot;ar&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Given language `lang` (a full language, etymology-language or family), fetch a list of Wikimedia languages to check&lt;br /&gt;
when converting a Wikidata item to a Wikipedia article. English is always first, followed by the Wikimedia language&lt;br /&gt;
code(s) of `lang` if `lang` is a language (which may or may not be the same as `lang`&#039;s Wiktionary code), followed&lt;br /&gt;
by the macrolanguage of `lang` for certain languages and families (currently, only languages and families in the Chinese&lt;br /&gt;
and Arabic families). If `lang` is nil, only return English. Note that the same code may occur more than once in the&lt;br /&gt;
list. This is exported because it&#039;s also used by [[Module:category tree/poscatboiler/data/language varieties]].&lt;br /&gt;
]==]&lt;br /&gt;
function export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang)&lt;br /&gt;
	local wikipedia_langs = {}&lt;br /&gt;
	insert(wikipedia_langs, &amp;quot;en&amp;quot;)&lt;br /&gt;
	if lang then&lt;br /&gt;
		local article_lang = lang&lt;br /&gt;
		while article_lang do&lt;br /&gt;
			if article_lang:hasType(&amp;quot;language&amp;quot;) then&lt;br /&gt;
				local wmcodes = article_lang:getWikimediaLanguageCodes()&lt;br /&gt;
				for _, wmcode in ipairs(wmcodes) do&lt;br /&gt;
					insert(wikipedia_langs, wmcode)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			article_lang = article_lang:getParent()&lt;br /&gt;
		end&lt;br /&gt;
		for _, family_to_wp_lang in ipairs(families_to_wikipedia_languages) do&lt;br /&gt;
			local family, wp_lang = unpack(family_to_wp_lang)&lt;br /&gt;
			if lang:inFamily(family) then&lt;br /&gt;
				insert(wikipedia_langs, wp_lang)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return wikipedia_langs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Fetch the categories to add to a page, given that the label whose canonical form is `canon_label` with language `lang`&lt;br /&gt;
has been seen. `labdata` is the label data structure for `label`, fetched from the appropriate submodule. `mode`&lt;br /&gt;
specifies how the label was invoked (see {get_label_info()} for more information). The return value is a list of the&lt;br /&gt;
actual categories, unless `for_doc` is specified, in which case the categories returned are marked up for display on a&lt;br /&gt;
documentation page. If `for_doc` is given, `lang` may be nil to format the categories in a language-independent fashion;&lt;br /&gt;
otherwise, it must be specified. If `category_types` is specified, it should be a set object (i.e. with category types&lt;br /&gt;
as keys and {true} as values), and only categories of the specified types will be returned.&lt;br /&gt;
]==]&lt;br /&gt;
function export.fetch_categories(canon_label, labdata, lang, mode, for_doc, category_types)&lt;br /&gt;
	local categories = {}&lt;br /&gt;
&lt;br /&gt;
	mode = validate_mode(mode)&lt;br /&gt;
	local langcode, canonical_name&lt;br /&gt;
	if lang then&lt;br /&gt;
		langcode = lang:getFullCode()&lt;br /&gt;
		canonical_name = lang:getFullName()&lt;br /&gt;
	elseif for_doc then&lt;br /&gt;
		langcode = &amp;quot;&amp;lt;var&amp;gt;[langcode]&amp;lt;/var&amp;gt;&amp;quot;&lt;br /&gt;
		canonical_name = &amp;quot;&amp;lt;var&amp;gt;[language name]&amp;lt;/var&amp;gt;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;quot;Internal error: Must specify `lang` unless `for_doc` is given&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function labprop(prop, expected_types)&lt;br /&gt;
		local retval = getprop(labdata, mode, prop)&lt;br /&gt;
		check_type(canon_label, lang, prop, retval, expected_types)&lt;br /&gt;
		return retval&lt;br /&gt;
	end&lt;br /&gt;
	local empty_list = {}&lt;br /&gt;
	local function get_cats(cat_type)&lt;br /&gt;
		if category_types and not category_types[cat_type] then&lt;br /&gt;
			return empty_list&lt;br /&gt;
		end&lt;br /&gt;
		local cats = labprop(cat_type)&lt;br /&gt;
		if not cats then&lt;br /&gt;
			return empty_list&lt;br /&gt;
		end&lt;br /&gt;
		if type(cats) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
			return {cats}&lt;br /&gt;
		end&lt;br /&gt;
		return cats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local topical_categories = get_cats(&amp;quot;topical_categories&amp;quot;)&lt;br /&gt;
	local sense_categories = get_cats(&amp;quot;sense_categories&amp;quot;)&lt;br /&gt;
	local pos_categories = get_cats(&amp;quot;pos_categories&amp;quot;)&lt;br /&gt;
	local regional_categories = get_cats(&amp;quot;regional_categories&amp;quot;)&lt;br /&gt;
	local plain_categories = get_cats(&amp;quot;plain_categories&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local function insert_cat(cat, sense_cat)&lt;br /&gt;
		if for_doc then&lt;br /&gt;
			cat = &amp;quot;&amp;lt;code&amp;gt;&amp;quot; .. cat .. &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
			if sense_cat then&lt;br /&gt;
				if mode == &amp;quot;term-label&amp;quot; then&lt;br /&gt;
					cat = cat .. &amp;quot; (using {{tl|tlb}})&amp;quot;&lt;br /&gt;
				else&lt;br /&gt;
					cat = cat .. &amp;quot; (using {{tl|lb}} or form-of template)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				cat = mw.getCurrentFrame():preprocess(cat)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		insert(categories, cat)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(topical_categories) do&lt;br /&gt;
		insert_cat(langcode .. &amp;quot;:&amp;quot; .. (cat == true and ucfirst(canon_label) or cat))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(sense_categories) do&lt;br /&gt;
		if cat == true then&lt;br /&gt;
			cat = canon_label&lt;br /&gt;
		end&lt;br /&gt;
		cat = mode == &amp;quot;term-label&amp;quot; and cat .. &amp;quot; terms&amp;quot; or &amp;quot;terms with &amp;quot; .. cat .. &amp;quot; senses&amp;quot;&lt;br /&gt;
		insert_cat(canonical_name .. &amp;quot; &amp;quot; .. cat, true)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(pos_categories) do&lt;br /&gt;
		insert_cat(canonical_name .. &amp;quot; &amp;quot; .. (cat == true and canon_label or cat))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(regional_categories) do&lt;br /&gt;
		insert_cat((cat == true and ucfirst(canon_label) or cat) .. &amp;quot; &amp;quot; .. canonical_name)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(plain_categories) do&lt;br /&gt;
		insert_cat(cat == true and ucfirst(canon_label) or cat)&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;
Return the list of all labels data modules for a label whose language is `lang`. The return value is a list of&lt;br /&gt;
module names, with overriding modules earlier in the list (that is, if a label occurs in two modules in the list,&lt;br /&gt;
the earlier-listed module takes precedence). If `lang` is nil, only return non-language-specific submodules.&lt;br /&gt;
]==]&lt;br /&gt;
function export.get_submodules(lang)&lt;br /&gt;
	local submodules = {&lt;br /&gt;
		&amp;quot;Module:labels/data&amp;quot;,&lt;br /&gt;
		&amp;quot;Module:labels/data/qualifiers&amp;quot;,&lt;br /&gt;
		&amp;quot;Module:labels/data/regional&amp;quot;,&lt;br /&gt;
		&amp;quot;Module:labels/data/topical&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if not lang then&lt;br /&gt;
		return submodules&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- get language-specific labels from data module&lt;br /&gt;
	local langcode = lang:getFullCode()&lt;br /&gt;
&lt;br /&gt;
	if m_lang_specific_data.langs_with_lang_specific_modules[langcode] then&lt;br /&gt;
		-- prefer per-language label in order to pick subvariety labels over regional ones&lt;br /&gt;
		insert(submodules, 1, export.lang_specific_data_modules_prefix .. langcode)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return submodules&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return the formatted form of a label `label` (which should be the canonical form of the label; see comment at top),&lt;br /&gt;
given (a) the label data structure `labdata` from one of the data modules; (b) the language object `lang` of the&lt;br /&gt;
language being processed, or nil for no language; (c) `deprecated` (true if the label is deprecated, otherwise the&lt;br /&gt;
deprecation information is taken from `labdata`); (d) `override_display` (if specified, override the display form of the&lt;br /&gt;
label with the specified string, instead of any value in `labdata.display` or `labdata.special_display` or the canonical&lt;br /&gt;
label in `label` itself); (e) `mode` (same as `data.mode` passed to {get_label_info()}). Returns two values: the&lt;br /&gt;
formatted label form and a boolean indicating whether the label is deprecated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE: Under normal circumstances, do not use this.&#039;&#039;&#039; Instead, use {get_label_info()}, which searches all the data&lt;br /&gt;
modules for a given label and handles other complications.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_label(label, labdata, lang, deprecated, override_display, mode)&lt;br /&gt;
	local formatted_label&lt;br /&gt;
&lt;br /&gt;
	mode = validate_mode(mode)&lt;br /&gt;
	local function labprop(prop, expected_types)&lt;br /&gt;
		local retval = getprop(labdata, mode, prop)&lt;br /&gt;
		check_type(label, lang, prop, retval, expected_types)&lt;br /&gt;
		return retval&lt;br /&gt;
	end&lt;br /&gt;
	deprecated = deprecated or labprop(&amp;quot;deprecated&amp;quot;)&lt;br /&gt;
	if not override_display and labprop(&amp;quot;special_display&amp;quot;) then&lt;br /&gt;
		local function add_language_name(str)&lt;br /&gt;
			if str == &amp;quot;canonical_name&amp;quot; then&lt;br /&gt;
				if lang then&lt;br /&gt;
					return lang:getFullName()&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;&amp;lt;code&amp;gt;&amp;lt;var&amp;gt;[language name]&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		formatted_label = labprop(&amp;quot;special_display&amp;quot;, &amp;quot;string&amp;quot;):gsub(&amp;quot;&amp;lt;(.-)&amp;gt;&amp;quot;, add_language_name)&lt;br /&gt;
	else&lt;br /&gt;
		--[=[&lt;br /&gt;
			We proceed as follows:&lt;br /&gt;
			1. The display form comes from either (a) the `override_display` variable if set (this happens when&lt;br /&gt;
			   the user uses a label like &#039;!British&#039;); (b) the `display` property, if set; or (c) the label iself.&lt;br /&gt;
			2. If the display form contains a link, use it directly and ignore the other display-related settings.&lt;br /&gt;
			   (NOTE: Settings `Wikipedia` and `Wikidata` may still be used on the category page itself, by the&lt;br /&gt;
			   category tree code.)&lt;br /&gt;
			3. Otherwise, use one of the other display-related settings, in the following order:&lt;br /&gt;
			   `glossary` &amp;gt; `Wiktionary` &amp;gt; `Wikipedia` &amp;gt; `Wikidata`. Specifically:&lt;br /&gt;
			   a. If any of the values is equal to `true`, that is equivalent to specifying a string consisting of&lt;br /&gt;
				  the canonical label.&lt;br /&gt;
			   b. If `glossary` is set, it specifies the anchor in [[Appendix:Glossary]].&lt;br /&gt;
			   c. If `Wiktionary` is set, it specifies an arbitrary Wiktionary page or page + anchor (e.g. a&lt;br /&gt;
				  separate Appendix entry).&lt;br /&gt;
			   d. If `Wikipedia` is set, it specifies an arbitrary Wikipedia article, or a list of such items (in&lt;br /&gt;
				  this case, we select the first one, but the category tree uses all of them).&lt;br /&gt;
			   e. If `Wikidata` is set, it specifies an arbitrary Wikidata item to retrieve a Wikipedia article from,&lt;br /&gt;
				  or a list of such items (in this case, we select the first one, but the category tree uses all of&lt;br /&gt;
				  them). If the item is of the form `wmcode:id`, the Wikipedia article corresponding to `id` in the&lt;br /&gt;
				  `wmcode`-language Wikipedia is fetched if available. Otherwise, the English-language Wikipedia&lt;br /&gt;
				  article corresponding to `id` is retrieved if available, falling back to the Wikimedia language(s)&lt;br /&gt;
				  corresponding to `lang` and then (in certain cases) to the macrolanguage that `lang` is part of.&lt;br /&gt;
&lt;br /&gt;
			Note that if `mode` is specified, prefixed properties (e.g. `accent_display` for `mode` == &amp;quot;accent&amp;quot;,&lt;br /&gt;
			`form_display` for `mode` == &amp;quot;form&amp;quot;) are checked before the bare equivalent (e.g. `display`).&lt;br /&gt;
		]=]&lt;br /&gt;
		local display = override_display or labprop(&amp;quot;display&amp;quot;, &amp;quot;string&amp;quot;) or label&lt;br /&gt;
&lt;br /&gt;
		-- There are several &#039;Foo spelling&#039; labels specially designed for use in the |from= param in&lt;br /&gt;
		-- {{alternative form of}}, {{standard spelling of}} and the like. Often the display includes the word&lt;br /&gt;
		-- &amp;quot;spelling&amp;quot; at the end (e.g. if it&#039;s defaulted), which is useful when the label is used with {{tl|lb}} or&lt;br /&gt;
		-- {{tl|tlb}}; but it causes redundancy when used with the form-of templates, which add the word &amp;quot;form&amp;quot;,&lt;br /&gt;
		-- &amp;quot;spelling&amp;quot;, &amp;quot;standard spelling&amp;quot;, etc. after the label.&lt;br /&gt;
		if mode == &amp;quot;form-of&amp;quot; then&lt;br /&gt;
			display = display:gsub(&amp;quot; spelling$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if display:find(&amp;quot;%[%[&amp;quot;) then&lt;br /&gt;
			formatted_label = display&lt;br /&gt;
		else&lt;br /&gt;
			local glossary = labprop(&amp;quot;glossary&amp;quot;, {&amp;quot;string&amp;quot;, true})&lt;br /&gt;
			local Wiktionary = labprop(&amp;quot;Wiktionary&amp;quot;, {&amp;quot;string&amp;quot;, true})&lt;br /&gt;
			local Wikipedia = labprop(&amp;quot;Wikipedia&amp;quot;, {&amp;quot;string&amp;quot;, true, &amp;quot;table&amp;quot;})&lt;br /&gt;
			local Wikidata = labprop(&amp;quot;Wikidata&amp;quot;, {&amp;quot;string&amp;quot;, true, &amp;quot;table&amp;quot;})&lt;br /&gt;
			if glossary then&lt;br /&gt;
				local glossary_entry = glossary == true and label or glossary&lt;br /&gt;
				formatted_label = &amp;quot;[[Appendix:Glossary#&amp;quot; .. glossary_entry .. &amp;quot;|&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			elseif Wiktionary then&lt;br /&gt;
				local Wiktionary_entry = Wiktionary == true and label or Wiktionary&lt;br /&gt;
				if Wiktionary == display then&lt;br /&gt;
					formatted_label = &amp;quot;[[&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
				else&lt;br /&gt;
					formatted_label = &amp;quot;[[&amp;quot; .. Wiktionary_entry .. &amp;quot;|&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			elseif Wikipedia then&lt;br /&gt;
				if type(Wikipedia) == &amp;quot;table&amp;quot; then&lt;br /&gt;
					Wikipedia = Wikipedia[1]&lt;br /&gt;
				end&lt;br /&gt;
				local Wikipedia_entry = Wikipedia == true and label or Wikipedia&lt;br /&gt;
				formatted_label = &amp;quot;[[w:&amp;quot; .. Wikipedia_entry .. &amp;quot;|&amp;quot; .. display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
			elseif Wikidata then&lt;br /&gt;
				if not mw.wikibase then&lt;br /&gt;
					error((&amp;quot;Unable to retrieve data from Wikidata ID for label &#039;%s&#039;; `mw.wikibase` not defined&amp;quot;&lt;br /&gt;
						):format(label))&lt;br /&gt;
				end&lt;br /&gt;
				local function make_formatted_label(wmcode, id)&lt;br /&gt;
					local article = mw.wikibase.sitelink(id, wmcode .. &amp;quot;wiki&amp;quot;)&lt;br /&gt;
					if article then&lt;br /&gt;
						local link = wmcode == &amp;quot;en&amp;quot; and &amp;quot;w:&amp;quot; .. article or &amp;quot;w:&amp;quot; .. wmcode .. &amp;quot;:&amp;quot; .. article&lt;br /&gt;
						return (&amp;quot;[[%s|%s]]&amp;quot;):format(link, display)&lt;br /&gt;
					else&lt;br /&gt;
						return nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if type(Wikidata) == &amp;quot;table&amp;quot; then&lt;br /&gt;
					Wikidata = Wikidata[1]&lt;br /&gt;
				end&lt;br /&gt;
				local wmcode, id = Wikidata:match(&amp;quot;^(.*):(.*)$&amp;quot;)&lt;br /&gt;
				if wmcode then&lt;br /&gt;
					formatted_label = make_formatted_label(wmcode, id)&lt;br /&gt;
				else&lt;br /&gt;
					local langs_to_check = export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang)&lt;br /&gt;
					for _, wmcode in ipairs(langs_to_check) do&lt;br /&gt;
						formatted_label = make_formatted_label(wmcode, Wikidata)&lt;br /&gt;
						if formatted_label then&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				formatted_label = formatted_label or display&lt;br /&gt;
			else&lt;br /&gt;
				formatted_label = display&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if deprecated then&lt;br /&gt;
		formatted_label = &#039;&amp;lt;span class=&amp;quot;deprecated-label&amp;quot;&amp;gt;&#039; .. formatted_label .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return formatted_label, deprecated&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return information on a label. On input `data` is an object with the following fields:&lt;br /&gt;
* `label`: The raw label to return information on.&lt;br /&gt;
* `lang`: The language of the label. Must be specified unless `for_doc` is given.&lt;br /&gt;
* `mode`: How the label was invoked. One of the following:&lt;br /&gt;
  ** {nil} or {&amp;quot;label&amp;quot;}: invoked through {{tl|lb}} or another template whose labels in the same fashion, e.g.&lt;br /&gt;
     {{tl|alt}}, {{tl|quote}} or {{tl|syn}};&lt;br /&gt;
  ** {&amp;quot;term-label&amp;quot;}: invoked through {{tl|tlb}};&lt;br /&gt;
  ** {&amp;quot;accent&amp;quot;}: invoked through {{tl|a}} or the {{para|a}} or {{para|aa}} parameters of other pronunciation templates,&lt;br /&gt;
     such as {{tl|IPA}}, {{tl|rhymes}} or {{tl|homophones}};&lt;br /&gt;
  ** {&amp;quot;form-of&amp;quot;}: invoked through {{tl|alt form}}, {{tl|standard spelling of}} or other form-of template.&lt;br /&gt;
  This changes the display and/or categorization of a minority of labels. (The majority work the same for all modes.)&lt;br /&gt;
* `for_doc`: Data is being fetched for documentation purposes. This causes the raw categories returned in&lt;br /&gt;
  `categories` to be formatted for documentation display.&lt;br /&gt;
* `nocat`: If true, don&#039;t add the label to any categories.&lt;br /&gt;
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion&lt;br /&gt;
   pages).&lt;br /&gt;
* `notrack`: Disable all tracking for this label.&lt;br /&gt;
* `sort`: Sort key for categorization.&lt;br /&gt;
* `already_seen`: An object used to track labels already seen, so they aren&#039;t displayed twice. Tracking is according&lt;br /&gt;
  to the display form of the label, so if two labels have the same display form, the second one won&#039;t be displayed&lt;br /&gt;
  (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn&#039;t happen.&lt;br /&gt;
&lt;br /&gt;
The return value is an object with the following fields:&lt;br /&gt;
* `raw_text`: If specified, the object does not describe a label but simply raw text surrounding labels. This occurs&lt;br /&gt;
  when double angle bracket (&amp;lt;&amp;lt;...&amp;gt;&amp;gt;) notation is used. {get_label_info()} does not currently return objects with this&lt;br /&gt;
  field set, but {process_raw_labels()} does. The value is {&amp;quot;begin&amp;quot;} (this is the first raw text portion derived from&lt;br /&gt;
  a double angle bracket spec, provided there are at least two raw text portions); {&amp;quot;end&amp;quot;} (this is the last raw text&lt;br /&gt;
  portion derived from a double angle bracket spec, provided there are at least two portions); {&amp;quot;middle&amp;quot;} (this is&lt;br /&gt;
  neither the first nor the last raw text portion); or {&amp;quot;only&amp;quot;} (this is a raw text portion standing by itself). The&lt;br /&gt;
  particular value determines the handling of commas and spaces on one or both sides of the raw text. If this field is&lt;br /&gt;
  specified, only the `label` field (containing the actual raw text) and the `category` field (containing an empty list)&lt;br /&gt;
  are set; all other fields are {nil}.&lt;br /&gt;
* `raw_label`: The raw label that was passed in.&lt;br /&gt;
* `non_canonical`: The label prior to canonicalization (i.e. alias resolution). Usually this is the same as `raw_label`,&lt;br /&gt;
  but if the raw label was preceded by an exclamation point (meaning &amp;quot;display the raw label as-is&amp;quot;), this field will&lt;br /&gt;
  contain the label stripped of the exclamation point, and if the raw label is of the form&lt;br /&gt;
  `&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;!&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` (meaning &amp;quot;display the label in the specified form&amp;quot;), this field will contain the&lt;br /&gt;
  label before the exclamation point.&lt;br /&gt;
* `canonical`: If the label in `non_canonical` is an alias, this contains the canonical name of the label; otherwise it&lt;br /&gt;
  will be {nil}.&lt;br /&gt;
* `override_display`: If specified, this contains a string that overrides the normal display form of the label. The&lt;br /&gt;
  display form of a label is the `.display` field of the label data if present, and otherwise is normally the canonical&lt;br /&gt;
  form of the label (i.e. after alias resolution). (This is not the same as the formatted form of the label, found in&lt;br /&gt;
  `label`, which is the final form shown to the user and includes links to Wikipedia, the glossary, etc. as well as an&lt;br /&gt;
  HTML wrapper if the label is deprecated.) If `override_display` is specified, however, this is used in place of the&lt;br /&gt;
  normal display form of the label. This currently happens in two circumstances: (1) the label was preceded by ! to&lt;br /&gt;
  indicate that the raw label should be displayed rather than the canonical form; (2) the label was given in the form&lt;br /&gt;
  `&amp;lt;var&amp;gt;label&amp;lt;/var&amp;gt;!&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` (meaning &amp;quot;display the label in the specified `&amp;lt;var&amp;gt;display&amp;lt;/var&amp;gt;` form&amp;quot;).&lt;br /&gt;
* `label`: The formatted form of the label. This is what is actually shown to the user. If the label is recognized&lt;br /&gt;
  (found in some module), this will typically be in the form of a link.&lt;br /&gt;
* `categories`: A list of the categories to add the label to; an empty list if `nocat` was specified.&lt;br /&gt;
* `formatted_categories`: A string containing the formatted categories; {nil} if `nocat` or `for_doc` was specified,&lt;br /&gt;
  or if `categories` is empty. Currently will be an empty string if there are categories to format but the namespace is&lt;br /&gt;
  one that normally excludes categories (e.g. userspace and discussion pages), and `force_cat` isn&#039;t specified.&lt;br /&gt;
* `deprecated`: True if the label is deprecated.&lt;br /&gt;
* `recognized`: If true, the label was found in some module.&lt;br /&gt;
* `data`: The data structure for the label, as fetched from the label modules. For unrecognized labels, this will&lt;br /&gt;
  be an empty object.&lt;br /&gt;
]==]&lt;br /&gt;
function export.get_label_info(data)&lt;br /&gt;
	if not data.label then&lt;br /&gt;
		error(&amp;quot;`data` must now be an object containing the params&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local mode = validate_mode(data.mode)&lt;br /&gt;
	local ret = {categories = {}}&lt;br /&gt;
	local label = data.label&lt;br /&gt;
	local raw_label = label&lt;br /&gt;
	ret.raw_label = raw_label&lt;br /&gt;
	local override_display&lt;br /&gt;
	if label:find(&amp;quot;^!&amp;quot;) then&lt;br /&gt;
		label = label:gsub(&amp;quot;^!&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		override_display = label&lt;br /&gt;
	elseif label:find(&amp;quot;![^%s]&amp;quot;) then&lt;br /&gt;
		label, override_display = label:match(&amp;quot;^(.-)!([^%s].*)$&amp;quot;)&lt;br /&gt;
		if not label then&lt;br /&gt;
			error((&amp;quot;Internal error: This Lua pattern should never fail to match for label &#039;%s&#039;&amp;quot;):format(raw_label))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local non_canonical = label&lt;br /&gt;
	ret.non_canonical = non_canonical&lt;br /&gt;
	local deprecated = false&lt;br /&gt;
	local labdata&lt;br /&gt;
	local submodule&lt;br /&gt;
	local data_langcode = data.lang and data.lang:getCode() or nil&lt;br /&gt;
&lt;br /&gt;
	local submodules_to_check = export.get_submodules(data.lang)&lt;br /&gt;
	for _, submodule_to_check in ipairs(submodules_to_check) do&lt;br /&gt;
		submodule = mw.loadData(submodule_to_check)&lt;br /&gt;
		local this_labdata = submodule[label]&lt;br /&gt;
		local resolved_label&lt;br /&gt;
		if type(this_labdata) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			resolved_label = this_labdata&lt;br /&gt;
			this_labdata = submodule[this_labdata]&lt;br /&gt;
			if not this_labdata then&lt;br /&gt;
				error((&amp;quot;Internal error: Label alias &#039;%s&#039; points to &#039;%s&#039;, which is undefined in module [[%s]]&amp;quot;):format(&lt;br /&gt;
					label, resolved_label, submodule_to_check))&lt;br /&gt;
			end&lt;br /&gt;
			if type(this_labdata) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				error((&amp;quot;Internal error: Label alias &#039;%s&#039; points to &#039;%s&#039;, which is also an alias (of &#039;%s&#039;) in module [[%s]]&amp;quot;):format(&lt;br /&gt;
					label, resolved_label, this_labdata, submodule_to_check))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if this_labdata then&lt;br /&gt;
			-- Make sure either there&#039;s no lang restriction, or we&#039;re processing lang-independent, or our language&lt;br /&gt;
			-- is among the listed languages. Otherwise, continue processing (which could conceivably pick up a&lt;br /&gt;
			-- lang-appropriate version of the label in another label data module).&lt;br /&gt;
			local lablangs = getprop(this_labdata, mode, &amp;quot;langs&amp;quot;)&lt;br /&gt;
			if not lablangs or not data_langcode then&lt;br /&gt;
				labdata = this_labdata&lt;br /&gt;
				label = resolved_label or label&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			local lang_in_list = false&lt;br /&gt;
			for _, langcode in ipairs(lablangs) do&lt;br /&gt;
				if langcode == data_langcode then&lt;br /&gt;
					lang_in_list = true&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if lang_in_list then&lt;br /&gt;
				labdata = this_labdata&lt;br /&gt;
				label = resolved_label or label&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if labdata then&lt;br /&gt;
		ret.recognized = true&lt;br /&gt;
	else&lt;br /&gt;
		labdata = {}&lt;br /&gt;
		ret.recognized = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function labprop(prop)&lt;br /&gt;
		return getprop(labdata, mode, prop)&lt;br /&gt;
	end&lt;br /&gt;
	if labprop(&amp;quot;deprecated&amp;quot;) then&lt;br /&gt;
		deprecated = true&lt;br /&gt;
	end&lt;br /&gt;
	if label ~= non_canonical then&lt;br /&gt;
		-- Note that this is an alias and store the canonical version.&lt;br /&gt;
		ret.canonical = label&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local formatted_label&lt;br /&gt;
	formatted_label, deprecated = export.format_label(label, labdata, data.lang, deprecated, override_display, mode)&lt;br /&gt;
	ret.deprecated = deprecated&lt;br /&gt;
	if deprecated then&lt;br /&gt;
		if not data.nocat then&lt;br /&gt;
			local depcat = &amp;quot;Entries with deprecated labels&amp;quot;&lt;br /&gt;
			if data.for_doc then&lt;br /&gt;
				depcat = &amp;quot;&amp;lt;code&amp;gt;&amp;quot; .. depcat .. &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			insert(ret.categories, depcat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local label_for_already_seen =&lt;br /&gt;
		(labprop(&amp;quot;topical_categories&amp;quot;) or labprop(&amp;quot;regional_categories&amp;quot;)&lt;br /&gt;
		or labprop(&amp;quot;plain_categories&amp;quot;) or labprop(&amp;quot;pos_categories&amp;quot;)&lt;br /&gt;
		or labprop(&amp;quot;sense_categories&amp;quot;)) and formatted_label&lt;br /&gt;
		or nil&lt;br /&gt;
&lt;br /&gt;
	-- Track label text. If label text was previously used, don&#039;t show it, but include the categories.&lt;br /&gt;
	-- For an example, see [[hypocretin]].&lt;br /&gt;
	if data.already_seen and data.already_seen[label_for_already_seen] then&lt;br /&gt;
		ret.label = &amp;quot;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		if formatted_label:find(&amp;quot;{&amp;quot;) then&lt;br /&gt;
			formatted_label = mw.getCurrentFrame():preprocess(formatted_label)&lt;br /&gt;
		end&lt;br /&gt;
		ret.label = formatted_label&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if data.nocat then&lt;br /&gt;
		-- do nothing&lt;br /&gt;
	else&lt;br /&gt;
		local cats = export.fetch_categories(label, labdata, data.lang, mode, data.for_doc)&lt;br /&gt;
		for _, cat in ipairs(cats) do&lt;br /&gt;
			insert(ret.categories, cat)&lt;br /&gt;
		end&lt;br /&gt;
		if not ret.categories[1] or data.for_doc then&lt;br /&gt;
			-- Don&#039;t try to format categories if we&#039;re doing this for documentation ({{label/doc}}), because there&lt;br /&gt;
			-- will be HTML in the categories.&lt;br /&gt;
			-- do nothing&lt;br /&gt;
		else&lt;br /&gt;
			ret.formatted_categories = require(utilities_module).format_categories(ret.categories, data.lang,&lt;br /&gt;
				data.sort, nil, force_cat or data.force_cat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret.data = labdata&lt;br /&gt;
&lt;br /&gt;
	if label_for_already_seen and data.already_seen then&lt;br /&gt;
		data.already_seen[label_for_already_seen] = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Split a string containing comma-separated raw labels into the individual labels. This will not split on a comma&lt;br /&gt;
followed by whitespace, and it will not split inside of matched &amp;lt;...&amp;gt; or [...]. The code is written to be efficient, so&lt;br /&gt;
that it does not load modules (e.g. [[Module:parse utilities]]) unnecessarily.&lt;br /&gt;
]==]&lt;br /&gt;
function export.split_labels_on_comma(term)&lt;br /&gt;
	if term:find(&amp;quot;[%[&amp;lt;]&amp;quot;) then&lt;br /&gt;
		-- Do it the &amp;quot;hard way&amp;quot;. We don&#039;t want to split anything inside of &amp;lt;...&amp;gt; or &amp;lt;&amp;lt;...&amp;gt;&amp;gt; even if there are commas&lt;br /&gt;
		-- inside of the angle brackets. For good measure we do the same for [...] and [[...]]. We first parse balanced&lt;br /&gt;
		-- segment runs involving either [...] or &amp;lt;...&amp;gt;. Then we split alternating runs on comma (but not on&lt;br /&gt;
		-- comma+whitespace). Then we rejoin the split runs. For example, given the following:&lt;br /&gt;
		-- &amp;quot;regional,older &amp;lt;&amp;lt;non-rhotic,and,non-hoarse-horse&amp;gt;&amp;gt; speakers&amp;quot;, the first call to&lt;br /&gt;
		-- parse_multi_delimiter_balanced_segment_run() produces&lt;br /&gt;
		--&lt;br /&gt;
		-- {&amp;quot;regional,older &amp;quot;, &amp;quot;&amp;lt;&amp;lt;non-rhotic,and,non-hoarse-horse&amp;gt;&amp;gt;&amp;quot;, &amp;quot; speakers&amp;quot;}&lt;br /&gt;
		--&lt;br /&gt;
		-- After calling split_alternating_runs_on_comma(), we get the following:&lt;br /&gt;
		--&lt;br /&gt;
		-- {{&amp;quot;regional&amp;quot;}, {&amp;quot;older &amp;quot;, &amp;quot;&amp;lt;&amp;lt;non-rhotic,and,non-hoarse-horse&amp;gt;&amp;gt;&amp;quot;, &amp;quot; speakers&amp;quot;}}&lt;br /&gt;
		--&lt;br /&gt;
		-- After rejoining each group, we get:&lt;br /&gt;
		--&lt;br /&gt;
		-- {&amp;quot;regional&amp;quot;, &amp;quot;older &amp;lt;&amp;lt;non-rhotic,and,non-hoarse-horse&amp;gt;&amp;gt; speakers&amp;quot;}&lt;br /&gt;
		--&lt;br /&gt;
		-- which is the desired output. When processing the second &amp;quot;label&amp;quot; string, the code in process_raw_labels()&lt;br /&gt;
		-- will do a similar process to this to pull out the labels inside of the &amp;lt;&amp;lt;...&amp;gt;&amp;gt; notation.&lt;br /&gt;
		local put = require(parse_utilities_module)&lt;br /&gt;
		local segments = put.parse_multi_delimiter_balanced_segment_run(term, {{&amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;}, {&amp;quot;[&amp;quot;, &amp;quot;]&amp;quot;}})&lt;br /&gt;
		-- This won&#039;t split on comma+whitespace.&lt;br /&gt;
		local comma_separated_groups = put.split_alternating_runs_on_comma(segments)&lt;br /&gt;
		for i, group in ipairs(comma_separated_groups) do&lt;br /&gt;
			comma_separated_groups[i] = table.concat(group)&lt;br /&gt;
		end&lt;br /&gt;
		return comma_separated_groups&lt;br /&gt;
	elseif term:find(&amp;quot;,%s&amp;quot;) then&lt;br /&gt;
		-- This won&#039;t split on comma+whitespace.&lt;br /&gt;
		return require(parse_utilities_module).split_on_comma(term)&lt;br /&gt;
	elseif term:find(&amp;quot;,&amp;quot;) then&lt;br /&gt;
		return require(string_utilities_module).split(term, &amp;quot;,&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		return {term}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return a list of objects corresponding to a set of raw labels. Each object returned is of the format returned by&lt;br /&gt;
{get_label_info()}. This is similar to looping over the labels and calling {get_label_info()} on each one, but it also&lt;br /&gt;
correctly handles embedded double angle bracket specs &amp;lt;&amp;lt;...&amp;gt;&amp;gt; found in the labels. (In such a case, there will be more&lt;br /&gt;
objects returned than raw labels passed in.) On input, `data` is an object with the following fields:&lt;br /&gt;
* `labels`: The list of labels to process.&lt;br /&gt;
* `lang`: The language of the labels. Must be specified.&lt;br /&gt;
* `mode`: How the label was invoked; see {get_label_info()} for more information.&lt;br /&gt;
* `nocat`: If true, don&#039;t add the label to any categories.&lt;br /&gt;
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion&lt;br /&gt;
   pages).&lt;br /&gt;
* `notrack`: Disable all tracking for this label.&lt;br /&gt;
* `sort`: Sort key for categorization.&lt;br /&gt;
* `already_seen`: An object used to track labels already seen, so they aren&#039;t displayed twice. Tracking is according&lt;br /&gt;
  to the display form of the label, so if two labels have the same display form, the second one won&#039;t be displayed&lt;br /&gt;
  (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn&#039;t happen.&lt;br /&gt;
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this&lt;br /&gt;
  function running.&lt;br /&gt;
]==]&lt;br /&gt;
function export.process_raw_labels(data)&lt;br /&gt;
	local label_infos = {}&lt;br /&gt;
&lt;br /&gt;
	if not data.ok_to_destructively_modify then&lt;br /&gt;
		data = m_table.shallowCopy(data)&lt;br /&gt;
		data.ok_to_destructively_modify = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function get_info_and_insert(label)&lt;br /&gt;
		-- Reuse this structure to save memory.&lt;br /&gt;
		data.label = label&lt;br /&gt;
		insert(label_infos, export.get_label_info(data))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, label in ipairs(data.labels) do&lt;br /&gt;
		if label:find(&amp;quot;&amp;lt;&amp;lt;&amp;quot;) then&lt;br /&gt;
			local segments = require(string_utilities_module).split(label, &amp;quot;&amp;lt;&amp;lt;(.-)&amp;gt;&amp;gt;&amp;quot;)&lt;br /&gt;
			for i, segment in ipairs(segments) do&lt;br /&gt;
				if i % 2 == 1 then&lt;br /&gt;
					local raw_text_type = i == 1 and &amp;quot;begin&amp;quot; or i == #segments and &amp;quot;end&amp;quot; or &amp;quot;middle&amp;quot;&lt;br /&gt;
					insert(label_infos, {raw_text = raw_text_type, label = segment, categories = {}})&lt;br /&gt;
				else&lt;br /&gt;
					local segment_labels = export.split_labels_on_comma(segment)&lt;br /&gt;
					for _, segment_label in ipairs(segment_labels) do&lt;br /&gt;
						get_info_and_insert(segment_label)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			get_info_and_insert(label)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return label_infos&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Split a comma-separated string of raw labels and process each label to get a list of objects suitable for passing to&lt;br /&gt;
{format_processed_labels()}. Each object returned is of the format returned by {get_label_info()}. This is equivalent to&lt;br /&gt;
calling {split_labels_on_comma()} followed by {process_raw_labels()}. On input, `data` is an object with the following&lt;br /&gt;
fields:&lt;br /&gt;
* `labels`: The string containing the raw comma-separated labels.&lt;br /&gt;
* `lang`: The language of the labels. Must be specified.&lt;br /&gt;
* `mode`: How the label was invoked; see {get_label_info()} for more information.&lt;br /&gt;
* `nocat`: If true, don&#039;t add the label to any categories.&lt;br /&gt;
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion&lt;br /&gt;
   pages).&lt;br /&gt;
* `notrack`: Disable all tracking for this label.&lt;br /&gt;
* `sort`: Sort key for categorization.&lt;br /&gt;
* `already_seen`: An object used to track labels already seen, so they aren&#039;t displayed twice. Tracking is according&lt;br /&gt;
  to the display form of the label, so if two labels have the same display form, the second one won&#039;t be displayed&lt;br /&gt;
  (but its categories will still be added). If `already_seen` is {nil}, this tracking doesn&#039;t happen.&lt;br /&gt;
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this&lt;br /&gt;
  function running.&lt;br /&gt;
]==]&lt;br /&gt;
function export.split_and_process_raw_labels(data)&lt;br /&gt;
	if not data.ok_to_destructively_modify then&lt;br /&gt;
		data = m_table.shallowCopy(data)&lt;br /&gt;
		data.ok_to_destructively_modify = true&lt;br /&gt;
	end&lt;br /&gt;
	data.labels = export.split_labels_on_comma(data.labels)&lt;br /&gt;
	return export.process_raw_labels(data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format one or more already-processed labels for display and categorization. &amp;quot;Already-processed&amp;quot; means that&lt;br /&gt;
{get_label_info()} or {process_raw_labels()} has been called on the raw labels to convert them into objects containing&lt;br /&gt;
information on how to display and categorize the labels. This is a lower-level alternative to {show_labels()} and is&lt;br /&gt;
meant for modules such as [[Module:alternative forms]], [[Module:quote]] and [[Module:etymology/templates/descendant]]&lt;br /&gt;
that support displaying labels along with some other information.&lt;br /&gt;
&lt;br /&gt;
On input `data` is an object with the following fields:&lt;br /&gt;
* `labels`: List of the label objects to format, in the format returned by {get_label_info()}.&lt;br /&gt;
* `lang`: The language of the labels.&lt;br /&gt;
* `open`: Open bracket or parenthesis to display before the concatenated labels. If specified, it is wrapped in the&lt;br /&gt;
  {&amp;quot;ib-brac&amp;quot;} and {&amp;quot;label-brac&amp;quot;} CSS classes. If {nil} or {false}, no open bracket is displayed.&lt;br /&gt;
* `close`: Close bracket or parenthesis to display after the concatenated labels. If specified, it is wrapped in the&lt;br /&gt;
  {&amp;quot;ib-brac&amp;quot;} and {&amp;quot;label-brac&amp;quot;} CSS classes. If {nil} or {false}, no close bracket is displayed.&lt;br /&gt;
* `no_ib_content`: By default, the concatenated formatted labels inside of the open/close brackets are wrapped in the&lt;br /&gt;
  {&amp;quot;ib-content&amp;quot;} and {&amp;quot;label-content&amp;quot;} CSS classes. Specify this to suppress this wrapping.&lt;br /&gt;
* `raw`: Suppress all CSS wrapping of content, including open/close parentheses, content and comma delimiters (which&lt;br /&gt;
  are normally wrapped in {&amp;quot;ib-comma&amp;quot;} and {&amp;quot;label-comma&amp;quot;} CSS classes).&lt;br /&gt;
* `ok_to_destructively_modify`: If set, the `data` structure, and the `data.labels` table inside of it, will be&lt;br /&gt;
  destructively modified in the process of this function running.&lt;br /&gt;
* `split_output`: If not given, the return value is a concatenation of the formatted concatenated labels and formatted&lt;br /&gt;
  categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is&lt;br /&gt;
  the value {&amp;quot;raw&amp;quot;}, the categories are returned in list form, where the list elements are strings f the form suitable&lt;br /&gt;
  for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the&lt;br /&gt;
  categories are returned as a pre-formatted concatenated string.&lt;br /&gt;
&lt;br /&gt;
The return value (or the first return value, if `split_output` is given) is a string containing the contenated labels,&lt;br /&gt;
optionally surrounded by open/close brackets or parentheses. Normally, labels are separated by comma-space sequences,&lt;br /&gt;
but this may be suppressed for certain labels. If `nocat` wasn&#039;t given to {get_label_info()} or {process_raw_labels()},&lt;br /&gt;
and `split_output` wasn&#039;t given, the label objects will contain formatted categories in them, which will be inserted&lt;br /&gt;
into the returned text. (Use `split_output` if you need the categories returned separately.) The concatenated text&lt;br /&gt;
inside of the open/close brackets is normally wrapped in the {&amp;quot;ib-content&amp;quot;} CSS class, but this can be suppressed, as&lt;br /&gt;
mentioned above.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_processed_labels(data)&lt;br /&gt;
	if not data.labels then&lt;br /&gt;
		error(&amp;quot;`data` must now be an object containing the params&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not data.ok_to_destructively_modify then&lt;br /&gt;
		data = m_table.shallowCopy(data)&lt;br /&gt;
		data.labels = m_table.deepCopy(data.labels)&lt;br /&gt;
		data.ok_to_destructively_modify = true&lt;br /&gt;
	end&lt;br /&gt;
	local labels = data.labels&lt;br /&gt;
	if not labels[1] then&lt;br /&gt;
		error(&amp;quot;You must specify at least one label.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Show the labels&lt;br /&gt;
	local omit_preComma = false&lt;br /&gt;
	local omit_postComma = true&lt;br /&gt;
	local omit_preSpace = false&lt;br /&gt;
	local omit_postSpace = true&lt;br /&gt;
&lt;br /&gt;
	for _, label in ipairs(labels) do&lt;br /&gt;
		omit_preComma = omit_postComma&lt;br /&gt;
		omit_preSpace = omit_postSpace&lt;br /&gt;
&lt;br /&gt;
		local raw_text_omit_before = label.raw_text == &amp;quot;middle&amp;quot; or label.raw_text == &amp;quot;end&amp;quot;&lt;br /&gt;
		local raw_text_omit_after = label.raw_text == &amp;quot;middle&amp;quot; or label.raw_text == &amp;quot;begin&amp;quot;&lt;br /&gt;
		label.omit_comma = omit_preComma or (label.data and label.data.omit_preComma) or raw_text_omit_before&lt;br /&gt;
		omit_postComma = (label.data and label.data.omit_postComma) or raw_text_omit_after&lt;br /&gt;
		label.omit_space = omit_preSpace or (label.data and label.data.omit_preSpace) or raw_text_omit_before&lt;br /&gt;
		omit_postSpace = (label.data and label.data.omit_postSpace) or raw_text_omit_after&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if data.lang then&lt;br /&gt;
		local lang_functions_module = export.lang_specific_data_modules_prefix .. data.lang:getCode() .. &amp;quot;/functions&amp;quot;&lt;br /&gt;
		local m_lang_functions = require(load_module).safe_require(lang_functions_module)&lt;br /&gt;
		if m_lang_functions and m_lang_functions.postprocess_handlers then&lt;br /&gt;
			for _, handler in ipairs(m_lang_functions.postprocess_handlers) do&lt;br /&gt;
				handler(data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function wrap_css(txt, suffix)&lt;br /&gt;
		if data.raw then&lt;br /&gt;
			return txt&lt;br /&gt;
		end&lt;br /&gt;
		return (&amp;quot;&amp;lt;span class=\&amp;quot;ib-%s label-%s\&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;quot;):format(suffix, suffix, txt)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local categories = nil&lt;br /&gt;
	local formatted_categories = split_output and split_output ~= &amp;quot;raw&amp;quot; and {} or nil&lt;br /&gt;
	for i, labelinfo in ipairs(labels) do&lt;br /&gt;
		local label&lt;br /&gt;
		-- Need to check for &#039;not raw_text&#039; here because blank labels may legitimately occur as raw text if a double&lt;br /&gt;
		-- angle bracket spec occurs at the beginning of a label. In this case we&#039;ve already taken into account the&lt;br /&gt;
		-- context and don&#039;t want to leave out a preceding comma and space e.g. in a case like&lt;br /&gt;
		-- {{lb|en|rare|&amp;lt;&amp;lt;dialect&amp;gt;&amp;gt; or &amp;lt;&amp;lt;eye dialect&amp;gt;&amp;gt;}}. FIXME: We should reconsider whether we need this special case&lt;br /&gt;
		-- at all.&lt;br /&gt;
		if labelinfo.label == &amp;quot;&amp;quot; and not labelinfo.raw_text then&lt;br /&gt;
			label = &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			label = (labelinfo.omit_comma and &amp;quot;&amp;quot; or wrap_css(&amp;quot;,&amp;quot;, &amp;quot;comma&amp;quot;)) ..&lt;br /&gt;
					(labelinfo.omit_space and &amp;quot;&amp;quot; or &amp;quot;&amp;amp;#32;&amp;quot;) ..&lt;br /&gt;
					labelinfo.label&lt;br /&gt;
		end&lt;br /&gt;
		if split_output then&lt;br /&gt;
			labels[i] = label&lt;br /&gt;
			if split_output == &amp;quot;raw&amp;quot; then&lt;br /&gt;
				if labelinfo.categories and labelinfo.categories[1] then&lt;br /&gt;
					if categories then&lt;br /&gt;
						m_table.extend(categories, labelinfo.categories)&lt;br /&gt;
					else&lt;br /&gt;
						categories = labelinfo.categories&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			elseif labelinfo.formatted_categories then&lt;br /&gt;
				insert(formatted_categories, labelinfo.formatted_categories)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			labels[i] = label .. (labelinfo.formatted_categories or &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function wrap_open_close(val)&lt;br /&gt;
		if val then&lt;br /&gt;
			return wrap_css(val, &amp;quot;brac&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local concatenated_labels = table.concat(labels, &amp;quot;&amp;quot;)&lt;br /&gt;
	if not data.no_ib_content then&lt;br /&gt;
		concatenated_labels = wrap_css(concatenated_labels, &amp;quot;content&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret_labels = wrap_open_close(data.open) .. concatenated_labels .. wrap_open_close(data.close)&lt;br /&gt;
	if split_output == &amp;quot;raw&amp;quot; then&lt;br /&gt;
		return ret_labels, categories&lt;br /&gt;
	elseif split_output then&lt;br /&gt;
		return ret_labels, concat(formatted_categories)&lt;br /&gt;
	else&lt;br /&gt;
		return ret_labels&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format one or more labels for display and categorization. This provides the implementation of the&lt;br /&gt;
{{tl|label}}/{{tl|lb}}, {{tl|term label}}/{{tl|tlb}} and {{tl|accent}}/{{tl|a}} templates, and can also be called from a&lt;br /&gt;
module. The return value is a string to be inserted into the generated page, including the display and categories. On&lt;br /&gt;
input `data` is an object with the following fields:&lt;br /&gt;
* `labels`: List of the labels to format.&lt;br /&gt;
* `lang`: The language of the labels.&lt;br /&gt;
* `mode`: How the label was invoked; see {get_label_info()} for more information.&lt;br /&gt;
* `nocat`: If true, don&#039;t add the labels to any categories.&lt;br /&gt;
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion&lt;br /&gt;
   pages).&lt;br /&gt;
* `notrack`: Disable all tracking for these labels.&lt;br /&gt;
* `sort`: Sort key for categorization.&lt;br /&gt;
* `no_track_already_seen`: Don&#039;t track already-seen labels. If not specified, already-seen labels are not displayed&lt;br /&gt;
  again, but still categorize. See the documentation of {get_label_info()}.&lt;br /&gt;
* `open`: Open bracket or parenthesis to display before the concatenated labels. If {nil}, defaults to an open&lt;br /&gt;
  parenthesis. Set to {false} to disable.&lt;br /&gt;
* `close`: Close bracket or parenthesis to display after the concatenated labels. If {nil}, defaults to a close&lt;br /&gt;
  parenthesis. Set to {false} to disable.&lt;br /&gt;
* `no_ib_content`: As in `format_processed_labels()`.&lt;br /&gt;
* `raw`: As in `format_processed_labels()`. Also suppress wrapping the entire formatted result in a usage label CSS&lt;br /&gt;
  class (see below).&lt;br /&gt;
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this&lt;br /&gt;
  function running.&lt;br /&gt;
&lt;br /&gt;
Compared with {format_processed_labels()}, this function has the following differences:&lt;br /&gt;
# The labels specified in `labels` are raw labels (i.e. strings) rather than formatted objects.&lt;br /&gt;
# The open and close brackets default to parentheses (&amp;quot;round brackets&amp;quot;) rather than not being displayed by default.&lt;br /&gt;
# Tracking of already-seen labels is enabled unless explicitly turned off using `no_track_already_seen`.&lt;br /&gt;
# The entire formatted result is wrapped in a {&amp;quot;usage-label-&amp;lt;var&amp;gt;type&amp;lt;/var&amp;gt;&amp;quot;} CSS class (depending on the value of&lt;br /&gt;
  `mode`), unless `raw` is given.&lt;br /&gt;
]==]&lt;br /&gt;
function export.show_labels(data)&lt;br /&gt;
	if not data.labels then&lt;br /&gt;
		error(&amp;quot;`data` must now be an object containing the params&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not data.ok_to_destructively_modify then&lt;br /&gt;
		data = m_table.shallowCopy(data)&lt;br /&gt;
		data.ok_to_destructively_modify = true&lt;br /&gt;
	end&lt;br /&gt;
	local labels = data.labels&lt;br /&gt;
	if not labels[1] then&lt;br /&gt;
		error(&amp;quot;You must specify at least one label.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local mode = validate_mode(data.mode)&lt;br /&gt;
&lt;br /&gt;
	if not data.no_track_already_seen then&lt;br /&gt;
		data.already_seen = {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	data.labels = export.process_raw_labels(data)&lt;br /&gt;
	if data.open == nil then&lt;br /&gt;
		data.open = &amp;quot;(&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if data.close == nil then&lt;br /&gt;
		data.close = &amp;quot;)&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local formatted = export.format_processed_labels(data)&lt;br /&gt;
	if data.raw then&lt;br /&gt;
		return formatted&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;lt;span class=\&amp;quot;&amp;quot; .. mode_to_outer_class[mode] .. &amp;quot;\&amp;quot;&amp;gt;&amp;quot; .. formatted .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Helper function for the data modules.]==]&lt;br /&gt;
function export.alias(labels, key, aliases)&lt;br /&gt;
	m_table.alias(labels, key, aliases)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Split the display form of a label. Returns two values: `link` and `display`. If the display form consists of a&lt;br /&gt;
two-part link, `link` is the first part and `display` is the second part. If the display form consists of a&lt;br /&gt;
single-part link, `link` and `display` are the same. Otherwise (the display form is not a link or contains an&lt;br /&gt;
embedded link), `link` is the same as the passed-in `label` and `display` is nil.&lt;br /&gt;
]==]&lt;br /&gt;
function export.split_display_form(label)&lt;br /&gt;
	if not label:find(&amp;quot;%[%[&amp;quot;) then&lt;br /&gt;
		return label, nil&lt;br /&gt;
	end&lt;br /&gt;
	local link, display = label:match(&amp;quot;^%[%[([^%[%]|]+)|([^%[%]|]+)%]%]$&amp;quot;)&lt;br /&gt;
	if link then&lt;br /&gt;
		return link, display&lt;br /&gt;
	end&lt;br /&gt;
	link = label:match(&amp;quot;^%[%[([^%[%]|])+%]%]$&amp;quot;)&lt;br /&gt;
	if link then&lt;br /&gt;
		return link, link&lt;br /&gt;
	end&lt;br /&gt;
	return label, nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Combine the `link` and `display` parts of the display form of a label as returned by {split_display_form()}.&lt;br /&gt;
If `display` is nil, `link` is returned directly. Otherwise, a one-part or two-part link is constructed&lt;br /&gt;
depending on whether `link` and `display` are the same. (As a special case, if both consist of a blank string,&lt;br /&gt;
the return value is a blank string rather than a malformed link.)&lt;br /&gt;
]==]&lt;br /&gt;
function export.combine_display_form_parts(link, display)&lt;br /&gt;
	if not display then&lt;br /&gt;
		return link&lt;br /&gt;
	end&lt;br /&gt;
	if link == display then&lt;br /&gt;
		if link == &amp;quot;&amp;quot; then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			return (&amp;quot;[[%s]]&amp;quot;):format(link)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return (&amp;quot;[[%s|%s]]&amp;quot;):format(link, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Used to finalize the data into the form that is actually returned.]==]&lt;br /&gt;
function export.finalize_data(labels)&lt;br /&gt;
	local shallow_copy = m_table.shallowCopy&lt;br /&gt;
	local aliases = {}&lt;br /&gt;
	for label, data in pairs(labels) do&lt;br /&gt;
		if type(data) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			if data.aliases then&lt;br /&gt;
				for _, alias in ipairs(data.aliases) do&lt;br /&gt;
					aliases[alias] = label&lt;br /&gt;
				end&lt;br /&gt;
				data.aliases = nil&lt;br /&gt;
			end&lt;br /&gt;
			if data.deprecated_aliases then&lt;br /&gt;
				local data2 = shallow_copy(data)&lt;br /&gt;
				data2.deprecated = true&lt;br /&gt;
				data2.canonical = label&lt;br /&gt;
				for _, alias in ipairs(data2.deprecated_aliases) do&lt;br /&gt;
					aliases[alias] = data2&lt;br /&gt;
				end&lt;br /&gt;
				data.deprecated_aliases = nil&lt;br /&gt;
				data2.deprecated_aliases = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for label, data in pairs(aliases) do&lt;br /&gt;
		labels[label] = data&lt;br /&gt;
	end&lt;br /&gt;
	return labels&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:languages&amp;diff=491422</id>
		<title>Module:languages</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:languages&amp;diff=491422"/>
		<updated>2026-03-24T23:55:49Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[=[&lt;br /&gt;
This module implements fetching of language-specific information and processing text in a given language.&lt;br /&gt;
&lt;br /&gt;
There are two types of languages: full languages and etymology-only languages. The essential difference is that only&lt;br /&gt;
full languages appear in L2 headings in vocabulary entries, and hence categories like [[:Category:French nouns]] exist&lt;br /&gt;
only for full languages. Etymology-only languages have either a full language or another etymology-only language as&lt;br /&gt;
their parent (in the parent-child inheritance sense), and for etymology-only languages with another etymology-only&lt;br /&gt;
language as their parent, a full language can always be derived by following the parent links upwards. For example,&lt;br /&gt;
&amp;quot;Canadian French&amp;quot;, code &#039;fr-CA&#039;, is an etymology-only language whose parent is the full language &amp;quot;French&amp;quot;, code &#039;fr&#039;.&lt;br /&gt;
An example of an etymology-only language with another etymology-only parent is &amp;quot;Northumbrian Old English&amp;quot;, code&lt;br /&gt;
&#039;ang-nor&#039;, which has &amp;quot;Anglian Old English&amp;quot;, code &#039;ang-ang&#039; as its parent; this is an etymology-only language whose&lt;br /&gt;
parent is &amp;quot;Old English&amp;quot;, code &amp;quot;ang&amp;quot;, which is a full language. (This is because Northumbrian Old English is considered&lt;br /&gt;
a variety of Anglian Old English.) Sometimes the parent is the &amp;quot;Undetermined&amp;quot; language, code &#039;und&#039;; this is the case,&lt;br /&gt;
for example, for &amp;quot;substrate&amp;quot; languages such as &amp;quot;Pre-Greek&amp;quot;, code &#039;qsb-grc&#039;, and &amp;quot;the BMAC substrate&amp;quot;, code &#039;qsb-bma&#039;.&lt;br /&gt;
&lt;br /&gt;
It is important to distinguish language &#039;&#039;parents&#039;&#039; from language &#039;&#039;ancestors&#039;&#039;. The parent-child relationship is one&lt;br /&gt;
of containment, i.e. if X is a child of Y, X is considered a variety of Y. On the other hand, the ancestor-descendant&lt;br /&gt;
relationship is one of descent in time. For example, &amp;quot;Classical Latin&amp;quot;, code &#039;la-cla&#039;, and &amp;quot;Late Latin&amp;quot;, code &#039;la-lat&#039;,&lt;br /&gt;
are both etymology-only languages with &amp;quot;Latin&amp;quot;, code &#039;la&#039;, as their parents, because both of the former are varieties&lt;br /&gt;
of Latin. However, Late Latin does *NOT* have Classical Latin as its parent because Late Latin is *not* a variety of&lt;br /&gt;
Classical Latin; rather, it is a descendant. There is in fact a separate &#039;ancestors&#039; field that is used to express the&lt;br /&gt;
ancestor-descendant relationship, and Late Latin&#039;s ancestor is given as Classical Latin. It is also important to note&lt;br /&gt;
that sometimes an etymology-only language is actually the conceptual ancestor of its parent language. This happens,&lt;br /&gt;
for example, with &amp;quot;Old Italian&amp;quot; (code &#039;roa-oit&#039;), which is an etymology-only variant of full language &amp;quot;Italian&amp;quot; (code&lt;br /&gt;
&#039;it&#039;), and with &amp;quot;Old Latin&amp;quot; (code &#039;itc-ola&#039;), which is an etymology-only variant of Latin. In both cases, the full&lt;br /&gt;
language has the etymology-only variant listed as an ancestor. This allows a Latin term to inherit from Old Latin&lt;br /&gt;
using the {{tl|inh}} template (where in this template, &amp;quot;inheritance&amp;quot; refers to ancestral inheritance, i.e. inheritance&lt;br /&gt;
in time, rather than in the parent-child sense); likewise for Italian and Old Italian.&lt;br /&gt;
&lt;br /&gt;
Full languages come in three subtypes:&lt;br /&gt;
* {regular}: This indicates a full language that is attested according to [[WT:CFI]] and therefore permitted in the&lt;br /&gt;
			main namespace. There may also be reconstructed terms for the language, which are placed in the&lt;br /&gt;
			{Reconstruction} namespace and must be prefixed with * to indicate a reconstruction. Most full languages&lt;br /&gt;
			are natural (not constructed) languages, but a few constructed languages (e.g. Esperanto and Volapük,&lt;br /&gt;
			among others) are also allowed in the mainspace and considered regular languages.&lt;br /&gt;
* {reconstructed}: This language is not attested according to [[WT:CFI]], and therefore is allowed only in the&lt;br /&gt;
				{Reconstruction} namespace. All terms in this language are reconstructed, and must be prefixed with&lt;br /&gt;
				*. Languages such as Proto-Indo-European and Proto-Germanic are in this category.&lt;br /&gt;
* {appendix-constructed}: This language is attested but does not meet the additional requirements set out for&lt;br /&gt;
						constructed languages ([[WT:CFI#Constructed languages]]). Its entries must therefore be in&lt;br /&gt;
						the Appendix namespace, but they are not reconstructed and therefore should not have *&lt;br /&gt;
						prefixed in links. Most constructed languages are of this subtype.&lt;br /&gt;
&lt;br /&gt;
Both full languages and etymology-only languages have a {Language} object associated with them, which is fetched using&lt;br /&gt;
the {getByCode} function in [[Module:languages]] to convert a language code to a {Language} object. Depending on the&lt;br /&gt;
options supplied to this function, etymology-only languages may or may not be accepted, and family codes may be&lt;br /&gt;
accepted (returning a {Family} object as described in [[Module:families]]). There are also separate {getByCanonicalName}&lt;br /&gt;
functions in [[Module:languages]] and [[Module:etymology languages]] to convert a language&#039;s canonical name to a&lt;br /&gt;
{Language} object (depending on whether the canonical name refers to a full or etymology-only language).&lt;br /&gt;
&lt;br /&gt;
Textual strings belonging to a given language come in several different &#039;&#039;text variants&#039;&#039;:&lt;br /&gt;
# The &#039;&#039;input text&#039;&#039; is what the user supplies in wikitext, in the parameters to {{tl|m}}, {{tl|l}}, {{tl|ux}},&lt;br /&gt;
{{tl|t}}, {{tl|lang}} and the like.&lt;br /&gt;
# The &#039;&#039;display text&#039;&#039; is the text in the form as it will be displayed to the user. This can include accent marks that&lt;br /&gt;
are stripped to form the entry text (see below), as well as embedded bracketed links that are variously processed&lt;br /&gt;
further. The display text is generated from the input text by applying language-specific transformations; for most&lt;br /&gt;
languages, there will be no such transformations. Examples of transformations are bad-character replacements for&lt;br /&gt;
certain languages (e.g. replacing &#039;l&#039; or &#039;1&#039; to [[palochka]] in certain languages in Cyrillic); and for Thai and&lt;br /&gt;
Khmer, converting space-separated words to bracketed words and resolving respelling substitutions such as [กรีน/กฺรีน],&lt;br /&gt;
which indicate how to transliterate given words.&lt;br /&gt;
# The &#039;&#039;entry text&#039;&#039; is the text in the form used to generate a link to a Wiktionary entry. This is usually generated&lt;br /&gt;
from the display text by stripping certain sorts of diacritics on a per-language basis, and sometimes doing other&lt;br /&gt;
transformations. The concept of &#039;&#039;entry text&#039;&#039; only really makes sense for text that does not contain embedded links,&lt;br /&gt;
meaning that display text containing embedded links will need to have the links individually processed to get&lt;br /&gt;
per-link entry text in order to generate the resolved display text (see below).&lt;br /&gt;
# The &#039;&#039;resolved display text&#039;&#039; is the result of resolving embedded links in the display text (e.g. converting them to&lt;br /&gt;
two-part links where the first part has entry-text transformations applied, and adding appropriate language-specific&lt;br /&gt;
fragments) and adding appropriate language and script tagging. This text can be passed directly to MediaWiki for&lt;br /&gt;
display.&lt;br /&gt;
# The &#039;&#039;source translit text&#039;&#039; is the text as supplied to the language-specific {transliterate()} method. The form of&lt;br /&gt;
the source translit text may need to be language-specific, e.g Thai and Khmer will need the full unprocessed input&lt;br /&gt;
text, whereas other languages may need to work off the display text. [FIXME: It&#039;s still unclear to me how embedded&lt;br /&gt;
bracketed links are handled in the existing code.] In general, embedded links need to be removed (i.e. converted to&lt;br /&gt;
their &amp;quot;bare display&amp;quot; form by taking the right part of two-part links and removing double brackets), but when this&lt;br /&gt;
happens is unclear to me [FIXME]. Some languages have a chop-up-and-paste-together scheme that sends parts of the&lt;br /&gt;
text through the transliterate mechanism, and for others (those listed with &amp;quot;cont&amp;quot; in {substition} in&lt;br /&gt;
[[Module:languages/data]]) they receive the full input text, but preprocessed in certain ways. (The wisdom of this is&lt;br /&gt;
still unclear to me.)&lt;br /&gt;
# The &#039;&#039;transliterated text&#039;&#039; (or &#039;&#039;transliteration&#039;&#039;) is the result of transliterating the source translit text.&lt;br /&gt;
Unlike for all the other text variants except the transcribed text, it is always in the Latin script.&lt;br /&gt;
# The &#039;&#039;transcribed text&#039;&#039; (or &#039;&#039;transcription&#039;&#039;) is the result of transcribing the source translit text, where&lt;br /&gt;
&amp;quot;transcription&amp;quot; here means a close approximation to the phonetic form of the language in languages (e.g. Akkadian,&lt;br /&gt;
Sumerian, Ancient Egyptian, maybe Tibetan) that have a wide difference between the written letters and spoken form.&lt;br /&gt;
Unlike for all the other text variants other than the transliterated text, it is always in the Latin script.&lt;br /&gt;
Currently, the transcribed text is always supplied manually be the user; there is no such thing as a&lt;br /&gt;
{lua|transcribe()} method on language objects.&lt;br /&gt;
# The &#039;&#039;sort key&#039;&#039; is the text used in sort keys for determining the placing of pages in categories they belong to. The&lt;br /&gt;
sort key is generated from the pagename or a specified &#039;&#039;sort base&#039;&#039; by lowercasing, doing language-specific&lt;br /&gt;
transformations and then uppercasing the result. If the sort base is supplied and is generated from input text, it&lt;br /&gt;
needs to be converted to display text, have embedded links removed (i.e. resolving them to their right side if they&lt;br /&gt;
are two-part links) and have entry text transformations applied.&lt;br /&gt;
# There are other text variants that occur in usexes (specifically, there are normalized variants of several of the&lt;br /&gt;
above text variants), but we can skip them for now.&lt;br /&gt;
&lt;br /&gt;
The following methods exist on {Language} objects to convert between different text variants:&lt;br /&gt;
# {makeDisplayText}: This converts input text to display text.&lt;br /&gt;
# {lua|makeEntryName}: This converts input or display text to entry text. [FIXME: This needs some rethinking. In&lt;br /&gt;
particular, {lua|makeEntryName} is sometimes called on display text (in some paths inside of [[Module:links]]) and&lt;br /&gt;
sometimes called on input text (in other paths inside of [[Module:links]], and usually from other modules). We need&lt;br /&gt;
to make sure we don&#039;t try to convert input text to display text twice, but at the same time we need to support&lt;br /&gt;
calling it directly on input text since so many modules do this. This means we need to add a parameter indicating&lt;br /&gt;
whether the passed-in text is input or display text; if that former, we call {lua|makeDisplayText} ourselves.]&lt;br /&gt;
# {lua|transliterate}: This appears to convert input text with embedded brackets removed into a transliteration.&lt;br /&gt;
[FIXME: This needs some rethinking. In particular, it calls {lua|processDisplayText} on its input, which won&#039;t work&lt;br /&gt;
for Thai and Khmer, so we may need language-specific flags indicating whether to pass the input text directly to the&lt;br /&gt;
language transliterate method. In addition, I&#039;m not sure how embedded links are handled in the existing translit code;&lt;br /&gt;
a lot of callers remove the links themselves before calling {lua|transliterate()}, which I assume is wrong.]&lt;br /&gt;
# {lua|makeSortKey}: This converts entry text (?) to a sort key. [FIXME: Clarify this.]&lt;br /&gt;
]=]&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local etymology_languages_data_module = &amp;quot;Module:etymology languages/data&amp;quot;&lt;br /&gt;
local families_module = &amp;quot;Module:families&amp;quot;&lt;br /&gt;
local json_module = &amp;quot;Module:JSON&amp;quot;&lt;br /&gt;
local language_like_module = &amp;quot;Module:language-like&amp;quot;&lt;br /&gt;
local languages_data_module = &amp;quot;Module:languages/data&amp;quot;&lt;br /&gt;
local languages_data_patterns_module = &amp;quot;Module:languages/data/patterns&amp;quot;&lt;br /&gt;
local links_data_module = &amp;quot;Module:links/data&amp;quot;&lt;br /&gt;
local load_module = &amp;quot;Module:load&amp;quot;&lt;br /&gt;
local patterns_module = &amp;quot;Module:patterns&amp;quot;&lt;br /&gt;
local scripts_module = &amp;quot;Module:scripts&amp;quot;&lt;br /&gt;
local scripts_data_module = &amp;quot;Module:scripts/data&amp;quot;&lt;br /&gt;
local string_encode_entities_module = &amp;quot;Module:string/encode entities&amp;quot;&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
local table_module = &amp;quot;Module:table&amp;quot;&lt;br /&gt;
local utilities_module = &amp;quot;Module:utilities&amp;quot;&lt;br /&gt;
local wikimedia_languages_module = &amp;quot;Module:wikimedia languages&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local mw = mw&lt;br /&gt;
local string = string&lt;br /&gt;
local table = table&lt;br /&gt;
&lt;br /&gt;
local char = string.char&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local find = string.find&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
local get_by_code -- Defined below.&lt;br /&gt;
local get_data_module_name -- Defined below.&lt;br /&gt;
local get_extra_data_module_name -- Defined below.&lt;br /&gt;
local getmetatable = getmetatable&lt;br /&gt;
local gmatch = string.gmatch&lt;br /&gt;
local gsub = string.gsub&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local ipairs = ipairs&lt;br /&gt;
local is_known_language_tag = mw.language.isKnownLanguageTag&lt;br /&gt;
local make_object -- Defined below.&lt;br /&gt;
local match = string.match&lt;br /&gt;
local next = next&lt;br /&gt;
local pairs = pairs&lt;br /&gt;
local remove = table.remove&lt;br /&gt;
local require = require&lt;br /&gt;
local select = select&lt;br /&gt;
local setmetatable = setmetatable&lt;br /&gt;
local sub = string.sub&lt;br /&gt;
local type = type&lt;br /&gt;
local unstrip = mw.text.unstrip&lt;br /&gt;
&lt;br /&gt;
-- Loaded as needed by findBestScript.&lt;br /&gt;
local Hans_chars&lt;br /&gt;
local Hant_chars&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]&lt;br /&gt;
	local function check_object(...)&lt;br /&gt;
		check_object = require(utilities_module).check_object&lt;br /&gt;
		return check_object(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function decode_entities(...)&lt;br /&gt;
		decode_entities = require(string_utilities_module).decode_entities&lt;br /&gt;
		return decode_entities(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function decode_uri(...)&lt;br /&gt;
		decode_uri = require(string_utilities_module).decode_uri&lt;br /&gt;
		return decode_uri(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function deep_copy(...)&lt;br /&gt;
		deep_copy = require(table_module).deepCopy&lt;br /&gt;
		return deep_copy(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function encode_entities(...)&lt;br /&gt;
		encode_entities = require(string_encode_entities_module)&lt;br /&gt;
		return encode_entities(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function get_script(...)&lt;br /&gt;
		get_script = require(scripts_module).getByCode&lt;br /&gt;
		return get_script(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function find_best_script_without_lang(...)&lt;br /&gt;
		find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang&lt;br /&gt;
		return find_best_script_without_lang(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function get_family(...)&lt;br /&gt;
		get_family = require(families_module).getByCode&lt;br /&gt;
		return get_family(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function get_plaintext(...)&lt;br /&gt;
		get_plaintext = require(utilities_module).get_plaintext&lt;br /&gt;
		return get_plaintext(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function get_wikimedia_lang(...)&lt;br /&gt;
		get_wikimedia_lang = require(wikimedia_languages_module).getByCode&lt;br /&gt;
		return get_wikimedia_lang(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function keys_to_list(...)&lt;br /&gt;
		keys_to_list = require(table_module).keysToList&lt;br /&gt;
		return keys_to_list(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function list_to_set(...)&lt;br /&gt;
		list_to_set = require(table_module).listToSet&lt;br /&gt;
		return list_to_set(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function load_data(...)&lt;br /&gt;
		load_data = require(load_module).load_data&lt;br /&gt;
		return load_data(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function make_family_object(...)&lt;br /&gt;
		make_family_object = require(families_module).makeObject&lt;br /&gt;
		return make_family_object(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function pattern_escape(...)&lt;br /&gt;
		pattern_escape = require(patterns_module).pattern_escape&lt;br /&gt;
		return pattern_escape(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function remove_duplicates(...)&lt;br /&gt;
		remove_duplicates = require(table_module).removeDuplicates&lt;br /&gt;
		return remove_duplicates(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function replacement_escape(...)&lt;br /&gt;
		replacement_escape = require(patterns_module).replacement_escape&lt;br /&gt;
		return replacement_escape(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function safe_require(...)&lt;br /&gt;
		safe_require = require(load_module).safe_require&lt;br /&gt;
		return safe_require(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function shallow_copy(...)&lt;br /&gt;
		shallow_copy = require(table_module).shallowCopy&lt;br /&gt;
		return shallow_copy(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function split(...)&lt;br /&gt;
		split = require(string_utilities_module).split&lt;br /&gt;
		return split(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function to_json(...)&lt;br /&gt;
		to_json = require(json_module).toJSON&lt;br /&gt;
		return to_json(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function u(...)&lt;br /&gt;
		u = require(string_utilities_module).char&lt;br /&gt;
		return u(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function ugsub(...)&lt;br /&gt;
		ugsub = require(string_utilities_module).gsub&lt;br /&gt;
		return ugsub(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function ulen(...)&lt;br /&gt;
		ulen = require(string_utilities_module).len&lt;br /&gt;
		return ulen(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function ulower(...)&lt;br /&gt;
		ulower = require(string_utilities_module).lower&lt;br /&gt;
		return ulower(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function umatch(...)&lt;br /&gt;
		umatch = require(string_utilities_module).match&lt;br /&gt;
		return umatch(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function uupper(...)&lt;br /&gt;
		uupper = require(string_utilities_module).upper&lt;br /&gt;
		return uupper(...)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
local function normalize_code(code)&lt;br /&gt;
	return load_data(languages_data_module).aliases[code] or code&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function check_inputs(self, check, default, ...)&lt;br /&gt;
	local n = select(&amp;quot;#&amp;quot;, ...)&lt;br /&gt;
	if n == 0 then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local ret = check(self, (...))&lt;br /&gt;
	if ret ~= nil then&lt;br /&gt;
		return ret&lt;br /&gt;
	elseif n &amp;gt; 1 then&lt;br /&gt;
		local inputs = {...}&lt;br /&gt;
		for i = 2, n do&lt;br /&gt;
			ret = check(self, inputs[i])&lt;br /&gt;
			if ret ~= nil then&lt;br /&gt;
				return ret&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return default&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_link(self, target, display)&lt;br /&gt;
	local prefix, main&lt;br /&gt;
	if self:getFamilyCode() == &amp;quot;qfa-sub&amp;quot; then&lt;br /&gt;
		prefix, main = display:match(&amp;quot;^(the )(.*)&amp;quot;)&lt;br /&gt;
		if not prefix then&lt;br /&gt;
			prefix, main = display:match(&amp;quot;^(a )(.*)&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return (prefix or &amp;quot;&amp;quot;) .. &amp;quot;[[&amp;quot; .. target .. &amp;quot;|&amp;quot; .. (main or display) .. &amp;quot;]]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Convert risky characters to HTML entities, which minimizes interference once returned (e.g. for &amp;quot;sms:a&amp;quot;, &amp;quot;&amp;lt;!-- --&amp;gt;&amp;quot; etc.).&lt;br /&gt;
local function escape_risky_characters(text)&lt;br /&gt;
	-- Spacing characters in isolation generally need to be escaped in order to be properly processed by the MediaWiki software.&lt;br /&gt;
	if umatch(text, &amp;quot;^%s*$&amp;quot;) then&lt;br /&gt;
		return encode_entities(text, text)&lt;br /&gt;
	end&lt;br /&gt;
	return encode_entities(text, &amp;quot;!#%&amp;amp;*+/:;&amp;lt;=&amp;gt;?@[\\]_{|}&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Temporarily convert various formatting characters to PUA to prevent them from being disrupted by the substitution process.&lt;br /&gt;
local function doTempSubstitutions(text, subbedChars, keepCarets, noTrim)&lt;br /&gt;
	-- Clone so that we don&#039;t insert any extra patterns into the table in package.loaded. For some reason, using require seems to keep memory use down; probably because the table is always cloned.&lt;br /&gt;
	local patterns = shallow_copy(require(languages_data_patterns_module))&lt;br /&gt;
	if keepCarets then&lt;br /&gt;
		insert(patterns, &amp;quot;((\\+)%^)&amp;quot;)&lt;br /&gt;
		insert(patterns, &amp;quot;((%^))&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	-- Ensure any whitespace at the beginning and end is temp substituted, to prevent it from being accidentally trimmed. We only want to trim any final spaces added during the substitution process (e.g. by a module), which means we only do this during the first round of temp substitutions.&lt;br /&gt;
	if not noTrim then&lt;br /&gt;
		insert(patterns, &amp;quot;^([\128-\191\244]*(%s+))&amp;quot;)&lt;br /&gt;
		insert(patterns, &amp;quot;((%s+)[\128-\191\244]*)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	-- Pre-substitution, of &amp;quot;[[&amp;quot; and &amp;quot;]]&amp;quot;, which makes pattern matching more accurate.&lt;br /&gt;
	text = gsub(text, &amp;quot;%f[%[]%[%[&amp;quot;, &amp;quot;\1&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;%f[%]]%]%]&amp;quot;, &amp;quot;\2&amp;quot;)&lt;br /&gt;
	local i = #subbedChars&lt;br /&gt;
	for _, pattern in ipairs(patterns) do&lt;br /&gt;
		-- Patterns ending in \0 stand are for things like &amp;quot;[[&amp;quot; or &amp;quot;]]&amp;quot;), so the inserted PUA are treated as breaks between terms by modules that scrape info from pages.&lt;br /&gt;
		local term_divider&lt;br /&gt;
		pattern = gsub(pattern, &amp;quot;%z$&amp;quot;, function(divider)&lt;br /&gt;
			term_divider = divider == &amp;quot;\0&amp;quot;&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end)&lt;br /&gt;
		text = gsub(text, pattern, function(...)&lt;br /&gt;
			local m = {...}&lt;br /&gt;
			local m1New = m[1]&lt;br /&gt;
			for k = 2, #m do&lt;br /&gt;
				local n = i + k - 1&lt;br /&gt;
				subbedChars[n] = m[k]&lt;br /&gt;
				local byte2 = floor(n / 4096) % 64 + (term_divider and 128 or 136)&lt;br /&gt;
				local byte3 = floor(n / 64) % 64 + 128&lt;br /&gt;
				local byte4 = n % 64 + 128&lt;br /&gt;
				m1New = gsub(m1New, pattern_escape(m[k]), &amp;quot;\244&amp;quot; .. char(byte2) .. char(byte3) .. char(byte4), 1)&lt;br /&gt;
			end&lt;br /&gt;
			i = i + #m - 1&lt;br /&gt;
			return m1New&lt;br /&gt;
		end)&lt;br /&gt;
	end&lt;br /&gt;
	text = gsub(text, &amp;quot;\1&amp;quot;, &amp;quot;%[%[&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;\2&amp;quot;, &amp;quot;%]%]&amp;quot;)&lt;br /&gt;
	return text, subbedChars&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Reinsert any formatting that was temporarily substituted.&lt;br /&gt;
local function undoTempSubstitutions(text, subbedChars)&lt;br /&gt;
	for i = 1, #subbedChars do&lt;br /&gt;
		local byte2 = floor(i / 4096) % 64 + 128&lt;br /&gt;
		local byte3 = floor(i / 64) % 64 + 128&lt;br /&gt;
		local byte4 = i % 64 + 128&lt;br /&gt;
		text = gsub(text, &amp;quot;\244[&amp;quot; .. char(byte2) .. char(byte2+8) .. &amp;quot;]&amp;quot; .. char(byte3) .. char(byte4), replacement_escape(subbedChars[i]))&lt;br /&gt;
	end&lt;br /&gt;
	text = gsub(text, &amp;quot;\1&amp;quot;, &amp;quot;%[%[&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;\2&amp;quot;, &amp;quot;%]%]&amp;quot;)&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Check if the raw text is an unsupported title, and if so return that. Otherwise, remove HTML entities. We do the pre-conversion to avoid loading the unsupported title list unnecessarily.&lt;br /&gt;
local function checkNoEntities(self, text)&lt;br /&gt;
	local textNoEnc = decode_entities(text)&lt;br /&gt;
	if textNoEnc ~= text and load_data(links_data_module).unsupported_titles[text] then&lt;br /&gt;
		return text&lt;br /&gt;
	else&lt;br /&gt;
		return textNoEnc&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If no script object is provided (or if it&#039;s invalid or None), get one.&lt;br /&gt;
local function checkScript(text, self, sc)&lt;br /&gt;
	if not check_object(&amp;quot;script&amp;quot;, true, sc) or sc:getCode() == &amp;quot;None&amp;quot; then&lt;br /&gt;
		return self:findBestScript(text)&lt;br /&gt;
	end&lt;br /&gt;
	return sc&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function normalize(text, sc)&lt;br /&gt;
	text = sc:fixDiscouragedSequences(text)&lt;br /&gt;
	return sc:toFixedNFD(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function doSubstitutions(self, text, sc, substitution_data, function_name, recursed)&lt;br /&gt;
	local fail, cats = nil, {}&lt;br /&gt;
	-- If there are language-specific substitutes given in the data module, use those.&lt;br /&gt;
	if type(substitution_data) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		-- If a script is specified, run this function with the script-specific data before continuing.&lt;br /&gt;
		local sc_code = sc:getCode()&lt;br /&gt;
		if substitution_data[sc_code] then&lt;br /&gt;
			text, fail, cats = doSubstitutions(self, text, sc, substitution_data[sc_code], function_name, true)&lt;br /&gt;
		-- Hant, Hans and Hani are usually treated the same, so add a special case to avoid having to specify each one separately.&lt;br /&gt;
		elseif sc_code:match(&amp;quot;^Han&amp;quot;) and substitution_data.Hani then&lt;br /&gt;
			text, fail, cats = doSubstitutions(self, text, sc, substitution_data.Hani, function_name, true)&lt;br /&gt;
		-- Substitution data with key 1 in the outer table may be given as a fallback.&lt;br /&gt;
		elseif substitution_data[1] then&lt;br /&gt;
			text, fail, cats = doSubstitutions(self, text, sc, substitution_data[1], function_name, true)&lt;br /&gt;
		end&lt;br /&gt;
		-- Iterate over all strings in the &amp;quot;from&amp;quot; subtable, and gsub with the corresponding string in &amp;quot;to&amp;quot;. We work with the NFD decomposed forms, as this simplifies many substitutions.&lt;br /&gt;
		if substitution_data.from then&lt;br /&gt;
			for i, from in ipairs(substitution_data.from) do&lt;br /&gt;
				-- Normalize each loop, to ensure multi-stage substitutions work correctly.&lt;br /&gt;
				text = sc:toFixedNFD(text)&lt;br /&gt;
				text = ugsub(text, sc:toFixedNFD(from), substitution_data.to[i] or &amp;quot;&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if substitution_data.remove_diacritics then&lt;br /&gt;
			text = sc:toFixedNFD(text)&lt;br /&gt;
			-- Convert exceptions to PUA.&lt;br /&gt;
			local remove_exceptions, substitutes = substitution_data.remove_exceptions&lt;br /&gt;
			if remove_exceptions then&lt;br /&gt;
				substitutes = {}&lt;br /&gt;
				local i = 0&lt;br /&gt;
				for _, exception in ipairs(remove_exceptions) do&lt;br /&gt;
					exception = sc:toFixedNFD(exception)&lt;br /&gt;
					text = ugsub(text, exception, function(m)&lt;br /&gt;
						i = i + 1&lt;br /&gt;
						local subst = u(0x80000 + i)&lt;br /&gt;
						substitutes[subst] = m&lt;br /&gt;
						return subst&lt;br /&gt;
					end)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- Strip diacritics.&lt;br /&gt;
			text = ugsub(text, &amp;quot;[&amp;quot; .. substitution_data.remove_diacritics .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			-- Convert exceptions back.&lt;br /&gt;
			if remove_exceptions then&lt;br /&gt;
				text = text:gsub(&amp;quot;\242[\128-\191]*&amp;quot;, substitutes)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif type(substitution_data) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		-- If there is a dedicated function module, use that.&lt;br /&gt;
		local module = safe_require(&amp;quot;Module:&amp;quot; .. substitution_data)&lt;br /&gt;
		if module then&lt;br /&gt;
			-- TODO: translit functions should take objects, not codes.&lt;br /&gt;
			-- TODO: translit functions should be called with form NFD.&lt;br /&gt;
			if function_name == &amp;quot;tr&amp;quot; then&lt;br /&gt;
				text, fail, cats = module[function_name](text, self._code, sc:getCode())&lt;br /&gt;
			else&lt;br /&gt;
				text, fail, cats = module[function_name](sc:toFixedNFD(text), self, sc)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;quot;Substitution data &#039;&amp;quot; .. substitution_data .. &amp;quot;&#039; does not match an existing module.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Don&#039;t normalize to NFC if this is the inner loop or if a module returned nil.&lt;br /&gt;
	if recursed or not text then&lt;br /&gt;
		return text, fail, cats&lt;br /&gt;
	end&lt;br /&gt;
	-- Fix any discouraged sequences created during the substitution process, and normalize into the final form.&lt;br /&gt;
	return sc:toFixedNFC(sc:fixDiscouragedSequences(text)), fail, cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Split the text into sections, based on the presence of temporarily substituted formatting characters, then iterate over each one to apply substitutions. This avoids putting PUA characters through language-specific modules, which may be unequipped for them.&lt;br /&gt;
local function iterateSectionSubstitutions(self, text, sc, subbedChars, keepCarets, substitution_data, function_name)&lt;br /&gt;
	local fail, cats, sections = nil, {}&lt;br /&gt;
	-- See [[Module:languages/data]].&lt;br /&gt;
	if not find(text, &amp;quot;\244&amp;quot;) or (load_data(languages_data_module).substitution[self._code] == &amp;quot;cont&amp;quot;) then&lt;br /&gt;
		sections = {text}&lt;br /&gt;
	else&lt;br /&gt;
		sections = split(text, &amp;quot;\244[\128-\143][\128-\191]*&amp;quot;, true)&lt;br /&gt;
	end&lt;br /&gt;
	for _, section in ipairs(sections) do&lt;br /&gt;
		-- Don&#039;t bother processing empty strings or whitespace (which may also not be handled well by dedicated modules).&lt;br /&gt;
		if gsub(section, &amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			local sub, sub_fail, sub_cats = doSubstitutions(self, section, sc, substitution_data, function_name)&lt;br /&gt;
			-- Second round of temporary substitutions, in case any formatting was added by the main substitution process. However, don&#039;t do this if the section contains formatting already (as it would have had to have been escaped to reach this stage, and therefore should be given as raw text).&lt;br /&gt;
			if sub and subbedChars then&lt;br /&gt;
				local noSub&lt;br /&gt;
				for _, pattern in ipairs(require(languages_data_patterns_module)) do&lt;br /&gt;
					if match(section, pattern .. &amp;quot;%z?&amp;quot;) then&lt;br /&gt;
						noSub = true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not noSub then&lt;br /&gt;
					sub, subbedChars = doTempSubstitutions(sub, subbedChars, keepCarets, true)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if (not sub) or sub_fail then&lt;br /&gt;
				text = sub&lt;br /&gt;
				fail = sub_fail&lt;br /&gt;
				cats = sub_cats or {}&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			text = sub and gsub(text, pattern_escape(section), replacement_escape(sub), 1) or text&lt;br /&gt;
			if type(sub_cats) == &amp;quot;table&amp;quot; then&lt;br /&gt;
				for _, cat in ipairs(sub_cats) do&lt;br /&gt;
					insert(cats, cat)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Trim, unless there are only spacing characters, while ignoring any final formatting characters.&lt;br /&gt;
	text = text and text:gsub(&amp;quot;^([\128-\191\244]*)%s+(%S)&amp;quot;, &amp;quot;%1%2&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;(%S)%s+([\128-\191\244]*)$&amp;quot;, &amp;quot;%1%2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Remove duplicate categories.&lt;br /&gt;
	if #cats &amp;gt; 1 then&lt;br /&gt;
		cats = remove_duplicates(cats)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text, fail, cats, subbedChars&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process carets (and any escapes). Default to simple removal, if no pattern/replacement is given.&lt;br /&gt;
local function processCarets(text, pattern, repl)&lt;br /&gt;
	local rep&lt;br /&gt;
	repeat&lt;br /&gt;
		text, rep = gsub(text, &amp;quot;\\\\(\\*^)&amp;quot;, &amp;quot;\3%1&amp;quot;)&lt;br /&gt;
	until rep == 0&lt;br /&gt;
	return text:gsub(&amp;quot;\\^&amp;quot;, &amp;quot;\4&amp;quot;)&lt;br /&gt;
		:gsub(pattern or &amp;quot;%^&amp;quot;, repl or &amp;quot;&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;\3&amp;quot;, &amp;quot;\\&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;\4&amp;quot;, &amp;quot;^&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Remove carets if they are used to capitalize parts of transliterations (unless they have been escaped).&lt;br /&gt;
local function removeCarets(text, sc)&lt;br /&gt;
	if not sc:hasCapitalization() and sc:isTransliterated() and text:find(&amp;quot;^&amp;quot;, 1, true) then&lt;br /&gt;
		return processCarets(text)&lt;br /&gt;
	else&lt;br /&gt;
		return text&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local Language = {}&lt;br /&gt;
&lt;br /&gt;
--[==[Returns the language code of the language. Example: {{code|lua|&amp;quot;fr&amp;quot;}} for French.]==]&lt;br /&gt;
function Language:getCode()&lt;br /&gt;
	return self._code&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns the canonical name of the language. This is the name used to represent that language on Wiktionary, and is guaranteed to be unique to that language alone. Example: {{code|lua|&amp;quot;French&amp;quot;}} for French.]==]&lt;br /&gt;
function Language:getCanonicalName()&lt;br /&gt;
	local name = self._name&lt;br /&gt;
	if name == nil then&lt;br /&gt;
		name = self._data[1]&lt;br /&gt;
		self._name = name&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return the display form of the language. The display form of a language, family or script is the form it takes when&lt;br /&gt;
appearing as the &amp;lt;code&amp;gt;&amp;lt;var&amp;gt;source&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; in categories such as &amp;lt;code&amp;gt;English terms derived from&lt;br /&gt;
&amp;lt;var&amp;gt;source&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;English given names from &amp;lt;var&amp;gt;source&amp;lt;/var&amp;gt;&amp;lt;/code&amp;gt;, and is also the displayed text&lt;br /&gt;
in {makeCategoryLink()} links. For full and etymology-only languages, this is the same as the canonical name, but&lt;br /&gt;
for families, it reads &amp;lt;code&amp;gt;&amp;quot;&amp;lt;var&amp;gt;name&amp;lt;/var&amp;gt; languages&amp;quot;&amp;lt;/code&amp;gt; (e.g. {&amp;quot;Indo-Iranian languages&amp;quot;}), and for scripts,&lt;br /&gt;
it reads &amp;lt;code&amp;gt;&amp;quot;&amp;lt;var&amp;gt;name&amp;lt;/var&amp;gt; script&amp;quot;&amp;lt;/code&amp;gt; (e.g. {&amp;quot;Arabic script&amp;quot;}).&lt;br /&gt;
]==]&lt;br /&gt;
function Language:getDisplayForm()&lt;br /&gt;
	local form = self._displayForm&lt;br /&gt;
	if form == nil then&lt;br /&gt;
		form = self:getCanonicalName()&lt;br /&gt;
		-- Add article and &amp;quot; substrate&amp;quot; to substrates that lack them.&lt;br /&gt;
		if self:getFamilyCode() == &amp;quot;qfa-sub&amp;quot; then&lt;br /&gt;
			if not (sub(form, 1, 4) == &amp;quot;the &amp;quot; or sub(form, 1, 2) == &amp;quot;a &amp;quot;) then&lt;br /&gt;
				form = &amp;quot;a &amp;quot; .. form&lt;br /&gt;
			end&lt;br /&gt;
			if not match(form, &amp;quot; [Ss]ubstrate&amp;quot;) then&lt;br /&gt;
				form = form .. &amp;quot; substrate&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self._displayForm = form&lt;br /&gt;
	end&lt;br /&gt;
	return form&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns the value which should be used in the HTML lang= attribute for tagged text in the language.]==]&lt;br /&gt;
function Language:getHTMLAttribute(sc, region)&lt;br /&gt;
	local code = self._code&lt;br /&gt;
	if not find(code, &amp;quot;-&amp;quot;, 1, true) then&lt;br /&gt;
		return code .. &amp;quot;-&amp;quot; .. sc:getCode() .. (region and &amp;quot;-&amp;quot; .. region or &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	local parent = self:getParent()&lt;br /&gt;
	region = region or match(code, &amp;quot;%f[%u][%u-]+%f[%U]&amp;quot;)&lt;br /&gt;
	if parent then&lt;br /&gt;
		return parent:getHTMLAttribute(sc, region)&lt;br /&gt;
	end&lt;br /&gt;
	-- TODO: ISO family codes can also be used.&lt;br /&gt;
	return &amp;quot;mis-&amp;quot; .. sc:getCode() .. (region and &amp;quot;-&amp;quot; .. region or &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns a table of the aliases that the language is known by, excluding the canonical name. Aliases are synonyms for the language in question. The names are not guaranteed to be unique, in that sometimes more than one language is known by the same name. Example: {{code|lua|{&amp;quot;High German&amp;quot;, &amp;quot;New High German&amp;quot;, &amp;quot;Deutsch&amp;quot;} }} for [[:Category:German language|German]].]==]&lt;br /&gt;
function Language:getAliases()&lt;br /&gt;
	self:loadInExtraData()&lt;br /&gt;
	return require(language_like_module).getAliases(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return a table of the known subvarieties of a given language, excluding subvarieties that have been given&lt;br /&gt;
explicit etymology-only language codes. The names are not guaranteed to be unique, in that sometimes a given name&lt;br /&gt;
refers to a subvariety of more than one language. Example: {{code|lua|{&amp;quot;Southern Aymara&amp;quot;, &amp;quot;Central Aymara&amp;quot;} }} for&lt;br /&gt;
[[:Category:Aymara language|Aymara]]. Note that the returned value can have nested tables in it, when a subvariety&lt;br /&gt;
goes by more than one name. Example: {{code|lua|{&amp;quot;North Azerbaijani&amp;quot;, &amp;quot;South Azerbaijani&amp;quot;, {&amp;quot;Afshar&amp;quot;, &amp;quot;Afshari&amp;quot;,&lt;br /&gt;
&amp;quot;Afshar Azerbaijani&amp;quot;, &amp;quot;Afchar&amp;quot;}, {&amp;quot;Qashqa&#039;i&amp;quot;, &amp;quot;Qashqai&amp;quot;, &amp;quot;Kashkay&amp;quot;}, &amp;quot;Sonqor&amp;quot;} }} for&lt;br /&gt;
[[:Category:Azerbaijani language|Azerbaijani]]. Here, for example, Afshar, Afshari, Afshar Azerbaijani and Afchar&lt;br /&gt;
all refer to the same subvariety, whose preferred name is Afshar (the one listed first). To avoid a return value&lt;br /&gt;
with nested tables in it, specify a non-{{code|lua|nil}} value for the &amp;lt;code&amp;gt;flatten&amp;lt;/code&amp;gt; parameter; in that case,&lt;br /&gt;
the return value would be {{code|lua|{&amp;quot;North Azerbaijani&amp;quot;, &amp;quot;South Azerbaijani&amp;quot;, &amp;quot;Afshar&amp;quot;, &amp;quot;Afshari&amp;quot;,&lt;br /&gt;
&amp;quot;Afshar Azerbaijani&amp;quot;, &amp;quot;Afchar&amp;quot;, &amp;quot;Qashqa&#039;i&amp;quot;, &amp;quot;Qashqai&amp;quot;, &amp;quot;Kashkay&amp;quot;, &amp;quot;Sonqor&amp;quot;} }}.&lt;br /&gt;
]==]&lt;br /&gt;
function Language:getVarieties(flatten)&lt;br /&gt;
	self:loadInExtraData()&lt;br /&gt;
	return require(language_like_module).getVarieties(self, flatten)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns a table of the &amp;quot;other names&amp;quot; that the language is known by, which are listed in the &amp;lt;code&amp;gt;otherNames&amp;lt;/code&amp;gt; field. It should be noted that the &amp;lt;code&amp;gt;otherNames&amp;lt;/code&amp;gt; field itself is deprecated, and entries listed there should eventually be moved to either &amp;lt;code&amp;gt;aliases&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;varieties&amp;lt;/code&amp;gt;.]==]&lt;br /&gt;
function Language:getOtherNames() -- To be eventually removed, once there are no more uses of the `otherNames` field.&lt;br /&gt;
	self:loadInExtraData()&lt;br /&gt;
	return require(language_like_module).getOtherNames(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Return a combined table of the canonical name, aliases, varieties and other names of a given language.]==]&lt;br /&gt;
function Language:getAllNames()&lt;br /&gt;
	self:loadInExtraData()&lt;br /&gt;
	return require(language_like_module).getAllNames(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns a table of types as a lookup table (with the types as keys).&lt;br /&gt;
&lt;br /&gt;
The possible types are&lt;br /&gt;
* {language}: This is a language, either full or etymology-only.&lt;br /&gt;
* {full}: This is a &amp;quot;full&amp;quot; (not etymology-only) language, i.e. the union of {regular}, {reconstructed} and&lt;br /&gt;
		{appendix-constructed}. Note that the types {full} and {etymology-only} also exist for families, so if you&lt;br /&gt;
		want to check specifically for a full language and you have an object that might be a family, you should&lt;br /&gt;
		use {{lua|hasType(&amp;quot;language&amp;quot;, &amp;quot;full&amp;quot;)}} and not simply {{lua|hasType(&amp;quot;full&amp;quot;)}}.&lt;br /&gt;
* {etymology-only}: This is an etymology-only (not full) language, whose parent is another etymology-only&lt;br /&gt;
					language or a full language. Note that the types {full} and {etymology-only} also exist for&lt;br /&gt;
					families, so if you want to check specifically for an etymology-only language and you have an&lt;br /&gt;
					object that might be a family, you should use {{lua|hasType(&amp;quot;language&amp;quot;, &amp;quot;etymology-only&amp;quot;)}}&lt;br /&gt;
					and not simply {{lua|hasType(&amp;quot;etymology-only&amp;quot;)}}.&lt;br /&gt;
* {regular}: This indicates a full language that is attested according to [[WT:CFI]] and therefore permitted&lt;br /&gt;
			in the main namespace. There may also be reconstructed terms for the language, which are placed in&lt;br /&gt;
			the {Reconstruction} namespace and must be prefixed with * to indicate a reconstruction. Most full&lt;br /&gt;
			languages are natural (not constructed) languages, but a few constructed languages (e.g. Esperanto&lt;br /&gt;
			and Volapük, among others) are also allowed in the mainspace and considered regular languages.&lt;br /&gt;
* {reconstructed}: This language is not attested according to [[WT:CFI]], and therefore is allowed only in the&lt;br /&gt;
				{Reconstruction} namespace. All terms in this language are reconstructed, and must be prefixed&lt;br /&gt;
				with *. Languages such as Proto-Indo-European and Proto-Germanic are in this category.&lt;br /&gt;
* {appendix-constructed}: This language is attested but does not meet the additional requirements set out for&lt;br /&gt;
						constructed languages ([[WT:CFI#Constructed languages]]). Its entries must therefore&lt;br /&gt;
						be in the Appendix namespace, but they are not reconstructed and therefore should&lt;br /&gt;
						not have * prefixed in links.&lt;br /&gt;
]==]&lt;br /&gt;
function Language:getTypes()&lt;br /&gt;
	local types = self._types&lt;br /&gt;
	if types == nil then&lt;br /&gt;
		types = {language = true}&lt;br /&gt;
		if self:getFullCode() == self._code then&lt;br /&gt;
			types.full = true&lt;br /&gt;
		else&lt;br /&gt;
			types[&amp;quot;etymology-only&amp;quot;] = true&lt;br /&gt;
		end&lt;br /&gt;
		for t in gmatch(self._data.type, &amp;quot;[^,]+&amp;quot;) do&lt;br /&gt;
			types[t] = true&lt;br /&gt;
		end&lt;br /&gt;
		self._types = types&lt;br /&gt;
	end&lt;br /&gt;
	return types&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Given a list of types as strings, returns true if the language has all of them.]==]&lt;br /&gt;
function Language:hasType(...)&lt;br /&gt;
	Language.hasType = require(language_like_module).hasType&lt;br /&gt;
	return self:hasType(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getMainCategoryName()&lt;br /&gt;
	return self._data.main_category or &amp;quot;lemma&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns a table containing &amp;lt;code&amp;gt;WikimediaLanguage&amp;lt;/code&amp;gt; objects (see [[Module:wikimedia languages]]), which represent languages and their codes as they are used in Wikimedia projects for interwiki linking and such. More than one object may be returned, as a single Wiktionary language may correspond to multiple Wikimedia languages. For example, Wiktionary&#039;s single code &amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt; (Serbo-Croatian) maps to four Wikimedia codes: &amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt; (Serbo-Croatian), &amp;lt;code&amp;gt;bs&amp;lt;/code&amp;gt; (Bosnian), &amp;lt;code&amp;gt;hr&amp;lt;/code&amp;gt; (Croatian) and &amp;lt;code&amp;gt;sr&amp;lt;/code&amp;gt; (Serbian).&lt;br /&gt;
The code for the Wikimedia language is retrieved from the &amp;lt;code&amp;gt;wikimedia_codes&amp;lt;/code&amp;gt; property in the data modules. If that property is not present, the code of the current language is used. If none of the available codes is actually a valid Wikimedia code, an empty table is returned.]==]&lt;br /&gt;
function Language:getWikimediaLanguages()&lt;br /&gt;
	local wm_langs = self._wikimediaLanguageObjects&lt;br /&gt;
	if wm_langs == nil then&lt;br /&gt;
		local codes = self:getWikimediaLanguageCodes()&lt;br /&gt;
		wm_langs = {}&lt;br /&gt;
		for i = 1, #codes do&lt;br /&gt;
			wm_langs[i] = get_wikimedia_lang(codes[i])&lt;br /&gt;
		end&lt;br /&gt;
		self._wikimediaLanguageObjects = wm_langs&lt;br /&gt;
	end&lt;br /&gt;
	return wm_langs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getWikimediaLanguageCodes()&lt;br /&gt;
	local wm_langs = self._wikimediaLanguageCodes&lt;br /&gt;
	if wm_langs == nil then&lt;br /&gt;
		wm_langs = self._data.wikimedia_codes&lt;br /&gt;
		if wm_langs then&lt;br /&gt;
			wm_langs = split(wm_langs, &amp;quot;,&amp;quot;, true, true)&lt;br /&gt;
		else&lt;br /&gt;
			local code = self._code&lt;br /&gt;
			if is_known_language_tag(code) then&lt;br /&gt;
				wm_langs = {code}&lt;br /&gt;
			else&lt;br /&gt;
				-- Inherit, but only if no codes are specified in the data *and*&lt;br /&gt;
				-- the language code isn&#039;t a valid Wikimedia language code.&lt;br /&gt;
				local parent = self:getParent()&lt;br /&gt;
				wm_langs = parent and parent:getWikimediaLanguageCodes() or {}&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self._wikimediaLanguageCodes = wm_langs&lt;br /&gt;
	end&lt;br /&gt;
	return wm_langs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Returns the name of the Wikipedia article for the language. `project` specifies the language and project to retrieve&lt;br /&gt;
the article from, defaulting to {&amp;quot;enwiki&amp;quot;} for the English Wikipedia. Normally if specified it should be the project&lt;br /&gt;
code for a specific-language Wikipedia e.g. &amp;quot;zhwiki&amp;quot; for the Chinese Wikipedia, but it can be any project, including&lt;br /&gt;
non-Wikipedia ones. If the project is the English Wikipedia and the property {wikipedia_article} is present in the data&lt;br /&gt;
module it will be used first. In all other cases, a sitelink will be generated from {:getWikidataItem} (if set). The&lt;br /&gt;
resulting value (or lack of value) is cached so that subsequent calls are fast. If no value could be determined, and&lt;br /&gt;
`noCategoryFallback` is {false}, {:getCategoryName} is used as fallback; otherwise, {nil} is returned. Note that if&lt;br /&gt;
`noCategoryFallback` is {nil} or omitted, it defaults to {false} if the project is the English Wikipedia, otherwise&lt;br /&gt;
to {true}. In other words, under normal circumstances, if the English Wikipedia article couldn&#039;t be retrieved, the&lt;br /&gt;
return value will fall back to a link to the language&#039;s category, but this won&#039;t normally happen for any other project.&lt;br /&gt;
]==]&lt;br /&gt;
function Language:getWikipediaArticle(noCategoryFallback, project)&lt;br /&gt;
	Language.getWikipediaArticle = require(language_like_module).getWikipediaArticle&lt;br /&gt;
	return self:getWikipediaArticle(noCategoryFallback, project)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:makeWikipediaLink()&lt;br /&gt;
	return make_link(self, (self:hasType(&amp;quot;conlang&amp;quot;) and self:getCanonicalName() or &amp;quot;w:&amp;quot; .. self:getWikipediaArticle()), self:getCanonicalName())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns the name of the Wikimedia Commons category page for the language.]==]&lt;br /&gt;
function Language:getCommonsCategory()&lt;br /&gt;
	Language.getCommonsCategory = require(language_like_module).getCommonsCategory&lt;br /&gt;
	return self:getCommonsCategory()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns the Wikidata item id for the language or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;. This corresponds to the the second field in the data modules.]==]&lt;br /&gt;
function Language:getWikidataItem()&lt;br /&gt;
	Language.getWikidataItem = require(language_like_module).getWikidataItem&lt;br /&gt;
	return self:getWikidataItem()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns a table of &amp;lt;code&amp;gt;Script&amp;lt;/code&amp;gt; objects for all scripts that the language is written in. See [[Module:scripts]].]==]&lt;br /&gt;
function Language:getScripts()&lt;br /&gt;
	local scripts = self._scriptObjects&lt;br /&gt;
	if scripts == nil then&lt;br /&gt;
		local codes = self:getScriptCodes()&lt;br /&gt;
		if codes[1] == &amp;quot;All&amp;quot; then&lt;br /&gt;
			scripts = load_data(scripts_data_module)&lt;br /&gt;
		else&lt;br /&gt;
			scripts = {}&lt;br /&gt;
			for i = 1, #codes do&lt;br /&gt;
				scripts[i] = get_script(codes[i])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self._scriptObjects = scripts&lt;br /&gt;
	end&lt;br /&gt;
	return scripts&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns the table of script codes in the language&#039;s data file.]==]&lt;br /&gt;
function Language:getScriptCodes()&lt;br /&gt;
	local scripts = self._scriptCodes&lt;br /&gt;
	if scripts == nil then&lt;br /&gt;
		scripts = self._data[4]&lt;br /&gt;
		if scripts then&lt;br /&gt;
			local codes, n = {}, 0&lt;br /&gt;
			for code in gmatch(scripts, &amp;quot;[^,]+&amp;quot;) do&lt;br /&gt;
				n = n + 1&lt;br /&gt;
				-- Special handling of &amp;quot;Hants&amp;quot;, which represents &amp;quot;Hani&amp;quot;, &amp;quot;Hant&amp;quot; and &amp;quot;Hans&amp;quot; collectively.&lt;br /&gt;
				if code == &amp;quot;Hants&amp;quot; then&lt;br /&gt;
					codes[n] = &amp;quot;Hani&amp;quot;&lt;br /&gt;
					codes[n + 1] = &amp;quot;Hant&amp;quot;&lt;br /&gt;
					codes[n + 2] = &amp;quot;Hans&amp;quot;&lt;br /&gt;
					n = n + 2&lt;br /&gt;
				else&lt;br /&gt;
					codes[n] = code&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			scripts = codes&lt;br /&gt;
		else&lt;br /&gt;
			scripts = {&amp;quot;None&amp;quot;}&lt;br /&gt;
		end&lt;br /&gt;
		self._scriptCodes = scripts&lt;br /&gt;
	end&lt;br /&gt;
	return scripts&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Given some text, this function iterates through the scripts of a given language and tries to find the script that best matches the text. It returns a {{code|lua|Script}} object representing the script. If no match is found at all, it returns the {{code|lua|None}} script object.]==]&lt;br /&gt;
function Language:findBestScript(text, forceDetect)&lt;br /&gt;
	if not text or text == &amp;quot;&amp;quot; or text == &amp;quot;-&amp;quot; then&lt;br /&gt;
		return get_script(&amp;quot;None&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Differs from table returned by getScriptCodes, as Hants is not normalized into its constituents.&lt;br /&gt;
	local codes = self._bestScriptCodes&lt;br /&gt;
	if codes == nil then&lt;br /&gt;
		codes = self._data[4]&lt;br /&gt;
		codes = codes and split(codes, &amp;quot;,&amp;quot;, true, true) or {&amp;quot;None&amp;quot;}&lt;br /&gt;
		self._bestScriptCodes = codes&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local first_sc = codes[1]&lt;br /&gt;
&lt;br /&gt;
	if first_sc == &amp;quot;All&amp;quot; then&lt;br /&gt;
		return find_best_script_without_lang(text)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local codes_len = #codes&lt;br /&gt;
&lt;br /&gt;
	if not (forceDetect or first_sc == &amp;quot;Hants&amp;quot; or codes_len &amp;gt; 1) then&lt;br /&gt;
		first_sc = get_script(first_sc)&lt;br /&gt;
		local charset = first_sc.characters&lt;br /&gt;
		return charset and umatch(text, &amp;quot;[&amp;quot; .. charset .. &amp;quot;]&amp;quot;) and first_sc or get_script(&amp;quot;None&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove all formatting characters.&lt;br /&gt;
	text = get_plaintext(text)&lt;br /&gt;
&lt;br /&gt;
	-- Remove all spaces and any ASCII punctuation. Some non-ASCII punctuation is script-specific, so can&#039;t be removed.&lt;br /&gt;
	text = ugsub(text, &amp;quot;[%s!\&amp;quot;#%%&amp;amp;&#039;()*,%-./:;?@[\\%]_{}]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	if #text == 0 then&lt;br /&gt;
		return get_script(&amp;quot;None&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Try to match every script against the text,&lt;br /&gt;
	-- and return the one with the most matching characters.&lt;br /&gt;
	local bestcount, bestscript, length = 0&lt;br /&gt;
	for i = 1, codes_len do&lt;br /&gt;
		local sc = codes[i]&lt;br /&gt;
		-- Special case for &amp;quot;Hants&amp;quot;, which is a special code that represents whichever of &amp;quot;Hant&amp;quot; or &amp;quot;Hans&amp;quot; best matches, or &amp;quot;Hani&amp;quot; if they match equally. This avoids having to list all three. In addition, &amp;quot;Hants&amp;quot; will be treated as the best match if there is at least one matching character, under the assumption that a Han script is desirable in terms that contain a mix of Han and other scripts (not counting those which use Jpan or Kore).&lt;br /&gt;
		if sc == &amp;quot;Hants&amp;quot; then&lt;br /&gt;
			local Hani = get_script(&amp;quot;Hani&amp;quot;)&lt;br /&gt;
			if not Hant_chars then&lt;br /&gt;
				Hant_chars = load_data(&amp;quot;Module:zh/data/ts&amp;quot;)&lt;br /&gt;
				Hans_chars = load_data(&amp;quot;Module:zh/data/st&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			local t, s, found = 0, 0&lt;br /&gt;
			-- This is faster than using mw.ustring.gmatch directly.&lt;br /&gt;
			for ch in gmatch(ugsub(text, &amp;quot;[&amp;quot; .. Hani.characters .. &amp;quot;]&amp;quot;, &amp;quot;\255%0&amp;quot;), &amp;quot;\255(.[\128-\191]*)&amp;quot;) do&lt;br /&gt;
				found = true&lt;br /&gt;
				if Hant_chars[ch] then&lt;br /&gt;
					t = t + 1&lt;br /&gt;
					if Hans_chars[ch] then&lt;br /&gt;
						s = s + 1&lt;br /&gt;
					end&lt;br /&gt;
				elseif Hans_chars[ch] then&lt;br /&gt;
					s = s + 1&lt;br /&gt;
				else&lt;br /&gt;
					t, s = t + 1, s + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if found then&lt;br /&gt;
				if t == s then&lt;br /&gt;
					return Hani&lt;br /&gt;
				end&lt;br /&gt;
				return get_script(t &amp;gt; s and &amp;quot;Hant&amp;quot; or &amp;quot;Hans&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			sc = get_script(sc)&lt;br /&gt;
&lt;br /&gt;
			if not length then&lt;br /&gt;
				length = ulen(text)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- Count characters by removing everything in the script&#039;s charset and comparing to the original length.&lt;br /&gt;
			local charset = sc.characters&lt;br /&gt;
			local count = charset and length - ulen(ugsub(text, &amp;quot;[&amp;quot; .. charset .. &amp;quot;]+&amp;quot;, &amp;quot;&amp;quot;)) or 0&lt;br /&gt;
&lt;br /&gt;
			if count &amp;gt;= length then&lt;br /&gt;
				return sc&lt;br /&gt;
			elseif count &amp;gt; bestcount then&lt;br /&gt;
				bestcount = count&lt;br /&gt;
				bestscript = sc&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Return best matching script, or otherwise None.&lt;br /&gt;
	return bestscript or get_script(&amp;quot;None&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns a &amp;lt;code&amp;gt;Family&amp;lt;/code&amp;gt; object for the language family that the language belongs to. See [[Module:families]].]==]&lt;br /&gt;
function Language:getFamily()&lt;br /&gt;
	local family = self._familyObject&lt;br /&gt;
	if family == nil then&lt;br /&gt;
		family = self:getFamilyCode()&lt;br /&gt;
		-- If the value is nil, it&#039;s cached as false.&lt;br /&gt;
		family = family and get_family(family) or false&lt;br /&gt;
		self._familyObject = family&lt;br /&gt;
	end&lt;br /&gt;
	return family or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns the family code in the language&#039;s data file.]==]&lt;br /&gt;
function Language:getFamilyCode()&lt;br /&gt;
	local family = self._familyCode&lt;br /&gt;
	if family == nil then&lt;br /&gt;
		-- If the value is nil, it&#039;s cached as false.&lt;br /&gt;
		family = self._data[3] or false&lt;br /&gt;
		self._familyCode = family&lt;br /&gt;
	end&lt;br /&gt;
	return family or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getFamilyName()&lt;br /&gt;
	local family = self._familyName&lt;br /&gt;
	if family == nil then&lt;br /&gt;
		family = self:getFamily()&lt;br /&gt;
		-- If the value is nil, it&#039;s cached as false.&lt;br /&gt;
		family = family and family:getCanonicalName() or false&lt;br /&gt;
		self._familyName = family&lt;br /&gt;
	end&lt;br /&gt;
	return family or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	local function check_family(self, family)&lt;br /&gt;
		if type(family) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			family = family:getCode()&lt;br /&gt;
		end&lt;br /&gt;
		if self:getFamilyCode() == family then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
		local self_family = self:getFamily()&lt;br /&gt;
		if self_family:inFamily(family) then&lt;br /&gt;
			return true&lt;br /&gt;
		-- If the family isn&#039;t a real family (e.g. creoles) check any ancestors.&lt;br /&gt;
		elseif self_family:inFamily(&amp;quot;qfa-not&amp;quot;) then&lt;br /&gt;
			local ancestors = self:getAncestors()&lt;br /&gt;
			for _, ancestor in ipairs(ancestors) do&lt;br /&gt;
				if ancestor:inFamily(family) then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[==[Check whether the language belongs to `family` (which can be a family code or object). A list of objects can be given in place of `family`; in that case, return true if the language belongs to any of the specified families. Note that some languages (in particular, certain creoles) can have multiple immediate ancestors potentially belonging to different families; in that case, return true if the language belongs to any of the specified families.]==]&lt;br /&gt;
	function Language:inFamily(...)&lt;br /&gt;
		if self:getFamilyCode() == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		return check_inputs(self, check_family, false, ...)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getParent()&lt;br /&gt;
	local parent = self._parentObject&lt;br /&gt;
	if parent == nil then&lt;br /&gt;
		parent = self:getParentCode()&lt;br /&gt;
		-- If the value is nil, it&#039;s cached as false.&lt;br /&gt;
		parent = parent and get_by_code(parent, nil, true, true) or false&lt;br /&gt;
		self._parentObject = parent&lt;br /&gt;
	end&lt;br /&gt;
	return parent or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getParentCode()&lt;br /&gt;
	local parent = self._parentCode&lt;br /&gt;
	if parent == nil then&lt;br /&gt;
		-- If the value is nil, it&#039;s cached as false.&lt;br /&gt;
		parent = self._data.parent or false&lt;br /&gt;
		self._parentCode = parent&lt;br /&gt;
	end&lt;br /&gt;
	return parent or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getParentName()&lt;br /&gt;
	local parent = self._parentName&lt;br /&gt;
	if parent == nil then&lt;br /&gt;
		parent = self:getParent()&lt;br /&gt;
		-- If the value is nil, it&#039;s cached as false.&lt;br /&gt;
		parent = parent and parent:getCanonicalName() or false&lt;br /&gt;
		self._parentName = parent&lt;br /&gt;
	end&lt;br /&gt;
	return parent or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getParentChain()&lt;br /&gt;
	local chain = self._parentChain&lt;br /&gt;
	if chain == nil then&lt;br /&gt;
		chain = {}&lt;br /&gt;
		local parent, n = self:getParent(), 0&lt;br /&gt;
		while parent do&lt;br /&gt;
			n = n + 1&lt;br /&gt;
			chain[n] = parent&lt;br /&gt;
			parent = parent:getParent()&lt;br /&gt;
		end&lt;br /&gt;
		self._parentChain = chain&lt;br /&gt;
	end&lt;br /&gt;
	return chain&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	local function check_lang(self, lang)&lt;br /&gt;
		for _, parent in ipairs(self:getParentChain()) do&lt;br /&gt;
			if (type(lang) == &amp;quot;string&amp;quot; and lang or lang:getCode()) == parent:getCode() then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function Language:hasParent(...)&lt;br /&gt;
		return check_inputs(self, check_lang, false, ...)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
If the language is etymology-only, this iterates through parents until a full language or family is found, and the&lt;br /&gt;
corresponding object is returned. If the language is a full language, then it simply returns itself.&lt;br /&gt;
]==]&lt;br /&gt;
function Language:getFull()&lt;br /&gt;
	local full = self._fullObject&lt;br /&gt;
	if full == nil then&lt;br /&gt;
		full = self:getFullCode()&lt;br /&gt;
		full = full == self._code and self or get_by_code(full)&lt;br /&gt;
		self._fullObject = full&lt;br /&gt;
	end&lt;br /&gt;
	return full&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
If the language is an etymology-only language, this iterates through parents until a full language or family is&lt;br /&gt;
found, and the corresponding code is returned. If the language is a full language, then it simply returns the&lt;br /&gt;
language code.&lt;br /&gt;
]==]&lt;br /&gt;
function Language:getFullCode()&lt;br /&gt;
	return self._fullCode or self._code&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
If the language is an etymology-only language, this iterates through parents until a full language or family is&lt;br /&gt;
found, and the corresponding canonical name is returned. If the language is a full language, then it simply returns&lt;br /&gt;
the canonical name of the language.&lt;br /&gt;
]==]&lt;br /&gt;
function Language:getFullName()&lt;br /&gt;
	local full = self._fullName&lt;br /&gt;
	if full == nil then&lt;br /&gt;
		full = self:getFull():getCanonicalName()&lt;br /&gt;
		self._fullName = full&lt;br /&gt;
	end&lt;br /&gt;
	return full&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns a table of &amp;lt;code class=&amp;quot;nf&amp;quot;&amp;gt;Language&amp;lt;/code&amp;gt; objects for all languages that this language is directly descended from. Generally this is only a single language, but creoles, pidgins and mixed languages can have multiple ancestors.]==]&lt;br /&gt;
function Language:getAncestors()&lt;br /&gt;
	local ancestors = self._ancestorObjects&lt;br /&gt;
	if ancestors == nil then&lt;br /&gt;
		ancestors = {}&lt;br /&gt;
		local ancestor_codes = self:getAncestorCodes()&lt;br /&gt;
		if #ancestor_codes &amp;gt; 0 then&lt;br /&gt;
			for _, ancestor in ipairs(ancestor_codes) do&lt;br /&gt;
				insert(ancestors, get_by_code(ancestor, nil, true))&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			local fam = self:getFamily()&lt;br /&gt;
			local protoLang = fam and fam:getProtoLanguage() or nil&lt;br /&gt;
			-- For the cases where the current language is the proto-language&lt;br /&gt;
			-- of its family, or an etymology-only language that is ancestral to that&lt;br /&gt;
			-- proto-language, we need to step up a level higher right from the&lt;br /&gt;
			-- start.&lt;br /&gt;
			if protoLang and (&lt;br /&gt;
				protoLang:getCode() == self._code or&lt;br /&gt;
				(self:hasType(&amp;quot;etymology-only&amp;quot;) and protoLang:hasAncestor(self))&lt;br /&gt;
			) then&lt;br /&gt;
				fam = fam:getFamily()&lt;br /&gt;
				protoLang = fam and fam:getProtoLanguage() or nil&lt;br /&gt;
			end&lt;br /&gt;
			while not protoLang and not (not fam or fam:getCode() == &amp;quot;qfa-not&amp;quot;) do&lt;br /&gt;
				fam = fam:getFamily()&lt;br /&gt;
				protoLang = fam and fam:getProtoLanguage() or nil&lt;br /&gt;
			end&lt;br /&gt;
			insert(ancestors, protoLang)&lt;br /&gt;
		end&lt;br /&gt;
		self._ancestorObjects = ancestors&lt;br /&gt;
	end&lt;br /&gt;
	return ancestors&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	-- Avoid a language being its own ancestor via class inheritance. We only need to check for this if the language has inherited an ancestor table from its parent, because we never want to drop ancestors that have been explicitly set in the data.&lt;br /&gt;
	-- Recursively iterate over ancestors until we either find self or run out. If self is found, return true.&lt;br /&gt;
	local function check_ancestor(self, lang)&lt;br /&gt;
		local codes = lang:getAncestorCodes()&lt;br /&gt;
		if not codes then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for i = 1, #codes do&lt;br /&gt;
			local code = codes[i]&lt;br /&gt;
			if code == self._code then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
			local anc = get_by_code(code, nil, true)&lt;br /&gt;
			if check_ancestor(self, anc) then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[==[Returns a table of &amp;lt;code class=&amp;quot;nf&amp;quot;&amp;gt;Language&amp;lt;/code&amp;gt; codes for all languages that this language is directly descended from. Generally this is only a single language, but creoles, pidgins and mixed languages can have multiple ancestors.]==]&lt;br /&gt;
	function Language:getAncestorCodes()&lt;br /&gt;
		if self._ancestorCodes then&lt;br /&gt;
			return self._ancestorCodes&lt;br /&gt;
		end&lt;br /&gt;
		local data = self._data&lt;br /&gt;
		local codes = data.ancestors&lt;br /&gt;
		if codes == nil then&lt;br /&gt;
			codes = {}&lt;br /&gt;
			self._ancestorCodes = codes&lt;br /&gt;
			return codes&lt;br /&gt;
		end&lt;br /&gt;
		codes = split(codes, &amp;quot;,&amp;quot;, true, true)&lt;br /&gt;
		self._ancestorCodes = codes&lt;br /&gt;
		-- If there are no codes or the ancestors weren&#039;t inherited data, there&#039;s nothing left to check.&lt;br /&gt;
		if #codes == 0 or self:getData(false, &amp;quot;raw&amp;quot;).ancestors ~= nil then&lt;br /&gt;
			return codes&lt;br /&gt;
		end&lt;br /&gt;
		local i, code = 1&lt;br /&gt;
		while i &amp;lt;= #codes do&lt;br /&gt;
			code = codes[i]&lt;br /&gt;
			if check_ancestor(self, self) then&lt;br /&gt;
				remove(codes, i)&lt;br /&gt;
			else&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return codes&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Given a list of language objects or codes, returns true if at least one of them is an ancestor. This includes any etymology-only children of that ancestor. If the language&#039;s ancestor(s) are etymology-only languages, it will also return true for those language parent(s) (e.g. if Vulgar Latin is the ancestor, it will also return true for its parent, Latin). However, a parent is excluded from this if the ancestor is also ancestral to that parent (e.g. if Classical Persian is the ancestor, Persian would return false, because Classical Persian is also ancestral to Persian).]==]&lt;br /&gt;
function Language:hasAncestor(...)&lt;br /&gt;
	local function iterateOverAncestorTree(node, func, parent_check)&lt;br /&gt;
		local ancestors = node:getAncestors()&lt;br /&gt;
		local ancestorsParents = {}&lt;br /&gt;
		for _, ancestor in ipairs(ancestors) do&lt;br /&gt;
			local ret = func(ancestor) or iterateOverAncestorTree(ancestor, func, parent_check)&lt;br /&gt;
			if ret then&lt;br /&gt;
				return ret&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- Check the parents of any ancestors. We don&#039;t do this if checking the parents of the other language, so that we exclude any etymology-only children of those parents that are not directly related (e.g. if the ancestor is Vulgar Latin and we are checking New Latin, we want it to return false because they are on different ancestral branches. As such, if we&#039;re already checking the parent of New Latin (Latin) we don&#039;t want to compare it to the parent of the ancestor (Latin), as this would be a false positive; it should be one or the other).&lt;br /&gt;
		if not parent_check then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, ancestor in ipairs(ancestors) do&lt;br /&gt;
			local ancestorParents = ancestor:getParentChain()&lt;br /&gt;
			for _, ancestorParent in ipairs(ancestorParents) do&lt;br /&gt;
				if ancestorParent:getCode() == self._code or ancestorParent:hasAncestor(ancestor) then&lt;br /&gt;
					break&lt;br /&gt;
				else&lt;br /&gt;
					insert(ancestorsParents, ancestorParent)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for _, ancestorParent in ipairs(ancestorsParents) do&lt;br /&gt;
			local ret = func(ancestorParent)&lt;br /&gt;
			if ret then&lt;br /&gt;
				return ret&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function do_iteration(otherlang, parent_check)&lt;br /&gt;
		-- otherlang can&#039;t be self&lt;br /&gt;
		if (type(otherlang) == &amp;quot;string&amp;quot; and otherlang or otherlang:getCode()) == self._code then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		repeat&lt;br /&gt;
			if iterateOverAncestorTree(&lt;br /&gt;
				self,&lt;br /&gt;
				function(ancestor)&lt;br /&gt;
					return ancestor:getCode() == (type(otherlang) == &amp;quot;string&amp;quot; and otherlang or otherlang:getCode())&lt;br /&gt;
				end,&lt;br /&gt;
				parent_check&lt;br /&gt;
			) then&lt;br /&gt;
				return true&lt;br /&gt;
			elseif type(otherlang) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				otherlang = get_by_code(otherlang, nil, true)&lt;br /&gt;
			end&lt;br /&gt;
			otherlang = otherlang:getParent()&lt;br /&gt;
			parent_check = false&lt;br /&gt;
		until not otherlang&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parent_check = true&lt;br /&gt;
	for _, otherlang in ipairs{...} do&lt;br /&gt;
		local ret = do_iteration(otherlang, parent_check)&lt;br /&gt;
		if ret then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	local function construct_node(lang, memo)&lt;br /&gt;
		local branch, ancestors = {lang = lang:getCode()}&lt;br /&gt;
		memo[lang:getCode()] = branch&lt;br /&gt;
		for _, ancestor in ipairs(lang:getAncestors()) do&lt;br /&gt;
			if ancestors == nil then&lt;br /&gt;
				ancestors = {}&lt;br /&gt;
			end&lt;br /&gt;
			insert(ancestors, memo[ancestor:getCode()] or construct_node(ancestor, memo))&lt;br /&gt;
		end&lt;br /&gt;
		branch.ancestors = ancestors&lt;br /&gt;
		return branch&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function Language:getAncestorChain()&lt;br /&gt;
		local chain = self._ancestorChain&lt;br /&gt;
		if chain == nil then&lt;br /&gt;
			chain = construct_node(self, {})&lt;br /&gt;
			self._ancestorChain = chain&lt;br /&gt;
		end&lt;br /&gt;
		return chain&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getAncestorChainOld()&lt;br /&gt;
	local chain = self._ancestorChain&lt;br /&gt;
	if chain == nil then&lt;br /&gt;
		chain = {}&lt;br /&gt;
		local step = self&lt;br /&gt;
		while true do&lt;br /&gt;
			local ancestors = step:getAncestors()&lt;br /&gt;
			step = #ancestors == 1 and ancestors[1] or nil&lt;br /&gt;
			if not step then&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			insert(chain, step)&lt;br /&gt;
		end&lt;br /&gt;
		self._ancestorChain = chain&lt;br /&gt;
	end&lt;br /&gt;
	return chain&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fetch_descendants(self, fmt)&lt;br /&gt;
	local descendants, family = {}, self:getFamily()&lt;br /&gt;
	-- Iterate over all three datasets.&lt;br /&gt;
	for _, data in ipairs{&lt;br /&gt;
		require(&amp;quot;Module:languages/code to canonical name&amp;quot;),&lt;br /&gt;
		require(&amp;quot;Module:etymology languages/code to canonical name&amp;quot;),&lt;br /&gt;
		require(&amp;quot;Module:families/code to canonical name&amp;quot;),&lt;br /&gt;
	} do&lt;br /&gt;
		for code in pairs(data) do&lt;br /&gt;
			local lang = get_by_code(code, nil, true, true)&lt;br /&gt;
			-- Test for a descendant. Earlier tests weed out most candidates, while the more intensive tests are only used sparingly.&lt;br /&gt;
			if (&lt;br /&gt;
				code ~= self._code and -- Not self.&lt;br /&gt;
				lang:inFamily(family) and -- In the same family.&lt;br /&gt;
				(&lt;br /&gt;
					family:getProtoLanguageCode() == self._code or -- Self is the protolanguage.&lt;br /&gt;
					self:hasDescendant(lang) or -- Full hasDescendant check.&lt;br /&gt;
					(lang:getFullCode() == self._code and not self:hasAncestor(lang)) -- Etymology-only child which isn&#039;t an ancestor.&lt;br /&gt;
				)&lt;br /&gt;
			) then&lt;br /&gt;
				if fmt == &amp;quot;object&amp;quot; then&lt;br /&gt;
					insert(descendants, lang)&lt;br /&gt;
				elseif fmt == &amp;quot;code&amp;quot; then&lt;br /&gt;
					insert(descendants, code)&lt;br /&gt;
				elseif fmt == &amp;quot;name&amp;quot; then&lt;br /&gt;
					insert(descendants, lang:getCanonicalName())&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return descendants&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getDescendants()&lt;br /&gt;
	local descendants = self._descendantObjects&lt;br /&gt;
	if descendants == nil then&lt;br /&gt;
		descendants = fetch_descendants(self, &amp;quot;object&amp;quot;)&lt;br /&gt;
		self._descendantObjects = descendants&lt;br /&gt;
	end&lt;br /&gt;
	return descendants&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getDescendantCodes()&lt;br /&gt;
	local descendants = self._descendantCodes&lt;br /&gt;
	if descendants == nil then&lt;br /&gt;
		descendants = fetch_descendants(self, &amp;quot;code&amp;quot;)&lt;br /&gt;
		self._descendantCodes = descendants&lt;br /&gt;
	end&lt;br /&gt;
	return descendants&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getDescendantNames()&lt;br /&gt;
	local descendants = self._descendantNames&lt;br /&gt;
	if descendants == nil then&lt;br /&gt;
		descendants = fetch_descendants(self, &amp;quot;name&amp;quot;)&lt;br /&gt;
		self._descendantNames = descendants&lt;br /&gt;
	end&lt;br /&gt;
	return descendants&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	local function check_lang(self, lang)&lt;br /&gt;
		if type(lang) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			lang = get_by_code(lang, nil, true)&lt;br /&gt;
		end&lt;br /&gt;
		if lang:hasAncestor(self) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function Language:hasDescendant(...)&lt;br /&gt;
		return check_inputs(self, check_lang, false, ...)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fetch_children(self, fmt)&lt;br /&gt;
	local m_etym_data = require(etymology_languages_data_module)&lt;br /&gt;
	local self_code, children = self._code, {}&lt;br /&gt;
	for code, lang in pairs(m_etym_data) do&lt;br /&gt;
		local _lang = lang&lt;br /&gt;
		repeat&lt;br /&gt;
			local parent = _lang.parent&lt;br /&gt;
			if parent == self_code then&lt;br /&gt;
				if fmt == &amp;quot;object&amp;quot; then&lt;br /&gt;
					insert(children, get_by_code(code, nil, true))&lt;br /&gt;
				elseif fmt == &amp;quot;code&amp;quot; then&lt;br /&gt;
					insert(children, code)&lt;br /&gt;
				elseif fmt == &amp;quot;name&amp;quot; then&lt;br /&gt;
					insert(children, lang[1])&lt;br /&gt;
				end&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			_lang = m_etym_data[parent]&lt;br /&gt;
		until not _lang&lt;br /&gt;
	end&lt;br /&gt;
	return children&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getChildren()&lt;br /&gt;
	local children = self._childObjects&lt;br /&gt;
	if children == nil then&lt;br /&gt;
		children = fetch_children(self, &amp;quot;object&amp;quot;)&lt;br /&gt;
		self._childObjects = children&lt;br /&gt;
	end&lt;br /&gt;
	return children&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getChildrenCodes()&lt;br /&gt;
	local children = self._childCodes&lt;br /&gt;
	if children == nil then&lt;br /&gt;
		children = fetch_children(self, &amp;quot;code&amp;quot;)&lt;br /&gt;
		self._childCodes = children&lt;br /&gt;
	end&lt;br /&gt;
	return children&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getChildrenNames()&lt;br /&gt;
	local children = self._childNames&lt;br /&gt;
	if children == nil then&lt;br /&gt;
		children = fetch_children(self, &amp;quot;name&amp;quot;)&lt;br /&gt;
		self._childNames = children&lt;br /&gt;
	end&lt;br /&gt;
	return children&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:hasChild(...)&lt;br /&gt;
	local lang = ...&lt;br /&gt;
	if not lang then&lt;br /&gt;
		return false&lt;br /&gt;
	elseif type(lang) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		lang = get_by_code(lang, nil, true)&lt;br /&gt;
	end&lt;br /&gt;
	if lang:hasParent(self) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return self:hasChild(select(2, ...))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns the name of the main category of that language. Example: {{code|lua|&amp;quot;French language&amp;quot;}} for French, whose category is at [[:Category:French language]]. Unless optional argument &amp;lt;code&amp;gt;nocap&amp;lt;/code&amp;gt; is given, the language name at the beginning of the returned value will be capitalized. This capitalization is correct for category names, but not if the language name is lowercase and the returned value of this function is used in the middle of a sentence.]==]&lt;br /&gt;
function Language:getCategoryName(nocap)&lt;br /&gt;
	local name = self._categoryName&lt;br /&gt;
	if name == nil then&lt;br /&gt;
		name = self:getCanonicalName()&lt;br /&gt;
		-- If a substrate, omit any leading article.&lt;br /&gt;
		if self:getFamilyCode() == &amp;quot;qfa-sub&amp;quot; then&lt;br /&gt;
			name = name:gsub(&amp;quot;^the &amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;^a &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Only add &amp;quot; language&amp;quot; if a full language.&lt;br /&gt;
		if self:hasType(&amp;quot;full&amp;quot;) then&lt;br /&gt;
			-- Unless the canonical name already ends with &amp;quot;language&amp;quot;, &amp;quot;lect&amp;quot; or their derivatives, add &amp;quot; language&amp;quot;.&lt;br /&gt;
			if not (match(name, &amp;quot;[Ll]anguage$&amp;quot;) or match(name, &amp;quot;[Ll]ect$&amp;quot;)) then&lt;br /&gt;
				name = name .. &amp;quot; language&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self._categoryName = name&lt;br /&gt;
	end&lt;br /&gt;
	if nocap then&lt;br /&gt;
		return name&lt;br /&gt;
	end&lt;br /&gt;
	return mw.getContentLanguage():ucfirst(name)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Creates a link to the category; the link text is the canonical name.]==]&lt;br /&gt;
function Language:makeCategoryLink()&lt;br /&gt;
	return make_link(self, &amp;quot;:Category:&amp;quot; .. self:getCategoryName(), self:getDisplayForm())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:getStandardCharacters(sc)&lt;br /&gt;
	local standard_chars = self._data.standardChars&lt;br /&gt;
	if type(standard_chars) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		return standard_chars&lt;br /&gt;
	elseif sc and type(sc) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		check_object(&amp;quot;script&amp;quot;, nil, sc)&lt;br /&gt;
		sc = sc:getCode()&lt;br /&gt;
	end&lt;br /&gt;
	if (not sc) or sc == &amp;quot;None&amp;quot; then&lt;br /&gt;
		local scripts = {}&lt;br /&gt;
		for _, script in pairs(standard_chars) do&lt;br /&gt;
			insert(scripts, script)&lt;br /&gt;
		end&lt;br /&gt;
		return concat(scripts)&lt;br /&gt;
	end&lt;br /&gt;
	if standard_chars[sc] then&lt;br /&gt;
		return standard_chars[sc] .. (standard_chars[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Make the entry name (i.e. the correct page name).]==]&lt;br /&gt;
function Language:makeEntryName(text, sc)&lt;br /&gt;
	if (not text) or text == &amp;quot;&amp;quot; then&lt;br /&gt;
		return text, nil, {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set `unsupported` as true if certain conditions are met.&lt;br /&gt;
	local unsupported&lt;br /&gt;
	-- Check if there&#039;s an unsupported character. \239\191\189 is the replacement character U+FFFD, which can&#039;t be typed directly here due to an abuse filter. Unix-style dot-slash notation is also unsupported, as it is used for relative paths in links, as are 3 or more consecutive tildes.&lt;br /&gt;
	-- Note: match is faster with magic characters/charsets; find is faster with plaintext.&lt;br /&gt;
	if (&lt;br /&gt;
		match(text, &amp;quot;[#&amp;lt;&amp;gt;%[%]_{|}]&amp;quot;) or&lt;br /&gt;
		find(text, &amp;quot;\239\191\189&amp;quot;) or&lt;br /&gt;
		match(text, &amp;quot;%f[^%z/]%.%.?%f[%z/]&amp;quot;) or&lt;br /&gt;
		find(text, &amp;quot;~~~&amp;quot;)&lt;br /&gt;
	) then&lt;br /&gt;
		unsupported = true&lt;br /&gt;
	-- If it looks like an interwiki link.&lt;br /&gt;
	elseif find(text, &amp;quot;:&amp;quot;) then&lt;br /&gt;
		local prefix = gsub(text, &amp;quot;^:*(.-):.*&amp;quot;, ulower)&lt;br /&gt;
		if (&lt;br /&gt;
			load_data(&amp;quot;Module:data/namespaces&amp;quot;)[prefix] or&lt;br /&gt;
			load_data(&amp;quot;Module:data/interwikis&amp;quot;)[prefix]&lt;br /&gt;
		) then&lt;br /&gt;
			unsupported = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check if the text is a listed unsupported title.&lt;br /&gt;
	local unsupportedTitles = load_data(links_data_module).unsupported_titles&lt;br /&gt;
	if unsupportedTitles[text] then&lt;br /&gt;
		return &amp;quot;Unsupported titles/&amp;quot; .. unsupportedTitles[text], nil, {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	sc = checkScript(text, self, sc)&lt;br /&gt;
&lt;br /&gt;
	local fail, cats&lt;br /&gt;
	text = normalize(text, sc)&lt;br /&gt;
	text, fail, cats = iterateSectionSubstitutions(self, text, sc, nil, nil, self._data.entry_name, &amp;quot;makeEntryName&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	text = umatch(text, &amp;quot;^[¿¡]?(.-[^%s%p].-)%s*[؟?!;՛՜ ՞ ՟？！︖︕।॥။၊་།]?$&amp;quot;) or text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Escape unsupported characters so they can be used in titles. ` is used as a delimiter for this, so a raw use of it in an unsupported title is also escaped here to prevent interference; this is only done with unsupported titles, though, so inclusion won&#039;t in itself mean a title is treated as unsupported (which is why it&#039;s excluded from the earlier test).&lt;br /&gt;
	if unsupported then&lt;br /&gt;
		local unsupported_characters = load_data(links_data_module).unsupported_characters&lt;br /&gt;
		text = text:gsub(&amp;quot;[#&amp;lt;&amp;gt;%[%]_`{|}\239]\191?\189?&amp;quot;, unsupported_characters)&lt;br /&gt;
			:gsub(&amp;quot;%f[^%z/]%.%.?%f[%z/]&amp;quot;, function(m)&lt;br /&gt;
				return gsub(m, &amp;quot;%.&amp;quot;, &amp;quot;`period`&amp;quot;)&lt;br /&gt;
			end)&lt;br /&gt;
			:gsub(&amp;quot;~~~+&amp;quot;, function(m)&lt;br /&gt;
				return gsub(m, &amp;quot;~&amp;quot;, &amp;quot;`tilde`&amp;quot;)&lt;br /&gt;
			end)&lt;br /&gt;
		text = &amp;quot;Unsupported titles/&amp;quot; .. text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text, fail, cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Generates alternative forms using a specified method, and returns them as a table. If no method is specified, returns a table containing only the input term.]==]&lt;br /&gt;
function Language:generateForms(text, sc)&lt;br /&gt;
	local generate_forms = self._data.generate_forms&lt;br /&gt;
	if generate_forms == nil then&lt;br /&gt;
		return {text}&lt;br /&gt;
	end&lt;br /&gt;
	sc = checkScript(text, self, sc)&lt;br /&gt;
	return require(&amp;quot;Module:&amp;quot; .. self._data.generate_forms).generateForms(text, self, sc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Creates a sort key for the given entry name, following the rules appropriate for the language. This removes diacritical marks from the entry name if they are not considered significant for sorting, and may perform some other changes. Any initial hyphen is also removed, and anything parentheses is removed as well.&lt;br /&gt;
The &amp;lt;code&amp;gt;sort_key&amp;lt;/code&amp;gt; setting for each language in the data modules defines the replacements made by this function, or it gives the name of the module that takes the entry name and returns a sortkey.]==]&lt;br /&gt;
function Language:makeSortKey(text, sc)&lt;br /&gt;
	if (not text) or text == &amp;quot;&amp;quot; then&lt;br /&gt;
		return text, nil, {}&lt;br /&gt;
	end&lt;br /&gt;
	-- Remove directional characters, soft hyphens, strip markers and HTML tags.&lt;br /&gt;
	text = ugsub(text, &amp;quot;[\194\173\226\128\170-\226\128\174\226\129\166-\226\129\169]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	text = gsub(unstrip(text), &amp;quot;&amp;lt;[^&amp;lt;&amp;gt;]+&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	text = decode_uri(text, &amp;quot;PATH&amp;quot;)&lt;br /&gt;
	text = checkNoEntities(self, text)&lt;br /&gt;
&lt;br /&gt;
	-- Remove initial hyphens and * unless the term only consists of spacing + punctuation characters.&lt;br /&gt;
	text = ugsub(text, &amp;quot;^([􀀀-􏿽]*)[-־ـ᠊*]+([􀀀-􏿽]*)(.*[^%s%p].*)&amp;quot;, &amp;quot;%1%2%3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	sc = checkScript(text, self, sc)&lt;br /&gt;
&lt;br /&gt;
	text = normalize(text, sc)&lt;br /&gt;
	text = removeCarets(text, sc)&lt;br /&gt;
&lt;br /&gt;
	-- For languages with dotted dotless i, ensure that &amp;quot;İ&amp;quot; is sorted as &amp;quot;i&amp;quot;, and &amp;quot;I&amp;quot; is sorted as &amp;quot;ı&amp;quot;.&lt;br /&gt;
	if self:hasDottedDotlessI() then&lt;br /&gt;
		text = gsub(text, &amp;quot;I\204\135&amp;quot;, &amp;quot;i&amp;quot;) -- decomposed &amp;quot;İ&amp;quot;&lt;br /&gt;
			:gsub(&amp;quot;I&amp;quot;, &amp;quot;ı&amp;quot;)&lt;br /&gt;
		text = sc:toFixedNFD(text)&lt;br /&gt;
	end&lt;br /&gt;
	-- Convert to lowercase, make the sortkey, then convert to uppercase. Where the language has dotted dotless i, it is usually not necessary to convert &amp;quot;i&amp;quot; to &amp;quot;İ&amp;quot; and &amp;quot;ı&amp;quot; to &amp;quot;I&amp;quot; first, because &amp;quot;I&amp;quot; will always be interpreted as conventional &amp;quot;I&amp;quot; (not dotless &amp;quot;İ&amp;quot;) by any sorting algorithms, which will have been taken into account by the sortkey substitutions themselves. However, if no sortkey substitutions have been specified, then conversion is necessary so as to prevent &amp;quot;i&amp;quot; and &amp;quot;ı&amp;quot; both being sorted as &amp;quot;I&amp;quot;.&lt;br /&gt;
	-- An exception is made for scripts that (sometimes) sort by scraping page content, as that means they are sensitive to changes in capitalization (as it changes the target page).&lt;br /&gt;
	local fail, cats&lt;br /&gt;
	if not sc:sortByScraping() then&lt;br /&gt;
		text = ulower(text)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local sort_key = self._data.sort_key&lt;br /&gt;
	text, fail, cats = iterateSectionSubstitutions(self, text, sc, nil, nil, sort_key, &amp;quot;makeSortKey&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if not sc:sortByScraping() then&lt;br /&gt;
		if self:hasDottedDotlessI() and not sort_key then&lt;br /&gt;
			text = gsub(gsub(text, &amp;quot;ı&amp;quot;, &amp;quot;I&amp;quot;), &amp;quot;i&amp;quot;, &amp;quot;İ&amp;quot;)&lt;br /&gt;
			text = sc:toFixedNFC(text)&lt;br /&gt;
		end&lt;br /&gt;
		text = uupper(text)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove parentheses, as long as they are either preceded or followed by something.&lt;br /&gt;
	text = gsub(text, &amp;quot;(.)[()]+&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;[()]+(.)&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	text = escape_risky_characters(text)&lt;br /&gt;
	return text, fail, cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Create the form used as as a basis for display text and transliteration.]==]&lt;br /&gt;
local function processDisplayText(text, self, sc, keepCarets, keepPrefixes)&lt;br /&gt;
	local subbedChars = {}&lt;br /&gt;
	text, subbedChars = doTempSubstitutions(text, subbedChars, keepCarets)&lt;br /&gt;
&lt;br /&gt;
	text = decode_uri(text, &amp;quot;PATH&amp;quot;)&lt;br /&gt;
	text = checkNoEntities(self, text)&lt;br /&gt;
&lt;br /&gt;
	sc = checkScript(text, self, sc)&lt;br /&gt;
	local fail, cats&lt;br /&gt;
	text = normalize(text, sc)&lt;br /&gt;
	text, fail, cats, subbedChars = iterateSectionSubstitutions(self, text, sc, subbedChars, keepCarets, self._data.display_text, &amp;quot;makeDisplayText&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	text = removeCarets(text, sc)&lt;br /&gt;
&lt;br /&gt;
	-- Remove any interwiki link prefixes (unless they have been escaped or this has been disabled).&lt;br /&gt;
	if find(text, &amp;quot;:&amp;quot;) and not keepPrefixes then&lt;br /&gt;
		local rep&lt;br /&gt;
		repeat&lt;br /&gt;
			text, rep = gsub(text, &amp;quot;\\\\(\\*:)&amp;quot;, &amp;quot;\3%1&amp;quot;)&lt;br /&gt;
		until rep == 0&lt;br /&gt;
		text = gsub(text, &amp;quot;\\:&amp;quot;, &amp;quot;\4&amp;quot;)&lt;br /&gt;
		while true do&lt;br /&gt;
			local prefix = gsub(text, &amp;quot;^(.-):.+&amp;quot;, function(m1)&lt;br /&gt;
				return gsub(m1, &amp;quot;\244[\128-\191]*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			end)&lt;br /&gt;
			-- Check if the prefix is an interwiki, though ignore capitalised Wiktionary:, which is a namespace.&lt;br /&gt;
			if not prefix or prefix == text or prefix == &amp;quot;Wiktionary&amp;quot;&lt;br /&gt;
				or not (load_data(&amp;quot;Module:data/interwikis&amp;quot;)[ulower(prefix)] or prefix == &amp;quot;&amp;quot;) then&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			text = gsub(text, &amp;quot;^(.-):(.*)&amp;quot;, function(m1, m2)&lt;br /&gt;
				local ret = {}&lt;br /&gt;
				for subbedChar in gmatch(m1, &amp;quot;\244[\128-\191]*&amp;quot;) do&lt;br /&gt;
					insert(ret, subbedChar)&lt;br /&gt;
				end&lt;br /&gt;
				return concat(ret) .. m2&lt;br /&gt;
			end)&lt;br /&gt;
		end&lt;br /&gt;
		text = gsub(text, &amp;quot;\3&amp;quot;, &amp;quot;\\&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;\4&amp;quot;, &amp;quot;:&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	--[[if not self:hasType(&amp;quot;conlang&amp;quot;) then&lt;br /&gt;
		text = gsub(text,&amp;quot;^%*&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = gsub(text,&amp;quot;^%*%*&amp;quot;, &amp;quot;*&amp;quot;)]]&lt;br /&gt;
&lt;br /&gt;
	return text, fail, cats, subbedChars&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Make the display text (i.e. what is displayed on the page).]==]&lt;br /&gt;
function Language:makeDisplayText(text, sc, keepPrefixes)&lt;br /&gt;
	if (not text) or text == &amp;quot;&amp;quot; then&lt;br /&gt;
		return text, nil, {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local fail, cats, subbedChars&lt;br /&gt;
	text, fail, cats, subbedChars = processDisplayText(text, self, sc, nil, keepPrefixes)&lt;br /&gt;
&lt;br /&gt;
	text = escape_risky_characters(text)&lt;br /&gt;
	return undoTempSubstitutions(text, subbedChars), fail, cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Transliterates the text from the given script into the Latin script (see [[Wiktionary:Transliteration and romanization]]). The language must have the &amp;lt;code&amp;gt;translit&amp;lt;/code&amp;gt; property for this to work; if it is not present, {{code|lua|nil}} is returned.&lt;br /&gt;
Returns three values:&lt;br /&gt;
# The transliteration.&lt;br /&gt;
# A boolean which indicates whether the transliteration failed for an unexpected reason. If {{code|lua|false}}, then the transliteration either succeeded, or the module is returning nothing in a controlled way (e.g. the input was {{code|lua|&amp;quot;-&amp;quot;}}). Generally, this means that no maintenance action is required. If {{code|lua|true}}, then the transliteration is {{code|lua|nil}} because either the input or output was defective in some way (e.g. [[Module:ar-translit]] will not transliterate non-vocalised inputs, and this module will fail partially-completed transliterations in all languages). Note that this value can be manually set by the transliteration module, so make sure to cross-check to ensure it is accurate.&lt;br /&gt;
# A table of categories selected by the transliteration module, which should be in the format expected by {{code|lua|format_categories}} in [[Module:utilities]].&lt;br /&gt;
The &amp;lt;code&amp;gt;sc&amp;lt;/code&amp;gt; parameter is handled by the transliteration module, and how it is handled is specific to that module. Some transliteration modules may tolerate {{code|lua|nil}} as the script, others require it to be one of the possible scripts that the module can transliterate, and will show an error if it&#039;s not one of them. For this reason, the &amp;lt;code&amp;gt;sc&amp;lt;/code&amp;gt; parameter should always be provided when writing non-language-specific code.&lt;br /&gt;
The &amp;lt;code&amp;gt;module_override&amp;lt;/code&amp;gt; parameter is used to override the default module that is used to provide the transliteration. This is useful in cases where you need to demonstrate a particular module in use, but there is no default module yet, or you want to demonstrate an alternative version of a transliteration module before making it official. It should not be used in real modules or templates, only for testing. All uses of this parameter are tracked by [[Wiktionary:Tracking/languages/module_override]].&lt;br /&gt;
&#039;&#039;&#039;Known bugs&#039;&#039;&#039;:&lt;br /&gt;
* This function assumes {tr(s1) .. tr(s2) == tr(s1 .. s2)}. When this assertion fails, wikitext markups like &amp;lt;nowiki&amp;gt;&#039;&#039;&#039;&amp;lt;/nowiki&amp;gt; can cause wrong transliterations.&lt;br /&gt;
* HTML entities like &amp;lt;code&amp;gt;&amp;amp;amp;apos;&amp;lt;/code&amp;gt;, often used to escape wikitext markups, do not work.]==]&lt;br /&gt;
function Language:transliterate(text, sc, module_override)&lt;br /&gt;
	-- If there is no text, or the language doesn&#039;t have transliteration data and there&#039;s no override, return nil.&lt;br /&gt;
	if not (self._data.translit or module_override) then&lt;br /&gt;
		return nil, false, {}&lt;br /&gt;
	elseif (not text) or text == &amp;quot;&amp;quot; or text == &amp;quot;-&amp;quot; then&lt;br /&gt;
		return text, false, {}&lt;br /&gt;
	end&lt;br /&gt;
	-- If the script is not transliteratable (and no override is given), return nil.&lt;br /&gt;
	sc = checkScript(text, self, sc)&lt;br /&gt;
	if not (sc:isTransliterated() or module_override) then&lt;br /&gt;
		return nil, true, {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove any strip markers.&lt;br /&gt;
	text = unstrip(text)&lt;br /&gt;
&lt;br /&gt;
	-- Do not process the formatting into PUA characters for certain languages.&lt;br /&gt;
	local processed = load_data(languages_data_module).substitution[self._code] ~= &amp;quot;none&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	-- Get the display text with the keepCarets flag set.&lt;br /&gt;
	local fail, cats, subbedChars&lt;br /&gt;
	if processed then&lt;br /&gt;
		text, fail, cats, subbedChars = processDisplayText(text, self, sc, true)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Transliterate (using the module override if applicable).&lt;br /&gt;
	text, fail, cats, subbedChars = iterateSectionSubstitutions(self, text, sc, subbedChars, true, module_override or self._data.translit, &amp;quot;tr&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if not text then&lt;br /&gt;
		return nil, true, cats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Incomplete transliterations return nil.&lt;br /&gt;
	local charset = sc.characters&lt;br /&gt;
	if charset and umatch(text, &amp;quot;[&amp;quot; .. charset .. &amp;quot;]&amp;quot;) then&lt;br /&gt;
		-- Remove any characters in Latin, which includes Latin characters also included in other scripts (as these are false positives), as well as any PUA substitutions. Anything remaining should only be script code &amp;quot;None&amp;quot; (e.g. numerals).&lt;br /&gt;
		local check_text = ugsub(text, &amp;quot;[&amp;quot; .. get_script(&amp;quot;Latn&amp;quot;).characters .. &amp;quot;􀀀-􏿽]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		-- Set none_is_last_resort_only flag, so that any non-None chars will cause a script other than &amp;quot;None&amp;quot; to be returned.&lt;br /&gt;
		if find_best_script_without_lang(check_text, true):getCode() ~= &amp;quot;None&amp;quot; then&lt;br /&gt;
			return nil, true, cats&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if processed then&lt;br /&gt;
		text = escape_risky_characters(text)&lt;br /&gt;
		text = undoTempSubstitutions(text, subbedChars)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If the script does not use capitalization, then capitalize any letters of the transliteration which are immediately preceded by a caret (and remove the caret).&lt;br /&gt;
	if text and not sc:hasCapitalization() and text:find(&amp;quot;^&amp;quot;, 1, true) then&lt;br /&gt;
		text = processCarets(text, &amp;quot;%^([\128-\191\244]*%*?)([^\128-\191\244][\128-\191]*)&amp;quot;, function(m1, m2)&lt;br /&gt;
			return m1 .. uupper(m2)&lt;br /&gt;
		end)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	fail = text == nil and (not not fail) or false&lt;br /&gt;
&lt;br /&gt;
	return text, fail, cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	local function handle_language_spec(self, spec, sc)&lt;br /&gt;
		local ret = self[&amp;quot;_&amp;quot; .. spec]&lt;br /&gt;
		if ret == nil then&lt;br /&gt;
			ret = self._data[spec]&lt;br /&gt;
			if type(ret) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				ret = list_to_set(split(ret, &amp;quot;,&amp;quot;, true, true))&lt;br /&gt;
			end&lt;br /&gt;
			self[&amp;quot;_&amp;quot; .. spec] = ret&lt;br /&gt;
		end&lt;br /&gt;
		if type(ret) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			ret = ret[sc:getCode()]&lt;br /&gt;
		end&lt;br /&gt;
		return not not ret&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function Language:overrideManualTranslit(sc)&lt;br /&gt;
		return handle_language_spec(self, &amp;quot;override_translit&amp;quot;, sc)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function Language:link_tr(sc)&lt;br /&gt;
		return handle_language_spec(self, &amp;quot;link_tr&amp;quot;, sc)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns {{code|lua|true}} if the language has a transliteration module, or {{code|lua|false}} if it doesn&#039;t.]==]&lt;br /&gt;
function Language:hasTranslit()&lt;br /&gt;
	return not not self._data.translit&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Returns {{code|lua|true}} if the language uses the letters I/ı and İ/i, or {{code|lua|false}} if it doesn&#039;t.]==]&lt;br /&gt;
function Language:hasDottedDotlessI()&lt;br /&gt;
	return not not self._data.dotted_dotless_i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Language:toJSON(opts)&lt;br /&gt;
	local entry_name, entry_name_patterns, entry_name_remove_diacritics = self._data.entry_name&lt;br /&gt;
	if entry_name then&lt;br /&gt;
		if entry_name.from then&lt;br /&gt;
			entry_name_patterns = {}&lt;br /&gt;
			for i, from in ipairs(entry_name.from) do&lt;br /&gt;
				insert(entry_name_patterns, {from = from, to = entry_name.to[i] or &amp;quot;&amp;quot;})&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		entry_name_remove_diacritics = entry_name.remove_diacritics&lt;br /&gt;
	end&lt;br /&gt;
	-- mainCode should only end up non-nil if dontCanonicalizeAliases is passed to make_object().&lt;br /&gt;
	local ret = {&lt;br /&gt;
		ancestors = self:getAncestorCodes(),&lt;br /&gt;
		canonicalName = self:getCanonicalName(),&lt;br /&gt;
		categoryName = self:getCategoryName(&amp;quot;nocap&amp;quot;),&lt;br /&gt;
		code = self._code,&lt;br /&gt;
		mainCode = self._mainCode,&lt;br /&gt;
		parent = self:getParentCode(),&lt;br /&gt;
		full = self:getFullCode(),&lt;br /&gt;
		entryNamePatterns = entry_name_patterns,&lt;br /&gt;
		entryNameRemoveDiacritics = entry_name_remove_diacritics,&lt;br /&gt;
		family = self:getFamilyCode(),&lt;br /&gt;
		aliases = self:getAliases(),&lt;br /&gt;
		varieties = self:getVarieties(),&lt;br /&gt;
		otherNames = self:getOtherNames(),&lt;br /&gt;
		scripts = self:getScriptCodes(),&lt;br /&gt;
		type = keys_to_list(self:getTypes()),&lt;br /&gt;
		wikimediaLanguages = self:getWikimediaLanguageCodes(),&lt;br /&gt;
		wikidataItem = self:getWikidataItem(),&lt;br /&gt;
		wikipediaArticle = self:getWikipediaArticle(true),&lt;br /&gt;
	}&lt;br /&gt;
	-- Use `deep_copy` when returning a table, so that there are no editing restrictions imposed by `mw.loadData`.&lt;br /&gt;
	return opts and opts.lua_table and deep_copy(ret) or to_json(ret, opts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.getDataModuleName(code)&lt;br /&gt;
	local letter = match(code, &amp;quot;^(%l)%l%l?$&amp;quot;)&lt;br /&gt;
	return &amp;quot;Module:&amp;quot; .. (&lt;br /&gt;
		letter == nil and &amp;quot;languages/data/exceptional&amp;quot; or&lt;br /&gt;
		#code == 2 and &amp;quot;languages/data/2&amp;quot; or&lt;br /&gt;
		&amp;quot;languages/data/3/&amp;quot; .. letter&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
get_data_module_name = export.getDataModuleName&lt;br /&gt;
&lt;br /&gt;
function export.getExtraDataModuleName(code)&lt;br /&gt;
	return get_data_module_name(code) .. &amp;quot;/extra&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
get_extra_data_module_name = export.getExtraDataModuleName&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	local function make_stack(data)&lt;br /&gt;
		local key_types = {&lt;br /&gt;
			[2] = &amp;quot;unique&amp;quot;,&lt;br /&gt;
			aliases = &amp;quot;unique&amp;quot;,&lt;br /&gt;
			otherNames = &amp;quot;unique&amp;quot;,&lt;br /&gt;
			type = &amp;quot;append&amp;quot;,&lt;br /&gt;
			varieties = &amp;quot;unique&amp;quot;,&lt;br /&gt;
			wikipedia_article = &amp;quot;unique&amp;quot;,&lt;br /&gt;
			wikimedia_codes = &amp;quot;unique&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		local function __index(self, k)&lt;br /&gt;
			local stack, key_type = getmetatable(self), key_types[k]&lt;br /&gt;
			-- Data that isn&#039;t inherited from the parent.&lt;br /&gt;
			if key_type == &amp;quot;unique&amp;quot; then&lt;br /&gt;
				local v = stack[stack[make_stack]][k]&lt;br /&gt;
				if v == nil then&lt;br /&gt;
					local layer = stack[0]&lt;br /&gt;
					if layer then -- Could be false if there&#039;s no extra data.&lt;br /&gt;
						v = layer[k]&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				return v&lt;br /&gt;
			-- Data that is appended by each generation.&lt;br /&gt;
			elseif key_type == &amp;quot;append&amp;quot; then&lt;br /&gt;
				local parts, offset, n = {}, 0, stack[make_stack]&lt;br /&gt;
				for i = 1, n do&lt;br /&gt;
					local part = stack[i][k]&lt;br /&gt;
					if part == nil then&lt;br /&gt;
						offset = offset + 1&lt;br /&gt;
					else&lt;br /&gt;
						parts[i - offset] = part&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				return offset ~= n and concat(parts, &amp;quot;,&amp;quot;) or nil&lt;br /&gt;
			end&lt;br /&gt;
			local n = stack[make_stack]&lt;br /&gt;
			while true do&lt;br /&gt;
				local layer = stack[n]&lt;br /&gt;
				if not layer then -- Could be false if there&#039;s no extra data.&lt;br /&gt;
					return nil&lt;br /&gt;
				end&lt;br /&gt;
				local v = layer[k]&lt;br /&gt;
				if v ~= nil then&lt;br /&gt;
					return v&lt;br /&gt;
				end&lt;br /&gt;
				n = n - 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local function __newindex()&lt;br /&gt;
			error(&amp;quot;table is read-only&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local function __pairs(self)&lt;br /&gt;
			-- Iterate down the stack, caching keys to avoid duplicate returns.&lt;br /&gt;
			local stack, seen = getmetatable(self), {}&lt;br /&gt;
			local n = stack[make_stack]&lt;br /&gt;
			local iter, state, k, v = pairs(stack[n])&lt;br /&gt;
			return function()&lt;br /&gt;
				repeat&lt;br /&gt;
					repeat&lt;br /&gt;
						k = iter(state, k)&lt;br /&gt;
						if k == nil then&lt;br /&gt;
							n = n - 1&lt;br /&gt;
							local layer = stack[n]&lt;br /&gt;
							if not layer then -- Could be false if there&#039;s no extra data.&lt;br /&gt;
								return nil&lt;br /&gt;
							end&lt;br /&gt;
							iter, state, k = pairs(layer)&lt;br /&gt;
						end&lt;br /&gt;
					until not (k == nil or seen[k])&lt;br /&gt;
					-- Get the value via a lookup, as the one returned by the&lt;br /&gt;
					-- iterator will be the raw value from the current layer,&lt;br /&gt;
					-- which may not be the one __index will return for that&lt;br /&gt;
					-- key. Also memoize the key in `seen` (even if the lookup&lt;br /&gt;
					-- returns nil) so that it doesn&#039;t get looked up again.&lt;br /&gt;
					-- TODO: store values in `self`, avoiding the need to create&lt;br /&gt;
					-- the `seen` table. The iterator will need to iterate over&lt;br /&gt;
					-- `self` with `next` first to find these on future loops.&lt;br /&gt;
					v, seen[k] = self[k], true&lt;br /&gt;
				until v ~= nil&lt;br /&gt;
				return k, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local __ipairs = require(table_module).indexIpairs&lt;br /&gt;
&lt;br /&gt;
		function make_stack(data)&lt;br /&gt;
			local stack = {&lt;br /&gt;
				data,&lt;br /&gt;
				[make_stack] = 1, -- stores the length and acts as a sentinel to confirm a given metatable is a stack.&lt;br /&gt;
				__index = __index,&lt;br /&gt;
				__newindex = __newindex,&lt;br /&gt;
				__pairs = __pairs,&lt;br /&gt;
				__ipairs = __ipairs,&lt;br /&gt;
			}&lt;br /&gt;
			stack.__metatable = stack&lt;br /&gt;
			return setmetatable({}, stack), stack&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return make_stack(data)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function get_stack(data)&lt;br /&gt;
		local stack = getmetatable(data)&lt;br /&gt;
		return stack and type(stack) == &amp;quot;table&amp;quot; and stack[make_stack] and stack or nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[==[&lt;br /&gt;
	&amp;lt;span style=&amp;quot;color: #BA0000&amp;quot;&amp;gt;This function is not for use in entries or other content pages.&amp;lt;/span&amp;gt;&lt;br /&gt;
	Returns a blob of data about the language. The format of this blob is undocumented, and perhaps unstable; it&#039;s intended for things like the module&#039;s own unit-tests, which are &amp;quot;close friends&amp;quot; with the module and will be kept up-to-date as the format changes. If `extra` is set, any extra data in the relevant `/extra` module will be included. (Note that it will be included anyway if it has already been loaded into the language object.) If `raw` is set, then the returned data will not contain any data inherited from parent objects.&lt;br /&gt;
	-- Do NOT use these methods!&lt;br /&gt;
	-- All uses should be pre-approved on the talk page!&lt;br /&gt;
	]==]&lt;br /&gt;
	function Language:getData(extra, raw)&lt;br /&gt;
		if extra then&lt;br /&gt;
			self:loadInExtraData()&lt;br /&gt;
		end&lt;br /&gt;
		local data = self._data&lt;br /&gt;
		-- If raw is not set, just return the data.&lt;br /&gt;
		if not raw then&lt;br /&gt;
			return data&lt;br /&gt;
		end&lt;br /&gt;
		local stack = get_stack(data)&lt;br /&gt;
		-- If there isn&#039;t a stack or its length is 1, return the data. Extra data (if any) will be included, as it&#039;s stored at key 0 and doesn&#039;t affect the reported length.&lt;br /&gt;
		if stack == nil then&lt;br /&gt;
			return data&lt;br /&gt;
		end&lt;br /&gt;
		local n = stack[make_stack]&lt;br /&gt;
		if n == 1 then&lt;br /&gt;
			return data&lt;br /&gt;
		end&lt;br /&gt;
		local extra = stack[0]&lt;br /&gt;
		-- If there isn&#039;t any extra data, return the top layer of the stack.&lt;br /&gt;
		if extra == nil then&lt;br /&gt;
			return stack[n]&lt;br /&gt;
		end&lt;br /&gt;
		-- If there is, return a new stack which has the top layer at key 1 and the extra data at key 0.&lt;br /&gt;
		data, stack = make_stack(stack[n])&lt;br /&gt;
		stack[0] = extra&lt;br /&gt;
		return data&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function Language:loadInExtraData()&lt;br /&gt;
		-- Only full languages have extra data.&lt;br /&gt;
		if not self:hasType(&amp;quot;language&amp;quot;, &amp;quot;full&amp;quot;) then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		local data = self._data&lt;br /&gt;
		-- If there&#039;s no stack, create one.&lt;br /&gt;
		local stack = get_stack(self._data)&lt;br /&gt;
		if stack == nil then&lt;br /&gt;
			data, stack = make_stack(data)&lt;br /&gt;
		-- If already loaded, return.&lt;br /&gt;
		elseif stack[0] ~= nil then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		self._data = data&lt;br /&gt;
		-- Load extra data from the relevant module and add it to the stack at key 0, so that the __index and __pairs metamethods will pick it up, since they iterate down the stack until they run out of layers.&lt;br /&gt;
		local code = self._code&lt;br /&gt;
		local modulename = get_extra_data_module_name(code)&lt;br /&gt;
		-- No data cached as false.&lt;br /&gt;
		stack[0] = modulename and load_data(modulename)[code] or false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[==[Returns the name of the module containing the language&#039;s data. Currently, this is always [[Module:scripts/data]].]==]&lt;br /&gt;
	function Language:getDataModuleName()&lt;br /&gt;
		local name = self._dataModuleName&lt;br /&gt;
		if name == nil then&lt;br /&gt;
			name = self:hasType(&amp;quot;etymology-only&amp;quot;) and etymology_languages_data_module or&lt;br /&gt;
				get_data_module_name(self._mainCode or self._code)&lt;br /&gt;
			self._dataModuleName = name&lt;br /&gt;
		end&lt;br /&gt;
		return name&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[==[Returns the name of the module containing the language&#039;s data. Currently, this is always [[Module:scripts/data]].]==]&lt;br /&gt;
	function Language:getExtraDataModuleName()&lt;br /&gt;
		local name = self._extraDataModuleName&lt;br /&gt;
		if name == nil then&lt;br /&gt;
			name = not self:hasType(&amp;quot;etymology-only&amp;quot;) and get_extra_data_module_name(self._mainCode or self._code) or false&lt;br /&gt;
			self._extraDataModuleName = name&lt;br /&gt;
		end&lt;br /&gt;
		return name or nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function export.makeObject(code, data, dontCanonicalizeAliases)&lt;br /&gt;
		local data_type = type(data)&lt;br /&gt;
		if data_type ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
			error((&amp;quot;bad argument #2 to &#039;makeObject&#039; (table expected, got %s)&amp;quot;):format(data_type))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Convert any aliases.&lt;br /&gt;
		local input_code = code&lt;br /&gt;
		code = normalize_code(code)&lt;br /&gt;
		input_code = dontCanonicalizeAliases and input_code or code&lt;br /&gt;
&lt;br /&gt;
		local parent&lt;br /&gt;
		if data.parent then&lt;br /&gt;
			parent = get_by_code(data.parent, nil, true, true)&lt;br /&gt;
		else&lt;br /&gt;
			parent = Language&lt;br /&gt;
		end&lt;br /&gt;
		parent.__index = parent&lt;br /&gt;
&lt;br /&gt;
		local lang = {_code = input_code}&lt;br /&gt;
		-- This can only happen if dontCanonicalizeAliases is passed to make_object().&lt;br /&gt;
		if code ~= input_code then&lt;br /&gt;
			lang._mainCode = code&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local parent_data = parent._data&lt;br /&gt;
		if parent_data == nil then&lt;br /&gt;
			-- Full code is the same as the code.&lt;br /&gt;
			lang._fullCode = parent._code or code&lt;br /&gt;
		else&lt;br /&gt;
			-- Copy full code.&lt;br /&gt;
			lang._fullCode = parent._fullCode&lt;br /&gt;
			local stack = get_stack(parent_data)&lt;br /&gt;
			if stack == nil then&lt;br /&gt;
				parent_data, stack = make_stack(parent_data)&lt;br /&gt;
			end&lt;br /&gt;
			-- Insert the input data as the new top layer of the stack.&lt;br /&gt;
			local n = stack[make_stack] + 1&lt;br /&gt;
			data, stack[n], stack[make_stack] = parent_data, data, n&lt;br /&gt;
		end&lt;br /&gt;
		lang._data = data&lt;br /&gt;
&lt;br /&gt;
		return setmetatable(lang, parent)&lt;br /&gt;
	end&lt;br /&gt;
	make_object = export.makeObject&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Finds the language whose code matches the one provided. If it exists, it returns a &amp;lt;code class=&amp;quot;nf&amp;quot;&amp;gt;Language&amp;lt;/code&amp;gt; object representing the language. Otherwise, it returns {{code|lua|nil}}, unless &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;paramForError&amp;lt;/code&amp;gt; is given, in which case an error is generated. If &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;paramForError&amp;lt;/code&amp;gt; is {{code|lua|true}}, a generic error message mentioning the bad code is generated; otherwise &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;paramForError&amp;lt;/code&amp;gt; should be a string or number specifying the parameter that the code came from, and this parameter will be mentioned in the error message along with the bad code. If &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;allowEtymLang&amp;lt;/code&amp;gt; is specified, etymology-only language codes are allowed and looked up along with normal language codes. If &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;allowFamily&amp;lt;/code&amp;gt; is specified, language family codes are allowed and looked up along with normal language codes.]==]&lt;br /&gt;
function export.getByCode(code, paramForError, allowEtymLang, allowFamily)&lt;br /&gt;
	if type(code) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		local typ&lt;br /&gt;
		if not code then&lt;br /&gt;
			typ = &amp;quot;nil&amp;quot;&lt;br /&gt;
		elseif check_object(&amp;quot;language&amp;quot;, true, code) then&lt;br /&gt;
			typ = &amp;quot;a language object&amp;quot;&lt;br /&gt;
		elseif check_object(&amp;quot;family&amp;quot;, true, code) then&lt;br /&gt;
			typ = &amp;quot;a family object&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			typ = &amp;quot;a &amp;quot; .. type(code)&lt;br /&gt;
		end&lt;br /&gt;
		error(&amp;quot;The function getByCode expects a string as its first argument, but received &amp;quot; .. typ .. &amp;quot;.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local m_data = load_data(languages_data_module)&lt;br /&gt;
&lt;br /&gt;
	local norm_code = normalize_code(code)&lt;br /&gt;
&lt;br /&gt;
	-- Get the data, checking for etymology-only languages if allowEtymLang is set.&lt;br /&gt;
	local data = load_data(get_data_module_name(norm_code))[norm_code] or&lt;br /&gt;
		allowEtymLang and load_data(etymology_languages_data_module)[norm_code]&lt;br /&gt;
&lt;br /&gt;
	-- If no data was found and allowFamily is set, check the family data. If the main family data was found, make the object with [[Module:families]] instead, as family objects have different methods. However, if it&#039;s an etymology-only family, use make_object in this module (which handles object inheritance), and the family-specific methods will be inherited from the parent object.&lt;br /&gt;
	if data == nil and allowFamily then&lt;br /&gt;
		data = load_data(&amp;quot;Module:families/data&amp;quot;)[norm_code]&lt;br /&gt;
		if data ~= nil then&lt;br /&gt;
			if data.parent == nil then&lt;br /&gt;
				return make_family_object(norm_code, data)&lt;br /&gt;
			elseif not allowEtymLang then&lt;br /&gt;
				data = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local retval = code and data and make_object(code, data)&lt;br /&gt;
&lt;br /&gt;
	if not retval and paramForError then&lt;br /&gt;
		require(&amp;quot;Module:languages/errorGetBy&amp;quot;).code(code, paramForError, allowEtymLang, allowFamily)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
get_by_code = export.getByCode&lt;br /&gt;
&lt;br /&gt;
--[==[Finds the language whose canonical name (the name used to represent that language on Wiktionary) or other name matches the one provided. If it exists, it returns a &amp;lt;code class=&amp;quot;nf&amp;quot;&amp;gt;Language&amp;lt;/code&amp;gt; object representing the language. Otherwise, it returns {{code|lua|nil}}, unless &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;paramForError&amp;lt;/code&amp;gt; is given, in which case an error is generated. If &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;allowEtymLang&amp;lt;/code&amp;gt; is specified, etymology-only language codes are allowed and looked up along with normal language codes. If &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;allowFamily&amp;lt;/code&amp;gt; is specified, language family codes are allowed and looked up along with normal language codes.&lt;br /&gt;
The canonical name of languages should always be unique (it is an error for two languages on Wiktionary to share the same canonical name), so this is guaranteed to give at most one result.&lt;br /&gt;
This function is powered by [[Module:languages/canonical names]], which contains a pre-generated mapping of full-language canonical names to codes. It is generated by going through the [[:Category:Language data modules]] for full languages. When &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;allowEtymLang&amp;lt;/code&amp;gt; is specified for the above function, [[Module:etymology languages/canonical names]] may also be used, and when &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;allowFamily&amp;lt;/code&amp;gt; is specified for the above function, [[Module:families/canonical names]] may also be used.]==]&lt;br /&gt;
function export.getByCanonicalName(name, errorIfInvalid, allowEtymLang, allowFamily)&lt;br /&gt;
	local byName = load_data(&amp;quot;Module:languages/canonical names&amp;quot;)&lt;br /&gt;
	local code = byName and byName[name]&lt;br /&gt;
&lt;br /&gt;
	if not code and allowEtymLang then&lt;br /&gt;
		byName = load_data(&amp;quot;Module:etymology languages/canonical names&amp;quot;)&lt;br /&gt;
		code = byName and byName[name] or&lt;br /&gt;
			byName[gsub(name, &amp;quot; [Ss]ubstrate$&amp;quot;, &amp;quot;&amp;quot;)] or&lt;br /&gt;
			byName[gsub(name, &amp;quot;^a &amp;quot;, &amp;quot;&amp;quot;)] or&lt;br /&gt;
			byName[gsub(name, &amp;quot;^a &amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot; [Ss]ubstrate$&amp;quot;, &amp;quot;&amp;quot;)] or&lt;br /&gt;
			-- For etymology families like &amp;quot;ira-pro&amp;quot;.&lt;br /&gt;
			-- FIXME: This is not ideal, as it allows &amp;quot; languages&amp;quot; to be appended to any etymology-only language, too.&lt;br /&gt;
			byName[match(name, &amp;quot;^(.*) languages$&amp;quot;)]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not code and allowFamily then&lt;br /&gt;
		byName = load_data(&amp;quot;Module:families/canonical names&amp;quot;)&lt;br /&gt;
		code = byName[name] or byName[match(name, &amp;quot;^(.*) languages$&amp;quot;)]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local retval = code and get_by_code(code, errorIfInvalid, allowEtymLang, allowFamily)&lt;br /&gt;
&lt;br /&gt;
	if not retval and errorIfInvalid then&lt;br /&gt;
		require(&amp;quot;Module:languages/errorGetBy&amp;quot;).canonicalName(name, allowEtymLang, allowFamily)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Used by [[Module:languages/data/2]] (et al.) and [[Module:etymology languages/data]], [[Module:families/data]], [[Module:scripts/data]] and [[Module:writing systems/data]] to finalize the data into the format that is actually returned.]==]&lt;br /&gt;
function export.finalizeData(data, main_type, variety)&lt;br /&gt;
	local fields = {&amp;quot;type&amp;quot;}&lt;br /&gt;
	if main_type == &amp;quot;language&amp;quot; then&lt;br /&gt;
		insert(fields, 4) -- script codes&lt;br /&gt;
		insert(fields, &amp;quot;ancestors&amp;quot;)&lt;br /&gt;
		insert(fields, &amp;quot;link_tr&amp;quot;)&lt;br /&gt;
		insert(fields, &amp;quot;override_translit&amp;quot;)&lt;br /&gt;
		insert(fields, &amp;quot;wikimedia_codes&amp;quot;)&lt;br /&gt;
	elseif main_type == &amp;quot;script&amp;quot; then&lt;br /&gt;
		insert(fields, 3) -- writing system codes&lt;br /&gt;
	end -- Families and writing systems have no extra fields to process.&lt;br /&gt;
	local fields_len = #fields&lt;br /&gt;
	for _, entity in next, data do&lt;br /&gt;
		if variety then&lt;br /&gt;
			-- Move parent from 3 to &amp;quot;parent&amp;quot; and family from &amp;quot;family&amp;quot; to 3. These are different for the sake of convenience, since very few varieties have the family specified, whereas all of them have a parent.&lt;br /&gt;
			entity.parent, entity[3], entity.family = entity[3], entity.family&lt;br /&gt;
		-- Give the type &amp;quot;regular&amp;quot; iff not a variety and no other types are assigned.&lt;br /&gt;
		elseif not (entity.type or entity.parent) then&lt;br /&gt;
			entity.type = &amp;quot;regular&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		for i = 1, fields_len do&lt;br /&gt;
			local key = fields[i]&lt;br /&gt;
			local field = entity[key]&lt;br /&gt;
			if field and type(field) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				entity[key] = gsub(field, &amp;quot;%s*,%s*&amp;quot;, &amp;quot;,&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[For backwards compatibility only; modules should require the error themselves.]==]&lt;br /&gt;
function export.err(lang_code, param, code_desc, template_tag, not_real_lang)&lt;br /&gt;
	return require(&amp;quot;Module:languages/error&amp;quot;)(lang_code, param, code_desc, template_tag, not_real_lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:links&amp;diff=491421</id>
		<title>Module:links</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:links&amp;diff=491421"/>
		<updated>2026-03-24T23:49:15Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
	[[Unsupported titles]], pages with high memory usage,&lt;br /&gt;
	extraction modules and part-of-speech names are listed&lt;br /&gt;
	at [[Module:links/data]].&lt;br /&gt;
&lt;br /&gt;
	Other modules used:&lt;br /&gt;
		[[Module:script utilities]]&lt;br /&gt;
		[[Module:scripts]]&lt;br /&gt;
		[[Module:languages]] and its submodules&lt;br /&gt;
		[[Module:gender and number]]&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local anchors_module = &amp;quot;Module:anchors&amp;quot;&lt;br /&gt;
local form_of_module = &amp;quot;Module:form of&amp;quot;&lt;br /&gt;
local gender_and_number_module = &amp;quot;Module:getn&amp;quot;&lt;br /&gt;
local languages_module = &amp;quot;Module:languages&amp;quot;&lt;br /&gt;
local load_module = &amp;quot;Module:load&amp;quot;&lt;br /&gt;
local memoize_module = &amp;quot;Module:memoize&amp;quot;&lt;br /&gt;
local pages_module = &amp;quot;Module:pages&amp;quot;&lt;br /&gt;
local pron_qualifier_module = &amp;quot;Module:pron qualifier&amp;quot;&lt;br /&gt;
local scripts_module = &amp;quot;Module:scripts&amp;quot;&lt;br /&gt;
local script_utilities_module = &amp;quot;Module:script utilities&amp;quot;&lt;br /&gt;
local string_encode_entities_module = &amp;quot;Module:string/encode entities&amp;quot;&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
local table_module = &amp;quot;Module:table&amp;quot;&lt;br /&gt;
local utilities_module = &amp;quot;Module:utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local find = string.find&lt;br /&gt;
local get_current_title = mw.title.getCurrentTitle&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local ipairs = ipairs&lt;br /&gt;
local match = string.match&lt;br /&gt;
local new_title = mw.title.new&lt;br /&gt;
local pairs = pairs&lt;br /&gt;
local remove = table.remove&lt;br /&gt;
local sub = string.sub&lt;br /&gt;
local toNFC = mw.ustring.toNFC&lt;br /&gt;
local tostring = tostring&lt;br /&gt;
local type = type&lt;br /&gt;
local unstrip = mw.text.unstrip&lt;br /&gt;
&lt;br /&gt;
local NAMESPACE = get_current_title().nsText&lt;br /&gt;
&lt;br /&gt;
local function anchor_encode(...)&lt;br /&gt;
	anchor_encode = require(memoize_module)(mw.uri.anchorEncode, true)&lt;br /&gt;
	return anchor_encode(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function decode_entities(...)&lt;br /&gt;
	decode_entities = require(string_utilities_module).decode_entities&lt;br /&gt;
	return decode_entities(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function decode_uri(...)&lt;br /&gt;
	decode_uri = require(string_utilities_module).decode_uri&lt;br /&gt;
	return decode_uri(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Can&#039;t yet replace, as the [[Module:string utilities]] version no longer has automatic double-encoding prevention, which requires changes here to account for.&lt;br /&gt;
local function encode_entities(...)&lt;br /&gt;
	encode_entities = require(string_encode_entities_module)&lt;br /&gt;
	return encode_entities(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function extend(...)&lt;br /&gt;
	extend = require(table_module).extend&lt;br /&gt;
	return extend(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function find_best_script_without_lang(...)&lt;br /&gt;
	find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang&lt;br /&gt;
	return find_best_script_without_lang(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format_categories(...)&lt;br /&gt;
	format_categories = require(utilities_module).format_categories&lt;br /&gt;
	return format_categories(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format_genders(...)&lt;br /&gt;
	format_genders = require(gender_and_number_module).format_genders&lt;br /&gt;
	return format_genders(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format_qualifiers(...)&lt;br /&gt;
	format_qualifiers = require(pron_qualifier_module).format_qualifiers&lt;br /&gt;
	return format_qualifiers(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_current_L2(...)&lt;br /&gt;
	get_current_L2 = require(pages_module).get_current_L2&lt;br /&gt;
	return get_current_L2(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_lang(...)&lt;br /&gt;
	get_lang = require(languages_module).getByCode&lt;br /&gt;
	return get_lang(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_script(...)&lt;br /&gt;
	get_script = require(scripts_module).getByCode&lt;br /&gt;
	return get_script(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function language_anchor(...)&lt;br /&gt;
	language_anchor = require(anchors_module).language_anchor&lt;br /&gt;
	return language_anchor(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function load_data(...)&lt;br /&gt;
	load_data = require(load_module).load_data&lt;br /&gt;
	return load_data(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function request_script(...)&lt;br /&gt;
	request_script = require(script_utilities_module).request_script&lt;br /&gt;
	return request_script(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function shallow_copy(...)&lt;br /&gt;
	shallow_copy = require(table_module).shallowCopy&lt;br /&gt;
	return shallow_copy(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split(...)&lt;br /&gt;
	split = require(string_utilities_module).split&lt;br /&gt;
	return split(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tag_text(...)&lt;br /&gt;
	tag_text = require(script_utilities_module).tag_text&lt;br /&gt;
	return tag_text(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tag_translit(...)&lt;br /&gt;
	tag_translit = require(script_utilities_module).tag_translit&lt;br /&gt;
	return tag_translit(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim(...)&lt;br /&gt;
	trim = require(string_utilities_module).trim&lt;br /&gt;
	return trim(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function u(...)&lt;br /&gt;
	u = require(string_utilities_module).char&lt;br /&gt;
	return u(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ulower(...)&lt;br /&gt;
	ulower = require(string_utilities_module).lower&lt;br /&gt;
	return ulower(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function umatch(...)&lt;br /&gt;
	umatch = require(string_utilities_module).match&lt;br /&gt;
	return umatch(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local m_headword_data&lt;br /&gt;
local function get_headword_data()&lt;br /&gt;
	m_headword_data = load_data(&amp;quot;Module:headword/data&amp;quot;)&lt;br /&gt;
	return m_headword_data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function selective_trim(...)&lt;br /&gt;
	-- Unconditionally trimmed charset.&lt;br /&gt;
	local always_trim =&lt;br /&gt;
		&amp;quot;\194\128-\194\159&amp;quot; ..   -- U+0080-009F (C1 control characters)&lt;br /&gt;
		&amp;quot;\194\173&amp;quot; ..            -- U+00AD (soft hyphen)&lt;br /&gt;
		&amp;quot;\226\128\170-\226\128\174&amp;quot; .. -- U+202A-202E (directionality formatting characters)&lt;br /&gt;
		&amp;quot;\226\129\166-\226\129\169&amp;quot; -- U+2066-2069 (directionality formatting characters)&lt;br /&gt;
&lt;br /&gt;
	-- Standard trimmed charset.&lt;br /&gt;
	local standard_trim = &amp;quot;%s&amp;quot; .. -- (default whitespace charset)&lt;br /&gt;
		&amp;quot;\226\128\139-\226\128\141&amp;quot; .. -- U+200B-200D (zero-width spaces)&lt;br /&gt;
		always_trim&lt;br /&gt;
&lt;br /&gt;
	-- If there are non-whitespace characters, trim all characters in `standard_trim`.&lt;br /&gt;
	-- Otherwise, only trim the characters in `always_trim`.&lt;br /&gt;
	selective_trim = function(text)&lt;br /&gt;
		if text == &amp;quot;&amp;quot; then&lt;br /&gt;
			return text&lt;br /&gt;
		end&lt;br /&gt;
		local trimmed = trim(text, standard_trim)&lt;br /&gt;
		if trimmed ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			return trimmed&lt;br /&gt;
		end&lt;br /&gt;
		return trim(text, always_trim)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return selective_trim(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function escape(text, str)&lt;br /&gt;
	local rep&lt;br /&gt;
	repeat&lt;br /&gt;
		text, rep = text:gsub(&amp;quot;\\\\(\\*&amp;quot; .. str .. &amp;quot;)&amp;quot;, &amp;quot;\5%1&amp;quot;)&lt;br /&gt;
	until rep == 0&lt;br /&gt;
	return (text:gsub(&amp;quot;\\&amp;quot; .. str, &amp;quot;\6&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function unescape(text, str)&lt;br /&gt;
	return (text&lt;br /&gt;
		:gsub(&amp;quot;\5&amp;quot;, &amp;quot;\\&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;\6&amp;quot;, str))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Remove bold, italics, soft hyphens, strip markers and HTML tags.&lt;br /&gt;
local function remove_formatting(str)&lt;br /&gt;
	str = str&lt;br /&gt;
		:gsub(&amp;quot;(&#039;*)&#039;&#039;&#039;(.-&#039;*)&#039;&#039;&#039;&amp;quot;, &amp;quot;%1%2&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;(&#039;*)&#039;&#039;(.-&#039;*)&#039;&#039;&amp;quot;, &amp;quot;%1%2&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;­&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	return (unstrip(str)&lt;br /&gt;
		:gsub(&amp;quot;&amp;lt;[^&amp;lt;&amp;gt;]+&amp;gt;&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Takes an input and splits on a double slash (taking account of escaping backslashes).]==]&lt;br /&gt;
function export.split_on_slashes(text)&lt;br /&gt;
	text = split(escape(text, &amp;quot;//&amp;quot;), &amp;quot;//&amp;quot;, true) or {}&lt;br /&gt;
	for i, v in ipairs(text) do&lt;br /&gt;
		text[i] = unescape(v, &amp;quot;//&amp;quot;)&lt;br /&gt;
		if v == &amp;quot;&amp;quot; then&lt;br /&gt;
			text[i] = false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Takes a wikilink and outputs the link target and display text. By default, the link target will be returned as a title object, but if `allow_bad_target` is set it will be returned as a string, and no check will be performed as to whether it is a valid link target.]==]&lt;br /&gt;
function export.get_wikilink_parts(text, allow_bad_target)&lt;br /&gt;
	-- TODO: replace `allow_bad_target` with `allow_unsupported`, with support for links to unsupported titles, including escape sequences.&lt;br /&gt;
	if (                        -- Filters out anything but &amp;quot;[[...]]&amp;quot; with no intermediate &amp;quot;[[&amp;quot; or &amp;quot;]]&amp;quot;.&lt;br /&gt;
			not match(text, &amp;quot;^()%[%[&amp;quot;) or -- Faster than sub(text, 1, 2) ~= &amp;quot;[[&amp;quot;.&lt;br /&gt;
			find(text, &amp;quot;[[&amp;quot;, 3, true) or&lt;br /&gt;
			find(text, &amp;quot;]]&amp;quot;, 3, true) ~= #text - 1&lt;br /&gt;
		) then&lt;br /&gt;
		return nil, nil&lt;br /&gt;
	end&lt;br /&gt;
	local pipe, title, display = find(text, &amp;quot;|&amp;quot;, 3, true)&lt;br /&gt;
	if pipe then&lt;br /&gt;
		title, display = sub(text, 3, pipe - 1), sub(text, pipe + 1, -3)&lt;br /&gt;
	else&lt;br /&gt;
		title = sub(text, 3, -3)&lt;br /&gt;
		display = title&lt;br /&gt;
	end&lt;br /&gt;
	if allow_bad_target then&lt;br /&gt;
		return title, display&lt;br /&gt;
	end&lt;br /&gt;
	title = new_title(title)&lt;br /&gt;
	-- No title object means the target is invalid.&lt;br /&gt;
	if title == nil then&lt;br /&gt;
		return nil, nil&lt;br /&gt;
		-- If the link target starts with &amp;quot;#&amp;quot; then mw.title.new returns a broken&lt;br /&gt;
		-- title object, so grab the current title and give it the correct fragment.&lt;br /&gt;
	elseif title.prefixedText == &amp;quot;&amp;quot; then&lt;br /&gt;
		local fragment = title.fragment&lt;br /&gt;
		if fragment == &amp;quot;&amp;quot; then -- [[#]] isn&#039;t valid&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
		title = get_current_title()&lt;br /&gt;
		title.fragment = fragment&lt;br /&gt;
	end&lt;br /&gt;
	return title, display&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Does the work of export.get_fragment, but can be called directly to avoid unnecessary checks for embedded links.&lt;br /&gt;
local function get_fragment(text)&lt;br /&gt;
	text = escape(text, &amp;quot;#&amp;quot;)&lt;br /&gt;
	-- Replace numeric character references with the corresponding character (&amp;amp;#39; → &#039;),&lt;br /&gt;
	-- as they contain #, which causes the numeric character reference to be&lt;br /&gt;
	-- misparsed (wa&#039;a → wa&amp;amp;#39;a → pagename wa&amp;amp;, fragment 39;a).&lt;br /&gt;
	text = decode_entities(text)&lt;br /&gt;
	local target, fragment = text:match(&amp;quot;^(.-)#(.+)$&amp;quot;)&lt;br /&gt;
	target = target or text&lt;br /&gt;
	target = unescape(target, &amp;quot;#&amp;quot;)&lt;br /&gt;
	fragment = fragment and unescape(fragment, &amp;quot;#&amp;quot;)&lt;br /&gt;
	return target, fragment&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Takes a link target and outputs the actual target and the fragment (if any).]==]&lt;br /&gt;
function export.get_fragment(text)&lt;br /&gt;
	-- If there are no embedded links, process input.&lt;br /&gt;
	local open = find(text, &amp;quot;[[&amp;quot;, nil, true)&lt;br /&gt;
	if not open then&lt;br /&gt;
		return get_fragment(text)&lt;br /&gt;
	end&lt;br /&gt;
	local close = find(text, &amp;quot;]]&amp;quot;, open + 2, true)&lt;br /&gt;
	if not close then&lt;br /&gt;
		return get_fragment(text)&lt;br /&gt;
		-- If there is one, but it&#039;s redundant (i.e. encloses everything with no pipe), remove and process.&lt;br /&gt;
	elseif open == 1 and close == #text - 1 and not find(text, &amp;quot;|&amp;quot;, 3, true) then&lt;br /&gt;
		return get_fragment(sub(text, 3, -3))&lt;br /&gt;
	end&lt;br /&gt;
	-- Otherwise, return the input.&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Given a link target as passed to `full_link()`, get the actual page that the target refers to. This removes&lt;br /&gt;
bold, italics, strip markets and HTML; calls `makeEntryName()` for the language in question; converts targets&lt;br /&gt;
beginning with `*` to the Reconstruction namespace; and converts appendix-constructed languages to the Appendix&lt;br /&gt;
namespace. Returns up to three values:&lt;br /&gt;
# the actual page to link to, or {nil} to not link to anything;&lt;br /&gt;
# how the target should be displayed as, if the user didn&#039;t explicitly specify any display text; generally the&lt;br /&gt;
  same as the original target, but minus any anti-asterisk !!;&lt;br /&gt;
# the value `true` if the target had a backslash-escaped * in it (FIXME: explain this more clearly).&lt;br /&gt;
]==]&lt;br /&gt;
function export.get_link_page_with_auto_display(target, lang, sc, plain)&lt;br /&gt;
	local orig_target = target&lt;br /&gt;
&lt;br /&gt;
	if not target then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	target = remove_formatting(target)&lt;br /&gt;
&lt;br /&gt;
	if target:sub(1, 1) == &amp;quot;:&amp;quot; then&lt;br /&gt;
		-- FIXME, the auto_display (second return value) should probably remove the colon&lt;br /&gt;
		return target:sub(2), orig_target&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix = target:match(&amp;quot;^(.-):&amp;quot;)&lt;br /&gt;
	-- Convert any escaped colons&lt;br /&gt;
	target = target:gsub(&amp;quot;\\:&amp;quot;, &amp;quot;:&amp;quot;)&lt;br /&gt;
	if prefix then&lt;br /&gt;
		-- If this is an a link to another namespace or an interwiki link, ensure there&#039;s an initial colon and then&lt;br /&gt;
		-- return what we have (so that it works as a conventional link, and doesn&#039;t do anything weird like add the term&lt;br /&gt;
		-- to a category.)&lt;br /&gt;
		prefix = ulower(trim(prefix))&lt;br /&gt;
		if prefix ~= &amp;quot;&amp;quot; and (&lt;br /&gt;
				load_data(&amp;quot;Module:data/namespaces&amp;quot;)[prefix] or&lt;br /&gt;
				load_data(&amp;quot;Module:data/interwikis&amp;quot;)[prefix]&lt;br /&gt;
			) then&lt;br /&gt;
			return target, orig_target&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check if the term is reconstructed and remove any asterisk. Also check for anti-asterisk (!!).&lt;br /&gt;
	-- Otherwise, handle the escapes.&lt;br /&gt;
	local reconstructed, escaped, anti_asterisk&lt;br /&gt;
	if not plain then&lt;br /&gt;
		target, reconstructed = target:gsub(&amp;quot;^%*(.)&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
		if reconstructed == 0 then&lt;br /&gt;
			target, anti_asterisk = target:gsub(&amp;quot;^!!(.)&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
			if anti_asterisk == 1 then&lt;br /&gt;
				-- Remove !! from original. FIXME! We do it this way because the call to remove_formatting() above&lt;br /&gt;
				-- may cause non-initial !! to be interpreted as anti-asterisks. We should surely move the&lt;br /&gt;
				-- remove_formatting() call later.&lt;br /&gt;
				orig_target = orig_target:gsub(&amp;quot;^!!&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	target, escaped = target:gsub(&amp;quot;^(\\-)\\%*&amp;quot;, &amp;quot;%1*&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if reconstructed == 0 and lang:hasType(&amp;quot;reconstructed&amp;quot;) and not lang:hasType(&amp;quot;conlang&amp;quot;) then&lt;br /&gt;
		orig_target = &amp;quot;*&amp;quot; .. target&lt;br /&gt;
		reconstructed = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not (sc and sc:getCode() ~= &amp;quot;None&amp;quot;) then&lt;br /&gt;
		sc = lang:findBestScript(target)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove carets if they are used to capitalize parts of transliterations (unless they have been escaped).&lt;br /&gt;
	if (not sc:hasCapitalization()) and sc:isTransliterated() and target:match(&amp;quot;%^&amp;quot;) then&lt;br /&gt;
		target = escape(target, &amp;quot;^&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;%^&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		target = unescape(target, &amp;quot;^&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the entry name for the language.&lt;br /&gt;
	target = lang:makeEntryName(target, sc, reconstructed == 1 or lang:hasType(&amp;quot;appendix-constructed&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
	-- If the link contains unexpanded template parameters, then don&#039;t create a link.&lt;br /&gt;
	if target:match(&amp;quot;{{{.-}}}&amp;quot;) then&lt;br /&gt;
		-- FIXME: Should we return the original target as the default display value (second return value)?&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Link to appendix for reconstructed terms and terms in appendix-only languages. Plain links interpret *&lt;br /&gt;
	-- literally, however.&lt;br /&gt;
	if not lang:hasType(&amp;quot;conlang&amp;quot;) then&lt;br /&gt;
		if lang:hasType(&amp;quot;appendix-constructed&amp;quot;) then&lt;br /&gt;
			target = &amp;quot;wikt:Appendix:&amp;quot; .. lang:getFullName() .. &amp;quot;/&amp;quot; .. target&lt;br /&gt;
		elseif reconstructed == 1 then -- asterisk found&lt;br /&gt;
			if lang:getFullCode() == &amp;quot;und&amp;quot; then&lt;br /&gt;
				-- Return the original target as default display value. If we don&#039;t do this, we wrongly get&lt;br /&gt;
				-- [Term?] displayed instead.&lt;br /&gt;
				return nil, orig_target&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			target = &amp;quot;wikt:Reconstruction:&amp;quot; .. lang:getFullName() .. &amp;quot;/&amp;quot; .. target&lt;br /&gt;
		elseif anti_asterisk ~= 1 and (lang:hasType(&amp;quot;reconstructed&amp;quot;) or lang:getFamilyCode() == &amp;quot;qfa-sub&amp;quot;) then&lt;br /&gt;
			--error(&amp;quot;The specified language &amp;quot; .. lang:getCanonicalName()&lt;br /&gt;
			--.. &amp;quot; is unattested, while the given term does not begin with &#039;*&#039; to indicate that it is reconstructed.&amp;quot;)&lt;br /&gt;
			orig_target = &amp;quot;*&amp;quot; .. target&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	target = (lang:hasType(&amp;quot;conlang&amp;quot;) and &amp;quot;Contionary:&amp;quot; or &amp;quot;wikt:&amp;quot;) .. target&lt;br /&gt;
&lt;br /&gt;
	return target, orig_target, escaped &amp;gt; 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.get_link_page(target, lang, sc, plain)&lt;br /&gt;
	local target, auto_display, escaped = export.get_link_page_with_auto_display(target, lang, sc, plain)&lt;br /&gt;
	return target, escaped&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Make a link from a given link&#039;s parts&lt;br /&gt;
local function make_link(link, lang, sc, id, isolated, cats, no_alt_ast, plain)&lt;br /&gt;
	-- Convert percent encoding to plaintext.&lt;br /&gt;
	link.target = link.target and decode_uri(link.target, &amp;quot;PATH&amp;quot;)&lt;br /&gt;
	link.fragment = link.fragment and decode_uri(link.fragment, &amp;quot;PATH&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Find fragments (if one isn&#039;t already set).&lt;br /&gt;
	-- Prevents {{l|en|word#Etymology 2|word}} from linking to [[word#Etymology 2#English]].&lt;br /&gt;
	-- # can be escaped as \#.&lt;br /&gt;
	if link.target and link.fragment == nil then&lt;br /&gt;
		link.target, link.fragment = get_fragment(link.target)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Process the target&lt;br /&gt;
	local auto_display, escaped&lt;br /&gt;
	link.target, auto_display, escaped = export.get_link_page_with_auto_display(link.target, lang, sc, plain)&lt;br /&gt;
&lt;br /&gt;
	-- Create a default display form.&lt;br /&gt;
	-- If the target is &amp;quot;&amp;quot; then it&#039;s a link like [[#English]], which refers to the current page.&lt;br /&gt;
	if auto_display == &amp;quot;&amp;quot; then&lt;br /&gt;
		auto_display = (m_headword_data or get_headword_data()).pagename&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If the display is the target and the reconstruction * has been escaped, remove the escaping backslash.&lt;br /&gt;
	if escaped then&lt;br /&gt;
		auto_display = auto_display:gsub(&amp;quot;\\([^\\]*%*)&amp;quot;, &amp;quot;%1&amp;quot;, 1)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Process the display form.&lt;br /&gt;
	if link.display then&lt;br /&gt;
		local orig_display = link.display&lt;br /&gt;
		link.display = lang:makeDisplayText(link.display, sc, true)&lt;br /&gt;
		if cats then&lt;br /&gt;
			auto_display = lang:makeDisplayText(auto_display, sc)&lt;br /&gt;
			-- If the alt text is the same as what would have been automatically generated, then the alt parameter is redundant (e.g. {{l|en|foo|foo}}, {{l|en|w:foo|foo}}, but not {{l|en|w:foo|w:foo}}).&lt;br /&gt;
			-- If they&#039;re different, but the alt text could have been entered as the term parameter without it affecting the target page, then the target parameter is redundant (e.g. {{l|ru|фу|фу́}}).&lt;br /&gt;
			-- If `no_alt_ast` is true, use pcall to catch the error which will be thrown if this is a reconstructed lang and the alt text doesn&#039;t have *.&lt;br /&gt;
			if link.display == auto_display then&lt;br /&gt;
				insert(cats, lang:getFullName() .. &amp;quot; links with redundant alt parameters&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				local ok, check&lt;br /&gt;
				if no_alt_ast then&lt;br /&gt;
					ok, check = pcall(export.get_link_page, orig_display, lang, sc, plain)&lt;br /&gt;
				else&lt;br /&gt;
					ok = true&lt;br /&gt;
					check = export.get_link_page(orig_display, lang, sc, plain)&lt;br /&gt;
				end&lt;br /&gt;
				if ok and link.target == check then&lt;br /&gt;
					insert(cats, lang:getFullName() .. &amp;quot; links with redundant target parameters&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		link.display = lang:makeDisplayText(auto_display, sc)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not link.target then&lt;br /&gt;
		return link.display&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If the target is the same as the current page, there is no sense id&lt;br /&gt;
	-- and either the language code is &amp;quot;und&amp;quot; or the current L2 is the current&lt;br /&gt;
	-- language then return a &amp;quot;self-link&amp;quot; like the software does.&lt;br /&gt;
	if link.target == get_current_title().prefixedText then&lt;br /&gt;
		local fragment, current_L2 = link.fragment, get_current_L2()&lt;br /&gt;
		if (&lt;br /&gt;
				fragment and fragment == current_L2 or&lt;br /&gt;
				not (id or fragment) and (lang:getFullCode() == &amp;quot;und&amp;quot; or lang:getFullName() == current_L2)&lt;br /&gt;
			) then&lt;br /&gt;
			return tostring(mw.html.create(&amp;quot;strong&amp;quot;)&lt;br /&gt;
				:addClass(&amp;quot;selflink&amp;quot;)&lt;br /&gt;
				:wikitext(link.display))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add fragment. Do not add a section link to &amp;quot;Undetermined&amp;quot;, as such sections do not exist and are invalid.&lt;br /&gt;
	-- TabbedLanguages handles links without a section by linking to the &amp;quot;last visited&amp;quot; section, but adding&lt;br /&gt;
	-- &amp;quot;Undetermined&amp;quot; would break that feature. For localized prefixes that make syntax error, please use the&lt;br /&gt;
	-- format: [&amp;quot;xyz&amp;quot;] = true.&lt;br /&gt;
	local prefix = link.target:match(&amp;quot;^:*([^:]+):&amp;quot;)&lt;br /&gt;
	prefix = prefix and ulower(prefix)&lt;br /&gt;
&lt;br /&gt;
	if prefix ~= &amp;quot;category&amp;quot; and not (prefix and load_data(&amp;quot;Module:data/interwikis&amp;quot;)[prefix]) then&lt;br /&gt;
		if (link.fragment or link.target:sub(-1) == &amp;quot;#&amp;quot;) and not plain then&lt;br /&gt;
			if cats then&lt;br /&gt;
				insert(cats, lang:getFullName() .. &amp;quot; links with manual fragments&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if not link.fragment then&lt;br /&gt;
			if id then&lt;br /&gt;
				link.fragment = lang:getFullCode() == &amp;quot;und&amp;quot; and anchor_encode(id) or language_anchor(lang, id)&lt;br /&gt;
			elseif lang:getFullCode() ~= &amp;quot;und&amp;quot; and not (link.target:match(&amp;quot;^Appendix:&amp;quot;) or link.target:match(&amp;quot;^Reconstruction:&amp;quot;)) then&lt;br /&gt;
				link.fragment = anchor_encode(lang:getFullName())&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Put inward-facing square brackets around a link to isolated spacing character(s).&lt;br /&gt;
	if isolated and #link.display &amp;gt; 0 and not umatch(decode_entities(link.display), &amp;quot;%S&amp;quot;) then&lt;br /&gt;
		link.display = &amp;quot;&amp;amp;#x5D;&amp;quot; .. link.display .. &amp;quot;&amp;amp;#x5B;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	link.target = link.target:gsub(&amp;quot;^(:?)(.*)&amp;quot;, function(m1, m2)&lt;br /&gt;
		return m1 .. encode_entities(m2, &amp;quot;#%&amp;amp;+/:&amp;lt;=&amp;gt;@[\\]_{|}&amp;quot;)&lt;br /&gt;
	end)&lt;br /&gt;
&lt;br /&gt;
	link.fragment = link.fragment and encode_entities(remove_formatting(link.fragment), &amp;quot;#%&amp;amp;+/:&amp;lt;=&amp;gt;@[\\]_{|}&amp;quot;)&lt;br /&gt;
	return &amp;quot;[[&amp;quot; ..&lt;br /&gt;
	link.target:gsub(&amp;quot;^[^:]&amp;quot;, &amp;quot;:%0&amp;quot;) .. (link.fragment and &amp;quot;#&amp;quot; .. link.fragment or &amp;quot;&amp;quot;) .. &amp;quot;|&amp;quot; .. link.display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Split a link into its parts&lt;br /&gt;
local function parse_link(linktext)&lt;br /&gt;
	local link = { target = linktext }&lt;br /&gt;
&lt;br /&gt;
	local target = link.target&lt;br /&gt;
	link.target, link.display = target:match(&amp;quot;^(..-)|(.+)$&amp;quot;)&lt;br /&gt;
	if not link.target then&lt;br /&gt;
		link.target = target&lt;br /&gt;
		link.display = target&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- There&#039;s no point in processing these, as they aren&#039;t real links.&lt;br /&gt;
	local target_lower = link.target:lower()&lt;br /&gt;
	for _, false_positive in ipairs({ &amp;quot;category&amp;quot;, &amp;quot;cat&amp;quot;, &amp;quot;file&amp;quot;, &amp;quot;image&amp;quot; }) do&lt;br /&gt;
		if target_lower:match(&amp;quot;^&amp;quot; .. false_positive .. &amp;quot;:&amp;quot;) then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	link.display = decode_entities(link.display)&lt;br /&gt;
	link.target, link.fragment = get_fragment(link.target)&lt;br /&gt;
&lt;br /&gt;
	-- So that make_link does not look for a fragment again.&lt;br /&gt;
	if not link.fragment then&lt;br /&gt;
		link.fragment = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return link&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function check_params_ignored_when_embedded(alt, lang, id, cats)&lt;br /&gt;
	if alt then&lt;br /&gt;
		if cats then&lt;br /&gt;
			insert(cats, lang:getFullName() .. &amp;quot; links with ignored alt parameters&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if id then&lt;br /&gt;
		if cats then&lt;br /&gt;
			insert(cats, lang:getFullName() .. &amp;quot; links with ignored id parameters&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Find embedded links and ensure they link to the correct section.&lt;br /&gt;
local function process_embedded_links(text, alt, lang, sc, id, cats, no_alt_ast, plain)&lt;br /&gt;
	-- Process the non-linked text.&lt;br /&gt;
	text = lang:makeDisplayText(text, sc, true)&lt;br /&gt;
&lt;br /&gt;
	-- If the text begins with * and another character, then act as if each link begins with *. However, don&#039;t do this if the * is contained within a link at the start. E.g. `|*[[foo]]` would set all_reconstructed to true, while `|[[*foo]]` would not.&lt;br /&gt;
	local all_reconstructed = false&lt;br /&gt;
	if not plain then&lt;br /&gt;
		-- anchor_encode removes links etc.&lt;br /&gt;
		if anchor_encode(text):sub(1, 1) == &amp;quot;*&amp;quot; then&lt;br /&gt;
			all_reconstructed = true&lt;br /&gt;
		end&lt;br /&gt;
		-- Otherwise, handle any escapes.&lt;br /&gt;
		text = text:gsub(&amp;quot;^(\\-)\\%*&amp;quot;, &amp;quot;%1*&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	check_params_ignored_when_embedded(alt, lang, id, cats)&lt;br /&gt;
&lt;br /&gt;
	local function process_link(space1, linktext, space2)&lt;br /&gt;
		local capture = &amp;quot;[[&amp;quot; .. linktext .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		local link = parse_link(linktext)&lt;br /&gt;
&lt;br /&gt;
		-- Return unprocessed false positives untouched (e.g. categories).&lt;br /&gt;
		if not link then&lt;br /&gt;
			return capture&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if all_reconstructed then&lt;br /&gt;
			if link.target:find(&amp;quot;^!!&amp;quot;) then&lt;br /&gt;
				-- Check for anti-asterisk !! at the beginning of a target, indicating that a reconstructed term&lt;br /&gt;
				-- wants a part of the term to link to a non-reconstructed term, e.g. Old English&lt;br /&gt;
				-- {{ang-noun|m|head=*[[!!Crist|Cristes]] [[!!mæsseǣfen]]}}.&lt;br /&gt;
				link.target = link.target:sub(3)&lt;br /&gt;
				-- Also remove !! from the display, which may have been copied from the target (as in mæsseǣfen in&lt;br /&gt;
				-- the example above).&lt;br /&gt;
				link.display = link.display:gsub(&amp;quot;^!!&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			elseif not link.target:match(&amp;quot;^%*&amp;quot;) then&lt;br /&gt;
				link.target = &amp;quot;*&amp;quot; .. link.target&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		linktext = make_link(link, lang, sc, id, false, nil, no_alt_ast, plain)&lt;br /&gt;
			:gsub(&amp;quot;^%[%[&amp;quot;, &amp;quot;\3&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;%]%]$&amp;quot;, &amp;quot;\4&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		return space1 .. linktext .. space2&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Use chars 1 and 2 as temporary substitutions, so that we can use charsets. These are converted to chars 3 and 4 by process_link, which means we can convert any remaining chars 1 and 2 back to square brackets (i.e. those not part of a link).&lt;br /&gt;
	text = text&lt;br /&gt;
		:gsub(&amp;quot;%[%[&amp;quot;, &amp;quot;\1&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;%]%]&amp;quot;, &amp;quot;\2&amp;quot;)&lt;br /&gt;
	-- If the script uses ^ to capitalize transliterations, make sure that any carets preceding links are on the inside, so that they get processed with the following text.&lt;br /&gt;
	if (&lt;br /&gt;
			text:find(&amp;quot;^&amp;quot;, nil, true) and&lt;br /&gt;
			not sc:hasCapitalization() and&lt;br /&gt;
			sc:isTransliterated()&lt;br /&gt;
		) then&lt;br /&gt;
		text = escape(text, &amp;quot;^&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;%^\1&amp;quot;, &amp;quot;\1%^&amp;quot;)&lt;br /&gt;
		text = unescape(text, &amp;quot;^&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	text = text:gsub(&amp;quot;\1(%s*)([^\1\2]-)(%s*)\2&amp;quot;, process_link)&lt;br /&gt;
&lt;br /&gt;
	-- Remove the extra * at the beginning of a language link if it&#039;s immediately followed by a link whose display begins with * too.&lt;br /&gt;
	if all_reconstructed then&lt;br /&gt;
		text = text:gsub(&amp;quot;^%*\3([^|\1-\4]+)|%*&amp;quot;, &amp;quot;\3%1|*&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return (text&lt;br /&gt;
		:gsub(&amp;quot;[\1\3]&amp;quot;, &amp;quot;[[&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;[\2\4]&amp;quot;, &amp;quot;]]&amp;quot;)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function simple_link(term, fragment, alt, lang, sc, id, cats, no_alt_ast, srwc)&lt;br /&gt;
	local plain&lt;br /&gt;
	if lang == nil then&lt;br /&gt;
		lang, plain = get_lang(&amp;quot;und&amp;quot;), true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the link target and display text. If the term is the empty string, treat the input as a link to the current page.&lt;br /&gt;
	if term == &amp;quot;&amp;quot; then&lt;br /&gt;
		term = get_current_title().prefixedText&lt;br /&gt;
	elseif term then&lt;br /&gt;
		local new_term, new_alt = export.get_wikilink_parts(term, true)&lt;br /&gt;
		if new_term then&lt;br /&gt;
			check_params_ignored_when_embedded(alt, lang, id, cats)&lt;br /&gt;
			-- [[|foo]] links are treated as plaintext &amp;quot;[[|foo]]&amp;quot;.&lt;br /&gt;
			-- FIXME: Pipes should be handled via a proper escape sequence, as they can occur in unsupported titles.&lt;br /&gt;
			if new_term == &amp;quot;&amp;quot; then&lt;br /&gt;
				term, alt = nil, term&lt;br /&gt;
			else&lt;br /&gt;
				local title = new_title(new_term)&lt;br /&gt;
				if title then&lt;br /&gt;
					local ns = title.namespace&lt;br /&gt;
					-- File: and Category: links should be returned as-is.&lt;br /&gt;
					if ns == 6 or ns == 14 then&lt;br /&gt;
						return term&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				term, alt = new_term, new_alt&lt;br /&gt;
				if cats then&lt;br /&gt;
					if not (srwc and srwc(term, alt)) then&lt;br /&gt;
						insert(cats, lang:getFullName() .. &amp;quot; links with redundant wikilinks&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if alt then&lt;br /&gt;
		alt = selective_trim(alt)&lt;br /&gt;
		if alt == &amp;quot;&amp;quot; then&lt;br /&gt;
			alt = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- If there&#039;s nothing to process, return nil.&lt;br /&gt;
	if not (term or alt) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If there is no script, get one.&lt;br /&gt;
	if not sc then&lt;br /&gt;
		sc = lang:findBestScript(alt or term)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Embedded wikilinks need to be processed individually.&lt;br /&gt;
	if term then&lt;br /&gt;
		local open = find(term, &amp;quot;[[&amp;quot;, nil, true)&lt;br /&gt;
		if open and find(term, &amp;quot;]]&amp;quot;, open + 2, true) then&lt;br /&gt;
			return process_embedded_links(term, alt, lang, sc, id, cats, no_alt_ast, plain)&lt;br /&gt;
		end&lt;br /&gt;
		term = selective_trim(term)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If not, make a link using the parameters.&lt;br /&gt;
	return make_link({&lt;br /&gt;
		target = term,&lt;br /&gt;
		display = alt,&lt;br /&gt;
		fragment = fragment&lt;br /&gt;
	}, lang, sc, id, true, cats, no_alt_ast, plain)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Creates a basic link to the given term. It links to the language section (such as &amp;lt;code&amp;gt;==English==&amp;lt;/code&amp;gt;), but it does not add language and script wrappers, so any code that uses this function should call the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;[[Module:script utilities#tag_text|tag_text]]&amp;lt;/code&amp;gt; from [[Module:script utilities]] to add such wrappers itself at some point.&lt;br /&gt;
The first argument, &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;data&amp;lt;/code&amp;gt;, may contain the following items, a subset of the items used in the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;data&amp;lt;/code&amp;gt; argument of &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;full_link&amp;lt;/code&amp;gt;. If any other items are included, they are ignored.&lt;br /&gt;
{ {&lt;br /&gt;
	term = entry_to_link_to,&lt;br /&gt;
	alt = link_text_or_displayed_text,&lt;br /&gt;
	lang = language_object,&lt;br /&gt;
	id = sense_id,&lt;br /&gt;
} }&lt;br /&gt;
; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;term&amp;lt;/code&amp;gt;&lt;br /&gt;
: Text to turn into a link. This is generally the name of a page. The text can contain wikilinks already embedded in it. These are processed individually just like a single link would be. The &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;alt&amp;lt;/code&amp;gt; argument is ignored in this case.&lt;br /&gt;
; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;alt&amp;lt;/code&amp;gt; (&#039;&#039;optional&#039;&#039;)&lt;br /&gt;
: The alternative display for the link, if different from the linked page. If this is {{code|lua|nil}}, the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;text&amp;lt;/code&amp;gt; argument is used instead (much like regular wikilinks). If &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;text&amp;lt;/code&amp;gt; contains wikilinks in it, this argument is ignored and has no effect. (Links in which the alt is ignored are tracked with the tracking template {{whatlinkshere|tracking=links/alt-ignored}}.)&lt;br /&gt;
; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;lang&amp;lt;/code&amp;gt;&lt;br /&gt;
: The [[Module:languages#Language objects|language object]] for the term being linked. If this argument is defined, the function will determine the language&#039;s canonical name (see [[Template:language data documentation]]), and point the link or links in the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;term&amp;lt;/code&amp;gt; to the language&#039;s section of an entry, or to a language-specific senseid if the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; argument is defined.&lt;br /&gt;
; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; (&#039;&#039;optional&#039;&#039;)&lt;br /&gt;
: Sense id string. If this argument is defined, the link will point to a language-specific sense id ({{ll|en|identifier|id=HTML}}) created by the template {{temp|senseid}}. A sense id consists of the language&#039;s canonical name, a hyphen (&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;), and the string that was supplied as the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;id&amp;lt;/code&amp;gt; argument. This is useful when a term has more than one sense in a language. If the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;term&amp;lt;/code&amp;gt; argument contains wikilinks, this argument is ignored. (Links in which the sense id is ignored are tracked with the tracking template {{whatlinkshere|tracking=links/id-ignored}}.)&lt;br /&gt;
The second argument is as follows:&lt;br /&gt;
; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;allow_self_link&amp;lt;/code&amp;gt;&lt;br /&gt;
: If {{code|lua|true}}, the function will also generate links to the current page. The default ({{code|lua|false}}) will not generate a link but generate a bolded &amp;quot;self link&amp;quot; instead.&lt;br /&gt;
The following special options are processed for each link (both simple text and with embedded wikilinks):&lt;br /&gt;
* The target page name will be processed to generate the correct entry name. This is done by the [[Module:languages#makeEntryName|makeEntryName]] function in [[Module:languages]], using the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;entry_name&amp;lt;/code&amp;gt; replacements in the language&#039;s data file (see [[Template:language data documentation]] for more information). This function is generally used to automatically strip dictionary-only diacritics that are not part of the normal written form of a language.&lt;br /&gt;
* If the text starts with &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;*&amp;lt;/code&amp;gt;, then the term is considered a reconstructed term, and a link to the Reconstruction: namespace will be created. If the text contains embedded wikilinks, then &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;*&amp;lt;/code&amp;gt; is automatically applied to each one individually, while preserving the displayed form of each link as it was given. This allows linking to phrases containing multiple reconstructed terms, while only showing the * once at the beginning.&lt;br /&gt;
* If the text starts with &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;:&amp;lt;/code&amp;gt;, then the link is treated as &amp;quot;raw&amp;quot; and the above steps are skipped. This can be used in rare cases where the page name begins with &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;*&amp;lt;/code&amp;gt; or if diacritics should not be stripped. For example:&lt;br /&gt;
** {{temp|l|en|*nix}} links to the nonexistent page [[Reconstruction:English/nix]] (&amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;*&amp;lt;/code&amp;gt; is interpreted as a reconstruction), but {{temp|l|en|:*nix}} links to [[*nix]].&lt;br /&gt;
** {{temp|l|sl|Franche-Comté}} links to the nonexistent page [[Franche-Comte]] (&amp;lt;code&amp;gt;é&amp;lt;/code&amp;gt; is converted to &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; by &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;makeEntryName&amp;lt;/code&amp;gt;), but {{temp|l|sl|:Franche-Comté}} links to [[Franche-Comté]].]==]&lt;br /&gt;
function export.language_link(data)&lt;br /&gt;
	if type(data) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		error(&lt;br /&gt;
		&amp;quot;The first argument to the function language_link must be a table. See Module:links/documentation for more information.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Categorize links to &amp;quot;und&amp;quot;.&lt;br /&gt;
	local lang, cats = data.lang, data.cats&lt;br /&gt;
	if cats and lang:getCode() == &amp;quot;und&amp;quot; then&lt;br /&gt;
		insert(cats, &amp;quot;Undetermined language links&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return simple_link(&lt;br /&gt;
		data.term,&lt;br /&gt;
		data.fragment,&lt;br /&gt;
		data.alt,&lt;br /&gt;
		lang,&lt;br /&gt;
		data.sc,&lt;br /&gt;
		data.id,&lt;br /&gt;
		cats,&lt;br /&gt;
		data.no_alt_ast,&lt;br /&gt;
		data.suppress_redundant_wikilink_cat&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.plain_link(data)&lt;br /&gt;
	if type(data) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		error(&lt;br /&gt;
		&amp;quot;The first argument to the function plain_link must be a table. See Module:links/documentation for more information.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return simple_link(&lt;br /&gt;
		data.term,&lt;br /&gt;
		data.fragment,&lt;br /&gt;
		data.alt,&lt;br /&gt;
		nil,&lt;br /&gt;
		data.sc,&lt;br /&gt;
		data.id,&lt;br /&gt;
		data.cats,&lt;br /&gt;
		data.no_alt_ast,&lt;br /&gt;
		data.suppress_redundant_wikilink_cat&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Replace any links with links to the correct section, but don&#039;t link the whole text if no embedded links are found. Returns the display text form.]==]&lt;br /&gt;
function export.embedded_language_links(data)&lt;br /&gt;
	if type(data) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		error(&lt;br /&gt;
		&amp;quot;The first argument to the function embedded_language_links must be a table. See Module:links/documentation for more information.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local term, lang, sc = data.term, data.lang, data.sc&lt;br /&gt;
&lt;br /&gt;
	-- If we don&#039;t have a script, get one.&lt;br /&gt;
	if not sc then&lt;br /&gt;
		sc = lang:findBestScript(term)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Do we have embedded wikilinks? If so, they need to be processed individually.&lt;br /&gt;
	local open = find(term, &amp;quot;[[&amp;quot;, nil, true)&lt;br /&gt;
	if open and find(term, &amp;quot;]]&amp;quot;, open + 2, true) then&lt;br /&gt;
		return process_embedded_links(term, data.alt, lang, sc, data.id, data.cats, data.no_alt_ast)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If not, return the display text.&lt;br /&gt;
	term = selective_trim(term)&lt;br /&gt;
	-- FIXME: Double-escape any percent-signs, because we don&#039;t want to treat non-linked text as having percent-encoded characters. This is a hack: percent-decoding should come out of [[Module:languages]] and only dealt with in this module, as it&#039;s specific to links.&lt;br /&gt;
	term = term:gsub(&amp;quot;%%&amp;quot;, &amp;quot;%%25&amp;quot;)&lt;br /&gt;
	return lang:makeDisplayText(term, sc, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.mark(text, item_type, face, lang)&lt;br /&gt;
	local tag = { &amp;quot;&amp;quot;, &amp;quot;&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
	if item_type == &amp;quot;gloss&amp;quot; then&lt;br /&gt;
		tag = { &#039;&amp;lt;span class=&amp;quot;mention-gloss-double-quote&amp;quot;&amp;gt;“&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mention-gloss&amp;quot;&amp;gt;&#039;,&lt;br /&gt;
			&#039;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mention-gloss-double-quote&amp;quot;&amp;gt;”&amp;lt;/span&amp;gt;&#039; }&lt;br /&gt;
	elseif item_type == &amp;quot;tr&amp;quot; then&lt;br /&gt;
		if face == &amp;quot;term&amp;quot; then&lt;br /&gt;
			tag = { &#039;&amp;lt;span lang=&amp;quot;&#039; .. lang:getFullCode() .. &#039;&amp;quot; class=&amp;quot;tr mention-tr Latn&amp;quot;&amp;gt;&#039;,&lt;br /&gt;
				&#039;&amp;lt;/span&amp;gt;&#039; }&lt;br /&gt;
		else&lt;br /&gt;
			tag = { &#039;&amp;lt;span lang=&amp;quot;&#039; .. lang:getFullCode() .. &#039;&amp;quot; class=&amp;quot;tr Latn&amp;quot;&amp;gt;&#039;, &#039;&amp;lt;/span&amp;gt;&#039; }&lt;br /&gt;
		end&lt;br /&gt;
	elseif item_type == &amp;quot;ts&amp;quot; then&lt;br /&gt;
		-- \226\129\160 = word joiner (zero-width non-breaking space) U+2060&lt;br /&gt;
		tag = { &#039;&amp;lt;span class=&amp;quot;ts mention-ts Latn&amp;quot;&amp;gt;/\226\129\160&#039;, &#039;\226\129\160/&amp;lt;/span&amp;gt;&#039; }&lt;br /&gt;
	elseif item_type == &amp;quot;pos&amp;quot; then&lt;br /&gt;
		tag = { &#039;&amp;lt;span class=&amp;quot;ann-pos&amp;quot;&amp;gt;&#039;, &#039;&amp;lt;/span&amp;gt;&#039; }&lt;br /&gt;
	elseif item_type == &amp;quot;non-gloss&amp;quot; then&lt;br /&gt;
		tag = { &#039;&amp;lt;span class=&amp;quot;ann-non-gloss&amp;quot;&amp;gt;&#039;, &#039;&amp;lt;/span&amp;gt;&#039; }&lt;br /&gt;
	elseif item_type == &amp;quot;annotations&amp;quot; then&lt;br /&gt;
		tag = { &#039;&amp;lt;span class=&amp;quot;mention-gloss-paren annotation-paren&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
			&#039;&amp;lt;span class=&amp;quot;mention-gloss-paren annotation-paren&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&#039; }&lt;br /&gt;
	elseif item_type == &amp;quot;infl&amp;quot; then&lt;br /&gt;
		tag = { &#039;&amp;lt;span class=&amp;quot;ann-infl&amp;quot;&amp;gt;&#039;, &#039;&amp;lt;/span&amp;gt;&#039; }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(text) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		return tag[1] .. text .. tag[2]&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local pos_tags&lt;br /&gt;
&lt;br /&gt;
--[==[Formats the annotations that are displayed with a link created by {{code|lua|full_link}}. Annotations are the extra bits of information that are displayed following the linked term, and include things such as gender, transliteration, gloss and so on.&lt;br /&gt;
* The first argument is a table possessing some or all of the following keys:&lt;br /&gt;
*:; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;genders&amp;lt;/code&amp;gt;&lt;br /&gt;
*:: Table containing a list of gender specifications in the style of [[Module:gender and number]].&lt;br /&gt;
*:; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;tr&amp;lt;/code&amp;gt;&lt;br /&gt;
*:: Transliteration.&lt;br /&gt;
*:; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;gloss&amp;lt;/code&amp;gt;&lt;br /&gt;
*:: Gloss that translates the term in the link, or gives some other descriptive information.&lt;br /&gt;
*:; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;pos&amp;lt;/code&amp;gt;&lt;br /&gt;
*:: Part of speech of the linked term. If the given argument matches one of the aliases in `pos_aliases` in [[Module:headword/data]], or consists of a part of speech or alias followed by `f` (for a non-lemma form), expand it appropriately. Otherwise, just show the given text as it is.&lt;br /&gt;
*:; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;ng&amp;lt;/code&amp;gt;&lt;br /&gt;
*:: Arbitrary non-gloss descriptive text for the link. This should be used in preference to putting descriptive text in `gloss` or `pos`.&lt;br /&gt;
*:; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;lit&amp;lt;/code&amp;gt;&lt;br /&gt;
*:: Literal meaning of the term, if the usual meaning is figurative or idiomatic.&lt;br /&gt;
*:; &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;infl&amp;lt;/code&amp;gt;&lt;br /&gt;
*:: Table containing a list of grammar tags in the style of [[Module:form of]] `tagged_inflections`.&lt;br /&gt;
*:Any of the above values can be omitted from the &amp;lt;code class=&amp;quot;n&amp;quot;&amp;gt;info&amp;lt;/code&amp;gt; argument. If a completely empty table is given (with no annotations at all), then an empty string is returned.&lt;br /&gt;
* The second argument is a string. Valid values are listed in [[Module:script utilities/data]] &amp;quot;data.translit&amp;quot; table.]==]&lt;br /&gt;
function export.format_link_annotations(data, face)&lt;br /&gt;
	local output = {}&lt;br /&gt;
&lt;br /&gt;
	-- Interwiki link&lt;br /&gt;
	if data.interwiki then&lt;br /&gt;
		insert(output, data.interwiki)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Genders&lt;br /&gt;
	if type(data.genders) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		data.genders = { data.genders }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if data.genders and #data.genders &amp;gt; 0 then&lt;br /&gt;
		local genders, gender_cats = format_genders(data.genders, data.lang)&lt;br /&gt;
		insert(output, &amp;quot;&amp;amp;nbsp;&amp;quot; .. genders)&lt;br /&gt;
		if gender_cats then&lt;br /&gt;
			local cats = data.cats&lt;br /&gt;
			if cats then&lt;br /&gt;
				extend(cats, gender_cats)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local annotations = {}&lt;br /&gt;
&lt;br /&gt;
	-- Transliteration and transcription&lt;br /&gt;
	if data.tr and data.tr[1] or data.ts and data.ts[1] then&lt;br /&gt;
		local kind&lt;br /&gt;
		if face == &amp;quot;term&amp;quot; then&lt;br /&gt;
			kind = face&lt;br /&gt;
		else&lt;br /&gt;
			kind = &amp;quot;default&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if data.tr[1] and data.ts[1] then&lt;br /&gt;
			insert(annotations, tag_translit(data.tr[1], data.lang, kind) .. &amp;quot; &amp;quot; .. export.mark(data.ts[1], &amp;quot;ts&amp;quot;))&lt;br /&gt;
		elseif data.ts[1] then&lt;br /&gt;
			insert(annotations, export.mark(data.ts[1], &amp;quot;ts&amp;quot;))&lt;br /&gt;
		else&lt;br /&gt;
			insert(annotations, tag_translit(data.tr[1], data.lang, kind))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Gloss/translation&lt;br /&gt;
	if data.gloss then&lt;br /&gt;
		insert(annotations, export.mark(data.gloss, &amp;quot;gloss&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Part of speech&lt;br /&gt;
	if data.pos then&lt;br /&gt;
		-- debug category for pos= containing transcriptions&lt;br /&gt;
		if data.pos:match(&amp;quot;/[^&amp;gt;&amp;lt;]-/&amp;quot;) then&lt;br /&gt;
			data.pos = data.pos .. &amp;quot;[[Category:links likely containing transcriptions in pos]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Canonicalize part of speech aliases as well as non-lemma aliases like &#039;nf&#039; or &#039;nounf&#039; for &amp;quot;noun form&amp;quot;.&lt;br /&gt;
		pos_tags = pos_tags or (m_headword_data or get_headword_data()).pos_aliases&lt;br /&gt;
		local pos = pos_tags[data.pos]&lt;br /&gt;
		if not pos and data.pos:find(&amp;quot;f$&amp;quot;) then&lt;br /&gt;
			local pos_form = data.pos:sub(1, -2)&lt;br /&gt;
			-- We only expand something ending in &#039;f&#039; if the result is a recognized non-lemma POS.&lt;br /&gt;
			pos_form = (pos_tags[pos_form] or pos_form) .. &amp;quot; form&amp;quot;&lt;br /&gt;
			if (m_headword_data or get_headword_data()).nonlemmas[pos_form .. &amp;quot;s&amp;quot;] then&lt;br /&gt;
				pos = pos_form&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		insert(annotations, export.mark(pos or data.pos, &amp;quot;pos&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Inflection data&lt;br /&gt;
	if data.infl then&lt;br /&gt;
		local m_form_of = require(form_of_module)&lt;br /&gt;
		-- Split tag sets manually, since tagged_inflections creates a numbered list, and we do not want that.&lt;br /&gt;
		local infl_outputs = {}&lt;br /&gt;
		local tag_sets = m_form_of.split_tag_set(data.infl)&lt;br /&gt;
		for _, tag_set in ipairs(tag_sets) do&lt;br /&gt;
			table.insert(infl_outputs,&lt;br /&gt;
				m_form_of.tagged_inflections({ tags = tag_set, lang = data.lang, nocat = true, nolink = true, nowrap = true }))&lt;br /&gt;
		end&lt;br /&gt;
		insert(annotations, export.mark(table.concat(infl_outputs, &amp;quot;; &amp;quot;), &amp;quot;infl&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Non-gloss text&lt;br /&gt;
	if data.ng then&lt;br /&gt;
		insert(annotations, export.mark(data.ng, &amp;quot;non-gloss&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Literal/sum-of-parts meaning&lt;br /&gt;
	if data.lit then&lt;br /&gt;
		insert(annotations, &amp;quot;literally &amp;quot; .. export.mark(data.lit, &amp;quot;gloss&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Provide a hook to insert additional annotations such as nested inflections.&lt;br /&gt;
	if data.postprocess_annotations then&lt;br /&gt;
		data.postprocess_annotations {&lt;br /&gt;
			data = data,&lt;br /&gt;
			annotations = annotations&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if #annotations &amp;gt; 0 then&lt;br /&gt;
		insert(output, &amp;quot; &amp;quot; .. export.mark(concat(annotations, &amp;quot;, &amp;quot;), &amp;quot;annotations&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return concat(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Encode certain characters to avoid various delimiter-related issues at various stages. We need to encode &amp;lt; and &amp;gt;&lt;br /&gt;
-- because they end up forming part of CSS class names inside of &amp;lt;span ...&amp;gt; and will interfere with finding the end&lt;br /&gt;
-- of the HTML tag. I first tried converting them to URL encoding, i.e. %3C and %3E; they then appear in the URL as&lt;br /&gt;
-- %253C and %253E, which get mapped back to %3C and %3E when passed to [[Module:accel]]. But mapping them to &amp;amp;lt;&lt;br /&gt;
-- and &amp;amp;gt; somehow works magically without any further work; they appear in the URL as &amp;lt; and &amp;gt;, and get passed to&lt;br /&gt;
-- [[Module:accel]] as &amp;lt; and &amp;gt;. I have no idea who along the chain of calls is doing the encoding and decoding. If&lt;br /&gt;
-- someone knows, please modify this comment appropriately!&lt;br /&gt;
local accel_char_map&lt;br /&gt;
local function get_accel_char_map()&lt;br /&gt;
	accel_char_map = {&lt;br /&gt;
		[&amp;quot;%&amp;quot;] = &amp;quot;.&amp;quot;,&lt;br /&gt;
		[&amp;quot; &amp;quot;] = &amp;quot;_&amp;quot;,&lt;br /&gt;
		[&amp;quot;_&amp;quot;] = u(0xFFF0),&lt;br /&gt;
		[&amp;quot;&amp;lt;&amp;quot;] = &amp;quot;&amp;amp;lt;&amp;quot;,&lt;br /&gt;
		[&amp;quot;&amp;gt;&amp;quot;] = &amp;quot;&amp;amp;gt;&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	return accel_char_map&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function encode_accel_param_chars(param)&lt;br /&gt;
	return (param:gsub(&amp;quot;[% &amp;lt;&amp;gt;_]&amp;quot;, accel_char_map or get_accel_char_map()))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function encode_accel_param(prefix, param)&lt;br /&gt;
	if not param then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if type(param) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local filled_params = {}&lt;br /&gt;
		-- There may be gaps in the sequence, especially for translit params.&lt;br /&gt;
		local maxindex = 0&lt;br /&gt;
		for k in pairs(param) do&lt;br /&gt;
			if type(k) == &amp;quot;number&amp;quot; and k &amp;gt; maxindex then&lt;br /&gt;
				maxindex = k&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for i = 1, maxindex do&lt;br /&gt;
			filled_params[i] = param[i] or &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		-- [[Module:accel]] splits these up again.&lt;br /&gt;
		param = concat(filled_params, &amp;quot;*~!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	-- This is decoded again by [[WT:ACCEL]].&lt;br /&gt;
	return prefix .. encode_accel_param_chars(param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function insert_if_not_blank(list, item)&lt;br /&gt;
	if item == &amp;quot;&amp;quot; then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	insert(list, item)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_class(lang, tr, accel, nowrap)&lt;br /&gt;
	if not accel and not nowrap then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local classes = {}&lt;br /&gt;
	if accel then&lt;br /&gt;
		insert(classes, &amp;quot;form-of lang-&amp;quot; .. lang:getFullCode())&lt;br /&gt;
		local form = accel.form&lt;br /&gt;
		if form then&lt;br /&gt;
			insert(classes, encode_accel_param_chars(form) .. &amp;quot;-form-of&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		insert_if_not_blank(classes, encode_accel_param(&amp;quot;gender-&amp;quot;, accel.gender))&lt;br /&gt;
		insert_if_not_blank(classes, encode_accel_param(&amp;quot;pos-&amp;quot;, accel.pos))&lt;br /&gt;
		insert_if_not_blank(classes, encode_accel_param(&amp;quot;transliteration-&amp;quot;, accel.translit or (tr ~= &amp;quot;-&amp;quot; and tr or nil)))&lt;br /&gt;
		insert_if_not_blank(classes, encode_accel_param(&amp;quot;target-&amp;quot;, accel.target))&lt;br /&gt;
		insert_if_not_blank(classes, encode_accel_param(&amp;quot;origin-&amp;quot;, accel.lemma))&lt;br /&gt;
		insert_if_not_blank(classes, encode_accel_param(&amp;quot;origin_transliteration-&amp;quot;, accel.lemma_translit))&lt;br /&gt;
		if accel.no_store then&lt;br /&gt;
			insert(classes, &amp;quot;form-of-nostore&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if nowrap then&lt;br /&gt;
		insert(classes, nowrap)&lt;br /&gt;
	end&lt;br /&gt;
	return concat(classes, &amp;quot; &amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Add any left or right regular or accent qualifiers, labels or references to a formatted term. `data` is the object&lt;br /&gt;
-- specifying the term, which should optionally contain:&lt;br /&gt;
-- * a language object in `lang`; required if any accent qualifiers or labels are given;&lt;br /&gt;
-- * left regular qualifiers in `q` (an array of strings or a single string); an empty array or blank string will be&lt;br /&gt;
--   ignored;&lt;br /&gt;
-- * right regular qualifiers in `qq` (an array of strings or a single string); an empty array or blank string will be&lt;br /&gt;
--   ignored;&lt;br /&gt;
-- * left accent qualifiers in `a` (an array of strings); an empty array will be ignored;&lt;br /&gt;
-- * right accent qualifiers in `aa` (an array of strings); an empty array will be ignored;&lt;br /&gt;
-- * left labels in `l` (an array of strings); an empty array will be ignored;&lt;br /&gt;
-- * right labels in `ll` (an array of strings); an empty array will be ignored;&lt;br /&gt;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`&lt;br /&gt;
--   (formatted reference text) and optionally `name` and/or `group`.&lt;br /&gt;
-- `formatted` is the formatted version of the term itself.&lt;br /&gt;
local function add_qualifiers_and_refs_to_term(data, formatted)&lt;br /&gt;
	local q = data.q&lt;br /&gt;
	if type(q) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		q = { q }&lt;br /&gt;
	end&lt;br /&gt;
	local qq = data.qq&lt;br /&gt;
	if type(qq) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		qq = { qq }&lt;br /&gt;
	end&lt;br /&gt;
	if q and q[1] or qq and qq[1] or data.a and data.a[1] or data.aa and data.aa[1] or data.l and data.l[1] or&lt;br /&gt;
		data.ll and data.ll[1] or data.refs and data.refs[1] then&lt;br /&gt;
		formatted = format_qualifiers {&lt;br /&gt;
			lang = data.lang,&lt;br /&gt;
			text = formatted,&lt;br /&gt;
			q = q,&lt;br /&gt;
			qq = qq,&lt;br /&gt;
			a = data.a,&lt;br /&gt;
			aa = data.aa,&lt;br /&gt;
			l = data.l,&lt;br /&gt;
			ll = data.ll,&lt;br /&gt;
			refs = data.refs,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return formatted&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Creates a full link, with annotations (see `[[#format_link_annotations|format_link_annotations]]`), in the style of {{tl|l}} or {{tl|m}}.&lt;br /&gt;
The first argument, `data`, must be a table. It contains the various elements that can be supplied as parameters to {{tl|l}} or {{tl|m}}:&lt;br /&gt;
{ {&lt;br /&gt;
	term = entry_to_link_to,&lt;br /&gt;
	alt = link_text_or_displayed_text,&lt;br /&gt;
	lang = language_object,&lt;br /&gt;
	sc = script_object,&lt;br /&gt;
	track_sc = boolean,&lt;br /&gt;
	no_nonstandard_sc_cat = boolean,&lt;br /&gt;
	fragment = link_fragment,&lt;br /&gt;
	id = sense_id,&lt;br /&gt;
	genders = { &amp;quot;gender1&amp;quot;, &amp;quot;gender2&amp;quot;, ... },&lt;br /&gt;
	tr = transliteration,&lt;br /&gt;
	respect_link_tr = boolean,&lt;br /&gt;
	ts = transcription,&lt;br /&gt;
	gloss = gloss,&lt;br /&gt;
	pos = part_of_speech_tag,&lt;br /&gt;
	ng = non-gloss text,&lt;br /&gt;
	lit = literal_translation,&lt;br /&gt;
	infl = { &amp;quot;form_of_grammar_tag1&amp;quot;, &amp;quot;form_of_grammar_tag2&amp;quot;, ... },&lt;br /&gt;
	no_alt_ast = boolean,&lt;br /&gt;
	accel = {accelerated_creation_tags},&lt;br /&gt;
	interwiki = interwiki,&lt;br /&gt;
	pretext = &amp;quot;text_at_beginning&amp;quot; or nil,&lt;br /&gt;
	posttext = &amp;quot;text_at_end&amp;quot; or nil,&lt;br /&gt;
	q = { &amp;quot;left_qualifier1&amp;quot;, &amp;quot;left_qualifier2&amp;quot;, ...} or &amp;quot;left_qualifier&amp;quot;,&lt;br /&gt;
	qq = { &amp;quot;right_qualifier1&amp;quot;, &amp;quot;right_qualifier2&amp;quot;, ...} or &amp;quot;right_qualifier&amp;quot;,&lt;br /&gt;
	l = { &amp;quot;left_label1&amp;quot;, &amp;quot;left_label2&amp;quot;, ...},&lt;br /&gt;
	ll = { &amp;quot;right_label1&amp;quot;, &amp;quot;right_label2&amp;quot;, ...},&lt;br /&gt;
	a = { &amp;quot;left_accent_qualifier1&amp;quot;, &amp;quot;left_accent_qualifier2&amp;quot;, ...},&lt;br /&gt;
	aa = { &amp;quot;right_accent_qualifier1&amp;quot;, &amp;quot;right_accent_qualifier2&amp;quot;, ...},&lt;br /&gt;
	refs = { &amp;quot;formatted_ref1&amp;quot;, &amp;quot;formatted_ref2&amp;quot;, ...} or { {text = &amp;quot;text&amp;quot;, name = &amp;quot;name&amp;quot;, group = &amp;quot;group&amp;quot;}, ... },&lt;br /&gt;
	show_qualifiers = boolean,&lt;br /&gt;
} }&lt;br /&gt;
Any one of the items in the `data` table may be {nil}, but an error will be shown if neither `term` nor `alt` nor `tr`&lt;br /&gt;
is present. Thus, calling {full_link{ term = term, lang = lang, sc = sc }}, where `term` is the page to link to (which&lt;br /&gt;
may have diacritics that will be stripped and/or embedded bracketed links) and `lang` is a&lt;br /&gt;
[[Module:languages#Language objects|language object]] from [[Module:languages]], will give a plain link similar to the&lt;br /&gt;
one produced by the template {{tl|l}}, and calling {full_link( { term = term, lang = lang, sc = sc }, &amp;quot;term&amp;quot; )} will&lt;br /&gt;
give a link similar to the one produced by the template {{tl|m}}.&lt;br /&gt;
&lt;br /&gt;
The function will:&lt;br /&gt;
* Try to determine the script, based on the characters found in the `term` or `alt` argument, if the script was not&lt;br /&gt;
  given. If a script is given and `track_sc` is {true}, it will check whether the input script is the same as the one&lt;br /&gt;
  which would have been automatically generated and add the category [[:Category:LANG terms with redundant script codes]]&lt;br /&gt;
  if yes, or [[:Category:LANG terms with non-redundant manual script codes]] if no. This should be used when the input&lt;br /&gt;
  script object is directly determined by a template&#039;s `sc` parameter.&lt;br /&gt;
* Call `[[#language_link|language_link]]` on the `term` or `alt` forms, to remove diacritics in the page name, process&lt;br /&gt;
  any embedded wikilinks and create links to Reconstruction or Appendix pages when necessary.&lt;br /&gt;
* Call `[[Module:script utilities#tag_text]]` to add the appropriate language and script tags to the term and&lt;br /&gt;
  italicize terms written in the Latin script if necessary. Accelerated creation tags, as used by [[WT:ACCEL]], are&lt;br /&gt;
  included.&lt;br /&gt;
* Generate a transliteration, based on the `alt` or `term` arguments, if the script is not Latin, no transliteration was&lt;br /&gt;
  provided in `tr` and the combination of the term&#039;s language and script support automatic transliteration. The&lt;br /&gt;
  transliteration itself will be linked if both `.respect_link_tr` is specified and the language of the term has the&lt;br /&gt;
  `link_tr` property set for the script of the term; but not otherwise.&lt;br /&gt;
* Add the annotations (transliteration, gender, gloss, etc.) after the link.&lt;br /&gt;
* If `no_alt_ast` is specified, then the `alt` text does not need to contain an asterisk if the language is&lt;br /&gt;
  reconstructed. This should only be used by modules which really need to allow links to reconstructions that don&#039;t&lt;br /&gt;
  display asterisks (e.g. number boxes).&lt;br /&gt;
* If `pretext` or `posttext` is specified, this is text to (respectively) prepend or append to the output, directly&lt;br /&gt;
  before processing qualifiers, labels and references. This can be used to add arbitrary extra text inside of the&lt;br /&gt;
  qualifiers, labels and references.&lt;br /&gt;
* If `show_qualifiers` is specified or the `show_qualifiers` argument is given, then left and right qualifiers, accent&lt;br /&gt;
  qualifiers, labels and references will be displayed, otherwise they will be ignored. (This is because a fair amount of&lt;br /&gt;
  code stores qualifiers, labels and/or references in these fields and displays them itself, rather than expecting&lt;br /&gt;
  {full_link()} to display them.)]==]&lt;br /&gt;
function export.full_link(data, face, allow_self_link, show_qualifiers)&lt;br /&gt;
	if type(data) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		error(&amp;quot;The first argument to the function full_link must be a table. &amp;quot;&lt;br /&gt;
			.. &amp;quot;See Module:links/documentation for more information.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Prevent data from being destructively modified.&lt;br /&gt;
	local data = shallow_copy(data)&lt;br /&gt;
&lt;br /&gt;
	-- FIXME: this shouldn&#039;t be added to `data`, as that means the input table needs to be cloned.&lt;br /&gt;
	data.cats = {}&lt;br /&gt;
&lt;br /&gt;
	-- Categorize links to &amp;quot;und&amp;quot;.&lt;br /&gt;
	local lang, cats = data.lang, data.cats&lt;br /&gt;
	if cats and lang:getCode() == &amp;quot;und&amp;quot; then&lt;br /&gt;
		insert(cats, &amp;quot;Undetermined language links&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local terms = { true }&lt;br /&gt;
&lt;br /&gt;
	-- Generate multiple forms if applicable.&lt;br /&gt;
	for _, param in ipairs { &amp;quot;term&amp;quot;, &amp;quot;alt&amp;quot; } do&lt;br /&gt;
		if type(data[param]) == &amp;quot;string&amp;quot; and data[param]:find(&amp;quot;//&amp;quot;, nil, true) then&lt;br /&gt;
			data[param] = export.split_on_slashes(data[param])&lt;br /&gt;
		elseif type(data[param]) == &amp;quot;string&amp;quot; and not (type(data.term) == &amp;quot;string&amp;quot; and data.term:find(&amp;quot;//&amp;quot;, nil, true)) then&lt;br /&gt;
			if not data.no_generate_forms then&lt;br /&gt;
				data[param] = lang:generateForms(data[param])&lt;br /&gt;
			else&lt;br /&gt;
				data[param] = { data[param] }&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			data[param] = {}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, param in ipairs { &amp;quot;sc&amp;quot;, &amp;quot;tr&amp;quot;, &amp;quot;ts&amp;quot; } do&lt;br /&gt;
		data[param] = { data[param] }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, param in ipairs { &amp;quot;term&amp;quot;, &amp;quot;alt&amp;quot;, &amp;quot;sc&amp;quot;, &amp;quot;tr&amp;quot;, &amp;quot;ts&amp;quot; } do&lt;br /&gt;
		for i in pairs(data[param]) do&lt;br /&gt;
			terms[i] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Create the link&lt;br /&gt;
	local output = {}&lt;br /&gt;
	local id, no_alt_ast, srwc, accel, nevercalltr = data.id, data.no_alt_ast, data.suppress_redundant_wikilink_cat,&lt;br /&gt;
		data.accel, data.never_call_transliteration_module&lt;br /&gt;
	local link_tr = data.respect_link_tr and lang:link_tr(data.sc[1])&lt;br /&gt;
&lt;br /&gt;
	for i in ipairs(terms) do&lt;br /&gt;
		local link&lt;br /&gt;
		-- Is there any text to show?&lt;br /&gt;
		if (data.term[i] or data.alt[i]) then&lt;br /&gt;
			-- Try to detect the script if it was not provided&lt;br /&gt;
			local display_term = data.alt[i] or data.term[i]&lt;br /&gt;
			local best = lang:findBestScript(display_term)&lt;br /&gt;
			-- no_nonstandard_sc_cat is intended for use in [[Module:interproject]]&lt;br /&gt;
			if (&lt;br /&gt;
					not data.no_nonstandard_sc_cat and&lt;br /&gt;
					best:getCode() == &amp;quot;None&amp;quot; and&lt;br /&gt;
					find_best_script_without_lang(display_term):getCode() ~= &amp;quot;None&amp;quot;&lt;br /&gt;
				) then&lt;br /&gt;
				insert(cats, lang:getFullName() .. &amp;quot; terms in nonstandard scripts&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			if not data.sc[i] then&lt;br /&gt;
				data.sc[i] = best&lt;br /&gt;
				-- Track uses of sc parameter.&lt;br /&gt;
			elseif data.track_sc then&lt;br /&gt;
				if data.sc[i]:getCode() == best:getCode() then&lt;br /&gt;
					insert(cats, lang:getFullName() .. &amp;quot; terms with redundant script codes&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					insert(cats, lang:getFullName() .. &amp;quot; terms with non-redundant manual script codes&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- If using a discouraged character sequence, add to maintenance category&lt;br /&gt;
			if data.sc[i]:hasNormalizationFixes() == true then&lt;br /&gt;
				if (data.term[i] and data.sc[i]:fixDiscouragedSequences(toNFC(data.term[i])) ~= toNFC(data.term[i])) or (data.alt[i] and data.sc[i]:fixDiscouragedSequences(toNFC(data.alt[i])) ~= toNFC(data.alt[i])) then&lt;br /&gt;
					insert(cats, &amp;quot;Pages using discouraged character sequences&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			link = simple_link(&lt;br /&gt;
				data.term[i],&lt;br /&gt;
				data.fragment,&lt;br /&gt;
				data.alt[i],&lt;br /&gt;
				lang,&lt;br /&gt;
				data.sc[i],&lt;br /&gt;
				id,&lt;br /&gt;
				cats,&lt;br /&gt;
				no_alt_ast,&lt;br /&gt;
				srwc&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
		-- simple_link can return nil, so check if a link has been generated.&lt;br /&gt;
		if link then&lt;br /&gt;
			-- Add &amp;quot;nowrap&amp;quot; class to prefixes in order to prevent wrapping after the hyphen&lt;br /&gt;
			local nowrap&lt;br /&gt;
			local display_term = data.alt[i] or data.term[i]&lt;br /&gt;
			if display_term and (display_term:find(&amp;quot;^%-&amp;quot;) or display_term:find(&amp;quot;^־&amp;quot;)) then -- Hebrew maqqef -- FIXME, use hyphens from [[Module:affix]]&lt;br /&gt;
				nowrap = &amp;quot;nowrap&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			link = tag_text(link, lang, data.sc[i], face, get_class(lang, data.tr[i], accel, nowrap))&lt;br /&gt;
		else&lt;br /&gt;
			--[[	No term to show.&lt;br /&gt;
					Is there at least a transliteration we can work from?	]]&lt;br /&gt;
			link = request_script(lang, data.sc[i])&lt;br /&gt;
			-- No link to show, and no transliteration either. Show a term request (unless it&#039;s a substrate, as they rarely take terms).&lt;br /&gt;
			if (link == &amp;quot;&amp;quot; or (not data.tr[i]) or data.tr[i] == &amp;quot;-&amp;quot;) and lang:getFamilyCode() ~= &amp;quot;qfa-sub&amp;quot; then&lt;br /&gt;
				-- If there are multiple terms, break the loop instead.&lt;br /&gt;
				if i &amp;gt; 1 then&lt;br /&gt;
					remove(output)&lt;br /&gt;
					break&lt;br /&gt;
				elseif NAMESPACE ~= &amp;quot;Template&amp;quot; then&lt;br /&gt;
					insert(cats, lang:getFullName() .. &amp;quot; term requests&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				link = &amp;quot;&amp;lt;small&amp;gt;[Term?]&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		insert(output, link)&lt;br /&gt;
		if i &amp;lt; #terms then insert(output, &amp;quot;&amp;lt;span class=\&amp;quot;Zsym mention\&amp;quot; style=\&amp;quot;font-size:100%;\&amp;quot;&amp;gt;&amp;amp;nbsp;/ &amp;lt;/span&amp;gt;&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- When suppress_tr is true, do not show or generate any transliteration&lt;br /&gt;
	if data.suppress_tr then&lt;br /&gt;
		data.tr[1] = nil&lt;br /&gt;
	else&lt;br /&gt;
		-- TODO: Currently only handles the first transliteration, pending consensus on how to handle multiple translits for multiple forms, as this is not always desirable (e.g. traditional/simplified Chinese).&lt;br /&gt;
		if data.tr[1] == &amp;quot;&amp;quot; or data.tr[1] == &amp;quot;-&amp;quot; then&lt;br /&gt;
			data.tr[1] = nil&lt;br /&gt;
		else&lt;br /&gt;
			local phonetic_extraction = load_data(&amp;quot;Module:links/data&amp;quot;).phonetic_extraction&lt;br /&gt;
			phonetic_extraction = phonetic_extraction[lang:getCode()] or phonetic_extraction[lang:getFullCode()]&lt;br /&gt;
&lt;br /&gt;
			if phonetic_extraction then&lt;br /&gt;
				data.tr[1] = data.tr[1] or&lt;br /&gt;
				require(phonetic_extraction).getTranslit(export.remove_links(data.alt[1] or data.term[1]))&lt;br /&gt;
			elseif (data.term[1] or data.alt[1]) and data.sc[1]:isTransliterated() then&lt;br /&gt;
				-- Track whenever there is manual translit. The categories below like &#039;terms with redundant transliterations&#039;&lt;br /&gt;
				-- aren&#039;t sufficient because they only work with reference to automatic translit and won&#039;t operate at all in&lt;br /&gt;
				-- languages without any automatic translit, like Persian and Hebrew.&lt;br /&gt;
				if data.tr[1] then&lt;br /&gt;
					local full_code = lang:getFullCode()&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				if not nevercalltr then&lt;br /&gt;
					-- Try to generate a transliteration.&lt;br /&gt;
					local text = data.alt[1] or data.term[1]&lt;br /&gt;
					if not link_tr then&lt;br /&gt;
						text = export.remove_links(text, true)&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					local automated_tr = lang:transliterate(text, data.sc[1])&lt;br /&gt;
&lt;br /&gt;
					if automated_tr then&lt;br /&gt;
						local manual_tr = data.tr[1]&lt;br /&gt;
&lt;br /&gt;
						if manual_tr then&lt;br /&gt;
							if export.remove_links(manual_tr) == export.remove_links(automated_tr) then&lt;br /&gt;
								insert(cats, lang:getFullName() .. &amp;quot; terms with redundant transliterations&amp;quot;)&lt;br /&gt;
							else&lt;br /&gt;
								-- Prevents Arabic root categories from flooding the tracking categories.&lt;br /&gt;
								if NAMESPACE ~= &amp;quot;Category&amp;quot; then&lt;br /&gt;
									insert(cats,&lt;br /&gt;
										lang:getFullName() .. &amp;quot; terms with non-redundant manual transliterations&amp;quot;)&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
&lt;br /&gt;
						if not manual_tr or lang:overrideManualTranslit(data.sc[1]) then&lt;br /&gt;
							data.tr[1] = automated_tr&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Link to the transliteration entry for languages that require this&lt;br /&gt;
	if data.tr[1] and link_tr and not data.tr[1]:match(&amp;quot;%[%[(.-)%]%]&amp;quot;) then&lt;br /&gt;
		data.tr[1] = simple_link(&lt;br /&gt;
			data.tr[1],&lt;br /&gt;
			nil,&lt;br /&gt;
			nil,&lt;br /&gt;
			lang,&lt;br /&gt;
			get_script(&amp;quot;Latn&amp;quot;),&lt;br /&gt;
			nil,&lt;br /&gt;
			cats,&lt;br /&gt;
			no_alt_ast,&lt;br /&gt;
			srwc&lt;br /&gt;
		)&lt;br /&gt;
	elseif data.tr[1] and not link_tr then&lt;br /&gt;
		-- Remove the pseudo-HTML tags added by remove_links.&lt;br /&gt;
		data.tr[1] = data.tr[1]:gsub(&amp;quot;&amp;lt;/?link&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if data.tr[1] and not umatch(data.tr[1], &amp;quot;[^%s%p]&amp;quot;) then data.tr[1] = nil end&lt;br /&gt;
&lt;br /&gt;
	insert(output, export.format_link_annotations(data, face))&lt;br /&gt;
&lt;br /&gt;
	if data.pretext then&lt;br /&gt;
		insert(output, 1, data.pretext)&lt;br /&gt;
	end&lt;br /&gt;
	if data.posttext then&lt;br /&gt;
		insert(output, data.posttext)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local categories = cats[1] and format_categories(cats, lang, &amp;quot;-&amp;quot;, nil, nil, data.sc) or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	output = concat(output)&lt;br /&gt;
	if show_qualifiers or data.show_qualifiers then&lt;br /&gt;
		output = add_qualifiers_and_refs_to_term(data, output)&lt;br /&gt;
	end&lt;br /&gt;
	return output .. categories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Replaces all wikilinks with their displayed text, and removes any categories. This function can be invoked either from a template or from another module.&lt;br /&gt;
-- Strips links: deletes category links, the targets of piped links, and any double square brackets involved in links (other than file links, which are untouched). If `tag` is set, then any links removed will be given pseudo-HTML tags, which allow the substitution functions in [[Module:languages]] to properly subdivide the text in order to reduce the chance of substitution failures in modules which scrape pages like [[Module:zh-translit]].&lt;br /&gt;
-- FIXME: This is quite hacky. We probably want this to be integrated into [[Module:languages]], but we can&#039;t do that until we know that nothing is pushing pipe linked transliterations through it for languages which don&#039;t have link_tr set.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[page|displayed text]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rarr; &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;displayed text&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[page and displayed text]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rarr; &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;page and displayed text&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Category:English lemmas|WORD]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; &amp;amp;rarr; &#039;&#039;(nothing)&#039;&#039;]==]&lt;br /&gt;
function export.remove_links(text, tag)&lt;br /&gt;
	if type(text) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		text = text.args[1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not text or text == &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = text&lt;br /&gt;
		:gsub(&amp;quot;%[%[&amp;quot;, &amp;quot;\1&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;%]%]&amp;quot;, &amp;quot;\2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Parse internal links for the display text.&lt;br /&gt;
	text = text:gsub(&amp;quot;(\1)([^\1\2]-)(\2)&amp;quot;,&lt;br /&gt;
		function(c1, c2, c3)&lt;br /&gt;
			-- Don&#039;t remove files.&lt;br /&gt;
			for _, false_positive in ipairs({ &amp;quot;file&amp;quot;, &amp;quot;image&amp;quot; }) do&lt;br /&gt;
				if c2:lower():match(&amp;quot;^&amp;quot; .. false_positive .. &amp;quot;:&amp;quot;) then return c1 .. c2 .. c3 end&lt;br /&gt;
			end&lt;br /&gt;
			-- Remove categories completely.&lt;br /&gt;
			for _, false_positive in ipairs({ &amp;quot;category&amp;quot;, &amp;quot;cat&amp;quot; }) do&lt;br /&gt;
				if c2:lower():match(&amp;quot;^&amp;quot; .. false_positive .. &amp;quot;:&amp;quot;) then return &amp;quot;&amp;quot; end&lt;br /&gt;
			end&lt;br /&gt;
			-- In piped links, remove all text before the pipe, unless it&#039;s the final character (i.e. the pipe trick), in which case just remove the pipe.&lt;br /&gt;
			c2 = c2:match(&amp;quot;^[^|]*|(.+)&amp;quot;) or c2:match(&amp;quot;([^|]+)|$&amp;quot;) or c2&lt;br /&gt;
			if tag then&lt;br /&gt;
				return &amp;quot;&amp;lt;link&amp;gt;&amp;quot; .. c2 .. &amp;quot;&amp;lt;/link&amp;gt;&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				return c2&lt;br /&gt;
			end&lt;br /&gt;
		end)&lt;br /&gt;
&lt;br /&gt;
	text = text&lt;br /&gt;
		:gsub(&amp;quot;\1&amp;quot;, &amp;quot;[[&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;\2&amp;quot;, &amp;quot;]]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.section_link(link)&lt;br /&gt;
	if type(link) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		error(&amp;quot;The first argument to section_link was a &amp;quot; .. type(link) .. &amp;quot;, but it should be a string.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local target, section = get_fragment((link:gsub(&amp;quot;_&amp;quot;, &amp;quot; &amp;quot;)))&lt;br /&gt;
&lt;br /&gt;
	if not section then&lt;br /&gt;
		error(&amp;quot;No \&amp;quot;#\&amp;quot; delineating a section name&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return simple_link(&lt;br /&gt;
		target,&lt;br /&gt;
		section,&lt;br /&gt;
		target .. &amp;quot; §&amp;amp;nbsp;&amp;quot; .. section&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:anchors&amp;diff=491420</id>
		<title>Module:anchors</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:anchors&amp;diff=491420"/>
		<updated>2026-03-24T23:43:03Z</updated>

		<summary type="html">&lt;p&gt;Sware: Created page with &amp;quot;local export = {}  local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;  local anchor_encode = mw.uri.anchorEncode local concat = table.concat local insert = table.insert local language_anchor -- Defined below.  local function decode_entities(...) 	decode_entities = require(string_utilities_module).decode_entities 	return decode_entities(...) end  local function encode_entities(...) 	encode_entities = require(string_utilities_module).encode_entities 	return encode_e...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local anchor_encode = mw.uri.anchorEncode&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local language_anchor -- Defined below.&lt;br /&gt;
&lt;br /&gt;
local function decode_entities(...)&lt;br /&gt;
	decode_entities = require(string_utilities_module).decode_entities&lt;br /&gt;
	return decode_entities(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function encode_entities(...)&lt;br /&gt;
	encode_entities = require(string_utilities_module).encode_entities&lt;br /&gt;
	return encode_entities(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns the anchor text to be used as the fragment of a link to a language section.&lt;br /&gt;
function export.language_anchor(lang, id)&lt;br /&gt;
	return anchor_encode(lang:getFullName() .. &amp;quot;: &amp;quot; .. id)&lt;br /&gt;
end&lt;br /&gt;
language_anchor = export.language_anchor&lt;br /&gt;
&lt;br /&gt;
-- Normalizes input text (removes formatting etc.), which can then be used as an anchor in an `id=` field.&lt;br /&gt;
function export.normalize_anchor(str)&lt;br /&gt;
	return decode_entities(anchor_encode(str))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.make_anchors(ids)&lt;br /&gt;
	local anchors = {}&lt;br /&gt;
	for i = 1, #ids do&lt;br /&gt;
		local id = ids[i]&lt;br /&gt;
		local el = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
			:addClass(&amp;quot;template-anchor&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;id&amp;quot;, anchor_encode(id))&lt;br /&gt;
			:attr(&amp;quot;data-id&amp;quot;, id)&lt;br /&gt;
		insert(anchors, tostring(el))&lt;br /&gt;
	end&lt;br /&gt;
	return concat(anchors)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.senseid(lang, id, tag_name)&lt;br /&gt;
	-- The following tag is opened but never closed, where is it supposed to be closed?&lt;br /&gt;
	--         with &amp;lt;li&amp;gt; it doesn&#039;t matter, as it is closed automatically.&lt;br /&gt;
	--         with &amp;lt;p&amp;gt; it is a problem&lt;br /&gt;
	-- Cannot use mw.html here as it always closes tags&lt;br /&gt;
	return &amp;quot;&amp;lt;&amp;quot; .. tag_name .. &amp;quot; class=\&amp;quot;senseid\&amp;quot; id=\&amp;quot;&amp;quot; .. language_anchor(lang, id) .. &amp;quot;\&amp;quot; data-lang=\&amp;quot;&amp;quot; .. lang:getCode() .. &amp;quot;\&amp;quot; data-id=\&amp;quot;&amp;quot; .. encode_entities(id) .. &amp;quot;\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.etymid(lang, id)&lt;br /&gt;
	-- Use a &amp;lt;ul&amp;gt; tag to ensure spacing doesn&#039;t get messed up.&lt;br /&gt;
	local el = mw.html.create(&amp;quot;ul&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;etymid&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;id&amp;quot;, language_anchor(lang, id))&lt;br /&gt;
		:attr(&amp;quot;data-lang&amp;quot;, lang:getCode())&lt;br /&gt;
		:attr(&amp;quot;data-id&amp;quot;, id)&lt;br /&gt;
	return tostring(el)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.etymonid(lang, id, opts)&lt;br /&gt;
	opts = opts or {}&lt;br /&gt;
	-- Use a &amp;lt;ul&amp;gt; tag to ensure spacing doesn&#039;t get messed up.&lt;br /&gt;
	local el = mw.html.create(&amp;quot;ul&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;etymonid&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;data-lang&amp;quot;, lang:getCode())&lt;br /&gt;
	&lt;br /&gt;
	if id then&lt;br /&gt;
		el:attr(&amp;quot;id&amp;quot;, language_anchor(lang, id))&lt;br /&gt;
		el:attr(&amp;quot;data-id&amp;quot;, id)&lt;br /&gt;
	end&lt;br /&gt;
	if opts.no_tree then&lt;br /&gt;
		el:attr(&amp;quot;data-no-tree&amp;quot;, &amp;quot;1&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if opts.title then&lt;br /&gt;
		el:attr(&amp;quot;data-title&amp;quot;, opts.title)&lt;br /&gt;
	end&lt;br /&gt;
	if opts.empty_tree then&lt;br /&gt;
		el:attr(&amp;quot;data-empty-tree&amp;quot;, &amp;quot;1&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring(el)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Template:Der&amp;diff=491418</id>
		<title>Template:Der</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Template:Der&amp;diff=491418"/>
		<updated>2026-03-24T23:17:38Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:etymology/templates|derived}}&amp;lt;noinclude&amp;gt;{{lua|etymology/templates}}{{documentation}}[[category:Templates]][[category:Contionary templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Template:Der&amp;diff=491417</id>
		<title>Template:Der</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Template:Der&amp;diff=491417"/>
		<updated>2026-03-24T23:17:29Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:etymology/templates|derived}}&amp;lt;noinclude&amp;gt;{{lua|etymology/templates/derived}}{{documentation}}[[category:Templates]][[category:Contionary templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology/specialized&amp;diff=491416</id>
		<title>Module:etymology/specialized</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/specialized&amp;diff=491416"/>
		<updated>2026-03-24T23:17:09Z</updated>

		<summary type="html">&lt;p&gt;Sware: Created page with &amp;quot;local export = {}  local m_str_utils = require(&amp;quot;Module:string utilities&amp;quot;) local en_utilities_module = &amp;quot;Module:en-utilities&amp;quot; local etymology_module = &amp;quot;Module:etymology&amp;quot;  local gsub = m_str_utils.gsub local insert = table.insert local pluralize = require(en_utilities_module).pluralize local upper = m_str_utils.upper  -- This function handles all the messiness of different types of specialized borrowings. It should insert any -- borrowing-type-specific categories into `cate...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local m_str_utils = require(&amp;quot;Module:string utilities&amp;quot;)&lt;br /&gt;
local en_utilities_module = &amp;quot;Module:en-utilities&amp;quot;&lt;br /&gt;
local etymology_module = &amp;quot;Module:etymology&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local gsub = m_str_utils.gsub&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local pluralize = require(en_utilities_module).pluralize&lt;br /&gt;
local upper = m_str_utils.upper&lt;br /&gt;
&lt;br /&gt;
-- This function handles all the messiness of different types of specialized borrowings. It should insert any&lt;br /&gt;
-- borrowing-type-specific categories into `categories` unless `nocat` is given, and return the text to display&lt;br /&gt;
-- before the source + term (or &amp;quot;&amp;quot; for no text).&lt;br /&gt;
local function get_specialized_borrowing_text_insert_cats(data)&lt;br /&gt;
	local bortype, categories, lang, terms, source, nocap, nocat, senseid =&lt;br /&gt;
		data.bortype, data.categories, data.lang, data.terms, data.source, data.nocap, data.nocat, data.senseid&lt;br /&gt;
&lt;br /&gt;
	local function inscat(cat)&lt;br /&gt;
		if not nocat then&lt;br /&gt;
			local display, sourcedisp = require(etymology_module).get_display_and_cat_name(source, &amp;quot;raw&amp;quot;)&lt;br /&gt;
			if cat:find(&amp;quot;DISPLAY&amp;quot;) then&lt;br /&gt;
				cat = cat:gsub(&amp;quot;DISPLAY&amp;quot;, display)&lt;br /&gt;
			elseif cat:find(&amp;quot;SOURCE&amp;quot;) then&lt;br /&gt;
				cat = cat:gsub(&amp;quot;SOURCE&amp;quot;, sourcedisp)&lt;br /&gt;
			else&lt;br /&gt;
				cat = cat .. &amp;quot; &amp;quot; .. sourcedisp&lt;br /&gt;
			end&lt;br /&gt;
			insert(categories, lang:getFullName() .. &amp;quot; &amp;quot; .. cat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- `text` is the display text for the borrowing type, which gets converted&lt;br /&gt;
	--	into a link.&lt;br /&gt;
	-- `appendix` is a the glossary anchor, which defaults to `text`&lt;br /&gt;
	-- `prep` is the preposition between the borrowing type and the language&lt;br /&gt;
	--	name (e.g. &amp;quot;of&amp;quot;, &amp;quot;from&amp;quot;)&lt;br /&gt;
	-- `pos` is the part of speech for the borrowing type (&amp;quot;noun&amp;quot; or&lt;br /&gt;
	--	&amp;quot;adjective&amp;quot;; defaults to &amp;quot;noun&amp;quot;)&lt;br /&gt;
	-- `plural` is the plural form of the borrowing type; if not specified,&lt;br /&gt;
	--	the pluralize function is used&lt;br /&gt;
	local text, appendix, prep, pos, plural&lt;br /&gt;
	&lt;br /&gt;
	if bortype == &amp;quot;calque&amp;quot; then&lt;br /&gt;
		text, prep = &amp;quot;calque&amp;quot;, &amp;quot;of&amp;quot;&lt;br /&gt;
		inscat(&amp;quot;terms calqued from&amp;quot;)&lt;br /&gt;
	elseif bortype == &amp;quot;partial-calque&amp;quot; then&lt;br /&gt;
		text, prep = &amp;quot;partial calque&amp;quot;, &amp;quot;of&amp;quot;&lt;br /&gt;
		inscat(&amp;quot;terms partially calqued from&amp;quot;)&lt;br /&gt;
	elseif bortype == &amp;quot;semantic-loan&amp;quot; then&lt;br /&gt;
		text, prep = &amp;quot;semantic loan&amp;quot;, &amp;quot;from&amp;quot;&lt;br /&gt;
		inscat(&amp;quot;semantic loans from&amp;quot;)&lt;br /&gt;
	elseif bortype == &amp;quot;transliteration&amp;quot; then&lt;br /&gt;
		text, prep = &amp;quot;transliteration&amp;quot;, &amp;quot;of&amp;quot;&lt;br /&gt;
		inscat(&amp;quot;terms borrowed from&amp;quot;)&lt;br /&gt;
		inscat(&amp;quot;transliterations of DISPLAY terms&amp;quot;)&lt;br /&gt;
	elseif bortype == &amp;quot;phono-semantic-matching&amp;quot; then&lt;br /&gt;
		text, prep = &amp;quot;phono-semantic matching&amp;quot;, &amp;quot;of&amp;quot;&lt;br /&gt;
		inscat(&amp;quot;phono-semantic matchings from&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		local langcode = lang:getCode()&lt;br /&gt;
		local lang_is_source = langcode == source:getCode()&lt;br /&gt;
		if lang_is_source then&lt;br /&gt;
			inscat(&amp;quot;terms borrowed back into&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			inscat(&amp;quot;terms borrowed from&amp;quot;)&lt;br /&gt;
			if bortype ~= &amp;quot;borrowing&amp;quot; then&lt;br /&gt;
				inscat(bortype .. &amp;quot; borrowings from&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if bortype == &amp;quot;borrowing&amp;quot; then&lt;br /&gt;
			text, appendix, prep, pos = &amp;quot;borrowed&amp;quot;, &amp;quot;loanword&amp;quot;, &amp;quot;from&amp;quot;, &amp;quot;adjective&amp;quot;&lt;br /&gt;
		elseif (&lt;br /&gt;
			bortype == &amp;quot;learned&amp;quot; or&lt;br /&gt;
			bortype == &amp;quot;semi-learned&amp;quot; or&lt;br /&gt;
			bortype == &amp;quot;orthographic&amp;quot; or&lt;br /&gt;
			bortype == &amp;quot;unadapted&amp;quot;&lt;br /&gt;
		) then&lt;br /&gt;
			text, prep = bortype .. &amp;quot; borrowing&amp;quot;, &amp;quot;from&amp;quot;&lt;br /&gt;
		elseif bortype == &amp;quot;adapted&amp;quot; then &lt;br /&gt;
			text, prep = bortype .. &amp;quot; borrowing&amp;quot;, &amp;quot;of&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;quot;Internal error: Unrecognized bortype: &amp;quot; .. bortype)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- If the term is suppressed, the preposition should always be &amp;quot;from&amp;quot;:&lt;br /&gt;
		-- &amp;quot;Calque of Chinese 中國&amp;quot;.&lt;br /&gt;
		-- &amp;quot;Calque from Chinese&amp;quot; (not &amp;quot;Calque of Chinese&amp;quot;).&lt;br /&gt;
	if terms[1].term == &amp;quot;-&amp;quot; then&lt;br /&gt;
		prep = &amp;quot;from&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	appendix = &amp;quot;Appendix:Glossary#&amp;quot; .. (appendix or text)&lt;br /&gt;
&lt;br /&gt;
	if senseid then&lt;br /&gt;
		local senseids, output = mw.text.split(senseid, &#039;!!&#039;), {}&lt;br /&gt;
		for i, id in ipairs(senseids) do&lt;br /&gt;
			-- FIXME: This should be done via a function.&lt;br /&gt;
			insert(output, mw.getCurrentFrame():preprocess(&#039;{{senseno|&#039; .. lang:getCode() .. &#039;|&#039; .. id .. (i == 1 and not nocap and &amp;quot;|uc=1&amp;quot; or &amp;quot;&amp;quot;) .. &#039;}}&#039;))&lt;br /&gt;
		end&lt;br /&gt;
		local link&lt;br /&gt;
		if senseid:find(&#039;!!&#039;) then&lt;br /&gt;
			link, text = &amp;quot;are&amp;quot;, pos == &amp;quot;adjective&amp;quot; and text or plural or pluralize(text)&lt;br /&gt;
		else&lt;br /&gt;
			link = pos == &amp;quot;adjective&amp;quot; and &amp;quot;is&amp;quot; or &amp;quot;is a&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		text = mw.text.listToText(output) .. &amp;quot; &amp;quot; .. link .. &amp;quot; &amp;quot; .. &#039;[[&#039; .. appendix .. &#039;|&#039; .. text .. &#039;]]&#039;&lt;br /&gt;
	else&lt;br /&gt;
		text = &amp;quot;[[&amp;quot; .. appendix .. &amp;quot;|&amp;quot; .. (nocap and text or gsub(text, &amp;quot;^.&amp;quot;, upper)) .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return text .. &amp;quot; &amp;quot; .. prep .. &amp;quot; &amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function export.specialized_borrowing(data)&lt;br /&gt;
	local lang, sources, terms = data.lang, data.sources, data.terms&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	local text&lt;br /&gt;
&lt;br /&gt;
	for _, source in ipairs(sources) do&lt;br /&gt;
		text = get_specialized_borrowing_text_insert_cats {&lt;br /&gt;
			bortype = data.bortype,&lt;br /&gt;
			categories = categories,&lt;br /&gt;
			lang = lang,&lt;br /&gt;
			terms = terms,&lt;br /&gt;
			source = source,&lt;br /&gt;
			nocap = data.nocap,&lt;br /&gt;
			nocat = data.nocat,&lt;br /&gt;
			senseid = data.senseid,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = data.notext and &amp;quot;&amp;quot; or text&lt;br /&gt;
	local sourcetext = require(etymology_module).format_sources {&lt;br /&gt;
		lang = lang,&lt;br /&gt;
		sources = sources,&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = data.sort_key,&lt;br /&gt;
		categories = categories,&lt;br /&gt;
		nocat = data.nocat,&lt;br /&gt;
		sourceconj = data.sourceconj,&lt;br /&gt;
	}&lt;br /&gt;
	return text .. require(etymology_module).format_links(terms, data.conj, &amp;quot;etymology/specialized&amp;quot;, sourcetext)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology/templates&amp;diff=491415</id>
		<title>Module:etymology/templates</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology/templates&amp;diff=491415"/>
		<updated>2026-03-24T23:16:19Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local require_when_needed = require(&amp;quot;Module:require when needed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&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 insert = table.insert&lt;br /&gt;
local process_params = require_when_needed(&amp;quot;Module:parameters&amp;quot;, &amp;quot;process&amp;quot;)&lt;br /&gt;
local trim = mw.text.trim&lt;br /&gt;
local lower = mw.ustring.lower&lt;br /&gt;
local dump = mw.dumpObject&lt;br /&gt;
&lt;br /&gt;
local etymology_module = &amp;quot;Module:etymology&amp;quot;&lt;br /&gt;
local etymology_specialized_module = &amp;quot;Module:etymology/specialized&amp;quot;&lt;br /&gt;
local parameter_utilities_module = &amp;quot;Module:parameter utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- For testing&lt;br /&gt;
local force_cat = false&lt;br /&gt;
&lt;br /&gt;
local allowed_conjs = {&amp;quot;and&amp;quot;, &amp;quot;or&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;/&amp;quot;, &amp;quot;~&amp;quot;, &amp;quot;;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
local function parse_etym_args(parent_args, base_params, has_dest_lang)&lt;br /&gt;
	local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local sourcearg, termarg&lt;br /&gt;
	if has_dest_lang then&lt;br /&gt;
		sourcearg, termarg = 2, 3&lt;br /&gt;
	else&lt;br /&gt;
		sourcearg, termarg = 1, 2&lt;br /&gt;
	end&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = base_params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = termarg,&lt;br /&gt;
		track_module = &amp;quot;etymology&amp;quot;,&lt;br /&gt;
		lang = function(args)&lt;br /&gt;
			return args[sourcearg][#args[sourcearg]]&lt;br /&gt;
		end,&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
		-- Don&#039;t do this, doesn&#039;t seem to make sense.&lt;br /&gt;
		-- parse_lang_prefix = true,&lt;br /&gt;
		make_separate_g_into_list = true,&lt;br /&gt;
		splitchar = &amp;quot;,&amp;quot;,&lt;br /&gt;
		subitem_param_handling = &amp;quot;last&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	-- If term param 3= is empty, there will be no terms in terms.terms. To facilitate further code and for&lt;br /&gt;
	-- compatibility,, insert one. It will display as &amp;lt;small&amp;gt;[Term?]&amp;lt;/small&amp;gt;.&lt;br /&gt;
	if not terms.terms[1] then&lt;br /&gt;
		terms.terms[1] = {&lt;br /&gt;
			lang = args[sourcearg][#args[sourcearg]],&lt;br /&gt;
			sc = args.sc,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return terms.terms, args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function export.parse_2_lang_args(parent_args, has_text, no_family)&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[2] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			sublist = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			family = not no_family,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[3] = true,&lt;br /&gt;
		[4] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[5] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
		[&amp;quot;senseid&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = boolean,&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;sourceconj&amp;quot;] = true,&lt;br /&gt;
		[&amp;quot;conj&amp;quot;] = {set = allowed_conjs, default = &amp;quot;,&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	if has_text then&lt;br /&gt;
		params[&amp;quot;notext&amp;quot;] = boolean&lt;br /&gt;
		params[&amp;quot;nocap&amp;quot;] = boolean&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return parse_etym_args(parent_args, params, &amp;quot;has dest lang&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of deprecated {{etyl}}. Provided to make histories more legible.&lt;br /&gt;
function export.etyl(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = {type = &amp;quot;language&amp;quot;, default = &amp;quot;en&amp;quot;},&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = {},&lt;br /&gt;
	}&lt;br /&gt;
	-- Empty language means English, but &amp;quot;-&amp;quot; means no language. Yes, confusing...&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	if args[2] and trim(args[2]) == &amp;quot;-&amp;quot; then&lt;br /&gt;
		params[2] = nil&lt;br /&gt;
		args = process_params({&lt;br /&gt;
			[1] = args[1],&lt;br /&gt;
			[&amp;quot;sort&amp;quot;] = args.sort&lt;br /&gt;
		}, params)&lt;br /&gt;
	else&lt;br /&gt;
		args = process_params(args, params)&lt;br /&gt;
	end&lt;br /&gt;
	return require(etymology_module).format_source {&lt;br /&gt;
		lang = args[2],&lt;br /&gt;
		source = args[1],&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of {{derived}}/{{der}}.&lt;br /&gt;
function export.derived(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	return require(etymology_module).format_derived {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		template_name = &amp;quot;derived&amp;quot;,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implementation of {{borrowed}}/{{bor}}.&lt;br /&gt;
function export.borrowed(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	return require(etymology_module).format_borrowed {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.inherited(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args)&lt;br /&gt;
	local sources = args[2]&lt;br /&gt;
	if sources[2] then&lt;br /&gt;
		-- Because this doesn&#039;t really make sense.&lt;br /&gt;
		error(&amp;quot;[[Template:inherited]] doesn&#039;t support multiple comma-separated sources&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return require(etymology_module).format_inherited {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.cognate(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {&lt;br /&gt;
			required = true,&lt;br /&gt;
			sublist = true,&lt;br /&gt;
			type = &amp;quot;language&amp;quot;,&lt;br /&gt;
			family = true,&lt;br /&gt;
			default = &amp;quot;und&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[2] = true,&lt;br /&gt;
		[3] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[4] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
		sourceconj = true,&lt;br /&gt;
		[&amp;quot;conj&amp;quot;] = {set = allowed_conjs, default = &amp;quot;,&amp;quot;},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = parse_etym_args(parent_args, params, false)&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_cognate {&lt;br /&gt;
		sources = args[1],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.noncognate(frame)&lt;br /&gt;
	return export.cognate(frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Supports various specialized types of borrowings, according to `frame.args.bortype`:&lt;br /&gt;
--   &amp;quot;learned&amp;quot; = {{lbor}}/{{learned borrowing}}&lt;br /&gt;
--   &amp;quot;semi-learned&amp;quot; = {{slbor}}/{{semi-learned borrowing}}&lt;br /&gt;
--   &amp;quot;orthographic&amp;quot; = {{obor}}/{{orthographic borrowing}}&lt;br /&gt;
--   &amp;quot;unadapted&amp;quot; = {{ubor}}/{{unadapted borrowing}}&lt;br /&gt;
--   &amp;quot;calque&amp;quot; = {{cal}}/{{calque}}&lt;br /&gt;
--   &amp;quot;partial-calque&amp;quot; = {{pcal}}/{{partial calque}}&lt;br /&gt;
--   &amp;quot;semantic-loan&amp;quot; = {{sl}}/{{semantic loan}}&lt;br /&gt;
--   &amp;quot;transliteration&amp;quot; = {{translit}}/{{transliteration}}&lt;br /&gt;
--   &amp;quot;phono-semantic-matching&amp;quot; = {{psm}}/{{phono-semantic matching}}&lt;br /&gt;
function export.specialized_borrowing(frame)&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local terms, args = export.parse_2_lang_args(parent_args, &amp;quot;has text&amp;quot;)&lt;br /&gt;
	local m_etymology_specialized = require(etymology_specialized_module)&lt;br /&gt;
	return m_etymology_specialized.specialized_borrowing {&lt;br /&gt;
		bortype = frame.args.bortype,&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		sources = args[2],&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		nocap = args.nocap,&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		sourceconj = args.sourceconj,&lt;br /&gt;
		conj = args.conj,&lt;br /&gt;
		senseid = args.senseid,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{abbrev}}, {{back-formation}}, {{clipping}}, {{ellipsis}},&lt;br /&gt;
-- {{rebracketing}} and {{reduplication}} that have a single associated term.&lt;br /&gt;
function export.misc_variant(frame)&lt;br /&gt;
	local iparams = {&lt;br /&gt;
		[&amp;quot;ignore-params&amp;quot;] = true,&lt;br /&gt;
		text = {required = true},&lt;br /&gt;
		oftext = true,&lt;br /&gt;
		cat = {list = true}, -- allow and compress holes&lt;br /&gt;
		conj = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local iargs = process_params(frame.args, iparams)&lt;br /&gt;
&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = true,&lt;br /&gt;
		[3] = {alias_of = &amp;quot;alt&amp;quot;},&lt;br /&gt;
		[4] = {alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
		nocap = boolean, -- should be processed in the template itself&lt;br /&gt;
		notext = boolean,&lt;br /&gt;
		nocat = boolean,&lt;br /&gt;
		conj = {set = allowed_conjs},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- |ignore-params= parameter to module invocation specifies&lt;br /&gt;
	-- additional parameter names to allow  in template invocation, separated by&lt;br /&gt;
	-- commas. They must consist of ASCII letters or numbers or hyphens.&lt;br /&gt;
	local ignore_params = iargs[&amp;quot;ignore-params&amp;quot;]&lt;br /&gt;
	if ignore_params then&lt;br /&gt;
		ignore_params = trim(ignore_params)&lt;br /&gt;
		if not ignore_params:match(&amp;quot;^[%w%-,]+$&amp;quot;) then&lt;br /&gt;
			error(&amp;quot;Invalid characters in |ignore-params=: &amp;quot; .. ignore_params:gsub(&amp;quot;[%w%-,]+&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		for param in ignore_params:gmatch(&amp;quot;[%w%-]+&amp;quot;) do&lt;br /&gt;
			if params[param] then&lt;br /&gt;
				error(&amp;quot;Duplicate param |&amp;quot; .. param&lt;br /&gt;
					.. &amp;quot; in |ignore-params=: already specified in params&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			params[param] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 2,&lt;br /&gt;
		track_module = &amp;quot;etymology&amp;quot;,&lt;br /&gt;
		-- Don&#039;t set lang here as we want to know whether there was a lang prefix or not.&lt;br /&gt;
		sc = &amp;quot;sc&amp;quot;,&lt;br /&gt;
		parse_lang_prefix = true,&lt;br /&gt;
		allow_multiple_lang_prefixes = true,&lt;br /&gt;
		make_separate_g_into_list = true,&lt;br /&gt;
		splitchar = &amp;quot;,&amp;quot;,&lt;br /&gt;
		subitem_param_handling = &amp;quot;last&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_misc_variant {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		text = iargs.text,&lt;br /&gt;
		oftext = iargs.oftext,&lt;br /&gt;
		terms = terms.terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		conj = args.conj or iargs.conj or &amp;quot;and&amp;quot;,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		cats = iargs.cat,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{doublet}} that can take multiple terms. Doesn&#039;t handle {{blend}}&lt;br /&gt;
-- or {{univerbation}}, which display + signs between elements and use compound_like in [[Module:affix/templates]].&lt;br /&gt;
function export.misc_variant_multiple_terms(frame)&lt;br /&gt;
	local iparams = {&lt;br /&gt;
		text = {required = true},&lt;br /&gt;
		oftext = true,&lt;br /&gt;
		cat = {list = true}, -- allow and compress holes&lt;br /&gt;
		conj = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local iargs = process_params(frame.args, iparams)&lt;br /&gt;
&lt;br /&gt;
	local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, type = &amp;quot;language&amp;quot;, template_default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = {list = true, allow_holes = true},&lt;br /&gt;
		nocap = boolean, -- should be processed in the template itself&lt;br /&gt;
		notext = boolean,&lt;br /&gt;
		nocat = boolean,&lt;br /&gt;
		conj = {set = allowed_conjs},&lt;br /&gt;
		sort = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    local m_param_utils = require(parameter_utilities_module)&lt;br /&gt;
	local param_mods = m_param_utils.construct_param_mods {&lt;br /&gt;
		-- We want to require an index for all params.&lt;br /&gt;
		{default = true, require_index = true},&lt;br /&gt;
		{group = {&amp;quot;link&amp;quot;, &amp;quot;q&amp;quot;, &amp;quot;l&amp;quot;, &amp;quot;ref&amp;quot;}},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local terms, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {&lt;br /&gt;
		params = params,&lt;br /&gt;
		param_mods = param_mods,&lt;br /&gt;
		raw_args = parent_args,&lt;br /&gt;
		termarg = 2,&lt;br /&gt;
		parse_lang_prefix = true,&lt;br /&gt;
		allow_multiple_lang_prefixes = true,&lt;br /&gt;
		track_module = &amp;quot;etymology-templates-doublet&amp;quot;,&lt;br /&gt;
		disallow_custom_separators = true,&lt;br /&gt;
		-- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do&lt;br /&gt;
		-- {{suffix|lang||foo}} to generate &amp;quot;+ -foo&amp;quot;.&lt;br /&gt;
		dont_skip_items = true,&lt;br /&gt;
		-- Don&#039;t set lang here as we want to know whether there was a lang prefix or not.&lt;br /&gt;
		sc = &amp;quot;sc.default&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return require(etymology_module).format_misc_variant {&lt;br /&gt;
		lang = args[1],&lt;br /&gt;
		notext = args.notext,&lt;br /&gt;
		text = iargs.text,&lt;br /&gt;
		oftext = iargs.oftext,&lt;br /&gt;
		terms = terms,&lt;br /&gt;
		sort_key = args.sort,&lt;br /&gt;
		conj = args.conj or iargs.conj or &amp;quot;and&amp;quot;,&lt;br /&gt;
		nocat = args.nocat,&lt;br /&gt;
		cats = iargs.cat,&lt;br /&gt;
		force_cat = force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{unknown}} that have no associated terms.&lt;br /&gt;
do&lt;br /&gt;
	local function get_args(frame)&lt;br /&gt;
		local boolean = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
		local params = {&lt;br /&gt;
			[1] = {required = true, type = &amp;quot;language&amp;quot;, default = &amp;quot;und&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
			[&amp;quot;title&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;nocap&amp;quot;] = boolean, -- should be processed in the template itself&lt;br /&gt;
			[&amp;quot;notext&amp;quot;] = boolean,&lt;br /&gt;
			[&amp;quot;nocat&amp;quot;] = boolean,&lt;br /&gt;
			[&amp;quot;sort&amp;quot;] = true,&lt;br /&gt;
		}&lt;br /&gt;
		if frame.args.title2_alias then&lt;br /&gt;
			params[2] = {alias_of = &amp;quot;title&amp;quot;}&lt;br /&gt;
		end&lt;br /&gt;
		return process_params(frame:getParent().args, params)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function export.misc_variant_no_term(frame)&lt;br /&gt;
		local args = get_args(frame)&lt;br /&gt;
&lt;br /&gt;
		return require(etymology_module).format_misc_variant_no_term {&lt;br /&gt;
			lang = args[1],&lt;br /&gt;
			notext = args.notext,&lt;br /&gt;
			title = args.title or frame.args.text,&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			cat = frame.args.cat,&lt;br /&gt;
			sort_key = args.sort,&lt;br /&gt;
			force_cat = force_cat,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- This function works similarly to misc_variant_no_term(), but with some automatic linking to the glossary in&lt;br /&gt;
	-- `title`.&lt;br /&gt;
	function export.onomatopoeia(frame)&lt;br /&gt;
		local args = get_args(frame)&lt;br /&gt;
&lt;br /&gt;
		local title = args.title&lt;br /&gt;
		if title and (lower(title) == &amp;quot;imitative&amp;quot; or lower(title) == &amp;quot;imitation&amp;quot;) then&lt;br /&gt;
			title = &amp;quot;[[wikt:Appendix:Glossary#imitative|&amp;quot; .. title .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return require(etymology_module).format_misc_variant_no_term {&lt;br /&gt;
			lang = args[1],&lt;br /&gt;
			notext = args.notext,&lt;br /&gt;
			title = title or frame.args.text,&lt;br /&gt;
			nocat = args.nocat,&lt;br /&gt;
			cat = frame.args.cat,&lt;br /&gt;
			sort_key = args.sort,&lt;br /&gt;
			force_cat = force_cat,&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Template:Der&amp;diff=491413</id>
		<title>Template:Der</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Template:Der&amp;diff=491413"/>
		<updated>2026-03-24T23:14:57Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:etymology/templates|derived}}&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;noinclude&amp;gt;{{lua|etymology/templates/derived}}{{documentation}}[[category:Templates]][[category:Contionary templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:etymology&amp;diff=491412</id>
		<title>Module:etymology</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:etymology&amp;diff=491412"/>
		<updated>2026-03-24T23:14:17Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
-- For testing&lt;br /&gt;
local force_cat = false&lt;br /&gt;
&lt;br /&gt;
local languages_module = &amp;quot;Module:languages&amp;quot;&lt;br /&gt;
local links_module = &amp;quot;Module:links&amp;quot;&lt;br /&gt;
local pron_qualifier_module = &amp;quot;Module:pron qualifier&amp;quot;&lt;br /&gt;
local table_module = &amp;quot;Module:table&amp;quot;&lt;br /&gt;
local utilities_module = &amp;quot;Module:utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local new_title = mw.title.new&lt;br /&gt;
&lt;br /&gt;
local function format_categories(...)&lt;br /&gt;
	format_categories = require(utilities_module).format_categories&lt;br /&gt;
	return format_categories(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format_qualifiers(...)&lt;br /&gt;
	format_qualifiers = require(pron_qualifier_module).format_qualifiers&lt;br /&gt;
	return format_qualifiers(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function full_link(...)&lt;br /&gt;
	full_link = require(links_module).full_link&lt;br /&gt;
	return full_link(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_language_data_module_name(...)&lt;br /&gt;
	get_language_data_module_name = require(languages_module).getDataModuleName&lt;br /&gt;
	return get_language_data_module_name(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_link_page(...)&lt;br /&gt;
	get_link_page = require(links_module).get_link_page&lt;br /&gt;
	return get_link_page(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function language_link(...)&lt;br /&gt;
	language_link = require(links_module).language_link&lt;br /&gt;
	return language_link(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function serial_comma_join(...)&lt;br /&gt;
	serial_comma_join = require(table_module).serialCommaJoin&lt;br /&gt;
	return serial_comma_join(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function shallow_copy(...)&lt;br /&gt;
	shallow_copy = require(table_module).shallowCopy&lt;br /&gt;
	return shallow_copy(...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function join_segs(segs, conj)&lt;br /&gt;
	if not segs[2] then&lt;br /&gt;
		return segs[1]&lt;br /&gt;
	elseif conj == &amp;quot;and&amp;quot; or conj == &amp;quot;or&amp;quot; then&lt;br /&gt;
		return serial_comma_join(segs, {conj = conj})&lt;br /&gt;
	end&lt;br /&gt;
	local sep&lt;br /&gt;
	if conj == &amp;quot;,&amp;quot; or conj == &amp;quot;;&amp;quot; then&lt;br /&gt;
		sep = conj .. &amp;quot; &amp;quot;&lt;br /&gt;
	elseif conj == &amp;quot;/&amp;quot; then&lt;br /&gt;
		sep = &amp;quot;/&amp;quot;&lt;br /&gt;
	elseif conj == &amp;quot;~&amp;quot; then&lt;br /&gt;
		sep = &amp;quot; ~ &amp;quot;&lt;br /&gt;
	elseif conj then&lt;br /&gt;
		error((&amp;quot;Internal error: Unrecognized conjunction \&amp;quot;%s\&amp;quot;&amp;quot;):format(conj))&lt;br /&gt;
	else&lt;br /&gt;
		error((&amp;quot;Internal error: No value supplied for conjunction&amp;quot;):format(conj))&lt;br /&gt;
	end&lt;br /&gt;
	return concat(segs, sep)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns true if `lang` is the same as `source`, or a variety of it.&lt;br /&gt;
local function lang_is_source(lang, source)&lt;br /&gt;
	return lang:getCode() == source:getCode() or lang:hasParent(source)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format one or more links as specified in `termobjs`, a list of term objects of the format accepted by `full_link()` in&lt;br /&gt;
[[Module:links]], additionally with optional qualifiers, labels and references. `conj` is used to join multiple terms&lt;br /&gt;
and must be specified if there is more than one term. `template_name` is the template name used in debug tracking and&lt;br /&gt;
must be specified. Optional `sourcetext` is text to prepend to the concatenated terms, separated by a space if the&lt;br /&gt;
concatenated terms are non-empty (which is always the case unless there is a single term with the value &amp;quot;-&amp;quot;). If&lt;br /&gt;
`qualifiers_labels_on_outside` is given, any qualifiers, labels or references specified in the first term go on the&lt;br /&gt;
outside of (i.e before) `sourcetext`; otherwise they will end up on the inside.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_links(termobjs, conj, template_name, sourcetext, qualifiers_labels_on_outside)&lt;br /&gt;
	if not template_name then&lt;br /&gt;
		error(&amp;quot;Internal error: Must specify `template_name` to format_links()&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	for i, termobj in ipairs(termobjs) do&lt;br /&gt;
		if termobj.lang:hasType(&amp;quot;family&amp;quot;) or termobj.lang:getFamilyCode() == &amp;quot;qfa-sub&amp;quot; then&lt;br /&gt;
			termobj.term = &amp;quot;-&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if termobj.term == &amp;quot;-&amp;quot; then&lt;br /&gt;
			termobjs[i] = i == 1 and sourcetext or &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			if i == 1 and qualifiers_labels_on_outside and sourcetext then&lt;br /&gt;
				termobj.pretext = sourcetext .. &amp;quot; &amp;quot;&lt;br /&gt;
				sourcetext = nil&lt;br /&gt;
			end&lt;br /&gt;
			termobjs[i] = (i == 1 and sourcetext and sourcetext .. &amp;quot; &amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
				full_link(termobj, &amp;quot;term&amp;quot;, nil, &amp;quot;show qualifiers&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return join_segs(termobjs, conj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.get_display_and_cat_name(source, raw)&lt;br /&gt;
	local display, cat_name&lt;br /&gt;
	if source:getCode() == &amp;quot;und&amp;quot; then&lt;br /&gt;
		display = &amp;quot;undetermined&amp;quot;&lt;br /&gt;
		cat_name = &amp;quot;other languages&amp;quot;&lt;br /&gt;
	elseif source:getCode() == &amp;quot;mul&amp;quot; then&lt;br /&gt;
		display = raw and &amp;quot;translingual&amp;quot; or &amp;quot;[[w:Translingualism|translingual]]&amp;quot;&lt;br /&gt;
		cat_name = &amp;quot;Translingual&amp;quot;&lt;br /&gt;
	elseif source:getCode() == &amp;quot;mul-tax&amp;quot; then&lt;br /&gt;
		display = raw and &amp;quot;taxonomic name&amp;quot; or &amp;quot;[[w:Biological nomenclature|taxonomic name]]&amp;quot;&lt;br /&gt;
		cat_name = &amp;quot;taxonomic names&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		display = raw and source:getCanonicalName() or source:makeWikipediaLink()&lt;br /&gt;
		cat_name = source:getDisplayForm()&lt;br /&gt;
	end&lt;br /&gt;
	return display, cat_name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.insert_source_cat_get_display(data)&lt;br /&gt;
	local categories, lang, source = data.categories, data.lang, data.source&lt;br /&gt;
	local display, cat_name = export.get_display_and_cat_name(source, data.raw)&lt;br /&gt;
&lt;br /&gt;
	if lang and not data.nocat then&lt;br /&gt;
		-- Add the category, but only if there is a current language&lt;br /&gt;
		if not categories then&lt;br /&gt;
			categories = {}&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local langname = lang:getFullName()&lt;br /&gt;
		-- If `lang` is an etym-only language, we need to check both it and its parent full language against `source`.&lt;br /&gt;
		-- Otherwise if e.g. `lang` is Medieval Latin and `source` is Latin, we&#039;ll end up wrongly constructing a&lt;br /&gt;
		-- category &#039;Latin terms derived from Latin&#039;.&lt;br /&gt;
		insert(categories, langname .. (&lt;br /&gt;
			lang_is_source(lang, source) and &amp;quot; terms borrowed back into &amp;quot; .. cat_name or&lt;br /&gt;
			&amp;quot; &amp;quot; .. (data.borrowing_type or &amp;quot;terms derived&amp;quot;) .. &amp;quot; from &amp;quot; .. cat_name&lt;br /&gt;
		))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return display, categories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.format_source(data)&lt;br /&gt;
	local lang, sort_key = data.lang, data.sort_key&lt;br /&gt;
&lt;br /&gt;
	local display, categories = export.insert_source_cat_get_display(data)&lt;br /&gt;
	if lang and not data.nocat then&lt;br /&gt;
		-- Format categories, but only if there is a current language; {{cog}} currently gets no categories&lt;br /&gt;
		categories = format_categories(categories, lang, sort_key, nil, data.force_cat or force_cat)&lt;br /&gt;
	else&lt;br /&gt;
		categories = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;lt;span class=\&amp;quot;etyl\&amp;quot;&amp;gt;&amp;quot; .. display .. categories .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Format sources for etymology templates such as {{tl|bor}}, {{tl|der}}, {{tl|inh}} and {{tl|cog}}. There may potentially&lt;br /&gt;
be more than one source language (except currently {{tl|inh}}, which doesn&#039;t support it because it doesn&#039;t really&lt;br /&gt;
make sense). In that case, all but the last source language is linked to the first term, but only if there is such a&lt;br /&gt;
term and this linking makes sense, i.e. either (1) the term page exists after stripping diacritics according to the&lt;br /&gt;
source language in question, or (2) the result of stripping diacritics according to the source language in question&lt;br /&gt;
results in a different page from the same process applied with the last source language. For example, {{m|ru|соля́нка}}&lt;br /&gt;
will link to [[солянка]] but {{m|en|соля́нка}} will link to [[соля́нка]] with an accent, and since they are different&lt;br /&gt;
pages, the use of English as a non-final source with term &#039;соля́нка&#039; will link to [[соля́нка]] even though it doesn&#039;t&lt;br /&gt;
exist, on the assumption that it is merely a redlink that might exist. If none of the above criteria apply, a non-final&lt;br /&gt;
source language will be linked to the Wikipedia entry for the language, just as final source languages always are.&lt;br /&gt;
&lt;br /&gt;
`data` contains the following fields:&lt;br /&gt;
* `lang`: The destination language object into which the terms were borrowed, inherited or otherwise derived. Used for&lt;br /&gt;
   categorization and can be nil, as with {{tl|cog}}.&lt;br /&gt;
* `sources`: List of source objects. Most commonly there is only one. If there are multiple, the non-final ones are&lt;br /&gt;
   handled specially; see above.&lt;br /&gt;
* `terms`: List of term objects. Most commonly there is only one. If there are multiple source objects as well as&lt;br /&gt;
   multiple term objects, the non-final source objects link to the first term object.&lt;br /&gt;
* `sort_key`: Sort key for categories. Usually nil.&lt;br /&gt;
* `categories`: Categories to add to the page. Additional categories may be added to `categories` based on the source&lt;br /&gt;
   languages (&#039;&#039;&#039;in which case `categories` is destructively modified&#039;&#039;&#039;). If `lang` is nil, no categories will be&lt;br /&gt;
   added.&lt;br /&gt;
* `nocat`: Don&#039;t add any categories to the page.&lt;br /&gt;
* `sourceconj`: Conjunction used to separate multiple source languages. Defaults to {&amp;quot;and&amp;quot;}. Currently recognized&lt;br /&gt;
   values are `and`, `or`, `,`, `;`, `/` and `~`.&lt;br /&gt;
* `borrowing_type`: Borrowing type used in categories, such as {&amp;quot;learned borrowings&amp;quot;}. Defaults to {&amp;quot;terms derived&amp;quot;}.&lt;br /&gt;
* `force_cat`: Force category generation on non-mainspace pages.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_sources(data)&lt;br /&gt;
	local lang, sources, terms, borrowing_type, sort_key, categories, nocat =&lt;br /&gt;
		data.lang, data.sources, data.terms, data.borrowing_type, data.sort_key, data.categories, data.nocat&lt;br /&gt;
	local term1, sources_n, source_segs = terms[1], #sources, {}&lt;br /&gt;
	local final_link_page&lt;br /&gt;
	local term1_term, term1_sc = term1.term, term1.sc&lt;br /&gt;
	if sources_n &amp;gt; 1 and term1_term and term1_term ~= &amp;quot;-&amp;quot; then&lt;br /&gt;
		final_link_page = get_link_page(term1_term, sources[sources_n], term1_sc)&lt;br /&gt;
	end&lt;br /&gt;
	for i, source in ipairs(sources) do&lt;br /&gt;
		local seg, display_term&lt;br /&gt;
		if i &amp;lt; sources_n and term1_term and term1_term ~= &amp;quot;-&amp;quot; then&lt;br /&gt;
			local link_page = get_link_page(term1_term, source, term1_sc)&lt;br /&gt;
			display_term = (link_page ~= final_link_page) or (link_page and not not new_title(link_page):getContent())&lt;br /&gt;
		end&lt;br /&gt;
		-- TODO: if the display forms or transliterations are different, display the terms separately.&lt;br /&gt;
		if display_term then&lt;br /&gt;
			local display, this_cats = export.insert_source_cat_get_display{&lt;br /&gt;
				lang = lang,&lt;br /&gt;
				source = source,&lt;br /&gt;
				borrowing_type = borrowing_type,&lt;br /&gt;
				raw = true,&lt;br /&gt;
				categories = categories,&lt;br /&gt;
				nocat = nocat,&lt;br /&gt;
			}&lt;br /&gt;
			seg = language_link {&lt;br /&gt;
				lang = source,&lt;br /&gt;
				term = term1_term,&lt;br /&gt;
				alt = display,&lt;br /&gt;
				tr = &amp;quot;-&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
			if lang and not nocat then&lt;br /&gt;
				-- Format categories, but only if there is a current language; {{cog}} currently gets no categories&lt;br /&gt;
				this_cats = format_categories(this_cats, lang, sort_key, nil, data.force_cat or force_cat)&lt;br /&gt;
			else&lt;br /&gt;
				this_cats = &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			seg = &amp;quot;&amp;lt;span class=\&amp;quot;etyl\&amp;quot;&amp;gt;&amp;quot; .. seg .. this_cats .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			seg = export.format_source{&lt;br /&gt;
				lang = lang,&lt;br /&gt;
				source = source,&lt;br /&gt;
				borrowing_type = borrowing_type,&lt;br /&gt;
				sort_key = sort_key,&lt;br /&gt;
				categories = categories,&lt;br /&gt;
				nocat = nocat,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		insert(source_segs, seg)&lt;br /&gt;
	end&lt;br /&gt;
	return join_segs(source_segs, data.sourceconj or &amp;quot;and&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Internal implementation of {{cognate}}/{{cog}} template.&lt;br /&gt;
function export.format_cognate(data)&lt;br /&gt;
	return export.format_derived {&lt;br /&gt;
		sources = data.sources,&lt;br /&gt;
		terms = data.terms,&lt;br /&gt;
		sort_key = data.sort_key,&lt;br /&gt;
		sourceconj = data.sourceconj,&lt;br /&gt;
		conj = data.conj,&lt;br /&gt;
		template_name = &amp;quot;cognate&amp;quot;,&lt;br /&gt;
		force_cat = data.force_cat,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Internal implementation of {{derived}}/{{der}} template. This dispThis is called externally from [[Module:affix]],&lt;br /&gt;
[[Module:affixusex]] and [[Module:see]] and needs to support qualifiers, labels and references on the outside&lt;br /&gt;
of the sources for use by those modules.&lt;br /&gt;
&lt;br /&gt;
`data` contains the following fields:&lt;br /&gt;
* `lang`: The destination language object into which the terms were derived. Used for categorization and can be nil, as&lt;br /&gt;
   with {{tl|cog}}; in this case, no categories are added.&lt;br /&gt;
* `sources`: List of source objects. Most commonly there is only one. If there are multiple, the non-final ones are&lt;br /&gt;
   handled specially; see `format_sources()`.&lt;br /&gt;
* `terms`: List of term objects. Most commonly there is only one. If there are multiple source objects as well as&lt;br /&gt;
   multiple term objects, the non-final source objects link to the first term object.&lt;br /&gt;
* `conj`: Conjunction used to separate multiple terms. &#039;&#039;&#039;Required&#039;&#039;&#039;. Currently recognized values are `and`, `or`, `,`,&lt;br /&gt;
   `;`, `/` and `~`.&lt;br /&gt;
* `sourceconj`: Conjunction used to separate multiple source languages. Defaults to {&amp;quot;and&amp;quot;}. Currently recognized&lt;br /&gt;
   values are as for `conj` above.&lt;br /&gt;
* `qualifiers_labels_on_outside`: If specified, any qualifiers, labels or references in the first term in `terms` will&lt;br /&gt;
   be displayed on the outside of (before) the source language(s) in `sources`. Normally this should be specified if&lt;br /&gt;
   there is only one term possible in `terms`.&lt;br /&gt;
* `template_name`: Name of the template invoking this function. Must be specified. Only used for tracking pages.&lt;br /&gt;
* `sort_key`: Sort key for categories. Usually nil.&lt;br /&gt;
* `categories`: Categories to add to the page. Additional categories may be added to `categories` based on the source&lt;br /&gt;
   languages (&#039;&#039;&#039;in which case `categories` is destructively modified&#039;&#039;&#039;). If `lang` is nil, no categories will be&lt;br /&gt;
   added.&lt;br /&gt;
* `nocat`: Don&#039;t add any categories to the page.&lt;br /&gt;
* `borrowing_type`: Borrowing type used in categories, such as {&amp;quot;learned borrowings&amp;quot;}. Defaults to {&amp;quot;terms derived&amp;quot;}.&lt;br /&gt;
* `force_cat`: Force category generation on non-mainspace pages.&lt;br /&gt;
]==]&lt;br /&gt;
function export.format_derived(data)&lt;br /&gt;
	local terms = data.terms&lt;br /&gt;
	local sourcetext = export.format_sources(data)&lt;br /&gt;
	return export.format_links(terms, data.conj, data.template_name, sourcetext, data.qualifiers_labels_on_outside)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.insert_borrowed_cat(categories, lang, source)&lt;br /&gt;
	if lang_is_source(lang, source) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	-- If both are the same, we want e.g. [[:Category:English terms borrowed back into English]] not&lt;br /&gt;
	-- [[:Category:English terms borrowed from English]]; the former is inserted automatically by format_source().&lt;br /&gt;
	-- The second parameter here doesn&#039;t matter as it only affects `display`, which we don&#039;t use.&lt;br /&gt;
	insert(categories, lang:getFullName() .. &amp;quot; terms borrowed from &amp;quot; .. select(2, export.get_display_and_cat_name(source, &amp;quot;raw&amp;quot;)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Internal implementation of {{borrowed}}/{{bor}} template.&lt;br /&gt;
function export.format_borrowed(data)&lt;br /&gt;
	local categories = {}&lt;br /&gt;
&lt;br /&gt;
	if not data.nocat then&lt;br /&gt;
		local lang = data.lang&lt;br /&gt;
		for _, source in ipairs(data.sources) do&lt;br /&gt;
			export.insert_borrowed_cat(categories, lang, source)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	data = shallow_copy(data)&lt;br /&gt;
	data.categories = categories&lt;br /&gt;
&lt;br /&gt;
	return export.format_links(data.terms, data.conj, &amp;quot;borrowed&amp;quot;, export.format_sources(data))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	-- Generate the non-ancestor error message.&lt;br /&gt;
	local function show_language(lang)&lt;br /&gt;
		local retval = (&amp;quot;%s (%s)&amp;quot;):format(lang:makeCategoryLink(), lang:getCode())&lt;br /&gt;
		if lang:hasType(&amp;quot;etymology-only&amp;quot;) then&lt;br /&gt;
			retval = retval .. (&amp;quot; (an etymology-only language whose regular parent is %s)&amp;quot;):format(&lt;br /&gt;
				show_language(lang:getParent()))&lt;br /&gt;
		end&lt;br /&gt;
		return retval&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Check that `lang` has `otherlang` (which may be an etymology-only language) as an ancestor. Throw an error if&lt;br /&gt;
	-- not. When `lang` is a family, verifies that `otherlang` is a language in that family.&lt;br /&gt;
	function export.check_ancestor(lang, otherlang)&lt;br /&gt;
		-- When `lang` is a family, verify `otherlang` is in that family or in its parent family.&lt;br /&gt;
		if lang.hasType and lang:hasType(&amp;quot;family&amp;quot;) then&lt;br /&gt;
			local family_code = lang:getCode()&lt;br /&gt;
			local function in_family_code(fcode, other)&lt;br /&gt;
				if not fcode or fcode == &amp;quot;&amp;quot; then return false end&lt;br /&gt;
				if other.inFamily and other:inFamily(fcode) then return true end&lt;br /&gt;
				if other.getFamilyCode and other:getFamilyCode() == fcode then return true end&lt;br /&gt;
				return false&lt;br /&gt;
			end&lt;br /&gt;
			local in_family = in_family_code(family_code, otherlang)&lt;br /&gt;
			if not in_family then&lt;br /&gt;
				local parent_code&lt;br /&gt;
				if lang.getParent then&lt;br /&gt;
					local parent_family = lang:getParent()&lt;br /&gt;
					if parent_family and parent_family.getCode then&lt;br /&gt;
						parent_code = parent_family:getCode()&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not parent_code and family_code:find(&amp;quot;-&amp;quot;, 1, true) then&lt;br /&gt;
					parent_code = family_code:match(&amp;quot;^(.+)-[^-]+$&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				if parent_code then&lt;br /&gt;
					in_family = in_family_code(parent_code, otherlang)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not in_family then&lt;br /&gt;
				local other_display = (otherlang.getCanonicalName and otherlang:getCanonicalName()) or (otherlang.getCode and otherlang:getCode()) or tostring(otherlang)&lt;br /&gt;
				local fam_display = (lang.getCanonicalName and lang:getCanonicalName()) or family_code&lt;br /&gt;
				error((&amp;quot;%s is not in family %s; inherited ancestor under a family must be a language in that family or its parent family.&amp;quot;)&lt;br /&gt;
					:format(other_display, fam_display))&lt;br /&gt;
			end&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		-- FIXME: I don&#039;t know if this function works correctly with etym-only languages in `lang`. I have fixed up&lt;br /&gt;
		-- the module link code appropriately (June 2024) but the remaining logic is untouched.&lt;br /&gt;
		if lang:hasAncestor(otherlang) then&lt;br /&gt;
			-- [[Special:WhatLinksHere/Wiktionary:Tracking/etymology/variety]]&lt;br /&gt;
			-- Track inheritance from varieties of Latin that shouldn&#039;t have any descendants (everything except Old Latin, Classical Latin and Vulgar Latin).&lt;br /&gt;
			if otherlang:getFullCode() == &amp;quot;la&amp;quot; then&lt;br /&gt;
				otherlang = otherlang:getCode()&lt;br /&gt;
			end&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		local ancestors, postscript = lang:getAncestors()&lt;br /&gt;
		local etym_module_link = lang:hasType(&amp;quot;etymology-only&amp;quot;) and &amp;quot;[[Module:etymology languages/data]] or &amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
		local module_link = &amp;quot;[[&amp;quot; .. get_language_data_module_name(lang:getFullCode()) .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		if not ancestors[1] then&lt;br /&gt;
			postscript = show_language(lang) .. &amp;quot; has no ancestors.&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			local ancestor_list = {}&lt;br /&gt;
			for _, ancestor in ipairs(ancestors) do&lt;br /&gt;
				insert(ancestor_list, show_language(ancestor))&lt;br /&gt;
			end&lt;br /&gt;
			postscript = (&amp;quot;The ancestor%s of %s %s %s.&amp;quot;):format(&lt;br /&gt;
				ancestors[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;, lang:getCanonicalName(),&lt;br /&gt;
				ancestors[2] and &amp;quot;are&amp;quot; or &amp;quot;is&amp;quot;, concat(ancestor_list, &amp;quot; and &amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		error((&amp;quot;%s is not set as an ancestor of %s in %s%s. %s&amp;quot;)&lt;br /&gt;
			:format(show_language(otherlang), show_language(lang), etym_module_link, module_link, postscript))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Internal implementation of {{inherited}}/{{inh}} template.&lt;br /&gt;
function export.format_inherited(data)&lt;br /&gt;
	local lang, terms, nocat = data.lang, data.terms, data.nocat&lt;br /&gt;
	local source = terms[1].lang&lt;br /&gt;
	&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	if not nocat then&lt;br /&gt;
		insert(categories, lang:getFullName() .. &amp;quot; terms inherited from &amp;quot; .. source:getCanonicalName())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	export.check_ancestor(lang, source)&lt;br /&gt;
&lt;br /&gt;
	data = shallow_copy(data)&lt;br /&gt;
	data.categories = categories&lt;br /&gt;
	data.source = source&lt;br /&gt;
&lt;br /&gt;
	return export.format_links(terms, data.conj, &amp;quot;inherited&amp;quot;, export.format_source(data))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Internal implementation of &amp;quot;misc variant&amp;quot; templates such as {{abbrev}}, {{clipping}}, {{reduplication}} and the like.&lt;br /&gt;
function export.format_misc_variant(data)&lt;br /&gt;
	local lang, notext, terms, cats, parts = data.lang, data.notext, data.terms, data.cats, {}&lt;br /&gt;
&lt;br /&gt;
	if not notext then&lt;br /&gt;
		insert(parts, data.text)&lt;br /&gt;
	end&lt;br /&gt;
	if terms[1] then&lt;br /&gt;
		if not notext then&lt;br /&gt;
			-- FIXME: If term is given as &#039;-&#039;, we should consider displaying just &amp;quot;Clipping&amp;quot; not &amp;quot;Clipping of&amp;quot;.&lt;br /&gt;
			insert(parts, &amp;quot; &amp;quot; .. (data.oftext or &amp;quot;of&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		local termparts = {}&lt;br /&gt;
		-- Make links out of all the parts.&lt;br /&gt;
		for _, termobj in ipairs(terms) do&lt;br /&gt;
			local result&lt;br /&gt;
			if termobj.lang then&lt;br /&gt;
				result = export.format_derived {&lt;br /&gt;
					lang = lang,&lt;br /&gt;
					terms = {termobj},&lt;br /&gt;
					sources = termobj.termlangs or {termobj.lang},&lt;br /&gt;
					template_name = &amp;quot;misc_variant&amp;quot;,&lt;br /&gt;
					qualifiers_labels_on_outside = true,&lt;br /&gt;
					force_cat = data.force_cat,&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				termobj.lang = lang&lt;br /&gt;
				result = export.format_links({termobj}, nil, &amp;quot;misc_variant&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			table.insert(termparts, result)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local linktext = join_segs(termparts, data.conj)&lt;br /&gt;
		if not notext and linktext ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			insert(parts, &amp;quot; &amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		insert(parts, linktext)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	if not data.nocat and cats then&lt;br /&gt;
		for _, cat in ipairs(cats) do&lt;br /&gt;
			insert(categories, lang:getFullName() .. &amp;quot; &amp;quot; .. cat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if categories[1] then&lt;br /&gt;
		insert(parts, format_categories(categories, lang, data.sort_key, nil, data.force_cat or force_cat))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return concat(parts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Implementation of miscellaneous templates such as {{unknown}} and {{onomatopoeia}} that have no associated terms.&lt;br /&gt;
function export.format_misc_variant_no_term(data)&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	if not data.notext then&lt;br /&gt;
		insert(parts, data.title)&lt;br /&gt;
	end&lt;br /&gt;
	if not data.nocat and data.cat then&lt;br /&gt;
		local lang, categories = data.lang, {}&lt;br /&gt;
		insert(categories, lang:getFullName() .. &amp;quot; &amp;quot; .. data.cat)&lt;br /&gt;
		insert(parts, format_categories(categories, lang, data.sort_key, nil, data.force_cat or force_cat))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return concat(parts)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Template:Jugs-noun-blank-full&amp;diff=491397</id>
		<title>Template:Jugs-noun-blank-full</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Template:Jugs-noun-blank-full&amp;diff=491397"/>
		<updated>2026-03-24T21:27:49Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{inflection-table-top|palette=blue|title=Inflection of &#039;&#039;{{term|{{{nsi}}}}}&#039;&#039; {{#if: {{{mean|}}}|- &#039;&#039;&amp;quot;{{{mean}}}&amp;quot;&#039;&#039;}} ({{{stem}}})|tall=y}}&lt;br /&gt;
! rowspan=2 | &amp;lt;small&amp;gt;neutral&amp;lt;/small&amp;gt;&lt;br /&gt;
! colspan=2 | singular&lt;br /&gt;
! colspan=2 | plural&lt;br /&gt;
|-&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | indefinite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | definite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | indefinite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | definite&lt;br /&gt;
|-&lt;br /&gt;
! nominative&lt;br /&gt;
| {{jugs-noun-cell|{{{nsi}}}|nsi}}&lt;br /&gt;
| {{jugs-noun-cell|{{{nsd}}}|nsd}}&lt;br /&gt;
| {{jugs-noun-cell|{{{npi}}}|npi}}&lt;br /&gt;
| {{jugs-noun-cell|{{{npd}}}|npd}}&lt;br /&gt;
|-&lt;br /&gt;
! accusative&lt;br /&gt;
| {{jugs-noun-cell|{{{asi}}}|asi}}&lt;br /&gt;
| {{jugs-noun-cell|{{{asd}}}|asd}}&lt;br /&gt;
| {{jugs-noun-cell|{{{api}}}|api}}&lt;br /&gt;
| {{jugs-noun-cell|{{{apd}}}|apd}}&lt;br /&gt;
|-&lt;br /&gt;
! dative&lt;br /&gt;
| {{jugs-noun-cell|{{{dsi}}}|dsi}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dsd}}}|dsd}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dpi}}}|dpi}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dpd}}}|dpd}}&lt;br /&gt;
|-&lt;br /&gt;
! genitive&lt;br /&gt;
| {{jugs-noun-cell|{{{gsi}}}|gsi}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gsd}}}|gsd}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gpi}}}|gpi}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gpd}}}|gpd}}&lt;br /&gt;
|-&lt;br /&gt;
| class=separator colspan=6 |&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=2 | &amp;lt;small&amp;gt;laudative&amp;lt;/small&amp;gt;&lt;br /&gt;
! colspan=2 | singular&lt;br /&gt;
! colspan=2 | plural&lt;br /&gt;
|-&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | indefinite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | definite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | indefinite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | definite&lt;br /&gt;
|-&lt;br /&gt;
! nominative&lt;br /&gt;
| {{jugs-noun-cell|{{{nsi_la}}}|nsi_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{nsd_la}}}|nsd_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{npi_la}}}|npi_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{npd_la}}}|npd_la}}&lt;br /&gt;
|-&lt;br /&gt;
! accusative&lt;br /&gt;
| {{jugs-noun-cell|{{{asi_la}}}|asi_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{asd_la}}}|asd_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{api_la}}}|api_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{apd_la}}}|apd_la}}&lt;br /&gt;
|-&lt;br /&gt;
! dative&lt;br /&gt;
| {{jugs-noun-cell|{{{dsi_la}}}|dsi_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dsd_la}}}|dsd_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dpi_la}}}|dpi_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dpd_la}}}|dpd_la}}&lt;br /&gt;
|-&lt;br /&gt;
! genitive&lt;br /&gt;
| {{jugs-noun-cell|{{{gsi_la}}}|gsi_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gsd_la}}}|gsd_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gpi_la}}}|gpi_la}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gpd_la}}}|gpd_la}}&lt;br /&gt;
|-&lt;br /&gt;
| class=separator colspan=6 |&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=2 | &amp;lt;small&amp;gt;pejorative&amp;lt;/small&amp;gt;&lt;br /&gt;
! colspan=2 | singular&lt;br /&gt;
! colspan=2 | plural&lt;br /&gt;
|-&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | indefinite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | definite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | indefinite&lt;br /&gt;
! class=&amp;quot;secondary&amp;quot; | definite&lt;br /&gt;
|-&lt;br /&gt;
! nominative&lt;br /&gt;
| {{jugs-noun-cell|{{{nsi_pej}}}|nsi_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{nsd_pej}}}|nsd_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{npi_pej}}}|npi_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{npd_pej}}}|npd_pej}}&lt;br /&gt;
|-&lt;br /&gt;
! accusative&lt;br /&gt;
| {{jugs-noun-cell|{{{asi_pej}}}|asi_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{asd_pej}}}|asd_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{api_pej}}}|api_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{apd_pej}}}|apd_pej}}&lt;br /&gt;
|-&lt;br /&gt;
! dative&lt;br /&gt;
| {{jugs-noun-cell|{{{dsi_pej}}}|dsi_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dsd_pej}}}|dsd_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dpi_pej}}}|dpi_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{dpd_pej}}}|dpd_pej}}&lt;br /&gt;
|-&lt;br /&gt;
! genitive&lt;br /&gt;
| {{jugs-noun-cell|{{{gsi_pej}}}|gsi_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gsd_pej}}}|gsd_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gpi_pej}}}|gpi_pej}}&lt;br /&gt;
| {{jugs-noun-cell|{{{gpd_pej}}}|gpd_pej}}&lt;br /&gt;
{{inflection-table-bottom|notes={{#if:{{{notes|}}}|{{{notes}}}|}}}}{{#ifeq: {{NAMESPACENUMBER}}|120|&amp;lt;includeonly&amp;gt;[[Category:Jugsnorsk {{replace|{{{stem}}}|&#039;|}} nouns]]&amp;lt;/includeonly&amp;gt;|}}&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_%C5%8Dn-stem_nouns&amp;diff=491395</id>
		<title>Category:Jugsnorsk ōn-stem nouns</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_%C5%8Dn-stem_nouns&amp;diff=491395"/>
		<updated>2026-03-24T21:07:21Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[category:Jugsnorsk n-stem nouns|ō]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_n-stem_nouns&amp;diff=491394</id>
		<title>Category:Jugsnorsk n-stem nouns</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_n-stem_nouns&amp;diff=491394"/>
		<updated>2026-03-24T21:07:07Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[Category:Jugsnorsk nouns by inflection type|n]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_neuter_a-stem_nouns&amp;diff=491393</id>
		<title>Category:Jugsnorsk neuter a-stem nouns</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_neuter_a-stem_nouns&amp;diff=491393"/>
		<updated>2026-03-24T21:06:56Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[Category:Jugsnorsk a-stem nouns|n]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_common_a-stem_nouns&amp;diff=491392</id>
		<title>Category:Jugsnorsk common a-stem nouns</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_common_a-stem_nouns&amp;diff=491392"/>
		<updated>2026-03-24T21:06:43Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[category:Jugsnorsk a-stem nouns|c]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_a-stem_nouns&amp;diff=491391</id>
		<title>Category:Jugsnorsk a-stem nouns</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_a-stem_nouns&amp;diff=491391"/>
		<updated>2026-03-24T21:06:31Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[category:Jugsnorsk nouns by inflection type|a]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_nouns_by_inflection_type&amp;diff=491390</id>
		<title>Category:Jugsnorsk nouns by inflection type</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_nouns_by_inflection_type&amp;diff=491390"/>
		<updated>2026-03-24T21:06:07Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Jugsnorsk nouns|i]]&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_neuter_nouns&amp;diff=491389</id>
		<title>Category:Jugsnorsk neuter nouns</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_neuter_nouns&amp;diff=491389"/>
		<updated>2026-03-24T21:05:54Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[category:Jugsnorsk nouns by gender|n]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_common-gender_nouns&amp;diff=491388</id>
		<title>Category:Jugsnorsk common-gender nouns</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_common-gender_nouns&amp;diff=491388"/>
		<updated>2026-03-24T21:05:42Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[category:jugsnorsk nouns by gender|c]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_nouns_by_gender&amp;diff=491387</id>
		<title>Category:Jugsnorsk nouns by gender</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_nouns_by_gender&amp;diff=491387"/>
		<updated>2026-03-24T21:05:34Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Jugsnorsk nouns|g]]&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_nouns&amp;diff=491386</id>
		<title>Category:Jugsnorsk nouns</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_nouns&amp;diff=491386"/>
		<updated>2026-03-24T21:05:29Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Jugsnorsk lemmas|n]]&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Category:Jugsnorsk_lemmas&amp;diff=491385</id>
		<title>Category:Jugsnorsk lemmas</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Category:Jugsnorsk_lemmas&amp;diff=491385"/>
		<updated>2026-03-24T21:05:21Z</updated>

		<summary type="html">&lt;p&gt;Sware: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Jugsnorsk|Jugsnorsk]]&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>