<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Acategory_tree%2Ffamilies</id>
	<title>Module:category tree/families - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Acategory_tree%2Ffamilies"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:category_tree/families&amp;action=history"/>
	<updated>2026-04-23T00:02:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:category_tree/families&amp;diff=494672&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:category_tree/families&amp;diff=494672&amp;oldid=prev"/>
		<updated>2026-04-21T11:22:23Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:22, 21 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:category_tree/families&amp;diff=494671&amp;oldid=prev</id>
		<title>wikt&gt;Surjection: Changed protection settings for &quot;Module:category tree/families&quot;: Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:category_tree/families&amp;diff=494671&amp;oldid=prev"/>
		<updated>2026-04-15T09:16:36Z</updated>

		<summary type="html">&lt;p&gt;Changed protection settings for &amp;quot;&lt;a href=&quot;/wiki/Module:category_tree/families&quot; title=&quot;Module:category tree/families&quot;&gt;Module:category tree/families&lt;/a&gt;&amp;quot;: Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local raw_categories = {}&lt;br /&gt;
local raw_handlers = {}&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                              RAW CATEGORIES                             --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;All language families&amp;quot;] = {&lt;br /&gt;
	topright = &amp;quot;{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}&amp;quot;,&lt;br /&gt;
	description = &amp;quot;This category lists all [[language family|language families]].&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;Fundamental&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Languages by family&amp;quot;] = {&lt;br /&gt;
	topright = &amp;quot;{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}&amp;quot;,&lt;br /&gt;
	description = &amp;quot;This category contains all languages categorized hierarchically according to the [[language family]] they belong to.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;Only top-level language families are shown here. For a full list of all language families, see [[:Category:All language families]] or [[Wiktionary:List of families]].&amp;quot;,&lt;br /&gt;
	parents = {&lt;br /&gt;
		{name = &amp;quot;All languages&amp;quot;, sort = &amp;quot; &amp;quot;},&lt;br /&gt;
		{name = &amp;quot;All language families&amp;quot;, sort = &amp;quot; &amp;quot;},&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Unassigned languages&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Languages that have not yet been assigned to any family by Wiktionary editors, usually due to oversight.&amp;quot;,&lt;br /&gt;
	additional = [=[This should be distinguished from:&lt;br /&gt;
* [[:Category:Unclassifiable languages]] (languages that cannot be confidently assigned to any family, typically because the language is extinct or unresearched and has little available data on it);&lt;br /&gt;
* [[:Category:Language isolates]] (where there is general agreement that the language has no relatives); and&lt;br /&gt;
* [[:Category:Languages of disputed affiliation]] (languages where there is no consensus concerning which family, if any, they belong to).]=],&lt;br /&gt;
	parents = {&lt;br /&gt;
		{name = &amp;quot;Languages by family&amp;quot;, sort = &amp;quot;*&amp;quot;},&lt;br /&gt;
		&amp;quot;All language families&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                                RAW HANDLERS                             --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function family_is_not_a_family(fam)&lt;br /&gt;
	if not fam then&lt;br /&gt;
		return false&lt;br /&gt;
	elseif fam:getCode() == &amp;quot;qfa-not&amp;quot; then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		return family_is_not_a_family(fam:getFamily())&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function family_has_no_category(fam)&lt;br /&gt;
	local famcode = fam:getCode()&lt;br /&gt;
	if famcode == &amp;quot;paa&amp;quot; then&lt;br /&gt;
		return false -- Papuan languages are not a family but have a category&lt;br /&gt;
	elseif famcode == &amp;quot;qfa-iso&amp;quot; or famcode == &amp;quot;qfa-not&amp;quot; then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		local parfam = fam:getFamily()&lt;br /&gt;
		if parfam and parfam:getCode() == &amp;quot;qfa-not&amp;quot; then&lt;br /&gt;
			-- Constructed languages, sign languages, etc.; no category for them&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;
-- Currently all Papuan families begin with &amp;quot;paa&amp;quot; or &amp;quot;ngf&amp;quot;,&lt;br /&gt;
local function family_is_papuan(fam)&lt;br /&gt;
	local famcode = fam:getCode()&lt;br /&gt;
	return famcode ~= &amp;quot;paa&amp;quot; and (famcode:find(&amp;quot;^paa&amp;quot;) or famcode:find(&amp;quot;^ngf&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function infobox(fam)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	&lt;br /&gt;
	insert(ret, &amp;quot;&amp;lt;table class=\&amp;quot;wikitable\&amp;quot;&amp;gt;\n&amp;quot;)&lt;br /&gt;
	insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th colspan=\&amp;quot;2\&amp;quot; class=\&amp;quot;plainlinks\&amp;quot;&amp;gt;[//en.wiktionary.org/w/index.php?title=Module:families/data&amp;amp;action=edit Edit family data]&amp;lt;/th&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Canonical name&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;quot; .. fam:getCanonicalName() .. &amp;quot;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local otherNames = fam:getOtherNames()&lt;br /&gt;
	if otherNames then&lt;br /&gt;
		local names = {}&lt;br /&gt;
		&lt;br /&gt;
		for _, name in ipairs(otherNames) do&lt;br /&gt;
			insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. name .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if #names &amp;gt; 0 then&lt;br /&gt;
			insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Other names&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;&amp;quot; .. concat(names, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local aliases = fam:getAliases()&lt;br /&gt;
	if aliases then&lt;br /&gt;
		local names = {}&lt;br /&gt;
		&lt;br /&gt;
		for _, name in ipairs(aliases) do&lt;br /&gt;
			insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. name .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if #names &amp;gt; 0 then&lt;br /&gt;
			insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Aliases&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;&amp;quot; .. concat(names, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local varieties = fam:getVarieties()&lt;br /&gt;
	if varieties then&lt;br /&gt;
		local names = {}&lt;br /&gt;
		&lt;br /&gt;
		for _, name in ipairs(varieties) do&lt;br /&gt;
			if type(name) == &amp;quot;string&amp;quot; then&lt;br /&gt;
				insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. name .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				assert(type(name) == &amp;quot;table&amp;quot;)&lt;br /&gt;
				local first_var&lt;br /&gt;
				local subvars = {}&lt;br /&gt;
				for i, var in ipairs(name) do&lt;br /&gt;
					if i == 1 then&lt;br /&gt;
						first_var = var&lt;br /&gt;
					else&lt;br /&gt;
						insert(subvars, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. var .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if #subvars &amp;gt; 0 then&lt;br /&gt;
					insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;lt;dl&amp;gt;&amp;lt;dt&amp;gt;&amp;quot; .. first_var .. &amp;quot;&amp;lt;/dt&amp;gt;\n&amp;lt;dd&amp;gt;&amp;lt;ul&amp;gt;&amp;quot; .. concat(subvars, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/dd&amp;gt;&amp;lt;/dl&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
				elseif first_var then&lt;br /&gt;
					insert(names, &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .. first_var .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if #names &amp;gt; 0 then&lt;br /&gt;
			insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;Varieties&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;ul&amp;gt;&amp;quot; .. concat(names, &amp;quot;\n&amp;quot;) .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Families|Family code]]&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;lt;code&amp;gt;&amp;quot; .. fam:getCode() .. &amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[w:Proto-language|Common ancestor]]&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local protoLanguage = fam:getProtoLanguage()&lt;br /&gt;
	&lt;br /&gt;
	if protoLanguage then&lt;br /&gt;
		insert(ret, &amp;quot;[[:Category:&amp;quot; .. protoLanguage:getCategoryName() .. &amp;quot;|&amp;quot; .. protoLanguage:getCanonicalName() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		insert(ret, &amp;quot;none&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	insert(ret, &amp;quot;&amp;lt;/td&amp;gt;\n&amp;quot;)&lt;br /&gt;
	insert(ret, &amp;quot;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local parent = fam:getFamily()&lt;br /&gt;
	&lt;br /&gt;
	if not parent then&lt;br /&gt;
		insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Families|Parent family]]&amp;lt;/th&amp;gt;\n&amp;lt;td&amp;gt;&amp;quot;)&lt;br /&gt;
		insert(ret, &amp;quot;unassigned&amp;quot;)&lt;br /&gt;
	elseif parent:getCode() == &amp;quot;qfa-not&amp;quot; then&lt;br /&gt;
		insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Families|Parent family]]&amp;lt;/th&amp;gt;\n&amp;lt;td&amp;gt;&amp;quot;)&lt;br /&gt;
		insert(ret, &amp;quot;not a family&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		local chain = {}&lt;br /&gt;
		while parent do&lt;br /&gt;
			if family_has_no_category(parent) then&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			insert(chain, &amp;quot;[[:Category:&amp;quot; .. parent:getCategoryName() .. &amp;quot;|&amp;quot; .. parent:getCanonicalName() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			parent = parent:getFamily()&lt;br /&gt;
		end&lt;br /&gt;
		if #chain == 0 then&lt;br /&gt;
			insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Families|Parent family]]&amp;lt;/th&amp;gt;\n&amp;lt;td&amp;gt;&amp;quot;)&lt;br /&gt;
			insert(ret, &amp;quot;no parents&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			insert(ret, &amp;quot;&amp;lt;tr&amp;gt;\n&amp;lt;th&amp;gt;[[Wiktionary:Families|Parent famil&amp;quot;&lt;br /&gt;
				.. (#chain == 1 and &amp;quot;y&amp;quot; or &amp;quot;ies&amp;quot;) .. &amp;quot;]]&amp;lt;/th&amp;gt;\n&amp;lt;td&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			for i = #chain, 1, -1 do&lt;br /&gt;
				insert(ret, &amp;quot;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;quot; .. chain[i])&lt;br /&gt;
			end&lt;br /&gt;
			insert(ret, string.rep(&amp;quot;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;quot;, #chain))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	insert(ret, &amp;quot;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;\n&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if fam:getWikidataItem() and mw.wikibase then&lt;br /&gt;
		local link = &amp;#039;[&amp;#039; .. mw.wikibase.getEntityUrl(fam:getWikidataItem()) .. &amp;#039; &amp;#039; .. fam:getWikidataItem() .. &amp;#039;]&amp;#039;&lt;br /&gt;
		insert(ret, &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Wikidata&amp;lt;/th&amp;gt;&amp;lt;td&amp;gt;&amp;quot; .. link .. &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	insert(ret, &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	return concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function NavFrame_for_family_tree(content, title)&lt;br /&gt;
	return &amp;#039;&amp;lt;div class=&amp;quot;NavFrame&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;NavHead&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		.. (title or &amp;#039;{{{title}}}&amp;#039;) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		.. &amp;#039;&amp;lt;div class=&amp;quot;NavContent&amp;quot; style=&amp;quot;text-align: left; font-size: calc(1em / 0.95); padding: 0.3em&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		.. content&lt;br /&gt;
		.. &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local additional_information = {&lt;br /&gt;
	[&amp;quot;qfa-dis&amp;quot;] = &amp;quot;These are languages where there is no consensus concerning which family, if any, they belong to.&amp;quot;,&lt;br /&gt;
	[&amp;quot;qfa-iso&amp;quot;] = &amp;quot;These are languages where there is general agreement that the language has no known relatives.&amp;quot;,&lt;br /&gt;
	[&amp;quot;qfa-mix&amp;quot;] = &amp;quot;A [[mixed language]] is a language which is composed of two different languages.&amp;quot;,&lt;br /&gt;
	[&amp;quot;qfa-unc&amp;quot;] = &amp;quot;These are languages that cannot be confidently assigned to a family due to lack of sufficient linguistic data. &amp;quot; ..&lt;br /&gt;
		&amp;quot;They are also commonly called {{w|unclassified language|unclassified languages}}, but this is ambiguous between &amp;quot; ..&lt;br /&gt;
		&amp;quot;languages that cannot be classified (due to insufficient data) and those that merely have not been classified &amp;quot; ..&lt;br /&gt;
		&amp;quot;(due to insufficient research).&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local preceding_information = {&lt;br /&gt;
	[&amp;quot;qfa-dis&amp;quot;] = &amp;quot;{{also|Category:Unclassifiable languages|Category:Unassigned languages|Category:Language isolates}}&amp;quot;,&lt;br /&gt;
	[&amp;quot;qfa-iso&amp;quot;] = &amp;quot;{{also|Category:Languages of disputed affiliation|Category:Unclassifiable languages|Category:Unassigned languages}}&amp;quot;,&lt;br /&gt;
	[&amp;quot;qfa-unc&amp;quot;] = &amp;quot;{{also|Category:Languages of disputed affiliation|Category:Unassigned languages|Category:Language isolates}}&amp;quot;,&lt;br /&gt;
	[&amp;quot;qfa-mix&amp;quot;] = &amp;quot;{{also|Category:Creole or pidgin languages}}&amp;quot;,&lt;br /&gt;
	[&amp;quot;crp&amp;quot;] = &amp;quot;{{also|Category:Mixed languages}}&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local specially_named_families = {&lt;br /&gt;
	[&amp;quot;Languages of disputed affiliation&amp;quot;] = &amp;quot;qfa-dis&amp;quot;,&lt;br /&gt;
	[&amp;quot;Language isolates&amp;quot;] = &amp;quot;qfa-iso&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local specially_named_family_sort_keys = {&lt;br /&gt;
	[&amp;quot;Languages of disputed affiliation&amp;quot;] = &amp;quot;Disputed affiliation&amp;quot;,&lt;br /&gt;
	[&amp;quot;Language isolates&amp;quot;] = &amp;quot;Isolate&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
insert(raw_handlers, function(data)&lt;br /&gt;
	local family = require(&amp;quot;Module:families&amp;quot;).getByCategoryName(data.category)&lt;br /&gt;
	if not family then&lt;br /&gt;
		local special_code = specially_named_families[data.category]&lt;br /&gt;
		if special_code then&lt;br /&gt;
			family = require(&amp;quot;Module:families&amp;quot;).getByCode(special_code)&lt;br /&gt;
			if not family then&lt;br /&gt;
				error((&amp;quot;Internal error: Family code &amp;#039;%s&amp;#039; is an invalid family code.&amp;quot;):format(special_code))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not family then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parent_fam = family:getFamily()&lt;br /&gt;
	local first_parent, parent_sort_key, first_parent_sort_key&lt;br /&gt;
	&lt;br /&gt;
	if not parent_fam or family_has_no_category(parent_fam) then&lt;br /&gt;
		first_parent = &amp;quot;Languages by family&amp;quot;&lt;br /&gt;
		parent_sort_key = specially_named_family_sort_keys[data.category]&lt;br /&gt;
		first_parent_sort_key = &amp;quot;*&amp;quot; .. (parent_sort_key or &amp;quot;&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		first_parent = parent_fam:getCategoryName()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local description, additional = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
	local topright&lt;br /&gt;
	local preceding = preceding_information[family:getCode()]&lt;br /&gt;
	local additional_preface = additional_information[family:getCode()]&lt;br /&gt;
	if additional_preface then&lt;br /&gt;
		additional_preface = additional_preface .. &amp;quot;\n\n&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		additional_preface = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if family_is_not_a_family(family) then&lt;br /&gt;
		additional_preface = additional_preface ..&lt;br /&gt;
			&amp;quot;This is a pseudo-family, used for grouping purposes but not forming a linguistically valid [[clade]] &amp;quot; ..&lt;br /&gt;
			&amp;quot;(i.e. a set of linguistically related languages descending from a common parent).\n\n&amp;quot; ..&lt;br /&gt;
			&amp;quot;Information about this family:\n\n&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		additional_preface = &amp;quot;Information about &amp;quot; .. family:getCanonicalName() .. &amp;quot;:\n\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if not data.called_from_inside then&lt;br /&gt;
		topright = {}&lt;br /&gt;
		local wikipedia_art = family:getWikipediaArticle(&amp;quot;noCategoryFallback&amp;quot;)&lt;br /&gt;
		if wikipedia_art then&lt;br /&gt;
			insert(topright, &amp;quot;{{wp|&amp;quot; .. wikipedia_art .. &amp;quot;}}&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		local commons_cat = family:getCommonsCategory()&lt;br /&gt;
		if commons_cat then&lt;br /&gt;
			insert(topright, &amp;quot;{{commonscat|&amp;quot; .. commons_cat:gsub(&amp;quot;^Category:&amp;quot;, &amp;quot;&amp;quot;) .. &amp;quot;}}&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		topright = #topright &amp;gt; 0 and concat(topright, &amp;quot;\n&amp;quot;) or nil&lt;br /&gt;
		description = &amp;quot;This is the main category of the &amp;#039;&amp;#039;&amp;#039;&amp;quot; .. family:getDisplayForm() .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;.&amp;quot;&lt;br /&gt;
		additional = additional_preface .. infobox(family)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ok, tree_of_descendants = pcall(&lt;br /&gt;
		require(&amp;quot;Module:family tree&amp;quot;).print_children,&lt;br /&gt;
		family:getCode(), {&lt;br /&gt;
			protolanguage_under_family = true,&lt;br /&gt;
			must_have_descendants = true&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
	if ok then&lt;br /&gt;
		if tree_of_descendants then&lt;br /&gt;
			additional = additional .. NavFrame_for_family_tree(&lt;br /&gt;
				tree_of_descendants,&lt;br /&gt;
				&amp;quot;Family tree&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			additional = additional .. &amp;quot;\n\n&amp;quot; .. ucfirst(family:getCanonicalName())&lt;br /&gt;
				.. &amp;quot; has no descendants or varieties listed in Wiktionary&amp;#039;s language data modules.&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		mw.log(&amp;quot;error while generating tree: &amp;quot; .. tostring(tree_of_descendants))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local parents = {&lt;br /&gt;
		{name = first_parent, sort = first_parent_sort_key},&lt;br /&gt;
		{name = &amp;quot;All language families&amp;quot;, sort = parent_sort_key},&lt;br /&gt;
	}&lt;br /&gt;
	if parent_fam and parent_fam:getCode() == &amp;quot;sgn&amp;quot; then&lt;br /&gt;
		insert(parents, &amp;quot;All sign languages&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if family_is_papuan(family) then&lt;br /&gt;
		insert(parents, &amp;quot;Papuan languages&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return {&lt;br /&gt;
		preceding = preceding,&lt;br /&gt;
		topright = topright,&lt;br /&gt;
		description = description,&lt;br /&gt;
		additional = additional,&lt;br /&gt;
		parents = parents,&lt;br /&gt;
		breadcrumb = family:getCanonicalName(),&lt;br /&gt;
		can_be_empty = true,&lt;br /&gt;
	}&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}&lt;/div&gt;</summary>
		<author><name>wikt&gt;Surjection</name></author>
	</entry>
</feed>