<?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%3ACher-common</id>
	<title>Module:Cher-common - 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%3ACher-common"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:Cher-common&amp;action=history"/>
	<updated>2026-06-25T16:22:59Z</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:Cher-common&amp;diff=495371&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:Cher-common&amp;diff=495371&amp;oldid=prev"/>
		<updated>2026-04-21T12:01:01Z</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:01, 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:Cher-common&amp;diff=495370&amp;oldid=prev</id>
		<title>wikt&gt;AmazingJus at 06:20, 10 January 2026</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:Cher-common&amp;diff=495370&amp;oldid=prev"/>
		<updated>2026-01-10T06:20:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local m_str_utils = require(&amp;quot;Module:string utilities&amp;quot;)&lt;br /&gt;
local m_table = require(&amp;quot;Module:table&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Import libraries&lt;br /&gt;
local decomp = mw.ustring.toNFD&lt;br /&gt;
local gsub = m_str_utils.gsub&lt;br /&gt;
local lower = m_str_utils.lower&lt;br /&gt;
&lt;br /&gt;
-- Store accents as variables&lt;br /&gt;
local U = require(&amp;quot;Module:string/char&amp;quot;)&lt;br /&gt;
local acute = U(0x0301)  -- acute accent&lt;br /&gt;
local grave = U(0x0300)  -- grave accent&lt;br /&gt;
local double_acute = U(0x030B)  -- double acute accent&lt;br /&gt;
local double_grave = U(0x030F)  -- double grave accent&lt;br /&gt;
&lt;br /&gt;
-- Store various character sets&lt;br /&gt;
export.CONS = &amp;quot;cdghjklmnqstwyCDGHJKLMNQSTWYʔ&amp;quot;  -- consonants&lt;br /&gt;
export.VOWL = &amp;quot;aeiouvAEIOUV&amp;quot;  -- vowels&lt;br /&gt;
export.TONE = acute .. grave .. double_acute .. double_grave  -- main tone marks&lt;br /&gt;
export.VLPH = &amp;quot;x&amp;quot;  -- vowel placeholder&lt;br /&gt;
local CONS = export.CONS&lt;br /&gt;
local VOWL = export.VOWL&lt;br /&gt;
local TONE = export.TONE&lt;br /&gt;
local VLPH = export.VLPH&lt;br /&gt;
&lt;br /&gt;
-- Store vowel order in Cherokee&lt;br /&gt;
export.vowel_order = {&amp;quot;a&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;i&amp;quot;, &amp;quot;o&amp;quot;, &amp;quot;u&amp;quot;, &amp;quot;v&amp;quot;}&lt;br /&gt;
local vowel_order = m_table.invert(export.vowel_order)&lt;br /&gt;
&lt;br /&gt;
-- Store voiceless to voiced consonant pairs&lt;br /&gt;
export.voiced_pairs = {&lt;br /&gt;
	[&amp;quot;c&amp;quot;] = &amp;quot;j&amp;quot;,&lt;br /&gt;
	[&amp;quot;k&amp;quot;] = &amp;quot;g&amp;quot;,&lt;br /&gt;
	[&amp;quot;t&amp;quot;] = &amp;quot;d&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
local voiced_pairs = export.voiced_pairs&lt;br /&gt;
&lt;br /&gt;
-- Map Latin consonants to Cherokee syllables&lt;br /&gt;
-- Each consonant maps to a corresponding vowel&lt;br /&gt;
export.syll_list = {&lt;br /&gt;
	-- order of syllables: a, e, i, o, u, v&lt;br /&gt;
	[&amp;quot;&amp;quot;] = {&amp;quot;Ꭰ&amp;quot;, &amp;quot;Ꭱ&amp;quot;, &amp;quot;Ꭲ&amp;quot;, &amp;quot;Ꭳ&amp;quot;, &amp;quot;Ꭴ&amp;quot;, &amp;quot;Ꭵ&amp;quot;},&lt;br /&gt;
	k = {&amp;quot;Ꭷ&amp;quot;},&lt;br /&gt;
	g = {&amp;quot;Ꭶ&amp;quot;, &amp;quot;Ꭸ&amp;quot;, &amp;quot;Ꭹ&amp;quot;, &amp;quot;Ꭺ&amp;quot;, &amp;quot;Ꭻ&amp;quot;, &amp;quot;Ꭼ&amp;quot;},&lt;br /&gt;
	h = {&amp;quot;Ꭽ&amp;quot;, &amp;quot;Ꭾ&amp;quot;, &amp;quot;Ꭿ&amp;quot;, &amp;quot;Ꮀ&amp;quot;, &amp;quot;Ꮁ&amp;quot;, &amp;quot;Ꮂ&amp;quot;},&lt;br /&gt;
	l = {&amp;quot;Ꮃ&amp;quot;, &amp;quot;Ꮄ&amp;quot;, &amp;quot;Ꮅ&amp;quot;, &amp;quot;Ꮆ&amp;quot;, &amp;quot;Ꮇ&amp;quot;, &amp;quot;Ꮈ&amp;quot;},&lt;br /&gt;
	m = {&amp;quot;Ꮉ&amp;quot;, &amp;quot;Ꮊ&amp;quot;, &amp;quot;Ꮋ&amp;quot;, &amp;quot;Ꮌ&amp;quot;, &amp;quot;Ꮍ&amp;quot;, &amp;quot;Ᏽ&amp;quot;}, -- Ᏽ is obsolete&lt;br /&gt;
	n = {&amp;quot;Ꮎ&amp;quot;, &amp;quot;Ꮑ&amp;quot;, &amp;quot;Ꮒ&amp;quot;, &amp;quot;Ꮓ&amp;quot;, &amp;quot;Ꮔ&amp;quot;, &amp;quot;Ꮕ&amp;quot;},&lt;br /&gt;
	hn = {&amp;quot;Ꮏ&amp;quot;},&lt;br /&gt;
	qu = {&amp;quot;Ꮖ&amp;quot;, &amp;quot;Ꮗ&amp;quot;, &amp;quot;Ꮘ&amp;quot;, &amp;quot;Ꮙ&amp;quot;, &amp;quot;Ꮚ&amp;quot;, &amp;quot;Ꮛ&amp;quot;},&lt;br /&gt;
	s = {&amp;quot;Ꮜ&amp;quot;, &amp;quot;Ꮞ&amp;quot;, &amp;quot;Ꮟ&amp;quot;, &amp;quot;Ꮠ&amp;quot;, &amp;quot;Ꮡ&amp;quot;, &amp;quot;Ꮢ&amp;quot;},&lt;br /&gt;
	d = {&amp;quot;Ꮣ&amp;quot;, &amp;quot;Ꮥ&amp;quot;, &amp;quot;Ꮧ&amp;quot;, &amp;quot;Ꮩ&amp;quot;, &amp;quot;Ꮪ&amp;quot;, &amp;quot;Ꮫ&amp;quot;},&lt;br /&gt;
	t = {&amp;quot;Ꮤ&amp;quot;, &amp;quot;Ꮦ&amp;quot;, &amp;quot;Ꮨ&amp;quot;},&lt;br /&gt;
	dl = {&amp;quot;Ꮬ&amp;quot;},&lt;br /&gt;
	tl = {&amp;quot;Ꮭ&amp;quot;, &amp;quot;Ꮮ&amp;quot;, &amp;quot;Ꮯ&amp;quot;, &amp;quot;Ꮰ&amp;quot;, &amp;quot;Ꮱ&amp;quot;, &amp;quot;Ꮲ&amp;quot;},&lt;br /&gt;
	ts = {&amp;quot;Ꮳ&amp;quot;, &amp;quot;Ꮴ&amp;quot;, &amp;quot;Ꮵ&amp;quot;, &amp;quot;Ꮶ&amp;quot;, &amp;quot;Ꮷ&amp;quot;, &amp;quot;Ꮸ&amp;quot;},&lt;br /&gt;
	w = {&amp;quot;Ꮹ&amp;quot;, &amp;quot;Ꮺ&amp;quot;, &amp;quot;Ꮻ&amp;quot;, &amp;quot;Ꮼ&amp;quot;, &amp;quot;Ꮽ&amp;quot;, &amp;quot;Ꮾ&amp;quot;},&lt;br /&gt;
	y = {&amp;quot;Ꮿ&amp;quot;, &amp;quot;Ᏸ&amp;quot;, &amp;quot;Ᏹ&amp;quot;, &amp;quot;Ᏺ&amp;quot;, &amp;quot;Ᏻ&amp;quot;, &amp;quot;Ᏼ&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Simplifies the transcription by removing tone and length in vowels and&lt;br /&gt;
-- converting normalising spelling in consonants&lt;br /&gt;
local function simplify_tr(text)&lt;br /&gt;
	-- make lowercase and decompose chars&lt;br /&gt;
	local tr = decomp(lower(text))&lt;br /&gt;
&lt;br /&gt;
	-- add word boundaries&lt;br /&gt;
	tr = gsub(tr, &amp;quot;([^%s]+)&amp;quot;, &amp;quot;#%1#&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- remove tone marks&lt;br /&gt;
	tr = gsub(tr, &amp;quot;[&amp;quot; .. TONE .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- remove long vowels&lt;br /&gt;
	tr = gsub(tr, &amp;quot;([&amp;quot; .. VOWL .. &amp;quot;])%1&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- remove dummy markers&lt;br /&gt;
	tr = gsub(tr, &amp;quot;(h?)([&amp;quot; .. VOWL .. &amp;quot;]*)%*&amp;quot;, &amp;quot;%2%1&amp;quot;)  -- also handle preaspiration resulting from metathesis&lt;br /&gt;
&lt;br /&gt;
	-- normalise consonants&lt;br /&gt;
	local replacements = {&lt;br /&gt;
		{ &amp;quot;kh?w&amp;quot;, &amp;quot;q&amp;quot; },           -- kw/khw -&amp;gt; q&lt;br /&gt;
		{ &amp;quot;nah&amp;quot;, &amp;quot;nA&amp;quot; },           -- nah -&amp;gt; nA&lt;br /&gt;
		{ &amp;quot;hn&amp;quot;, &amp;quot;N&amp;quot; },             -- hn -&amp;gt; N&lt;br /&gt;
		{ &amp;quot;ts&amp;quot;, &amp;quot;c&amp;quot; },             -- ts -&amp;gt; c&lt;br /&gt;
		{ &amp;quot;([ckt])([^h])&amp;quot;, function(ch, ch_next) -- voiceless unaspirated to voiced&lt;br /&gt;
			return voiced_pairs[ch] .. ch_next&lt;br /&gt;
		end },&lt;br /&gt;
		{ &amp;quot;([ckt])h&amp;quot;, &amp;quot;%1&amp;quot; },      -- voiceless aspirated to unaspirated&lt;br /&gt;
		{ &amp;quot;[ht]l&amp;quot;, &amp;quot;T&amp;quot; },          -- hl/tl -&amp;gt; T&lt;br /&gt;
		{ &amp;quot;dl&amp;quot;, &amp;quot;D&amp;quot; }              -- dl -&amp;gt; D&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- go over each replacement&lt;br /&gt;
	for _, replacement in ipairs(replacements) do&lt;br /&gt;
		tr = gsub(tr, replacement[1], replacement[2])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- handle vowels&lt;br /&gt;
	tr = gsub(tr, &amp;quot;#([&amp;quot; .. VOWL .. &amp;quot;])&amp;quot;, &amp;quot;#ʔ%1&amp;quot;)  -- initial vowels&lt;br /&gt;
	tr = gsub(tr, &amp;quot;([&amp;quot; .. VOWL .. &amp;quot;])([&amp;quot; .. VOWL .. &amp;quot;])&amp;quot;, &amp;quot;%1ʔ%2&amp;quot;)  -- vowel sequences&lt;br /&gt;
&lt;br /&gt;
	-- remove word boundaries&lt;br /&gt;
	return gsub(tr, &amp;quot;#&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Generates a single Cherokee syllable given a consonant and vowel&lt;br /&gt;
local function gen_syll(cons, vowel)&lt;br /&gt;
	-- normalise consonants&lt;br /&gt;
	local cons_map = {&lt;br /&gt;
		[&amp;quot;c&amp;quot;] = &amp;quot;ts&amp;quot;,&lt;br /&gt;
		[&amp;quot;D&amp;quot;] = &amp;quot;dl&amp;quot;,&lt;br /&gt;
		[&amp;quot;j&amp;quot;] = &amp;quot;ts&amp;quot;,&lt;br /&gt;
		[&amp;quot;N&amp;quot;] = &amp;quot;hn&amp;quot;,&lt;br /&gt;
		[&amp;quot;q&amp;quot;] = &amp;quot;qu&amp;quot;,&lt;br /&gt;
		[&amp;quot;T&amp;quot;] = &amp;quot;tl&amp;quot;,&lt;br /&gt;
		[&amp;quot;ʔ&amp;quot;] = &amp;quot;&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	cons = cons_map[cons] or cons&lt;br /&gt;
&lt;br /&gt;
	-- handle special cases&lt;br /&gt;
	if cons == &amp;quot;s&amp;quot; and vowel == &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;quot;Ꮝ&amp;quot;&lt;br /&gt;
	elseif (cons == &amp;quot;h&amp;quot; or cons == &amp;quot;&amp;quot;) and vowel == &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	elseif vowel == &amp;quot;A&amp;quot; then&lt;br /&gt;
		return &amp;quot;Ꮐ&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- get syllable from mapping&lt;br /&gt;
	local sylls = export.syll_list[cons]&lt;br /&gt;
	local vowel_idx = vowel_order[vowel]&lt;br /&gt;
	local syll = sylls and vowel_idx and vowel_idx &amp;lt;= #sylls and sylls[vowel_idx]&lt;br /&gt;
	if not syll then&lt;br /&gt;
		-- check for fallback consonants&lt;br /&gt;
		local fallback_map = {&lt;br /&gt;
			[&amp;quot;dl&amp;quot;] = &amp;quot;tl&amp;quot;,&lt;br /&gt;
			[&amp;quot;hn&amp;quot;] = &amp;quot;n&amp;quot;,&lt;br /&gt;
			[&amp;quot;k&amp;quot;] = &amp;quot;g&amp;quot;,&lt;br /&gt;
			[&amp;quot;t&amp;quot;] = &amp;quot;d&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		local fallback_cons = fallback_map[cons]&lt;br /&gt;
		if fallback_cons then&lt;br /&gt;
			local fallback_sylls = export.syll_list[fallback_cons]&lt;br /&gt;
			syll = fallback_sylls and vowel_idx and vowel_idx &amp;lt;= #fallback_sylls and fallback_sylls[vowel_idx]&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- invalid syllable&lt;br /&gt;
		if not syll then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- return syllable if successful&lt;br /&gt;
	return syll&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Generates the Cherokee syllabary form from a given Latin transcription&lt;br /&gt;
-- It first simplifies the transcription, then matches each consonant-vowel pair to a syllable&lt;br /&gt;
-- Each invalid syllable is logged and and any will result in an error&lt;br /&gt;
function export.to_syll(tr)&lt;br /&gt;
	-- simplify transcription&lt;br /&gt;
	tr = simplify_tr(tr)&lt;br /&gt;
	local invalid_cons = {}&lt;br /&gt;
&lt;br /&gt;
	-- match each consonant-vowel pair with corresponding syllable&lt;br /&gt;
	local result = gsub(tr, &amp;quot;([&amp;quot; .. CONS .. &amp;quot;])([&amp;quot; .. VOWL .. &amp;quot;]?)&amp;quot;, function(c, v)&lt;br /&gt;
		local syll = gen_syll(c, v)&lt;br /&gt;
		if not syll and v == &amp;quot;&amp;quot; then&lt;br /&gt;
			table.insert(invalid_cons, c)&lt;br /&gt;
			return c&lt;br /&gt;
		end&lt;br /&gt;
		return syll or (c .. v)&lt;br /&gt;
	end)&lt;br /&gt;
&lt;br /&gt;
	-- raise error for any invalid consonant&lt;br /&gt;
	if #invalid_cons &amp;gt; 0 then&lt;br /&gt;
		error(&amp;#039;The consonants &amp;quot;&amp;#039; .. m_table.serialCommaJoin(invalid_cons, {[&amp;quot;punc&amp;quot;] = &amp;#039;&amp;quot;, &amp;quot;&amp;#039;}) ..&lt;br /&gt;
		&amp;#039;&amp;quot; are invalid - please fix by adding a dummy vowel after each one, followed by a &amp;quot;*&amp;quot;.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- otherwise return result&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>wikt&gt;AmazingJus</name></author>
	</entry>
</feed>