<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.stiles.casa/index.php?action=history&amp;feed=atom&amp;title=Module%3ALang%2Fdocumentor_tool</id>
	<title>Module:Lang/documentor tool - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stiles.casa/index.php?action=history&amp;feed=atom&amp;title=Module%3ALang%2Fdocumentor_tool"/>
	<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:Lang/documentor_tool&amp;action=history"/>
	<updated>2026-04-04T03:05:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://wiki.stiles.casa/index.php?title=Module:Lang/documentor_tool&amp;diff=7975&amp;oldid=prev</id>
		<title>imported&gt;Trappist the monk at 19:34, 10 January 2022</title>
		<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:Lang/documentor_tool&amp;diff=7975&amp;oldid=prev"/>
		<updated>2022-01-10T19:34:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;Module:No globals&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------&amp;lt; P R I V A T E _ T A G S &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Lang/documentor tool|private_tags}}&lt;br /&gt;
&lt;br /&gt;
Reads the override{} table in Module:Lang/data and renders a wiki table of private tags and their associated languages&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function private_tags (frame)&lt;br /&gt;
	local override_t = mw.loadData (&amp;#039;Module:Lang/data&amp;#039;).override;				-- get the override table&lt;br /&gt;
	&lt;br /&gt;
	local private_t = {};&lt;br /&gt;
&lt;br /&gt;
	for tag, lang in pairs (override_t) do&lt;br /&gt;
		if tag:find (&amp;#039;%-x%-&amp;#039;) then&lt;br /&gt;
			table.insert (private_t, table.concat ({&amp;#039;\n|-\n|&amp;#039;, lang, &amp;#039;||&amp;#039;, tag}))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort (private_t)&lt;br /&gt;
&lt;br /&gt;
	table.insert (private_t, 1, &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;);&lt;br /&gt;
	table.insert (private_t, 2, &amp;#039;\n|+ Supported private-use IETF language tags&amp;#039;)&lt;br /&gt;
	table.insert (private_t, 3, &amp;#039;\n! Language !! Private-use tag&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	return table.concat (private_t) .. &amp;#039;\n|}&amp;#039;;&lt;br /&gt;
--	return &amp;#039;&amp;lt;pre&amp;gt;&amp;#039; .. table.concat (private_t) .. &amp;#039;\n|}&amp;#039; .. &amp;#039;&amp;lt;/pre&amp;gt;&amp;#039;&lt;br /&gt;
--error (mw.dumpObject (private_t))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------&amp;lt; L A N G - X X _ S E T T I N G S &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Lang/documentor tool|lang_xx_settings|template={{ROOTPAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
Reads the content of the template and extracts the parameters from {{#invoke:Lang|...}} for display on the template&amp;#039;s&lt;br /&gt;
documentation page.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function lang_xx_settings(frame)&lt;br /&gt;
	local page = mw.title.makeTitle(&amp;#039;Template&amp;#039;, frame.args[&amp;#039;template&amp;#039;] or frame.args[1])	-- get a page object for this page in &amp;#039;Template:&amp;#039; namespace&lt;br /&gt;
	if not page then&lt;br /&gt;
		return &amp;#039;&amp;#039;																-- TODO: error message?&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local content = page:getContent()											-- get unparsed content&lt;br /&gt;
	if not page then&lt;br /&gt;
		return &amp;#039;&amp;#039;																-- TODO: error message?&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
&lt;br /&gt;
	local params&lt;br /&gt;
	local style&lt;br /&gt;
&lt;br /&gt;
	if content:match(&amp;#039;{{%s*#invoke:%s*[Ll]ang%s*|[^|]+|[^}]+}}&amp;#039;) or content:match(&amp;#039;{{%s*#invoke:%s*[Ll]ang/sandbox%s*|[^|]+|[^}]+}}&amp;#039;) then			-- if this template uses [[Module:Lang]]&lt;br /&gt;
		params = content:match(&amp;#039;{{%s*#invoke:%s*[Ll]ang%s*|[^|]+(|[^}]+)}}&amp;#039;) or content:match(&amp;#039;{{%s*#invoke:%s*[Ll]ang/sandbox%s*|[^|]+(|[^}]+)}}&amp;#039;)	-- extract the #invoke:&amp;#039;s parameters&lt;br /&gt;
		if not params then &lt;br /&gt;
			return &amp;#039;&amp;#039;															-- there should be at least one or the template/module won&amp;#039;t work TODO: error message?&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(out, &amp;#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: right; float: right;&amp;quot;\n|+settings&amp;#039;)	-- start a wikitable&lt;br /&gt;
		for k, v in params:gmatch(&amp;#039;%s*|%s*([^%s=]+)%s*=%s*([^%s|]+)&amp;#039;) do		-- get the parameter names (k) and values (v)&lt;br /&gt;
			if &amp;#039;label&amp;#039; == k then												-- special case for labels because spaces and pipes&lt;br /&gt;
				v = params:match(&amp;#039;label%s*=%s*(%[%[[^%]]+%]%])&amp;#039;) or params:match(&amp;#039;label%s*=%s*([^|\n]+)&amp;#039;) or &amp;#039;missing label&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(out, table.concat({k, &amp;#039;\n|&amp;#039;, v}))						-- make rudimentary wikitable entries&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		style = content:match(&amp;#039;lang_xx_([^|]+)&amp;#039;)&lt;br /&gt;
		return table.concat({table.concat(out,&amp;#039;\n|-\n! scope=&amp;quot;row&amp;quot; | &amp;#039;), &amp;#039;\n|-\n|colspan=&amp;quot;2&amp;quot;|style: &amp;#039;, style, &amp;#039;\n|-\n|}&amp;#039;})	-- add inter-row markup and close the wikitable and done&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;																-- does not use [[Module:Lang]] so abandon quietly&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; U S E S _ M O D U L E &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Lang/documentor tool|uses_module|template={{ROOTPAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
Reads the content of the template to determine if this {{lang-xx}} template uses Module:Lang.&lt;br /&gt;
Returns the index of the substring &amp;#039;{{#invoke|lang|&amp;#039; in the template page content if true; empty string if false.&lt;br /&gt;
&lt;br /&gt;
Used in template documentation {{#if:}} parser functions.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function uses_module(frame)&lt;br /&gt;
	local page = mw.title.makeTitle(&amp;#039;Template&amp;#039;, frame.args[&amp;#039;template&amp;#039;] or frame.args[1])	-- get a page object for this page in &amp;#039;Template:&amp;#039; namespace&lt;br /&gt;
	if not page then&lt;br /&gt;
		return &amp;#039;&amp;#039;																-- TODO: error message?&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local content = page:getContent()											-- get unparsed content&lt;br /&gt;
	if not page then&lt;br /&gt;
		return &amp;#039;&amp;#039;																-- TODO: error message?&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return content:find(&amp;#039;{{%s*#invoke:[Ll]ang%s*|&amp;#039;) or &amp;#039;&amp;#039;						-- return index or empty string&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; S H A R E D _ C O D E &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
- Tables:&lt;br /&gt;
-- language_categories&lt;br /&gt;
-- error_messages&lt;br /&gt;
-- strings&lt;br /&gt;
&lt;br /&gt;
- Functions:&lt;br /&gt;
-- make_error(message, layout, parent_category, nocat)&lt;br /&gt;
-- get_language_link(language_name, language_code)&lt;br /&gt;
-- get_see_also_section(page_title, language_name, language_code)&lt;br /&gt;
-- get_hidden_category_template(frame)&lt;br /&gt;
-- get_top_section(frame)&lt;br /&gt;
-- get_bottom_section(frame, language_name, see_also_section, parent_category)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local language_categories = {&lt;br /&gt;
	[&amp;quot;LANGUAGES_SOURCES&amp;quot;] = &amp;quot;Articles with %s-language sources (%s)&amp;quot;,&lt;br /&gt;
	[&amp;quot;LANGUAGES_COLLECTIVE_SOURCES&amp;quot;] = &amp;quot;Articles with %s-collective sources (%s)&amp;quot;,&lt;br /&gt;
	[&amp;quot;CS1&amp;quot;] = &amp;quot;CS1 %s-language sources (%s)&amp;quot;,&lt;br /&gt;
	[&amp;quot;LANGUAGE_TEXT&amp;quot;] = &amp;quot;Articles containing %s-language text&amp;quot;,&lt;br /&gt;
	-- old version [&amp;quot;LANGUAGES_COLLECTIVE_TEXT&amp;quot;] = &amp;quot;Articles with text from the %s collective&amp;quot;,&lt;br /&gt;
	[&amp;quot;LANGUAGES_COLLECTIVE_TEXT&amp;quot;] = &amp;quot;Articles with text in %s&amp;quot;,&lt;br /&gt;
	[&amp;quot;ENGLISH&amp;quot;] = &amp;quot;Articles containing explicitly cited %s-language text&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local error_assistance = &amp;quot; Please see [[Template talk:Lang]] for assistance.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local error_messages = {&lt;br /&gt;
	[&amp;quot;ASSISTANCE&amp;quot;] = &amp;quot;Please see [[Template talk:Lang]] for assistance.&amp;quot;,&lt;br /&gt;
	[&amp;quot;INCORRECT_CATEGORY_TITLE&amp;quot;] = &amp;quot;[[:%s]] is not the category being populated by the {{tlx|%s}} template. The correct category is located at: [[:%s]].&amp;quot;,&lt;br /&gt;
	[&amp;quot;NO_CATEGORY_TITLE_FOUND&amp;quot;] = &amp;quot;No language category found for &amp;#039;&amp;#039;&amp;#039;%s.&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. error_assistance,&lt;br /&gt;
	[&amp;quot;NOT_VALID_CATEGORY_FORMAT&amp;quot;] = &amp;quot;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; is not a a valid category title.&amp;quot; .. error_assistance,&lt;br /&gt;
	[&amp;quot;NOT_VALID_LANGUAGE_CODE&amp;quot;] = &amp;quot;[[%s]] is not a valid ISO 639 or IETF language name.&amp;quot; .. error_assistance,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local strings = {&lt;br /&gt;
	[&amp;quot;ERROR_CATEGORY&amp;quot;] = &amp;quot;[[Category:Lang and lang-xx template errors]]&amp;quot;,&lt;br /&gt;
	[&amp;quot;ERROR_SPAN&amp;quot;] = &amp;#039;&amp;lt;span style=&amp;quot;font-size: 100%%; font-style: normal;&amp;quot; class=&amp;quot;error&amp;quot;&amp;gt;Error: %s &amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
	[&amp;quot;PURGE_DIV&amp;quot;] = &amp;#039;&amp;lt;div style=&amp;quot;font-size: x-small;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
	[&amp;quot;SEE_ALSO&amp;quot;] = &amp;quot;\n==See also==&amp;quot;,&lt;br /&gt;
	[&amp;quot;SEE_ALSO_ITEM&amp;quot;] = &amp;quot;* [[:%s]]&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; M A K E _ E R R O R &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Create an error message.&lt;br /&gt;
Does not place page in error category if args.nocat is used.&lt;br /&gt;
Does not categorize in parent cateogory if used in category namespace (usually for /testcases).&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_error(message, layout, parent_category, nocat)&lt;br /&gt;
	table.insert(layout, string.format(strings[&amp;quot;ERROR_SPAN&amp;quot;], message))&lt;br /&gt;
&lt;br /&gt;
	if not nocat then&lt;br /&gt;
		table.insert(layout, strings[&amp;quot;ERROR_CATEGORY&amp;quot;])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if mw.title.getCurrentTitle().nsText == &amp;quot;Category&amp;quot; then&lt;br /&gt;
		table.insert(layout, parent_category)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(layout)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; G E T _ L A N G U A G E _ L I N K &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Generates a language link for the correct style.&lt;br /&gt;
&lt;br /&gt;
Collective languages use the name_from_tag value,&lt;br /&gt;
while other languages use a display name of &amp;quot;x-language&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_language_link(language_name, language_code)&lt;br /&gt;
	local lang_module = require(&amp;#039;Module:Lang&amp;#039;)&lt;br /&gt;
	-- Is a language collective?&lt;br /&gt;
	if language_name:find(&amp;#039;languages&amp;#039;) then&lt;br /&gt;
		return lang_module.name_from_tag({language_code, link = &amp;quot;yes&amp;quot;})&lt;br /&gt;
	else&lt;br /&gt;
		return lang_module.name_from_tag({language_code, link = &amp;quot;yes&amp;quot;, label = lang_module.name_from_tag({language_code}) .. &amp;quot;-language&amp;quot;})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; G E T _ S E E _ A L S O _ S E C T I O N &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Generates a consistent style See also section for&lt;br /&gt;
{{Category articles containing non-English-language text}} and {{Non-English-language source category}}.&lt;br /&gt;
&lt;br /&gt;
If {{CS1 language sources}} is converted, it should also use it.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_see_also_section(page_title, language_name, language_code)&lt;br /&gt;
	local see_also_section = {}&lt;br /&gt;
&lt;br /&gt;
	for _, category_name in pairs(language_categories) do&lt;br /&gt;
		local category = mw.title.new(string.format(category_name, language_name, language_code), 14)&lt;br /&gt;
 		if category and page_title ~= category.text and category.exists then&lt;br /&gt;
			table.insert(see_also_section, string.format(strings[&amp;quot;SEE_ALSO_ITEM&amp;quot;], category.prefixedText))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.sort(see_also_section)&lt;br /&gt;
	table.insert(see_also_section, 1, strings[&amp;quot;SEE_ALSO&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
	if table.getn(see_also_section) == 1 then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return table.concat(see_also_section, &amp;quot;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; G E T _ H I D D E N _ C A T E G O R Y _ T E M P L A T E &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Generates the Template:Hidden category template.&lt;br /&gt;
&lt;br /&gt;
This function is separate from the get_top_section() function&lt;br /&gt;
as this should be used in both error categories and valid categories.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_hidden_category_template(frame)&lt;br /&gt;
	return frame:expandTemplate{title = &amp;#039;Hidden category&amp;#039;}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; G E T _ T O P _ S E C T I O N &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Generates a consistent top maintenance template section which consists of:&lt;br /&gt;
-- Template:Possibly empty category&lt;br /&gt;
-- Template:Purge&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_top_section(frame)&lt;br /&gt;
	local top_section = {}&lt;br /&gt;
	if mw.site.stats.pagesInCategory(mw.title.getCurrentTitle().text, &amp;quot;all&amp;quot;) == 0 then&lt;br /&gt;
		table.insert(top_section, frame:expandTemplate{title = &amp;#039;Possibly empty category&amp;#039;})&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(top_section, frame:expandTemplate{title = &amp;#039;Possibly empty category&amp;#039;, args = {hidden=true}})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local purge_module = require(&amp;#039;Module:Purge&amp;#039;)&lt;br /&gt;
	table.insert(top_section, string.format(strings[&amp;quot;PURGE_DIV&amp;quot;], purge_module._main({&amp;quot;Purge page cache&amp;quot;})))&lt;br /&gt;
&lt;br /&gt;
	return table.concat(top_section, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; G E T _ B O T T O M _ S E C T I O N &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Generates a consistent non-text section which consists of:&lt;br /&gt;
-- Template:CatAutoTOC&lt;br /&gt;
-- A see also section&lt;br /&gt;
-- {{DEFAULTSORT}}&lt;br /&gt;
-- Categorization in parent category&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_bottom_section(frame, language_name, see_also_section, parent_category)&lt;br /&gt;
	local bottom_section = {}&lt;br /&gt;
	table.insert(bottom_section, frame:expandTemplate{title = &amp;#039;CatAutoTOC&amp;#039;})&lt;br /&gt;
	table.insert(bottom_section, see_also_section)&lt;br /&gt;
&lt;br /&gt;
	if mw.title.getCurrentTitle().nsText == &amp;quot;Category&amp;quot; then&lt;br /&gt;
		table.insert(bottom_section, frame:preprocess{text = &amp;quot;{{DEFAULTSORT:&amp;quot; .. language_name .. &amp;quot;}}&amp;quot;})&lt;br /&gt;
		table.insert(bottom_section, parent_category)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(bottom_section, &amp;quot;\n\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; N O N _ E N G L I S H _ L A N G U A G E _ T E X T _ C A T E G O R Y &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Lang/documentor tool|non_english_language_text_category}}&lt;br /&gt;
&lt;br /&gt;
This function implements {{Non-English-language text category}}.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local non_english_language_text_strings = {&lt;br /&gt;
	[&amp;quot;LINE1&amp;quot;] = &amp;quot;This category contains articles with %s%s text. The primary purpose of these categories is to facilitate manual or automated checking of text in other languages.&amp;quot;,&lt;br /&gt;
	[&amp;quot;LINE2&amp;quot;] = &amp;quot;This category should only be added with the %s family of templates, never explicitly.&amp;quot;,&lt;br /&gt;
	[&amp;quot;LINE3&amp;quot;] = &amp;#039;For example %s, which wraps the text with &amp;lt;code&amp;gt;&amp;amp;lt;span lang=&amp;quot;%s&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;.%s&amp;#039;,&lt;br /&gt;
	[&amp;quot;LINE3_EXTRA&amp;quot;] = &amp;quot; Also available is %s which displays as %s.&amp;quot;,&lt;br /&gt;
	[&amp;quot;IN_SCRIPT&amp;quot;] = &amp;quot; (in %s)&amp;quot;,&lt;br /&gt;
	[&amp;quot;EXAMPLE_DEFAULT_TEXT&amp;quot;] = &amp;quot;text in %s language here&amp;quot;,&lt;br /&gt;
	[&amp;quot;PARENT_CATEGORY&amp;quot;] = &amp;quot;[[Category:Articles containing non-English-language text]]&amp;quot;,&lt;br /&gt;
	[&amp;quot;TEMPLATE&amp;quot;] = &amp;quot;Lang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function non_english_language_text_category(frame)&lt;br /&gt;
	local page = mw.title.getCurrentTitle()&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame)&lt;br /&gt;
	-- args.test is used for /testcases&lt;br /&gt;
	if args.test then&lt;br /&gt;
		page = mw.title.new(args.test)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Naming style: Articles with text from the Berber languages collective&lt;br /&gt;
	local page_title_modified = page.text&lt;br /&gt;
	local split_title = &amp;quot;([^,]+)%%s([^,]*)&amp;quot;&lt;br /&gt;
	local part1 = &amp;quot;&amp;quot;&lt;br /&gt;
	local part2 = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	if page_title_modified:find(&amp;#039;Articles with text in&amp;#039;) then&lt;br /&gt;
		-- Naming style: Category:Articles with text from Afro-Asiatic languages (as currently implemented in Module:lang)&lt;br /&gt;
		part1, part2 = language_categories[&amp;quot;LANGUAGES_COLLECTIVE_TEXT&amp;quot;]:match(split_title)&lt;br /&gt;
	elseif page_title_modified:find(&amp;#039;explicitly cited&amp;#039;) then&lt;br /&gt;
		part1, part2 = language_categories[&amp;quot;ENGLISH&amp;quot;]:match(split_title)&lt;br /&gt;
	else&lt;br /&gt;
		-- Naming style: Category:Articles containing French-language text&lt;br /&gt;
		part1, part2 = language_categories[&amp;quot;LANGUAGE_TEXT&amp;quot;]:match(split_title)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	page_title_modified = page_title_modified:gsub(part1, &amp;quot;&amp;quot;)&lt;br /&gt;
	page_title_modified = page_title_modified:gsub(part2, &amp;quot;&amp;quot;)&lt;br /&gt;
	local language_name = page_title_modified&lt;br /&gt;
&lt;br /&gt;
	local layout = {}&lt;br /&gt;
	table.insert(layout, get_hidden_category_template(frame))&lt;br /&gt;
	local parent_category = non_english_language_text_strings[&amp;quot;PARENT_CATEGORY&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
	if language_name == page.text then&lt;br /&gt;
		-- Error: Category title format not supported.&lt;br /&gt;
		return make_error(string.format(error_messages[&amp;quot;NOT_VALID_CATEGORY_FORMAT&amp;quot;], page.text), layout, parent_category, args.nocat)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local lang_module = require(&amp;#039;Module:Lang&amp;#039;)&lt;br /&gt;
	local language_code = lang_module._tag_from_name({language_name})	&lt;br /&gt;
&lt;br /&gt;
	if language_code:find(&amp;#039;[Ee]rror&amp;#039;) then&lt;br /&gt;
		-- Error: Language code not found in database.&lt;br /&gt;
		return make_error(string.format(error_messages[&amp;quot;NOT_VALID_LANGUAGE_CODE&amp;quot;], language_name), layout, parent_category, args.nocat)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local correct_language_category_title = lang_module._category_from_tag({language_code})&lt;br /&gt;
	if correct_language_category_title:find(&amp;#039;[Ee]rror&amp;#039;) then&lt;br /&gt;
		-- Error: No category title found for language code.&lt;br /&gt;
		return make_error(string.format(error_messages[&amp;quot;NO_CATEGORY_TITLE_FOUND&amp;quot;], language_code), layout, parent_category, args.nocat)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local current_category_title = page.prefixedText&lt;br /&gt;
	if current_category_title ~= correct_language_category_title then&lt;br /&gt;
		-- Error: The current title used is not in the supported format. TODO: can this still be reached?&lt;br /&gt;
		return make_error(&lt;br /&gt;
			string.format(error_messages[&amp;quot;INCORRECT_CATEGORY_TITLE&amp;quot;], current_category_title, non_english_language_text_strings[&amp;quot;LANG&amp;quot;], correct_language_category_title),&lt;br /&gt;
			layout, parent_category, args.nocat)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(layout, get_top_section(frame))&lt;br /&gt;
&lt;br /&gt;
	local script_text = &amp;quot;&amp;quot;&lt;br /&gt;
	if args.script then&lt;br /&gt;
		script_text = string.format(non_english_language_text_strings[&amp;quot;IN_SCRIPT&amp;quot;], args.script)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local language_link = get_language_link(language_name, language_code)&lt;br /&gt;
	table.insert(layout, string.format(non_english_language_text_strings[&amp;quot;LINE1&amp;quot;], language_link, script_text))&lt;br /&gt;
&lt;br /&gt;
	local lang_template = frame:expandTemplate{title = &amp;#039;Tl&amp;#039;, args = {non_english_language_text_strings[&amp;quot;TEMPLATE&amp;quot;]}}&lt;br /&gt;
	table.insert(layout, string.format(non_english_language_text_strings[&amp;quot;LINE2&amp;quot;], lang_template))&lt;br /&gt;
&lt;br /&gt;
	local language_code_link = lang_module._name_from_tag({language_code, link=&amp;quot;yes&amp;quot;, label=language_code})&lt;br /&gt;
	local example_default_text = string.format(non_english_language_text_strings[&amp;quot;EXAMPLE_DEFAULT_TEXT&amp;quot;], language_name)&lt;br /&gt;
	local example_text = args.example or example_default_text&lt;br /&gt;
	local lang_template_example = frame:expandTemplate{title = &amp;#039;Tlx&amp;#039;, args = {non_english_language_text_strings[&amp;quot;TEMPLATE&amp;quot;], language_code_link, example_text}}&lt;br /&gt;
	local lang_x = mw.title.makeTitle(10, &amp;quot;Lang-&amp;quot; .. language_code)&lt;br /&gt;
&lt;br /&gt;
	local line3_extra = &amp;quot;&amp;quot;&lt;br /&gt;
	if lang_x.exists then&lt;br /&gt;
		local lang_x_template_example = frame:expandTemplate{title = &amp;#039;Tlx&amp;#039;, args = {lang_x.text, example_text}}&lt;br /&gt;
		local lang_x_template = frame:expandTemplate{title = lang_x.text, args = {example_text}}&lt;br /&gt;
		line3_extra = string.format(non_english_language_text_strings[&amp;quot;LINE3_EXTRA&amp;quot;], lang_x_template_example, lang_x_template)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(layout, string.format(non_english_language_text_strings[&amp;quot;LINE3&amp;quot;], lang_template_example, language_code, line3_extra))&lt;br /&gt;
	local see_also_section = get_see_also_section(page.text, language_name, language_code)&lt;br /&gt;
&lt;br /&gt;
	local bottom = get_bottom_section(frame, language_name, see_also_section, non_english_language_text_strings[&amp;quot;PARENT_CATEGORY&amp;quot;])&lt;br /&gt;
	return table.concat(layout, &amp;quot;\n\n&amp;quot;) .. bottom&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; N O N _ E N G L I S H _ L A N G U A G E _ S O U R C E S _ C A T E G O R Y &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Lang/documentor tool|non_english_language_sources_category}}&lt;br /&gt;
&lt;br /&gt;
This function implements {{Non-English-language sources category}}.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local non_english_language_sources_strings = {&lt;br /&gt;
	[&amp;quot;LINE1&amp;quot;] = &amp;quot;This is a tracking category for articles that use %s to identify %s sources.&amp;quot;,&lt;br /&gt;
	[&amp;quot;PARENT_CATEGORY&amp;quot;] = &amp;quot;[[Category:Articles with non-English-language sources]]&amp;quot;,&lt;br /&gt;
	[&amp;quot;TEMPLATE&amp;quot;] = &amp;quot;In lang&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function non_english_language_sources_category(frame)&lt;br /&gt;
	local page = mw.title.getCurrentTitle()&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame)&lt;br /&gt;
	-- args.test is used for /testcases&lt;br /&gt;
	if args.test then&lt;br /&gt;
		page = mw.title.new(args.test)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local page_title = page.text&lt;br /&gt;
	local language_code = page_title:match(&amp;#039;%(([%a%-]+)%)&amp;#039;)&lt;br /&gt;
	local language_name = require(&amp;#039;Module:Lang&amp;#039;)._name_from_tag({language_code})&lt;br /&gt;
&lt;br /&gt;
	local layout = {}&lt;br /&gt;
	table.insert(layout, get_hidden_category_template(frame))&lt;br /&gt;
	local parent_category = non_english_language_sources_strings[&amp;quot;PARENT_CATEGORY&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
	local correct_language_category_title = require(&amp;#039;Module:In lang&amp;#039;)._in_lang({language_code, [&amp;quot;list-cats&amp;quot;]=&amp;quot;yes&amp;quot;})&lt;br /&gt;
	if correct_language_category_title == &amp;quot;&amp;quot; then&lt;br /&gt;
		-- Error: No category title found for language code.&lt;br /&gt;
		return make_error(string.format(error_messages[&amp;quot;NO_CATEGORY_TITLE_FOUND&amp;quot;], language_code), layout, parent_category, args.nocat)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local current_category_title = page.prefixedText&lt;br /&gt;
	if correct_language_category_title ~= current_category_title then&lt;br /&gt;
		-- Error: The current title used is not in the supported format.&lt;br /&gt;
		return make_error(&lt;br /&gt;
			string.format(error_messages[&amp;quot;INCORRECT_CATEGORY_TITLE&amp;quot;], current_category_title, non_english_language_sources_strings[&amp;quot;TEMPLATE&amp;quot;], correct_language_category_title),&lt;br /&gt;
			layout, parent_category, args.nocat)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local language_link = get_language_link(language_name, language_code)&lt;br /&gt;
	local text = string.format(non_english_language_sources_strings[&amp;quot;LINE1&amp;quot;], frame:expandTemplate{title = &amp;#039;Tlx&amp;#039;, args = {non_english_language_sources_strings[&amp;quot;TEMPLATE&amp;quot;], language_code}}, language_link)&lt;br /&gt;
&lt;br /&gt;
	table.insert(layout, get_top_section(frame))	&lt;br /&gt;
	table.insert(layout, text)&lt;br /&gt;
	local see_also_section = get_see_also_section(page_title, language_name, language_code)&lt;br /&gt;
&lt;br /&gt;
	local bottom = get_bottom_section(frame, language_name, see_also_section, parent_category)&lt;br /&gt;
	return table.concat(layout, &amp;quot;\n\n&amp;quot;) .. bottom&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; N O N _ E N G L I S H _ L A N G U A G E _ C S 1 _ S O U R C E S _ C A T E G O R Y &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Lang/documentor tool|non_english_language_cs1_sources_category}}&lt;br /&gt;
&lt;br /&gt;
This function implements {{Non-English-language CS1 sources category}}.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local non_english_language_cs1_text_strings = {&lt;br /&gt;
	[&amp;quot;LINE1&amp;quot;] = &amp;quot;This is a tracking category for [[SW:CS1|CS1 citations]] that use the parameter %s to identify a source in [[%s language|%s]]. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].&amp;quot;,&lt;br /&gt;
	[&amp;quot;PARENT_CATEGORY&amp;quot;] = &amp;quot;[[Category:CS1 foreign language sources]]&amp;quot;, -- #TODO change to &amp;quot;Articles with non-english CS1 language sources&amp;quot; or &amp;quot;CS1 non-English language sources&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
	--&amp;quot;This is a tracking category for [[SW:CS1|CS1 citations]] that use the parameter %s to hold a citation title that uses %s characters and contains the language prefix &amp;lt;code&amp;gt;%s:&amp;lt;/code&amp;gt;. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].&amp;quot;,&lt;br /&gt;
	--&amp;quot;[[Category:CS1 uses foreign language script]]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
	-- &amp;quot;This is a tracking category for [[SW:CS1|CS1 citations]] that use the parameter %s. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].&amp;quot;,&lt;br /&gt;
	-- &amp;quot;to identify a source in [[%s language|%s]].&amp;quot;,&lt;br /&gt;
	-- &amp;quot;to hold a citation title that uses %s characters and contains the language prefix &amp;lt;code&amp;gt;%s:&amp;lt;/code&amp;gt;.&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
local function non_english_language_cs1_sources_category(frame)&lt;br /&gt;
	local page_title_object = mw.title.getCurrentTitle()&lt;br /&gt;
	local page_title = page_title_object.text&lt;br /&gt;
	local language_code = page_title:match(&amp;#039;%(([%a%-]+)%)&amp;#039;)&lt;br /&gt;
	local language_name = require(&amp;#039;Module:Lang&amp;#039;)._name_from_tag({language_code})&lt;br /&gt;
	local layout = {}&lt;br /&gt;
	table.insert(layout, get_hidden_category_template(frame))&lt;br /&gt;
	local see_also_section = &amp;quot;&amp;quot;&lt;br /&gt;
	local parameter_doc = frame:expandTemplate{title = &amp;#039;para&amp;#039;, args = {&amp;quot;language&amp;quot;, language_code}}&lt;br /&gt;
	table.insert(layout, get_top_section(frame))&lt;br /&gt;
	table.insert(layout, string.format(non_english_language_cs1_text_strings[&amp;quot;LINE1&amp;quot;], parameter_doc, language_name, language_name))&lt;br /&gt;
	local see_also_section = get_see_also_section(page_title, language_name, language_code)&lt;br /&gt;
	local bottom = get_bottom_section(frame, language_name, see_also_section, non_english_language_cs1_text_strings[&amp;quot;PARENT_CATEGORY&amp;quot;])&lt;br /&gt;
	return table.concat(layout, &amp;quot;\n\n&amp;quot;) .. bottom&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; T E S T _ C A S E S _ S H A R E D _ C O D E &amp;gt; -------------------------- &lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function compare_by_keys2(a, b)											-- local function used by table.sort()&lt;br /&gt;
	return a[2] &amp;lt; b[2]															-- ascending sort by code&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function compare_by_keys(a, b)											-- local function used by table.sort()&lt;br /&gt;
	return a[1] &amp;lt; b[1]															-- ascending sort by code&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Used by testcases_iso_code_to_name()&lt;br /&gt;
local function get_language_code_table_from_code(args)&lt;br /&gt;
	local entry = {}&lt;br /&gt;
	--if args.override_table[args.language_code] then&lt;br /&gt;
	--	table.insert(entry, args.override_table[args.language_code][1]) -- :gsub(&amp;#039; %b()$&amp;#039;, &amp;#039;&amp;#039;) fails here&lt;br /&gt;
	--else&lt;br /&gt;
		table.insert(entry, args.language_code)&lt;br /&gt;
--	end&lt;br /&gt;
	return entry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Used by testcases_name_from_tag()&lt;br /&gt;
local function get_language_code_and_name_table_from_code(args)&lt;br /&gt;
	local entry = {}&lt;br /&gt;
	if args.override_table[args.language_code] then&lt;br /&gt;
		table.insert(entry, args.language_code)&lt;br /&gt;
		local language_code, _ = args.override_table[args.language_code][1]:gsub(&amp;#039; %b()$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		table.insert(entry, language_code)&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(entry, args.language_code)&lt;br /&gt;
		table.insert(entry, args.language_table[args.language_code])&lt;br /&gt;
	end&lt;br /&gt;
	return entry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Used by testcases_category_from_tag()&lt;br /&gt;
local function get_language_code_and_category_table_from_code(args)&lt;br /&gt;
	local entry = {}&lt;br /&gt;
	table.insert(entry, args.language_code)&lt;br /&gt;
	table.insert(entry, args.test_function({args.language_code}))&lt;br /&gt;
	return entry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Used by testcases_iso_name_to_code() and testcases_tag_from_name()&lt;br /&gt;
local function get_language_name_and_code_table_from_code(args)&lt;br /&gt;
	local entry = {}&lt;br /&gt;
	if args.override_table[args.language_code] then&lt;br /&gt;
		table.insert(entry, args.override_table[args.language_code][1])			-- only the first name when there are multiples&lt;br /&gt;
		table.insert(entry, args.language_code)&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(entry, args.language_names[1])								-- only the first name when there are multiples&lt;br /&gt;
		table.insert(entry, args.language_code)&lt;br /&gt;
	end&lt;br /&gt;
	return entry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function get_table(table_function, language_table, length, range, iso_number, test_function)&lt;br /&gt;
	local table_of_language_name_and_code_tables = {}&lt;br /&gt;
&lt;br /&gt;
	local override_table_name = &amp;quot;override&amp;quot;&lt;br /&gt;
	if iso_number then&lt;br /&gt;
		override_table_name = &amp;quot;override_&amp;quot; .. iso_number&lt;br /&gt;
	end&lt;br /&gt;
	local override_table = require(&amp;quot;Module:Language/data/ISO_639_override/sandbox&amp;quot;)[override_table_name]&lt;br /&gt;
&lt;br /&gt;
	-- For most ISO 639s.&lt;br /&gt;
	if range then&lt;br /&gt;
		for language_code, language_names in pairs(language_table) do&lt;br /&gt;
			if language_code:find(range) then&lt;br /&gt;
				table.insert(table_of_language_name_and_code_tables, table_function({&lt;br /&gt;
					override_table = override_table,&lt;br /&gt;
					language_code = language_code,&lt;br /&gt;
					language_names = language_names,&lt;br /&gt;
					test_function = test_function,&lt;br /&gt;
					language_table = language_table&lt;br /&gt;
				}))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	-- For ISO 639-1.&lt;br /&gt;
	elseif length then&lt;br /&gt;
		for language_code, language_names in pairs(language_table) do&lt;br /&gt;
			if language_code:len() == 2 then&lt;br /&gt;
				table.insert(table_of_language_name_and_code_tables, table_function({&lt;br /&gt;
					override_table = override_table,&lt;br /&gt;
					language_code = language_code,&lt;br /&gt;
					language_names = language_names,&lt;br /&gt;
					test_function = test_function,&lt;br /&gt;
					language_table = language_table&lt;br /&gt;
				}))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	-- For general /testcases.&lt;br /&gt;
	else&lt;br /&gt;
		for language_code, language_names in pairs(language_table) do&lt;br /&gt;
				table.insert(table_of_language_name_and_code_tables, table_function({&lt;br /&gt;
					override_table = override_table,&lt;br /&gt;
					language_code = language_code,&lt;br /&gt;
					language_names = language_names,&lt;br /&gt;
					test_function = test_function,&lt;br /&gt;
					language_table = language_table&lt;br /&gt;
				}))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table_of_language_name_and_code_tables&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function get_undabbed_table(language_list, length, range)&lt;br /&gt;
	local undabbed_language_table = {}											-- for this test, ISO 639-3 language name disambiguators must be removed; un-dabbed names go here&lt;br /&gt;
	for language_code, language_names in pairs(language_list) do&lt;br /&gt;
		-- For most ISO 639s.&lt;br /&gt;
		if range then&lt;br /&gt;
			if language_code:find(range) then&lt;br /&gt;
				undabbed_language_table[language_code] = language_names[1]:gsub(&amp;#039; %b()$&amp;#039;, &amp;#039;&amp;#039;)	-- undab and save only the first name; ignore all other names assigned to a code&lt;br /&gt;
			end&lt;br /&gt;
		-- For ISO 639-1.&lt;br /&gt;
		elseif length then&lt;br /&gt;
			if language_code:len() == 2 then&lt;br /&gt;
				undabbed_language_table[language_code] = language_names[1]:gsub(&amp;#039; %b()$&amp;#039;, &amp;#039;&amp;#039;)	-- undab and save only the first name; ignore all other names assigned to a code&lt;br /&gt;
			end&lt;br /&gt;
		-- For general /testcases.&lt;br /&gt;
		else&lt;br /&gt;
			undabbed_language_table[language_code] = language_names[1]:gsub(&amp;#039; %b()$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return undabbed_language_table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; T E S T C A S E S _ C A T E G O R Y _ F R O M _ T A G &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Entry point for the various category_from_tag testcases.&lt;br /&gt;
&lt;br /&gt;
Build a table of test patterns where each entry in the table is a table with two members:&lt;br /&gt;
	{&amp;quot;&amp;lt;language_code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;category name according to Module:Lang&amp;gt;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;Expected&amp;quot; column value is the category name according to Module:Lang.&lt;br /&gt;
- &amp;quot;Actual&amp;quot; column value is the result of {{#invoke:Lang/sandbox|category_from_tag|&amp;lt;language_code&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
TODO: Currently not working.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function testcases_category_from_tag(self, args)&lt;br /&gt;
	local cat_from_tag_function = require(&amp;#039;Module:Lang&amp;#039;)._category_from_tag	&lt;br /&gt;
	local language_tables = get_table(get_language_code_and_category_table_from_code, args.language_list, args.length, args.range, args.iso_number, cat_from_tag_function)&lt;br /&gt;
	table.sort(language_tables, compare_by_keys)&lt;br /&gt;
&lt;br /&gt;
	self:preprocess_equals_preprocess_many(&lt;br /&gt;
		&amp;#039;{{#invoke:Lang/sandbox|category_from_tag|&amp;#039;, &amp;#039;}}&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;,&lt;br /&gt;
		language_tables, &lt;br /&gt;
		{nowiki=false}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; T E S T C A S E S _ N A M E _ F R O M _ T A G &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Entry point for the various name_from_tag testcases.&lt;br /&gt;
&lt;br /&gt;
Build a table of test patterns where each entry in the table is a table with two members:&lt;br /&gt;
	{&amp;quot;&amp;lt;language_code&amp;gt;&amp;quot;, &amp;quot;&amp;lt;language_name&amp;gt;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;Expected&amp;quot; column value is the &amp;lt;language_name&amp;gt;.&lt;br /&gt;
- &amp;quot;Actual&amp;quot; column value is the result of sandbox version {{#invoke:Lang/sandbox|name_from_tag|&amp;lt;language_code&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function testcases_name_from_tag(self, args)&lt;br /&gt;
	local undabbed_language_table = get_undabbed_table(args.language_list, args.length, args.range, nil)&lt;br /&gt;
	local language_tables = get_table(get_language_code_and_name_table_from_code, undabbed_language_table, args.length, args.range)&lt;br /&gt;
	table.sort(language_tables, compare_by_keys)&lt;br /&gt;
&lt;br /&gt;
	self:preprocess_equals_preprocess_many(&lt;br /&gt;
		&amp;#039;{{#invoke:Lang/sandbox|name_from_tag|&amp;#039;, &amp;#039;}}&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;,&lt;br /&gt;
		language_tables, &lt;br /&gt;
		{nowiki=false}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; T E S T C A S E S _ T A G _ F R O M _ N A M E &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Entry point for the various tag_from_name testcases.&lt;br /&gt;
&lt;br /&gt;
Build a table of test patterns where each entry in the table is a table with two members:&lt;br /&gt;
	{&amp;quot;&amp;lt;language_name&amp;gt;&amp;quot;, &amp;quot;&amp;lt;language_code&amp;gt;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;Expected&amp;quot; column value is the &amp;lt;language_code&amp;gt;.&lt;br /&gt;
- &amp;quot;Actual&amp;quot; column value is the result of sandbox version {{#invoke:Lang/sandbox|tag_from_name|&amp;lt;language_name&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
TODO: Currently not working.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function testcases_tag_from_name(self, args)&lt;br /&gt;
	local language_tables = get_table(get_language_name_and_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)&lt;br /&gt;
	table.sort(language_tables, compare_by_keys2)&lt;br /&gt;
&lt;br /&gt;
	local ordered_table = {}&lt;br /&gt;
	table.sort(unordered_table)&lt;br /&gt;
	for _, key in ipairs(unordered_table) do&lt;br /&gt;
		table.insert(ordered_table, {key, reverse_table[key]})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	self:preprocess_equals_preprocess_many(&lt;br /&gt;
		&amp;#039;{{#invoke:Lang/sandbox|tag_from_name|&amp;#039;, &amp;#039;}}&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;,&lt;br /&gt;
		language_tables, &lt;br /&gt;
		{nowiki=false}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; T E S T C A S E S _ I S O _ C O D E _ T O _ N A M E &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Entry point for the various iso_code_to_name testcases.&lt;br /&gt;
&lt;br /&gt;
Build a table of test patterns where each entry in the table is a table with one member:&lt;br /&gt;
	{&amp;quot;&amp;lt;language_code&amp;gt;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;Expected&amp;quot; column value is the result of the live version of {{#invoke:ISO 639 name|iso_639_name_to_code|&amp;lt;language_code&amp;gt;}}.&lt;br /&gt;
- &amp;quot;Actual&amp;quot; column value is the result of sandbox version {{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|&amp;lt;language_code&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function testcases_iso_code_to_name(self, args)&lt;br /&gt;
	local language_tables = get_table(get_language_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)&lt;br /&gt;
	table.sort(language_tables, compare_by_keys)&lt;br /&gt;
&lt;br /&gt;
	self:preprocess_equals_preprocess_many(&lt;br /&gt;
		&amp;#039;{{#invoke:ISO 639 name/sandbox|iso_639_code_to_name|link=yes|&amp;#039;, &amp;#039;}}&amp;#039;, &amp;#039;{{#invoke:ISO 639 name|iso_639_code_to_name|link=yes|&amp;#039;, &amp;#039;}}&amp;#039;,&lt;br /&gt;
		language_tables, &lt;br /&gt;
		{nowiki=false}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; T E S T C A S E S _ I S O _ N A M E _ T O _ C O D E &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
Entry point for the various iso_name_to_code testcases.&lt;br /&gt;
&lt;br /&gt;
Build a table of test patterns where each entry in the table is a table with two members:&lt;br /&gt;
	{&amp;quot;&amp;lt;language_name&amp;gt;&amp;quot;, &amp;quot;&amp;lt;language_code&amp;gt;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
- &amp;quot;Expected&amp;quot; column value is the &amp;lt;language_code&amp;gt;.&lt;br /&gt;
- &amp;quot;Actual&amp;quot; column is value the result of {{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|&amp;lt;language_name&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function testcases_iso_name_to_code(self, args)&lt;br /&gt;
	local language_tables = get_table(get_language_name_and_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)&lt;br /&gt;
	table.sort(language_tables, compare_by_keys2)&lt;br /&gt;
	self:preprocess_equals_preprocess_many(&lt;br /&gt;
		&amp;#039;{{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|2=&amp;#039; .. args.iso_number .. &amp;quot;|&amp;quot;, &amp;#039;}}&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;,&lt;br /&gt;
		language_tables, &lt;br /&gt;
		{nowiki=false}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ -------------------------- &amp;lt; E X P O R T E D _ F U N C T I O N S &amp;gt; --------------------------&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	lang_xx_settings = lang_xx_settings,&lt;br /&gt;
	uses_module = uses_module,&lt;br /&gt;
	non_english_language_text_category = non_english_language_text_category,&lt;br /&gt;
	non_english_language_sources_category = non_english_language_sources_category,&lt;br /&gt;
	non_english_language_cs1_sources_category = non_english_language_cs1_sources_category,&lt;br /&gt;
	private_tags = private_tags,&lt;br /&gt;
&lt;br /&gt;
	-- Module:Lang testcases&lt;br /&gt;
	testcases_category_from_tag = testcases_category_from_tag,&lt;br /&gt;
	testcases_name_from_tag = testcases_name_from_tag,&lt;br /&gt;
	testcases_tag_from_name = testcases_tag_from_name,&lt;br /&gt;
&lt;br /&gt;
	-- Module:ISO 639 name testcases&lt;br /&gt;
	testcases_iso_code_to_name = testcases_iso_code_to_name,&lt;br /&gt;
	testcases_iso_name_to_code = testcases_iso_name_to_code,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>imported&gt;Trappist the monk</name></author>
	</entry>
</feed>