<?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%3Azh-translit</id>
	<title>Module:zh-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%3Azh-translit"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:zh-translit&amp;action=history"/>
	<updated>2026-04-22T12:56:36Z</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:zh-translit&amp;diff=495307&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:zh-translit&amp;diff=495307&amp;oldid=prev"/>
		<updated>2026-04-21T12:00:51Z</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:zh-translit&amp;diff=495306&amp;oldid=prev</id>
		<title>wikt&gt;Benwing2: treat lzh-lit like lzh</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:zh-translit&amp;diff=495306&amp;oldid=prev"/>
		<updated>2026-02-11T05:10:28Z</updated>

		<summary type="html">&lt;p&gt;treat lzh-lit like lzh&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local m_str_utils = require(&amp;quot;Module:string utilities&amp;quot;)&lt;br /&gt;
local m_template_parser = require(&amp;quot;Module:template parser&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local class_else_type = m_template_parser.class_else_type&lt;br /&gt;
local find_templates = m_template_parser.find_templates&lt;br /&gt;
local get_section = require(&amp;quot;Module:pages&amp;quot;).get_section&lt;br /&gt;
local gsub = string.gsub&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local remove = table.remove&lt;br /&gt;
local safe_require = require(&amp;quot;Module:load&amp;quot;).safe_require&lt;br /&gt;
local split = m_str_utils.split&lt;br /&gt;
local toNFD = mw.ustring.toNFD&lt;br /&gt;
local trim = m_str_utils.trim&lt;br /&gt;
local ugsub = m_str_utils.gsub&lt;br /&gt;
local ulen = m_str_utils.len&lt;br /&gt;
local ulower = m_str_utils.lower&lt;br /&gt;
local usub = m_str_utils.sub&lt;br /&gt;
local uupper = m_str_utils.upper&lt;br /&gt;
&lt;br /&gt;
local tag&lt;br /&gt;
&lt;br /&gt;
local lect_code = mw.loadData(&amp;quot;Module:zh/data/lect codes&amp;quot;).langcode_to_abbr&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local function fail(lang, request)&lt;br /&gt;
	require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;zh-translit/needs manual translit/&amp;quot; .. lang)&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_content(title)&lt;br /&gt;
	local content = mw.title.new(title)&lt;br /&gt;
	if not content then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return get_section(content:getContent(), &amp;quot;Chinese&amp;quot;, 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Match function for regex &amp;quot;,(?! )&amp;quot;.&lt;br /&gt;
local function split_on_comma_without_space(str, start)&lt;br /&gt;
	local i&lt;br /&gt;
	repeat&lt;br /&gt;
		i = str:find(&amp;quot;,&amp;quot;, start)&lt;br /&gt;
		if not i then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		start = i + 1&lt;br /&gt;
	until str:sub(start, start) ~= &amp;quot; &amp;quot;&lt;br /&gt;
	return i, i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function handle_readings(readings, lang, tr)&lt;br /&gt;
	if lang == &amp;quot;ltc&amp;quot; or lang == &amp;quot;och&amp;quot; then&lt;br /&gt;
		if tr and readings ~= tr then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		return readings&lt;br /&gt;
	elseif (&lt;br /&gt;
		lang == &amp;quot;cmn&amp;quot; or&lt;br /&gt;
		lang == &amp;quot;csp&amp;quot; or&lt;br /&gt;
		lang == &amp;quot;wuu&amp;quot; or&lt;br /&gt;
		lang == &amp;quot;yue&amp;quot; or&lt;br /&gt;
		lang == &amp;quot;zhx-tai&amp;quot;&lt;br /&gt;
	) then&lt;br /&gt;
		readings = split(readings, split_on_comma_without_space, true)&lt;br /&gt;
	else&lt;br /&gt;
		readings = split(readings, &amp;quot;/&amp;quot;, true, true)&lt;br /&gt;
	end&lt;br /&gt;
	local tr_orig = tr&lt;br /&gt;
	for _, reading in ipairs(readings) do&lt;br /&gt;
		reading = trim(reading)&lt;br /&gt;
		if not reading:find(&amp;quot;=&amp;quot;) then&lt;br /&gt;
			if (&lt;br /&gt;
				not tr or&lt;br /&gt;
				tr == reading or&lt;br /&gt;
				gsub(ulower(tr), &amp;quot;%^&amp;quot;, &amp;quot;&amp;quot;) == reading&lt;br /&gt;
			) then&lt;br /&gt;
				tr = reading&lt;br /&gt;
			elseif ulower(reading) ~= tr then&lt;br /&gt;
				return false&lt;br /&gt;
			end&lt;br /&gt;
		elseif lang == &amp;quot;cmn&amp;quot; and reading == &amp;quot;cap=y&amp;quot; then&lt;br /&gt;
			local tr_cap = &amp;quot;^&amp;quot; .. tr&lt;br /&gt;
			if not tr_orig or tr_orig == tr_cap then&lt;br /&gt;
				tr = tr_cap&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function remove_ref_tags(template)&lt;br /&gt;
	for node, parent, i in template:iterate_nodes(&amp;quot;tag&amp;quot;) do&lt;br /&gt;
		if node.name == &amp;quot;ref&amp;quot; then&lt;br /&gt;
			parent[i] = &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iterate_content(content, lang, see, seen, tr)&lt;br /&gt;
	for template in find_templates(content) do&lt;br /&gt;
		local name = template:get_name()&lt;br /&gt;
		if name == &amp;quot;zh-pron&amp;quot; then&lt;br /&gt;
			remove_ref_tags(template)&lt;br /&gt;
			for k, v in pairs(template:get_arguments()) do&lt;br /&gt;
				if (&lt;br /&gt;
					#v &amp;gt; 0 and&lt;br /&gt;
					type(k) == &amp;quot;string&amp;quot; and&lt;br /&gt;
					k == lect_code[lang]&lt;br /&gt;
				) then&lt;br /&gt;
					tr = handle_readings(v, lang, tr)&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if tr == false then&lt;br /&gt;
				return tr&lt;br /&gt;
			end&lt;br /&gt;
		elseif name == &amp;quot;zh-see&amp;quot; then&lt;br /&gt;
			remove_ref_tags(template)&lt;br /&gt;
			local arg = trim(template:get_arguments()[1])&lt;br /&gt;
			if not seen[arg] then&lt;br /&gt;
				insert(see, arg)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.tr(text, lang, sc)&lt;br /&gt;
	if (not text) or text == &amp;quot;&amp;quot; then&lt;br /&gt;
		return text&lt;br /&gt;
	elseif lang == &amp;quot;zh&amp;quot; or lang == &amp;quot;lzh&amp;quot; or lang == &amp;quot;lzh-lit&amp;quot; then&lt;br /&gt;
		lang = &amp;quot;cmn&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not lect_code[lang] then&lt;br /&gt;
		lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(lang, nil, true):getFullCode()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local content = get_content(text)&lt;br /&gt;
	if not content then&lt;br /&gt;
		return fail(lang)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local see = {}&lt;br /&gt;
	local seen = {&lt;br /&gt;
		[text] = true&lt;br /&gt;
	}&lt;br /&gt;
	local tr = iterate_content(content, lang, see, seen)&lt;br /&gt;
	&lt;br /&gt;
	if tr == nil then&lt;br /&gt;
		local i, title = 1&lt;br /&gt;
		while i &amp;lt;= #see do&lt;br /&gt;
			title = see[i]&lt;br /&gt;
			content = get_content(title)&lt;br /&gt;
			if content then&lt;br /&gt;
				tr = iterate_content(content, lang, see, seen, tr)&lt;br /&gt;
				if tr == false then&lt;br /&gt;
					return fail(lang)&lt;br /&gt;
				end&lt;br /&gt;
				seen[title] = true&lt;br /&gt;
			end&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not tr then&lt;br /&gt;
		return fail(lang)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if lang == &amp;quot;cmn&amp;quot; then&lt;br /&gt;
		tr = tr:gsub(&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		if tr:match(&amp;quot;[\194-\244]&amp;quot;) then&lt;br /&gt;
			tag = tag or mw.loadData(&amp;quot;Module:zh/data/cmn-tag&amp;quot;).MT&lt;br /&gt;
			tr = tr:gsub(&amp;quot;.[\128-\191]*&amp;quot;, function(m)&lt;br /&gt;
				if m == &amp;quot;一&amp;quot; then&lt;br /&gt;
					return &amp;quot;yī&amp;quot;&lt;br /&gt;
				elseif m == &amp;quot;不&amp;quot; then&lt;br /&gt;
					return &amp;quot;bù&amp;quot;&lt;br /&gt;
				else&lt;br /&gt;
					m = tag[m] and tag[m][1]&lt;br /&gt;
					if m then&lt;br /&gt;
						return toNFD(m):gsub(&amp;quot;^[aeiou]&amp;quot;, &amp;quot;\1%0&amp;quot;) -- temporarily use \1 for apostrophes, as it&amp;#039;s not in %p&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end)&lt;br /&gt;
			tr = ugsub(tr, &amp;quot;%f[^%z%s%p](^?)\1&amp;quot;, &amp;quot;%1&amp;quot;) -- remove any initial apostrophes inserted by the previous function&lt;br /&gt;
				:gsub(&amp;quot;\1&amp;quot;, &amp;quot;&amp;#039;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		tr = ugsub(tr, &amp;quot;%^(&amp;#039;?.)&amp;quot;, uupper)&lt;br /&gt;
	elseif lang == &amp;quot;csp&amp;quot; or lang == &amp;quot;yue&amp;quot; or lang == &amp;quot;zhx-tai&amp;quot; then&lt;br /&gt;
		tr = tr:gsub(&amp;quot;%d[%d%*%-]*%f[^%d%*]&amp;quot;, &amp;quot;&amp;lt;sup&amp;gt;%0&amp;lt;/sup&amp;gt;&amp;quot;)&lt;br /&gt;
	elseif lang == &amp;quot;hak&amp;quot; then&lt;br /&gt;
		-- TODO&lt;br /&gt;
	elseif lang == &amp;quot;ltc&amp;quot; or lang == &amp;quot;och&amp;quot; then&lt;br /&gt;
		if tr == &amp;quot;n&amp;quot; then&lt;br /&gt;
			return fail(lang)&lt;br /&gt;
		end&lt;br /&gt;
		local index = tr and split(tr, lang == &amp;quot;ltc&amp;quot; and &amp;quot;,&amp;quot; or &amp;quot;;&amp;quot;, true, true) or {}&lt;br /&gt;
		for i = 1, ulen(text) do&lt;br /&gt;
			local module_type = lang .. &amp;quot;-pron&amp;quot;&lt;br /&gt;
			if lang == &amp;quot;och&amp;quot; then&lt;br /&gt;
				module_type = module_type .. &amp;quot;-ZS&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			local data_module = safe_require(&amp;quot;Module:zh/data/&amp;quot; .. module_type .. &amp;quot;/&amp;quot; .. usub(text, i, i))&lt;br /&gt;
			&lt;br /&gt;
			if not data_module or (((not index[i]) or index[i] == &amp;quot;y&amp;quot;) and #data_module &amp;gt; 1) then&lt;br /&gt;
				return fail(lang)&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if index[i] == &amp;quot;y&amp;quot; then&lt;br /&gt;
				index[i] = 1&lt;br /&gt;
			elseif index[i] then&lt;br /&gt;
				index[i] = tonumber(index[i])&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			index[i] = index[i] and data_module[index[i]] or data_module[1]&lt;br /&gt;
			&lt;br /&gt;
			if lang == &amp;quot;ltc&amp;quot; then&lt;br /&gt;
				local data = mw.loadData(&amp;quot;Module:ltc-pron/data&amp;quot;)&lt;br /&gt;
				local initial, final, tone = require(&amp;quot;Module:ltc-pron&amp;quot;).infer_categories(index[i])&lt;br /&gt;
				tone = tone ~= &amp;quot;&amp;quot; and (&amp;quot;&amp;lt;sup&amp;gt;&amp;quot; .. tone .. &amp;quot;&amp;lt;/sup&amp;gt;&amp;quot;) or tone&lt;br /&gt;
				index[i] = require(&amp;quot;Module:ltc-pron/baxter&amp;quot;).baxter(initial, final, tone)&lt;br /&gt;
			else&lt;br /&gt;
				index[i] = index[i][6]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		tr = table.concat(index, &amp;quot; &amp;quot;)&lt;br /&gt;
		if lang == &amp;quot;och&amp;quot; then&lt;br /&gt;
			tr = &amp;quot;*&amp;quot; .. tr&lt;br /&gt;
		end&lt;br /&gt;
	elseif lang == &amp;quot;nan&amp;quot; then&lt;br /&gt;
		-- TODO&lt;br /&gt;
	elseif lang == &amp;quot;nan-tws&amp;quot; then&lt;br /&gt;
		tr = require(&amp;quot;Module:nan-pron&amp;quot;).pengim_display(tr)&lt;br /&gt;
	elseif lang == &amp;quot;wuu&amp;quot; then&lt;br /&gt;
		local w_pron = require(&amp;quot;Module:wuu-pron&amp;quot;)&lt;br /&gt;
		if tr:match(&amp;#039;;&amp;#039;) then&lt;br /&gt;
			--TODO&lt;br /&gt;
			return fail(lang)&lt;br /&gt;
		elseif tr:match(&amp;#039;:&amp;#039;) then&lt;br /&gt;
			tr = w_pron.wugniu_format(tr:sub(4))&lt;br /&gt;
		else&lt;br /&gt;
			tr = w_pron.wugniu_format(w_pron.wikt_to_wugniu(tr))&lt;br /&gt;
		end&lt;br /&gt;
	elseif lang == &amp;quot;zhx-sic&amp;quot; then&lt;br /&gt;
		tr = ugsub(tr, &amp;quot;([%d-])(%a)&amp;quot;, &amp;quot;%1 %2&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;%d[%d%*%-]*%f[^%d%*]&amp;quot;, &amp;quot;&amp;lt;sup&amp;gt;%0&amp;lt;/sup&amp;gt;&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		tr = require(&amp;quot;Module:&amp;quot; .. lang .. &amp;quot;-pron&amp;quot;).rom(tr)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- End with a space so that concurrent parts of running text that need to be transliterated separately (e.g. due to links) are still properly separated.&lt;br /&gt;
	return tr .. &amp;quot; &amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>wikt&gt;Benwing2</name></author>
	</entry>
</feed>