<?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%2Fnames</id>
	<title>Module:category tree/names - 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%2Fnames"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:category_tree/names&amp;action=history"/>
	<updated>2026-04-22T05:48:43Z</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/names&amp;diff=494706&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/names&amp;diff=494706&amp;oldid=prev"/>
		<updated>2026-04-21T11:22:29Z</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/names&amp;diff=494705&amp;oldid=prev</id>
		<title>wikt&gt;Surjection: Changed protection settings for &quot;Module:category tree/names&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/names&amp;diff=494705&amp;oldid=prev"/>
		<updated>2026-04-15T09:16:39Z</updated>

		<summary type="html">&lt;p&gt;Changed protection settings for &amp;quot;&lt;a href=&quot;/wiki/Module:category_tree/names&quot; title=&quot;Module:category tree/names&quot;&gt;Module:category tree/names&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 labels = {}&lt;br /&gt;
local raw_categories = {}&lt;br /&gt;
local handlers = {}&lt;br /&gt;
&lt;br /&gt;
local names_module = &amp;quot;Module:names&amp;quot;&lt;br /&gt;
local en_utilities_module = &amp;quot;Module:en-utilities&amp;quot;&lt;br /&gt;
local pluralize = require(en_utilities_module).pluralize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                                  LABELS                                 --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;names&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} terms that are used to refer to specific individuals or groups.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;Place names, demonyms and other kinds of names can be found in [[:Category:Names]].&amp;quot;,&lt;br /&gt;
	umbrella_parents = {name = &amp;quot;terms by semantic function&amp;quot;, is_label = true, sort = &amp;quot; &amp;quot;},&lt;br /&gt;
	parents = {&amp;quot;terms by semantic function&amp;quot;, &amp;quot;proper nouns&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
------------------------------------------- given names -------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local human_genders = {&lt;br /&gt;
	[&amp;quot;male&amp;quot;] = &amp;quot;to male individuals&amp;quot;,&lt;br /&gt;
	[&amp;quot;female&amp;quot;] = &amp;quot;to female individuals&amp;quot;,&lt;br /&gt;
	[&amp;quot;unisex&amp;quot;] = &amp;quot;either to male or to female individuals&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for gender, props in pairs(require(names_module).given_name_genders) do&lt;br /&gt;
	if gender ~= &amp;quot;unknown-gender&amp;quot; then&lt;br /&gt;
		local is_animal = props.type == &amp;quot;animal&amp;quot;&lt;br /&gt;
		local cat = is_animal and gender .. &amp;quot; names&amp;quot; or gender .. &amp;quot; given names&amp;quot;&lt;br /&gt;
		local desc = is_animal and &amp;quot; given to [[&amp;quot; .. gender .. &amp;quot;|&amp;quot; .. pluralize(gender) .. &amp;quot;]]&amp;quot; or &amp;quot; given &amp;quot; .. human_genders[gender]&lt;br /&gt;
		local function do_cat(cat, desc, breadcrumb, parents)&lt;br /&gt;
			labels[cat] = {&lt;br /&gt;
				description = &amp;quot;{{{langname}}} &amp;quot; .. desc .. &amp;quot;.&amp;quot;,&lt;br /&gt;
				breadcrumb = breadcrumb,&lt;br /&gt;
				parents = parents,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		for _, dimaug in ipairs { &amp;quot;diminutive&amp;quot;, &amp;quot;augmentative&amp;quot; } do&lt;br /&gt;
			do_cat(dimaug .. &amp;quot;s of &amp;quot; .. cat, dimaug .. &amp;quot; names &amp;quot; .. desc, dimaug,&lt;br /&gt;
				{gender .. &amp;quot; given names&amp;quot;, dimaug .. &amp;quot; nouns&amp;quot;})&lt;br /&gt;
		end&lt;br /&gt;
		do_cat(cat, &amp;quot;names &amp;quot; .. desc, gender, is_animal and (gender == &amp;quot;animal&amp;quot; and &amp;quot;names&amp;quot; or is_animal and&lt;br /&gt;
			&amp;quot;animal names&amp;quot;) or &amp;quot;given names&amp;quot;)&lt;br /&gt;
		if not is_animal then&lt;br /&gt;
			do_cat(gender .. &amp;quot; skin names&amp;quot;, &amp;quot;skin names &amp;quot; .. desc, gender, {&amp;quot;skin names&amp;quot;})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;given names&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} names given to individuals.&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;names&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;skin names&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} terms given at birth that are used to refer to individuals from specific marital classes.&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;proper nouns&amp;quot;, &amp;quot;names&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
------------------------------------------- surnames -------------------------------------------&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;common-gender surnames&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} names shared by both male and female family members, in languages that distinguish male and female surnames.&amp;quot;,&lt;br /&gt;
	breadcrumb = &amp;quot;common-gender&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;surnames&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;female surnames&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} names shared by female family members.&amp;quot;,&lt;br /&gt;
	breadcrumb = &amp;quot;female&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;surnames&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;male surnames&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} names shared by male family members.&amp;quot;,&lt;br /&gt;
	breadcrumb = &amp;quot;male&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;surnames&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;surnames&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} names shared by family members.&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;names&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for _, nymics in ipairs { &amp;quot;matronymics&amp;quot;, &amp;quot;patronymics&amp;quot; } do&lt;br /&gt;
	local ancestor = nymics == &amp;quot;matronymics&amp;quot; and &amp;quot;mother, grandmother or earlier female ancestor&amp;quot; or&lt;br /&gt;
		&amp;quot;father, grandfather or earlier male ancestor&amp;quot;&lt;br /&gt;
	labels[&amp;quot;common-gender &amp;quot; .. nymics] = {&lt;br /&gt;
		description = (&amp;quot;{{{langname}}} names used by both men and women to indicate their %s, in languages that distinguish male and female %s.&amp;quot;):&lt;br /&gt;
			format(ancestor, nymics),&lt;br /&gt;
		breadcrumb = &amp;quot;common-gender&amp;quot;,&lt;br /&gt;
		parents = {nymics},&lt;br /&gt;
	}&lt;br /&gt;
	labels[&amp;quot;female &amp;quot; .. nymics] = {&lt;br /&gt;
		description = (&amp;quot;{{{langname}}} names used by women to indicate their %s.&amp;quot;):&lt;br /&gt;
			format(ancestor, nymics),&lt;br /&gt;
		breadcrumb = &amp;quot;female&amp;quot;,&lt;br /&gt;
		parents = {nymics},&lt;br /&gt;
	}&lt;br /&gt;
	labels[&amp;quot;male &amp;quot; .. nymics] = {&lt;br /&gt;
		description = (&amp;quot;{{{langname}}} names used by men to indicate their %s.&amp;quot;):&lt;br /&gt;
			format(ancestor, nymics),&lt;br /&gt;
		breadcrumb = &amp;quot;male&amp;quot;,&lt;br /&gt;
		parents = {nymics},&lt;br /&gt;
	}&lt;br /&gt;
	labels[nymics] = {&lt;br /&gt;
		description = (&amp;quot;{{{langname}}} names indicating a person&amp;#039;s %s.&amp;quot;):format(ancestor),&lt;br /&gt;
		parents = {&amp;quot;names&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;nomina gentilia&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} \&amp;quot;[[family name]]s\&amp;quot; (singular &amp;#039;&amp;#039;[[nomen gentile]]&amp;#039;&amp;#039;) in a [[w:Roman naming convention|convential Roman name]].&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;names&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
------------------------------------------- misc -------------------------------------------&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;exonyms&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} [[exonym]]s, i.e. terms for toponyms whose name in {{{langname}}} is different from the name in the source language.&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;names&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
labels[&amp;quot;renderings of foreign personal names&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;{{{langname}}} transliterations, respellings or other renderings of foreign personal names.&amp;quot;,&lt;br /&gt;
	parents = {&amp;quot;names&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Add &amp;#039;umbrella_parents&amp;#039; key if not already present.&lt;br /&gt;
for key, data in pairs(labels) do&lt;br /&gt;
	if not data.umbrella_parents then&lt;br /&gt;
		data.umbrella_parents = &amp;quot;Names subcategories by language&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                              RAW CATEGORIES                             --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
raw_categories[&amp;quot;Names subcategories by language&amp;quot;] = {&lt;br /&gt;
	description = &amp;quot;Umbrella categories covering topics related to names.&amp;quot;,&lt;br /&gt;
	additional = &amp;quot;{{{umbrella_meta_msg}}}&amp;quot;,&lt;br /&gt;
	parents = {&lt;br /&gt;
		&amp;quot;Umbrella metacategories&amp;quot;,&lt;br /&gt;
		{name = &amp;quot;names&amp;quot;, is_label = true, sort = &amp;quot; &amp;quot;},&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--                                                                         --&lt;br /&gt;
--                                 HANDLERS                                --&lt;br /&gt;
--                                                                         --&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function source_name_to_source(nametype, source_name)&lt;br /&gt;
	local special_sources&lt;br /&gt;
	if nametype:find(&amp;quot;given names&amp;quot;) then&lt;br /&gt;
		special_sources = require(&amp;quot;Module:table&amp;quot;).listToSet {&lt;br /&gt;
			&amp;quot;surnames&amp;quot;, &amp;quot;place names&amp;quot;, &amp;quot;coinages&amp;quot;, &amp;quot;the Bible&amp;quot;, &amp;quot;month names&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	elseif nametype:find(&amp;quot;surnames&amp;quot;) then&lt;br /&gt;
		special_sources = require(&amp;quot;Module:table&amp;quot;).listToSet {&lt;br /&gt;
			&amp;quot;given names&amp;quot;, &amp;quot;place names&amp;quot;, &amp;quot;occupations&amp;quot;, &amp;quot;patronymics&amp;quot;, &amp;quot;matronymics&amp;quot;,&lt;br /&gt;
			&amp;quot;common nouns&amp;quot;, &amp;quot;nicknames&amp;quot;, &amp;quot;ethnonyms&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		special_sources = {}&lt;br /&gt;
	end&lt;br /&gt;
	if special_sources[source_name] then&lt;br /&gt;
		return source_name&lt;br /&gt;
	else&lt;br /&gt;
		return require(&amp;quot;Module:languages&amp;quot;).getByCanonicalName(source_name, nil,&lt;br /&gt;
			&amp;quot;allow etym langs&amp;quot;, &amp;quot;allow families&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_source_text(source)&lt;br /&gt;
	if type(source) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		return source:getDisplayForm()&lt;br /&gt;
	else&lt;br /&gt;
		return source&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_description(lang, nametype, source)&lt;br /&gt;
	local origintext, addltext&lt;br /&gt;
	if source == &amp;quot;surnames&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;transferred from surnames&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;given names&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;transferred from given names&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;nicknames&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;transferred from nicknames&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;place names&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;transferred from place names&amp;quot;&lt;br /&gt;
		addltext = &amp;quot; For place names that are also surnames, see &amp;quot; .. (&lt;br /&gt;
			lang and &amp;quot;[[:Category:{{{langname}}} &amp;quot; .. nametype .. &amp;quot; from surnames]]&amp;quot; or&lt;br /&gt;
			&amp;quot;[[:Category:&amp;quot; .. mw.getContentLanguage():ucfirst(nametype) .. &amp;quot; from surnames by language]]&amp;quot;&lt;br /&gt;
		) .. &amp;quot;.&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;common nouns&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;transferred from common nouns&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;month names&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;transferred from month names&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;coinages&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;originating as coinages&amp;quot;&lt;br /&gt;
		addltext = &amp;quot; These are names of artificial origin, names based on fictional characters, combinations of two words or names or backward spellings. Names of uncertain origin can also be placed here if there is a strong suspicion that they are coinages.&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;occupations&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;originating as occupations&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;patronymics&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;originating as patronymics&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;matronymics&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;originating as matronymics&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;ethnonyms&amp;quot; then&lt;br /&gt;
		origintext = &amp;quot;originating as ethnonyms&amp;quot;&lt;br /&gt;
	elseif source == &amp;quot;the Bible&amp;quot; then&lt;br /&gt;
		-- Hack esp. for Hawaiian names. We should consider changing them to&lt;br /&gt;
		-- have the source as Biblical Hebrew and mention the derivation from&lt;br /&gt;
		-- the Bible some other way.&lt;br /&gt;
		origintext = &amp;quot;originating from the Bible&amp;quot;&lt;br /&gt;
	elseif type(source) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		error(&amp;quot;Internal error: Unrecognized string source \&amp;quot;&amp;quot; .. source .. &amp;quot;\&amp;quot;, should be special-cased&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		origintext = &amp;quot;of &amp;quot; .. source:makeCategoryLink() .. &amp;quot; origin&amp;quot;&lt;br /&gt;
		if lang and source:getCode() == lang:getCode() then&lt;br /&gt;
			addltext = &amp;quot; These are names derived from common nouns, local mythology, etc.&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local introtext&lt;br /&gt;
	if lang then&lt;br /&gt;
		introtext = &amp;quot;{{{langname}}} &amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		introtext = &amp;quot;Categories with &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return introtext .. nametype .. &amp;quot; &amp;quot; .. origintext ..&lt;br /&gt;
		&amp;quot;. (This includes names derived at an older stage of the language.)&amp;quot; .. (addltext or &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If one of the following families occurs in any of the ancestral families&lt;br /&gt;
-- of a given language, use it instead of the three-letter parent&lt;br /&gt;
-- (or immediate parent if no three-letter parent).&lt;br /&gt;
local high_level_families = require(&amp;quot;Module:table&amp;quot;).listToSet {&lt;br /&gt;
	-- Indo-European&lt;br /&gt;
	&amp;quot;gem&amp;quot;, -- Germanic (for gme, gmq, gmw)&lt;br /&gt;
	&amp;quot;inc&amp;quot;, -- Indic (for e.g. pra = Prakrit)&lt;br /&gt;
	&amp;quot;ine-ana&amp;quot;, -- Anatolian (don&amp;#039;t keep going to ine)&lt;br /&gt;
	&amp;quot;ine-toc&amp;quot;, -- Tocharian (don&amp;#039;t keep going to ine)&lt;br /&gt;
	&amp;quot;ira&amp;quot;, -- Iranian (for e.g. xme = Median, xsc = Scythian)&lt;br /&gt;
	&amp;quot;sla&amp;quot;, -- Slavic (for zle, zls, zlw)&lt;br /&gt;
	-- Other&lt;br /&gt;
	&amp;quot;ath&amp;quot;, -- Athabaskan (for e.g. apa = Apachean)&lt;br /&gt;
	&amp;quot;poz&amp;quot;, -- Malayo-Polynesian (for e.g. pqe = Eastern Malayo-Polynesian)&lt;br /&gt;
	&amp;quot;cau-nwc&amp;quot;, -- Northwest Caucasian&lt;br /&gt;
	&amp;quot;cau-nec&amp;quot;, -- Northeast Caucasian&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function find_high_level_family(lang)&lt;br /&gt;
	local family = lang:getFamily()&lt;br /&gt;
	-- (1) If no family, return nil (e.g. for Pictish).&lt;br /&gt;
	if not family then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- (2) See if any ancestor family is in `high_level_families`.&lt;br /&gt;
	-- if so, return it.&lt;br /&gt;
	local high_level_family = family&lt;br /&gt;
	while high_level_family do&lt;br /&gt;
		local high_level_code = high_level_family:getCode()&lt;br /&gt;
		if high_level_code == &amp;quot;qfa-not&amp;quot; then&lt;br /&gt;
			-- &amp;quot;not a family&amp;quot;; its own parent, causing an infinite loop.&lt;br /&gt;
			-- Break rather than return so we get categories like&lt;br /&gt;
			-- [[Category:English female given names from sign languages]] and&lt;br /&gt;
			-- [[Category:English female given names from constructed languages]].&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		if high_level_families[high_level_code] then&lt;br /&gt;
			return high_level_family&lt;br /&gt;
		end&lt;br /&gt;
		high_level_family = high_level_family:getFamily()&lt;br /&gt;
	end&lt;br /&gt;
	-- (3) If the family is of the form &amp;#039;FOO-BAR&amp;#039;, see if &amp;#039;FOO&amp;#039; is a family.&lt;br /&gt;
	-- If so, return it.&lt;br /&gt;
	local basic_family = family:getCode():match(&amp;quot;^(.-)%-.*$&amp;quot;)&lt;br /&gt;
	if basic_family then&lt;br /&gt;
		basic_family = require(&amp;quot;Module:families&amp;quot;).getByCode(basic_family)&lt;br /&gt;
		if basic_family then&lt;br /&gt;
			return basic_family&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- (4) Fall back to just the family itself.&lt;br /&gt;
	return family&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function match_gendered_nametype(nametype)&lt;br /&gt;
	local gender, label = nametype:match(&amp;quot;^(f?e?male) (given names)$&amp;quot;)&lt;br /&gt;
	if not gender then&lt;br /&gt;
		gender, label = nametype:match(&amp;quot;^(unisex) (given names)$&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if gender then&lt;br /&gt;
		return gender, label&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_parents(lang, nametype, source)&lt;br /&gt;
	local parents = {}&lt;br /&gt;
&lt;br /&gt;
	if lang then&lt;br /&gt;
		table.insert(parents, {name = nametype, sort = get_source_text(source)})&lt;br /&gt;
		if type(source) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			table.insert(parents, {name = &amp;quot;terms derived from &amp;quot; .. source:getDisplayForm(), sort = &amp;quot; &amp;quot;})&lt;br /&gt;
			-- If the source is a regular language, put it in a parent category for the high-level language family, e.g. for&lt;br /&gt;
			-- &amp;quot;Russian female given names from German&amp;quot;, put it in a parent category &amp;quot;Russian female given names from Germanic languages&amp;quot;&lt;br /&gt;
			-- (skipping over West Germanic languages).&lt;br /&gt;
			--&lt;br /&gt;
			-- If the source is an etymology language, put it in a parent category for the parent full language, e.g. for&lt;br /&gt;
			-- &amp;quot;French male given names from Gascon&amp;quot;, put it in a parent category &amp;quot;French male given names from Occitan&amp;quot;.&lt;br /&gt;
			--&lt;br /&gt;
			-- If the source is a family, put it in a parent category for the parent family.&lt;br /&gt;
			if source:hasType(&amp;quot;family&amp;quot;) then&lt;br /&gt;
				local parent_family = source:getFamily()&lt;br /&gt;
				if parent_family and parent_family:getCode() ~= &amp;quot;qfa-not&amp;quot; then&lt;br /&gt;
					table.insert(parents, {&lt;br /&gt;
						name = nametype .. &amp;quot; from &amp;quot; .. parent_family:getDisplayForm(),&lt;br /&gt;
						sort = source:getCanonicalName()&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			elseif source:hasType(&amp;quot;etymology-only&amp;quot;) then&lt;br /&gt;
				local source_parent = source:getFull()&lt;br /&gt;
				if source_parent and source_parent:getCode() ~= &amp;quot;und&amp;quot; then&lt;br /&gt;
					table.insert(parents, {&lt;br /&gt;
						name = nametype .. &amp;quot; from &amp;quot; .. source_parent:getDisplayForm(),&lt;br /&gt;
						sort = source:getCanonicalName()&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				local high_level_family = find_high_level_family(source)&lt;br /&gt;
				if high_level_family then -- may not exist, e.g. for Pictish&lt;br /&gt;
					table.insert(parents,&lt;br /&gt;
						{name = nametype .. &amp;quot; from &amp;quot; .. high_level_family:getDisplayForm(),&lt;br /&gt;
						sort = source:getCanonicalName()&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		local gender, label = match_gendered_nametype(nametype)&lt;br /&gt;
		if gender then&lt;br /&gt;
			table.insert(parents, {name = label .. &amp;quot; from &amp;quot; .. get_source_text(source), sort = gender})&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local gender, label = match_gendered_nametype(nametype)&lt;br /&gt;
		if gender then&lt;br /&gt;
			table.insert(parents, {name = label .. &amp;quot; from &amp;quot; .. get_source_text(source), is_label = true, sort = &amp;quot; &amp;quot;})&lt;br /&gt;
		elseif type(source) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			-- FIXME! This is duplicated in [[Module:category tree/etymology]] in the handler for umbrella categories&lt;br /&gt;
			-- &amp;#039;Terms derived from SOURCE&amp;#039;.&lt;br /&gt;
			local first_umbrella_parent =&lt;br /&gt;
				source:hasType(&amp;quot;family&amp;quot;) and {name = source:getCategoryName(), raw = true, sort = &amp;quot; &amp;quot;} or&lt;br /&gt;
				source:hasType(&amp;quot;etymology-only&amp;quot;) and {name = &amp;quot;Category:&amp;quot; .. source:getCategoryName(), sort = nametype} or&lt;br /&gt;
				{name = source:getCategoryName(), raw = true, sort = nametype}&lt;br /&gt;
			table.insert(parents, first_umbrella_parent)&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(parents, &amp;quot;Names subcategories by language&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return parents&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
table.insert(handlers, function(data)&lt;br /&gt;
	local nametype, source_name = data.label:match(&amp;quot;^(.*names) from (.+)$&amp;quot;)&lt;br /&gt;
	if nametype then&lt;br /&gt;
		local personal_name_type_set = require(names_module).personal_name_type_set&lt;br /&gt;
		if not personal_name_type_set[nametype] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		local source = source_name_to_source(nametype, source_name)&lt;br /&gt;
		if not source then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		return {&lt;br /&gt;
			description = get_description(data.lang, nametype, source),&lt;br /&gt;
			breadcrumb = &amp;quot;from &amp;quot; .. get_source_text(source),&lt;br /&gt;
			parents = get_parents(data.lang, nametype, source),&lt;br /&gt;
			umbrella = {&lt;br /&gt;
				description = get_description(nil, nametype, source),&lt;br /&gt;
				parents = get_parents(nil, nametype, source),&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Handler for e.g. &amp;#039;English renderings of Russian male given names&amp;#039;.&lt;br /&gt;
table.insert(handlers, function(data)&lt;br /&gt;
	local label = data.label:match(&amp;quot;^renderings of (.*)$&amp;quot;)&lt;br /&gt;
	if label then&lt;br /&gt;
		local personal_name_types = require(names_module).personal_name_types&lt;br /&gt;
		for _, nametype in ipairs(personal_name_types) do&lt;br /&gt;
			local sourcename = label:match(&amp;quot;^(.+) &amp;quot; .. nametype .. &amp;quot;$&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			if sourcename then&lt;br /&gt;
				local source = require(&amp;quot;Module:languages&amp;quot;).getByCanonicalName(sourcename, nil, &amp;quot;allow etym&amp;quot;)&lt;br /&gt;
				if source then&lt;br /&gt;
					return {&lt;br /&gt;
						description = &amp;quot;Transliterations, respellings or other renderings of &amp;quot; .. source:makeCategoryLink() .. &amp;quot; &amp;quot; .. nametype .. &amp;quot; into {{{langdisp}}}.&amp;quot;,&lt;br /&gt;
						lang = data.lang,&lt;br /&gt;
						breadcrumb = sourcename .. &amp;quot; &amp;quot; .. nametype,&lt;br /&gt;
						parents = {&lt;br /&gt;
							{ name = &amp;quot;renderings of foreign personal names&amp;quot;, sort = sourcename },&lt;br /&gt;
							{ name = nametype, lang = source:getCode(), sort = &amp;quot;{{{langname}}}&amp;quot; },&lt;br /&gt;
						},&lt;br /&gt;
						umbrella = {&lt;br /&gt;
							description = &amp;quot;Transliterations, respellings or other renderings of &amp;quot; .. source:makeCategoryLink() .. &amp;quot; &amp;quot; .. nametype .. &amp;quot; into various languages.&amp;quot;,&lt;br /&gt;
							parents = {{name = &amp;quot;renderings of foreign personal names&amp;quot;, is_label = true, sort = label}},&lt;br /&gt;
						},&lt;br /&gt;
					}&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;
&lt;br /&gt;
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}&lt;/div&gt;</summary>
		<author><name>wikt&gt;Surjection</name></author>
	</entry>
</feed>