<?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%3AHrkt-translit</id>
	<title>Module:Hrkt-translit - 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%3AHrkt-translit"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:Hrkt-translit&amp;action=history"/>
	<updated>2026-04-21T19:57:37Z</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:Hrkt-translit&amp;diff=496363&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:Hrkt-translit&amp;diff=496363&amp;oldid=prev"/>
		<updated>2026-04-21T12:46:22Z</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:46, 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:Hrkt-translit&amp;diff=496362&amp;oldid=prev</id>
		<title>wikt&gt;Fish bowl: Undo revision 89059378 by Fish bowl (talk) Module talk:Hrkt-translit. i love apostrophe hell</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:Hrkt-translit&amp;diff=496362&amp;oldid=prev"/>
		<updated>2026-01-05T22:59:23Z</updated>

		<summary type="html">&lt;p&gt;Undo revision &lt;a href=&quot;/wiki/Special:Diff/89059378&quot; title=&quot;Special:Diff/89059378&quot;&gt;89059378&lt;/a&gt; by &lt;a href=&quot;/wiki/Special:Contributions/Fish_bowl&quot; title=&quot;Special:Contributions/Fish bowl&quot;&gt;Fish bowl&lt;/a&gt; (&lt;a href=&quot;/w/index.php?title=User_talk:Fish_bowl&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Fish bowl (page does not exist)&quot;&gt;talk&lt;/a&gt;) &lt;a href=&quot;/w/index.php?title=Module_talk:Hrkt-translit&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module talk:Hrkt-translit (page does not exist)&quot;&gt;Module talk:Hrkt-translit&lt;/a&gt;. i love apostrophe hell&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local concat = table.concat&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local load_data = mw.loadData&lt;br /&gt;
local toNFD = mw.ustring.toNFD&lt;br /&gt;
local umatch = mw.ustring.match&lt;br /&gt;
&lt;br /&gt;
local m_ja = require(&amp;quot;Module:ja&amp;quot;)&lt;br /&gt;
local kata_to_hira = m_ja.kata_to_hira&lt;br /&gt;
local normalize_kana = m_ja.normalize_kana&lt;br /&gt;
&lt;br /&gt;
local data_common&lt;br /&gt;
local glottal = &amp;quot;\1&amp;quot;&lt;br /&gt;
local disambig = &amp;quot;\2&amp;quot;&lt;br /&gt;
local cons = &amp;quot;b-df-hj-np-tvxz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function get_initial(text)&lt;br /&gt;
	return umatch(text, &amp;quot;(.+)%f[&amp;quot; .. umatch(text, &amp;quot;.$&amp;quot;) .. &amp;quot;]&amp;quot;) or text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function handle_initials(data, d_voicing, d_semivoicing, initials, checked)&lt;br /&gt;
	if not data then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(data) do&lt;br /&gt;
		if not checked[k] and umatch(v, &amp;quot;^%a+$&amp;quot;) then&lt;br /&gt;
			local initial = get_initial(v)&lt;br /&gt;
			if initial:match(&amp;quot;^[&amp;quot; .. cons .. &amp;quot;]+$&amp;quot;) then&lt;br /&gt;
				initials[initial] = true&lt;br /&gt;
			end&lt;br /&gt;
			local v_initial, sv_initial = d_voicing[initial], d_semivoicing[initial]&lt;br /&gt;
			if v_initial and v_initial:match(&amp;quot;^[&amp;quot; .. cons .. &amp;quot;]+$&amp;quot;) then&lt;br /&gt;
				initials[v_initial] = true&lt;br /&gt;
			end&lt;br /&gt;
			if sv_initial and sv_initial:match(&amp;quot;^[&amp;quot; .. cons .. &amp;quot;]+$&amp;quot;) then&lt;br /&gt;
				initials[sv_initial] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		checked[k] = true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.process_data(data, common)&lt;br /&gt;
	local initials, checked, d_voicing, d_semivoicing = {}, {}, data.tr_voicing, data.tr_semivoicing&lt;br /&gt;
	data.initials = initials&lt;br /&gt;
	if not common then&lt;br /&gt;
		data_common = data_common or load_data(&amp;quot;Module:Hrkt-translit/data&amp;quot;)&lt;br /&gt;
		d_voicing = d_voicing or data_common.tr_voicing&lt;br /&gt;
		d_semivoicing = d_semivoicing or data_common.tr_semivoicing&lt;br /&gt;
	end&lt;br /&gt;
	handle_initials(data.rom, d_voicing, d_semivoicing, initials, checked)&lt;br /&gt;
	if not common then&lt;br /&gt;
		handle_initials(data_common.rom, d_voicing, d_semivoicing, initials, checked)&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_data(lang)&lt;br /&gt;
	data_common = data_common or load_data(&amp;quot;Module:Hrkt-translit/data&amp;quot;)&lt;br /&gt;
	local function inspect_table(t, ...)&lt;br /&gt;
		for i = 1, select(&amp;quot;#&amp;quot;, ...) do&lt;br /&gt;
			if type(t) == &amp;quot;table&amp;quot; then&lt;br /&gt;
				t = t[select(i, ...)]&lt;br /&gt;
			else return nil end&lt;br /&gt;
		end&lt;br /&gt;
		return t&lt;br /&gt;
	end&lt;br /&gt;
	if lang then&lt;br /&gt;
		local name_data = &amp;quot;Module:Hrkt-translit/data/&amp;quot; .. lang&lt;br /&gt;
		if package.loaders[2](name_data) then&lt;br /&gt;
			local data_lang = load_data(name_data)&lt;br /&gt;
			return function(...)&lt;br /&gt;
				local item_lang, item_common = data_lang[...], data_common[...]&lt;br /&gt;
				for i = 2, select(&amp;quot;#&amp;quot;, ...) do &lt;br /&gt;
					local key = select(i, ...)&lt;br /&gt;
					if type(item_lang) == &amp;quot;table&amp;quot; then&lt;br /&gt;
						item_lang = item_lang[key]&lt;br /&gt;
					else return inspect_table(item_common, select(i, ...)) end&lt;br /&gt;
					if type(item_common) == &amp;quot;table&amp;quot; then&lt;br /&gt;
						item_common = item_common[key]&lt;br /&gt;
					else return inspect_table(item_lang, select(i + 1, ...)) end&lt;br /&gt;
				end&lt;br /&gt;
				if item_lang ~= nil then return item_lang else return item_common end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return function(...)&lt;br /&gt;
		return inspect_table(data_common[...], select(2, ...))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function do_voicing(i_last, result, result_sp, hist, d, key)&lt;br /&gt;
	local text = result[i_last]&lt;br /&gt;
	if not hist and result_sp[i_last] == &amp;quot;historical w&amp;quot; then&lt;br /&gt;
		text = &amp;quot;w&amp;quot; .. text&lt;br /&gt;
	end&lt;br /&gt;
	return text:gsub(&amp;quot;^&amp;quot; .. get_initial(text), d(key))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.tr(text, lang, sc, options)&lt;br /&gt;
	if umatch(text, &amp;quot;[&amp;quot; .. mw.loadData(&amp;quot;Module:ja/data/range&amp;quot;).kanji .. &amp;quot;]&amp;quot;) then&lt;br /&gt;
		require(&amp;quot;Module:debug&amp;quot;).track(&amp;quot;ja/invalid Hrkt&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	options = options or {}&lt;br /&gt;
	&lt;br /&gt;
	local result = {[0] = &amp;quot;&amp;quot;}&lt;br /&gt;
	local result_sp = {}&lt;br /&gt;
	&lt;br /&gt;
	local d = get_data(lang)&lt;br /&gt;
	&lt;br /&gt;
	local function getlast(i_start, predicate_good, predicate_bad)&lt;br /&gt;
		local in_xml = false&lt;br /&gt;
		for i = i_start or #result, 1, -1 do&lt;br /&gt;
			if in_xml then&lt;br /&gt;
				if result[i] == &amp;quot;&amp;lt;&amp;quot; then in_xml = false end&lt;br /&gt;
			elseif result[i] == &amp;quot;&amp;gt;&amp;quot; then&lt;br /&gt;
				in_xml = true&lt;br /&gt;
			else&lt;br /&gt;
				if (predicate_bad or function(index)&lt;br /&gt;
					return result_sp[index] == &amp;quot;stop&amp;quot;&lt;br /&gt;
				end)(i) then break end&lt;br /&gt;
				if (predicate_good or function(index)&lt;br /&gt;
					return result[index]:len() &amp;gt; 0 and result_sp[index] ~= &amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
				end)(i) then return i end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- normalize long vowels and iteration marks&lt;br /&gt;
	text = toNFD(kata_to_hira(normalize_kana(text)))&lt;br /&gt;
	&lt;br /&gt;
	for c in text:gmatch(&amp;quot;.[\128-\191]*&amp;quot;) do&lt;br /&gt;
		local rc = options.hist and d(&amp;quot;rom_hist&amp;quot;, c) or d(&amp;quot;rom&amp;quot;, c) or c&lt;br /&gt;
		local rc_sp = d(&amp;quot;rom_sp&amp;quot;, c)&lt;br /&gt;
		local i_last = getlast()&lt;br /&gt;
		&lt;br /&gt;
		if options.keep_dot and c == &amp;quot;.&amp;quot; then&lt;br /&gt;
			rc = &amp;quot;.&amp;quot;&lt;br /&gt;
		elseif c:match(&amp;quot;%a&amp;quot;) then&lt;br /&gt;
			rc_sp = &amp;quot;stop&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local repl_digraph = d(&amp;quot;digraph&amp;quot;, c, result[i_last])&lt;br /&gt;
		if repl_digraph then&lt;br /&gt;
			result[i_last], rc = repl_digraph, &amp;quot;&amp;quot;&lt;br /&gt;
			result_sp[i_last], rc_sp = nil, nil&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if not options.hist then --はへ&lt;br /&gt;
			if d(&amp;quot;flag_hahe&amp;quot;, result_sp[i_last]) and (umatch(c, &amp;quot;[-~%.゙゚]&amp;quot;) or rc:match(&amp;quot;[-~%a&amp;quot; .. glottal .. &amp;quot;]&amp;quot;)) then&lt;br /&gt;
				result[i_last] = result_sp[i_last]&lt;br /&gt;
				result_sp[i_last] = nil&lt;br /&gt;
			end&lt;br /&gt;
			if d(&amp;quot;flag_hahe&amp;quot;, rc_sp) and (options.phonetic or result_sp[getlast(nil, function(i)&lt;br /&gt;
				return result[i]:len() &amp;gt; 0 and result_sp[i] ~= &amp;quot;&amp;#039;&amp;quot; or result_sp[i] == &amp;quot;stop&amp;quot;&lt;br /&gt;
			end, function() return false end)] == &amp;quot;stop&amp;quot; or result[i_last]:match(&amp;quot;[-~%a&amp;quot; .. glottal .. &amp;quot;]&amp;quot;)) then&lt;br /&gt;
				rc = rc_sp&lt;br /&gt;
				rc_sp = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if rc:match(&amp;quot;%a&amp;quot;) and umatch(result[i_last], &amp;quot;^[,%.?!:)”†]$&amp;quot;) then --space and punctuations&lt;br /&gt;
			result[i_last] = result[i_last] .. &amp;quot; &amp;quot;&lt;br /&gt;
		elseif umatch(rc, &amp;quot;^[(“]$&amp;quot;) and result[i_last]:match(&amp;quot;%a&amp;quot;) then&lt;br /&gt;
			rc = &amp;quot; &amp;quot; .. rc&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if rc_sp == &amp;quot;voiced&amp;quot; then -- voicing&lt;br /&gt;
			result[i_last] = do_voicing(i_last, result, result_sp, options.hist, d, &amp;quot;tr_voicing&amp;quot;)&lt;br /&gt;
		elseif rc_sp == &amp;quot;semivoiced&amp;quot; then&lt;br /&gt;
			result[i_last] = do_voicing(i_last, result, result_sp, options.hist, d, &amp;quot;tr_semivoicing&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if rc:match(&amp;quot;[&amp;quot; .. cons .. &amp;quot;]+&amp;quot; .. &amp;quot;$&amp;quot;) and rc_sp ~= &amp;quot;stop&amp;quot; then&lt;br /&gt;
			rc_sp = &amp;quot;coda&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local r_last = result[i_last]&lt;br /&gt;
		local r_lastlast = r_last:match&amp;quot;^.*(%a%A*)$&amp;quot; --vowel clusters or stop consonants&lt;br /&gt;
		if r_lastlast and r_lastlast:match(&amp;quot;[aiueo]&amp;quot;) then&lt;br /&gt;
			if rc:match(&amp;quot;^%-[yw]&amp;quot;) and r_last:match(&amp;quot;^[&amp;quot; .. cons .. &amp;quot;yw]&amp;quot;) then&lt;br /&gt;
				local rc_first = rc:sub(2, 2)&lt;br /&gt;
				r_last = #r_last &amp;gt; 1 and r_last:sub(1, -2) or r_last&lt;br /&gt;
				if not (rc_first == &amp;quot;y&amp;quot; and d(&amp;quot;flag_postalveolarconsonant&amp;quot;, r_last)) then&lt;br /&gt;
					r_last = r_last .. rc_first&lt;br /&gt;
				end&lt;br /&gt;
				result[i_last] = r_last&lt;br /&gt;
				rc = rc:sub(3)&lt;br /&gt;
			elseif options.hist and r_last:match(&amp;quot;^[&amp;quot; .. cons .. &amp;quot;]&amp;quot;) and (&lt;br /&gt;
				r_lastlast == &amp;quot;i&amp;quot; and rc:sub(1, 1) == &amp;quot;y&amp;quot; or&lt;br /&gt;
				r_lastlast == &amp;quot;u&amp;quot; and rc:sub(1, 1) == &amp;quot;w&amp;quot;&lt;br /&gt;
			) then&lt;br /&gt;
				local rc_first = rc:sub(1, 1)&lt;br /&gt;
				r_last = r_last:sub(1, -2)&lt;br /&gt;
				if not (rc_first == &amp;quot;y&amp;quot; and d(&amp;quot;flag_postalveolarconsonant&amp;quot;, r_last)) then&lt;br /&gt;
					r_last = r_last .. rc_first&lt;br /&gt;
				end&lt;br /&gt;
				result[i_last] = r_last&lt;br /&gt;
				rc = rc:sub(2)&lt;br /&gt;
			elseif rc:match&amp;quot;^%-[yw]?[aiueo]$&amp;quot; then&lt;br /&gt;
				rc = rc:sub(2)&lt;br /&gt;
				if r_lastlast == rc then&lt;br /&gt;
					result[i_last] = r_last .. r_lastlast&lt;br /&gt;
					rc = &amp;quot;&amp;quot;&lt;br /&gt;
				elseif d(&amp;quot;flag_specialconsonant&amp;quot;, r_last) then&lt;br /&gt;
					result[i_last] = r_last:sub(1, -2)&lt;br /&gt;
				elseif r_lastlast == &amp;quot;i&amp;quot; then&lt;br /&gt;
					result[i_last] = r_last:sub(1, -2) .. &amp;quot;y&amp;quot;&lt;br /&gt;
				elseif r_lastlast:match(&amp;quot;[ou]&amp;quot;) and rc ~= &amp;quot;u&amp;quot; then&lt;br /&gt;
					result[i_last] = r_last:sub(1, -2) .. &amp;quot;w&amp;quot;&lt;br /&gt;
				elseif #r_last &amp;gt; 1 then&lt;br /&gt;
					result[i_last] = r_last:sub(1, -2)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		insert(result, rc)&lt;br /&gt;
		result_sp[#result] = rc_sp&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not options.hist then --isolated はへ&lt;br /&gt;
		local i_last = getlast()&lt;br /&gt;
		if d(&amp;quot;flag_hahe&amp;quot;, result_sp[i_last]) and getlast(i_last - 1) == 0 then&lt;br /&gt;
			result[i_last] = result_sp[i_last]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local has_gem = false&lt;br /&gt;
	for i, v in ipairs(result) do&lt;br /&gt;
		--gemination&lt;br /&gt;
		if has_gem then&lt;br /&gt;
			local apos, consonant, remainder = v:match(&amp;quot;^(&amp;quot; .. glottal .. &amp;quot;*)([&amp;quot; .. cons .. &amp;quot;yw]+)(.*)&amp;quot;)&lt;br /&gt;
			if consonant then&lt;br /&gt;
				local init, c_gem = apos .. consonant&lt;br /&gt;
				while true do&lt;br /&gt;
					c_gem = d(&amp;quot;tr_gem&amp;quot;, init)&lt;br /&gt;
					if #init == 1 or not init:match(&amp;quot;[yw]$&amp;quot;) then&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
					init = init:sub(1, -2)&lt;br /&gt;
				end&lt;br /&gt;
				c_gem = c_gem or init:sub(1, 1)&lt;br /&gt;
				v = consonant .. remainder&lt;br /&gt;
				local i_gem = getlast(i)&lt;br /&gt;
				while true do&lt;br /&gt;
					i_gem = getlast(i_gem - 1)&lt;br /&gt;
					if result_sp[i_gem] == &amp;quot;gem&amp;quot; then&lt;br /&gt;
						result[i_gem] = c_gem&lt;br /&gt;
					elseif result_sp[i_gem] ~= &amp;quot;allow gem&amp;quot; then&lt;br /&gt;
						i_gem = getlast(i_gem + 1)&lt;br /&gt;
						result[i_gem] = apos .. result[i_gem]&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				has_gem = false&lt;br /&gt;
			end&lt;br /&gt;
		elseif result_sp[i] == &amp;quot;gem&amp;quot; then&lt;br /&gt;
			has_gem = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- FIXME: ng/nw should be determined automatically by a disambiguation model.&lt;br /&gt;
		local v_first = v:match(&amp;quot;^[aiueoyw]&amp;quot;) or v:match(&amp;quot;^n[gw]&amp;quot;)&lt;br /&gt;
		if v_first then&lt;br /&gt;
			local i_last&lt;br /&gt;
			if v_first == &amp;quot;y&amp;quot; or v_first == &amp;quot;w&amp;quot; or v_first == &amp;quot;ng&amp;quot; or v_first == &amp;quot;nw&amp;quot; then&lt;br /&gt;
				i_last = getlast(i - 1, function(index)&lt;br /&gt;
					local res, res_sp = result[index], result_sp[index]&lt;br /&gt;
					return res ~= &amp;quot;&amp;quot; and res ~= &amp;quot;.&amp;quot; and res_sp ~= &amp;quot;&amp;#039;&amp;quot; and res_sp ~= &amp;quot;gem&amp;quot;&lt;br /&gt;
				end, function() end)&lt;br /&gt;
			else&lt;br /&gt;
				i_last = getlast(i - 1, nil, function() end)&lt;br /&gt;
			end&lt;br /&gt;
			if v_first:sub(1, 1) == &amp;quot;n&amp;quot; then&lt;br /&gt;
				if umatch(result[i_last], &amp;quot;%a&amp;quot;) and not (v_first == &amp;quot;nw&amp;quot; and result[i_last]:match(&amp;quot;n$&amp;quot;)) then&lt;br /&gt;
					v = disambig .. v&lt;br /&gt;
				end&lt;br /&gt;
			elseif result_sp[i_last] == &amp;quot;coda&amp;quot; then&lt;br /&gt;
				local coda = d(&amp;quot;tr_coda_apos&amp;quot;, v_first, result[i_last])&lt;br /&gt;
				if coda == nil or options.hist and coda == &amp;quot;hist&amp;quot; then&lt;br /&gt;
					v = disambig .. v&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--Diacritics (long vowels and others).&lt;br /&gt;
		v = v:gsub(&amp;quot;[aiueo][aiueo%A]*&amp;quot;, d(&amp;quot;tr_long&amp;quot;)) -- From small kana.&lt;br /&gt;
		local i_last = getlast(i - 1)&lt;br /&gt;
		local r_last = result[i_last]&lt;br /&gt;
		-- From digraphs.&lt;br /&gt;
		if r_last and not (options.hist or options.phonetic or options.no_diacritics) then&lt;br /&gt;
			local r_lastlast = r_last:match&amp;quot;^.*(%a%A*)$&amp;quot; --vowel clusters or stop consonants&lt;br /&gt;
			if r_lastlast and d(&amp;quot;tr_long&amp;quot;, r_lastlast .. v) and not r_last:match(&amp;quot;[aiueo][aiueo]$&amp;quot;) then&lt;br /&gt;
				result[i_last] = (r_last .. v):gsub(&amp;quot;[aiueo][aiueo%A]*&amp;quot;, d(&amp;quot;tr_long&amp;quot;))&lt;br /&gt;
				v = &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		result[i] = v&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local num_cap = 0&lt;br /&gt;
	for i, v in ipairs(result) do&lt;br /&gt;
		--uppercase&lt;br /&gt;
		if result_sp[i] == &amp;quot;cap&amp;quot; then&lt;br /&gt;
			num_cap = num_cap + 1&lt;br /&gt;
		end&lt;br /&gt;
		if num_cap &amp;gt; 0 then&lt;br /&gt;
			result[i] = v:gsub(&amp;quot;.[\128-\191]*&amp;quot;, function(c)&lt;br /&gt;
				if num_cap &amp;lt;= 0 then return c end&lt;br /&gt;
				local uc = c:uupper()&lt;br /&gt;
				if c ~= uc then num_cap = num_cap - 1 end&lt;br /&gt;
				return uc&lt;br /&gt;
			end)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return (concat(result):gsub(&amp;quot;[&amp;quot; .. glottal .. disambig .. &amp;quot;]&amp;quot;, &amp;quot;&amp;#039;&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>wikt&gt;Fish bowl</name></author>
	</entry>
</feed>