<?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%3Aamf-utilities</id>
	<title>Module:amf-utilities - 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%3Aamf-utilities"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:amf-utilities&amp;action=history"/>
	<updated>2026-06-25T16:22:56Z</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:amf-utilities&amp;diff=495355&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:amf-utilities&amp;diff=495355&amp;oldid=prev"/>
		<updated>2026-04-21T12:00:58Z</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 12:00, 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:amf-utilities&amp;diff=495354&amp;oldid=prev</id>
		<title>wikt&gt;Theknightwho: Remove unnecessary checks.</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:amf-utilities&amp;diff=495354&amp;oldid=prev"/>
		<updated>2025-03-06T14:10:08Z</updated>

		<summary type="html">&lt;p&gt;Remove unnecessary checks.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
-- internal encoding using [a-zA-Z]&lt;br /&gt;
export.encode = {&lt;br /&gt;
	[&amp;quot;ã&amp;quot;] = &amp;quot;A&amp;quot;,&lt;br /&gt;
	[&amp;quot;ɓ&amp;quot;] = &amp;quot;B&amp;quot;,&lt;br /&gt;
	[&amp;quot;cʼ&amp;quot;] = &amp;quot;C&amp;quot;,&lt;br /&gt;
	[&amp;quot;ɗ&amp;quot;] = &amp;quot;D&amp;quot;,&lt;br /&gt;
	[&amp;quot;ɛ&amp;quot;] = &amp;quot;E&amp;quot;,&lt;br /&gt;
	[&amp;quot;ɠ&amp;quot;] = &amp;quot;G&amp;quot;,&lt;br /&gt;
	[&amp;quot;ĩ&amp;quot;] = &amp;quot;I&amp;quot;,&lt;br /&gt;
	[&amp;quot;ɲ&amp;quot;] = &amp;quot;N&amp;quot;,&lt;br /&gt;
	[&amp;quot;ɔ&amp;quot;] = &amp;quot;O&amp;quot;,&lt;br /&gt;
	[&amp;quot;sh&amp;quot;] = &amp;quot;S&amp;quot;,&lt;br /&gt;
	[&amp;quot;tʼ&amp;quot;] = &amp;quot;T&amp;quot;,&lt;br /&gt;
	[&amp;quot;ʔ&amp;quot;] = &amp;quot;Q&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
export.decode = {&lt;br /&gt;
	A = &amp;quot;ã&amp;quot;,&lt;br /&gt;
	B = &amp;quot;ɓ&amp;quot;,&lt;br /&gt;
	C = &amp;quot;cʼ&amp;quot;,&lt;br /&gt;
	D = &amp;quot;ɗ&amp;quot;,&lt;br /&gt;
	E = &amp;quot;ɛ&amp;quot;,&lt;br /&gt;
	G = &amp;quot;ɠ&amp;quot;,&lt;br /&gt;
	I = &amp;quot;ĩ&amp;quot;,&lt;br /&gt;
	N = &amp;quot;ɲ&amp;quot;,&lt;br /&gt;
	O = &amp;quot;ɔ&amp;quot;,&lt;br /&gt;
	S = &amp;quot;sh&amp;quot;,&lt;br /&gt;
	T = &amp;quot;tʼ&amp;quot;,&lt;br /&gt;
	Q = &amp;quot;ʔ&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
export.sortkey = {&lt;br /&gt;
	A = &amp;quot;a&amp;quot;,&lt;br /&gt;
	B = &amp;quot;b&amp;quot;,&lt;br /&gt;
	C = &amp;quot;c&amp;quot;,&lt;br /&gt;
	D = &amp;quot;d&amp;quot;,&lt;br /&gt;
	E = &amp;quot;e&amp;quot;,&lt;br /&gt;
	G = &amp;quot;g&amp;quot;,&lt;br /&gt;
	I = &amp;quot;i&amp;quot;,&lt;br /&gt;
	N = &amp;quot;n&amp;quot;,&lt;br /&gt;
	O = &amp;quot;o&amp;quot;,&lt;br /&gt;
	S = &amp;quot;sh&amp;quot;,&lt;br /&gt;
	T = &amp;quot;t&amp;quot;,&lt;br /&gt;
	Q = &amp;quot;ʔ&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- parse a word into syllables using the internal encoding&lt;br /&gt;
-- returns a table with extra info, e.g. &amp;quot;Wucʼê&amp;quot; becomes:&lt;br /&gt;
-- { &amp;quot;wu&amp;quot;, &amp;quot;Ce&amp;quot;, accent=2, cap=true, falling=true }&lt;br /&gt;
function export.syllabify(word)&lt;br /&gt;
	word = mw.ustring.toNFD(word)&lt;br /&gt;
	&lt;br /&gt;
	local lowered = word:ulower()&lt;br /&gt;
	local cap = lowered ~= word&lt;br /&gt;
	word = lowered&lt;br /&gt;
	&lt;br /&gt;
	local accent = word:match(&amp;#039;\204[\129\130]&amp;#039;)&lt;br /&gt;
	local _, count = word:gsub(&amp;#039;\204[\129\130]&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	if count &amp;gt; 1 then error(&amp;quot;More than one diacritic found.&amp;quot;) end&lt;br /&gt;
	&lt;br /&gt;
	word = word:gsub(&amp;quot;[tc]ʼ&amp;quot;, export.encode)&lt;br /&gt;
	if word:match(&amp;quot;ʼ&amp;quot;) then error(&amp;quot;Uncoupled ʼ found.&amp;quot;) end&lt;br /&gt;
	word = word:gsub(&amp;quot;sh&amp;quot;, &amp;quot;S&amp;quot;)&lt;br /&gt;
	word = word:gsub(&amp;quot;[\194-\223][\128-\191]&amp;quot;, export.encode)&lt;br /&gt;
	&lt;br /&gt;
	word = word:gsub(&amp;quot;[bBcCdDgGhjklmnNpqrsStwxyzQ][aeiouEO]&amp;quot;, &amp;quot;.%0&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;([aeiouEO])([aeiouEO]\204[\129\130])&amp;quot;, &amp;quot;%1.%2&amp;quot;) -- e.g. tiá -&amp;gt; ti.á&lt;br /&gt;
		:gsub(&amp;quot;^%.&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;%.%.+&amp;quot;, &amp;quot;.&amp;quot;)&lt;br /&gt;
	local syllables = mw.text.split(word, &amp;quot;.&amp;quot;, true)&lt;br /&gt;
	&lt;br /&gt;
	local accented = 0&lt;br /&gt;
	for i, syl in ipairs(syllables) do&lt;br /&gt;
		syllables[i], count = syl:gsub(&amp;quot;\204[\129\130]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		if count == 1 then&lt;br /&gt;
			accented = i&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	syllables.accent = accented&lt;br /&gt;
	syllables.cap = cap&lt;br /&gt;
	syllables.falling = accent == &amp;quot;\204\130&amp;quot;&lt;br /&gt;
	return syllables&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- inverse of export.syllabify&lt;br /&gt;
function export.combine(syllables)&lt;br /&gt;
	local a, c, f = syllables.accent, syllables.cap, syllables.falling&lt;br /&gt;
	local diacritic = f and &amp;quot;\204\130&amp;quot; or &amp;quot;\204\129&amp;quot;&lt;br /&gt;
	local word = &amp;quot;&amp;quot; -- do not use table.concat to avoid modifying input&lt;br /&gt;
	for i, syl in ipairs(syllables) do&lt;br /&gt;
		if i == a then&lt;br /&gt;
			syl = syl:gsub(&amp;quot;[aeiouEO]&amp;quot;, &amp;quot;%0&amp;quot;..diacritic, 1)&lt;br /&gt;
		end&lt;br /&gt;
		word = word .. syl&lt;br /&gt;
	end&lt;br /&gt;
	word = word:gsub(&amp;quot;[BCDEGNOSTQ]&amp;quot;, export.decode)&lt;br /&gt;
	if c then&lt;br /&gt;
		word = word:gsub(&amp;quot;^[\1-\127\194-\255][\128-\191]*&amp;quot;, string.uupper, 1)&lt;br /&gt;
	end&lt;br /&gt;
	return mw.ustring.toNFC(word)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- generates the sort key for categorization&lt;br /&gt;
-- wucʼê --&amp;gt; wuce2&amp;#039;&lt;br /&gt;
-- (2: accent on second syllable)&lt;br /&gt;
-- (apostrophe at the end: falling tone)&lt;br /&gt;
function export.makeSortKey(text, lang, sc)&lt;br /&gt;
	local words = mw.text.split(text, &amp;quot; &amp;quot;, true)&lt;br /&gt;
	for i, word in ipairs(words) do&lt;br /&gt;
		local success, syllables = pcall(export.syllabify, word)&lt;br /&gt;
		if success then&lt;br /&gt;
			words[i] = table.concat(syllables):gsub(&amp;quot;[BCDEGNOSTQ]&amp;quot;, export.sortkey)&lt;br /&gt;
			.. syllables.accent&lt;br /&gt;
			.. (syllables.falling and &amp;quot;&amp;#039;&amp;quot; or &amp;quot;&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			require(&amp;quot;Module:debug&amp;quot;).track(&amp;quot;amf-utilities/sort&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(words, &amp;quot; &amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>wikt&gt;Theknightwho</name></author>
	</entry>
</feed>