<?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%3Afamily_tree%2Fnested_data</id>
	<title>Module:family tree/nested data - 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%3Afamily_tree%2Fnested_data"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:family_tree/nested_data&amp;action=history"/>
	<updated>2026-04-03T17:28:01Z</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:family_tree/nested_data&amp;diff=286100&amp;oldid=prev</id>
		<title>Sware at 23:13, 27 July 2022</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:family_tree/nested_data&amp;diff=286100&amp;oldid=prev"/>
		<updated>2022-07-27T23:13:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:13, 27 July 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l166&quot;&gt;Line 166:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 166:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.. code&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&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:family_tree/nested_data&amp;diff=286099&amp;oldid=prev</id>
		<title>Sware at 23:12, 27 July 2022</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:family_tree/nested_data&amp;diff=286099&amp;oldid=prev"/>
		<updated>2022-07-27T23:12:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:12, 27 July 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l166&quot;&gt;Line 166:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 166:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; .. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;table.concat(&lt;/del&gt;code&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;,&quot;&quot;)&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; .. code)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&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:family_tree/nested_data&amp;diff=286097&amp;oldid=prev</id>
		<title>Sware at 23:09, 27 July 2022</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:family_tree/nested_data&amp;diff=286097&amp;oldid=prev"/>
		<updated>2022-07-27T23:09:16Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:09, 27 July 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l166&quot;&gt;Line 166:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 166:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; .. code)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; .. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;table.concat(&lt;/ins&gt;code&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;,&quot;&quot;)&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&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:family_tree/nested_data&amp;diff=286093&amp;oldid=prev</id>
		<title>Sware at 22:58, 27 July 2022</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:family_tree/nested_data&amp;diff=286093&amp;oldid=prev"/>
		<updated>2022-07-27T22:58:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:58, 27 July 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--[=[&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--[=[&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Authors: [[User:kc_kennylau]], [[User:JohnC5]], [[User:Erutuon]], [[User:Suzukaze-c]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Authors: [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;wikt:&lt;/ins&gt;User:kc_kennylau]], [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;wikt:&lt;/ins&gt;User:JohnC5]], [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;wikt:&lt;/ins&gt;User:Erutuon]], [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;wikt:&lt;/ins&gt;User:Suzukaze-c]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--]=]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--]=]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l166&quot;&gt;Line 166:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 166:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; .. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;table.concat(&lt;/del&gt;code&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;)&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; .. code)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&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:family_tree/nested_data&amp;diff=233379&amp;oldid=prev</id>
		<title>Sware at 18:00, 8 August 2021</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:family_tree/nested_data&amp;diff=233379&amp;oldid=prev"/>
		<updated>2021-08-08T18:00:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:00, 8 August 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l166&quot;&gt;Line 166:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 166:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				if code and not val then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					-- Error in data table!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; .. code)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					mw.log(&quot;no such family code: &quot; .. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;table.concat(&lt;/ins&gt;code&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;)&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				return nil&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:family_tree/nested_data&amp;diff=233365&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;--[=[  Authors: User:kc_kennylau, User:JohnC5, User:Erutuon, User:Suzukaze-c  --]=]  local regular_languages = require(&quot;Module:languages/alldata&quot;) local famili...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:family_tree/nested_data&amp;diff=233365&amp;oldid=prev"/>
		<updated>2021-08-08T17:38:57Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--[=[  Authors: &lt;a href=&quot;/w/index.php?title=User:Kc_kennylau&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Kc kennylau (page does not exist)&quot;&gt;User:kc_kennylau&lt;/a&gt;, &lt;a href=&quot;/w/index.php?title=User:JohnC5&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:JohnC5 (page does not exist)&quot;&gt;User:JohnC5&lt;/a&gt;, &lt;a href=&quot;/w/index.php?title=User:Erutuon&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Erutuon (page does not exist)&quot;&gt;User:Erutuon&lt;/a&gt;, &lt;a href=&quot;/w/index.php?title=User:Suzukaze-c&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Suzukaze-c (page does not exist)&quot;&gt;User:Suzukaze-c&lt;/a&gt;  --]=]  local regular_languages = require(&amp;quot;Module:languages/alldata&amp;quot;) local famili...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[=[&lt;br /&gt;
&lt;br /&gt;
Authors: [[User:kc_kennylau]], [[User:JohnC5]], [[User:Erutuon]], [[User:Suzukaze-c]]&lt;br /&gt;
&lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
local regular_languages = require(&amp;quot;Module:languages/alldata&amp;quot;)&lt;br /&gt;
local families = require(&amp;quot;Module:families/data&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Version of [[Module:etymology languages/data]] that chooses the language-&lt;br /&gt;
-- codiest code of several codes that have the same data. For instance,&lt;br /&gt;
-- it chooses &amp;quot;de-AT&amp;quot; over &amp;quot;Austrian German&amp;quot;.&lt;br /&gt;
local etymology_languages = require(&amp;quot;Module:family tree/etymology languages&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local supplementary_language_and_family_data = require(&amp;quot;Module:family tree/data&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local memoize = require(&amp;quot;Module:fun&amp;quot;).memoize&lt;br /&gt;
&lt;br /&gt;
local make_auto_subtabler = require(&amp;quot;Module:auto-subtable&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local function get_data(code)&lt;br /&gt;
	return regular_languages[code] or etymology_languages[code] or families[code]&lt;br /&gt;
		or error(&amp;quot;language code &amp;quot; .. tostring(code) .. &amp;quot; not recognized&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local get_sort_value = memoize(function (code)&lt;br /&gt;
	local data = get_data(code)&lt;br /&gt;
	return (data[1] or data.canonicalName):gsub(&amp;quot;Proto%-&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- used in deep_sort&lt;br /&gt;
local function compare(code1, code2)&lt;br /&gt;
	return get_sort_value(code1) &amp;lt; get_sort_value(code2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function deep_sort(current)&lt;br /&gt;
	local result = {}&lt;br /&gt;
	local is_table = {}&lt;br /&gt;
	for key, val in pairs(current) do&lt;br /&gt;
		if type(key) == &amp;quot;number&amp;quot; then&lt;br /&gt;
			table.insert(result, val)&lt;br /&gt;
		else&lt;br /&gt;
			is_table[key] = true&lt;br /&gt;
			table.insert(result, key)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.sort(result, compare)&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, #result do&lt;br /&gt;
		if is_table[result[i]] then&lt;br /&gt;
			local name = result[i]&lt;br /&gt;
			result[i] = deep_sort(current[result[i]])&lt;br /&gt;
			result[i].name = name&lt;br /&gt;
		else&lt;br /&gt;
			result[i] = { name = result[i] }&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Reliably get family for etymology language.&lt;br /&gt;
local function get_family(code)&lt;br /&gt;
	while code do&lt;br /&gt;
		local data = get_data(code)&lt;br /&gt;
		local family = data[3] or data.family&lt;br /&gt;
		if family then -- This is a regular language or family code.&lt;br /&gt;
			return family&lt;br /&gt;
		end&lt;br /&gt;
		-- This is an etymology language code. Go up in the chain of parenthood.&lt;br /&gt;
		code = data.parent&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function all_in_family(family_code, codes)&lt;br /&gt;
	for _, code in ipairs(codes) do&lt;br /&gt;
		if get_family(code) ~= family_code then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local protolanguage_of = memoize(function(fam_code)&lt;br /&gt;
	local data = get_data(fam_code)&lt;br /&gt;
	if data then&lt;br /&gt;
		local proto = data.protoLanguage&lt;br /&gt;
		if proto then&lt;br /&gt;
			return proto&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local proto = fam_code .. &amp;quot;-pro&amp;quot;&lt;br /&gt;
	if regular_languages[proto] or etymology_languages[proto] then&lt;br /&gt;
		return proto&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Key: old parent code&lt;br /&gt;
-- Value: new parent code (move all regular languages or families here)&lt;br /&gt;
local new_parent_code = {}&lt;br /&gt;
&lt;br /&gt;
-- Key: ancestor of proto-language&lt;br /&gt;
-- Value: table, containing&lt;br /&gt;
--    Key: proto-language&lt;br /&gt;
--    Value: family of proto-language&lt;br /&gt;
local protolanguage_to_put_under_family = make_auto_subtabler()&lt;br /&gt;
&lt;br /&gt;
local function find_ancestors(code, val)&lt;br /&gt;
	-- First look for the special family tree–only ancestor.&lt;br /&gt;
	if supplementary_language_and_family_data[code] and supplementary_language_and_family_data[code].parent then&lt;br /&gt;
		return { supplementary_language_and_family_data[code].parent }&lt;br /&gt;
	&lt;br /&gt;
	-- Handle etymology languages.&lt;br /&gt;
	elseif etymology_languages[code] then&lt;br /&gt;
		local parent = val.parent&lt;br /&gt;
		if parent then&lt;br /&gt;
			return { parent }&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	-- Handle regular languages&lt;br /&gt;
	-- Return ancestors value if the ancestors belong to the same language&lt;br /&gt;
	-- family.&lt;br /&gt;
	elseif val.ancestors and (#val.ancestors == 1&lt;br /&gt;
	or all_in_family(get_family(code), val.ancestors)) then&lt;br /&gt;
		return val.ancestors&lt;br /&gt;
	&lt;br /&gt;
	-- If the proto-language of a family does not belong to the family (i.e.,&lt;br /&gt;
	-- it belongs to the same family as the family does), nest the family&lt;br /&gt;
	-- under the proto-language instead of the other way around.&lt;br /&gt;
	elseif families[code] then&lt;br /&gt;
		local proto = protolanguage_of(code)&lt;br /&gt;
		if proto then&lt;br /&gt;
			if get_family(proto) == get_family(code) then&lt;br /&gt;
				new_parent_code[proto] = code&lt;br /&gt;
				return { proto }&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			-- Normally a family is the child of a proto-language or a family,&lt;br /&gt;
			-- but if the family&amp;#039;s proto-language has an ancestors field, use&lt;br /&gt;
			-- that as parent instead.&lt;br /&gt;
			local proto_data = get_data(proto)&lt;br /&gt;
			if proto_data.ancestors then&lt;br /&gt;
				for _, ancestor in ipairs(proto_data.ancestors) do&lt;br /&gt;
					protolanguage_to_put_under_family[ancestor][proto] = code&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				return proto_data.ancestors&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Handle regular languages and language families.&lt;br /&gt;
	-- Return a proto-language if possible, else a language family.&lt;br /&gt;
	if get_family(code) then&lt;br /&gt;
		-- Go up through the language families that the language or family&lt;br /&gt;
		-- belongs to.&lt;br /&gt;
		local origin = code&lt;br /&gt;
		while true do&lt;br /&gt;
			code = get_family(code)&lt;br /&gt;
			val = families[code]&lt;br /&gt;
			&lt;br /&gt;
			-- no family, &amp;quot;not a family&amp;quot;, undetermined family&lt;br /&gt;
			if not (code and val and code ~= &amp;quot;qfa-not&amp;quot; and code ~= &amp;quot;qfa-und&amp;quot;) then&lt;br /&gt;
				if code and not val then&lt;br /&gt;
					-- Error in data table!&lt;br /&gt;
					mw.log(&amp;quot;no such family code: &amp;quot; .. code)&lt;br /&gt;
				end&lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			local proto = protolanguage_of(code)&lt;br /&gt;
			if proto and proto ~= origin then&lt;br /&gt;
				return { proto }&lt;br /&gt;
			else&lt;br /&gt;
				return { code }&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_parent_to_children_map()&lt;br /&gt;
	local children = make_auto_subtabler{}&lt;br /&gt;
	&lt;br /&gt;
	for _, data_module in ipairs { families, regular_languages, etymology_languages } do&lt;br /&gt;
		for code, data in pairs(data_module) do&lt;br /&gt;
			local ancestors = find_ancestors(code, data)&lt;br /&gt;
			if ancestors then&lt;br /&gt;
				for _, ancestor in ipairs(ancestors) do&lt;br /&gt;
					if ancestor ~= code then&lt;br /&gt;
						table.insert(children[ancestor], code)&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;
	-- No more auto subtabling needed.&lt;br /&gt;
	return children:un_auto_subtable()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- For instance, Latin is the proto-language of the Romance languages, but&lt;br /&gt;
-- belongs to the Italic family. All the children of Latin that are languages&lt;br /&gt;
-- or families were initially placed under Latin, but must be placed under the&lt;br /&gt;
-- Romance languages.&lt;br /&gt;
local function move_children(parent_to_children_map)&lt;br /&gt;
	make_auto_subtabler(parent_to_children_map)&lt;br /&gt;
	&lt;br /&gt;
	for old_code, new_code in pairs(new_parent_code) do&lt;br /&gt;
		local old_children = parent_to_children_map[old_code]&lt;br /&gt;
		local new_children = parent_to_children_map[new_code]&lt;br /&gt;
		&lt;br /&gt;
		local i = 1&lt;br /&gt;
		while old_children[i] do&lt;br /&gt;
			local child = old_children[i]&lt;br /&gt;
			if child ~= new_code and (regular_languages[child] or families[child]) then&lt;br /&gt;
				table.insert(new_children, table.remove(old_children, i))&lt;br /&gt;
			else&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if #old_children == 0 then&lt;br /&gt;
			parent_to_children_map[old_code] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for old_parent, child_to_new_parent in pairs(protolanguage_to_put_under_family) do&lt;br /&gt;
		local old_children = parent_to_children_map[old_parent]&lt;br /&gt;
		if type(old_children) == &amp;quot;table&amp;quot; then&lt;br /&gt;
			local i = 1&lt;br /&gt;
			while old_children[i] do&lt;br /&gt;
				local child = old_children[i]&lt;br /&gt;
				&lt;br /&gt;
				local new_parent = child_to_new_parent[child]&lt;br /&gt;
				if new_parent then&lt;br /&gt;
					table.insert(parent_to_children_map[new_parent], table.remove(old_children, i))&lt;br /&gt;
				else&lt;br /&gt;
					i = i + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	parent_to_children_map:un_auto_subtable()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function reverse_comp(a, b)&lt;br /&gt;
	return a &amp;gt; b&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_nested(data, children)&lt;br /&gt;
	local make_nil = {}&lt;br /&gt;
	for key, val in pairs(data) do&lt;br /&gt;
		if type(key) == &amp;quot;number&amp;quot; then&lt;br /&gt;
			if children[val] then&lt;br /&gt;
				data[val] = make_nested(children[val], children)&lt;br /&gt;
				table.insert(make_nil, key)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			data[key] = make_nested(val, children)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if make_nil[2] then -- Make sure larger keys are removed first.&lt;br /&gt;
		table.sort(make_nil, reverse_comp)&lt;br /&gt;
	end&lt;br /&gt;
	for _, key in ipairs(make_nil) do&lt;br /&gt;
		table.remove(data, key)&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function main()&lt;br /&gt;
	local parent_to_children_map = make_parent_to_children_map()&lt;br /&gt;
	&lt;br /&gt;
	move_children(parent_to_children_map)&lt;br /&gt;
	&lt;br /&gt;
	local nested = make_nested(parent_to_children_map, parent_to_children_map)&lt;br /&gt;
	&lt;br /&gt;
	nested = deep_sort(nested)&lt;br /&gt;
	&lt;br /&gt;
	return { nested = nested, protolanguage_of = protolanguage_of }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return main()&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>