<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hna.wiki/Module:Lang?action=history&amp;feed=atom</id>
	<title>Module:Lang - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://hna.wiki/Module:Lang?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Lang?action=history"/>
	<updated>2026-07-14T19:41:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://hna.wiki/Module:Lang?diff=969&amp;oldid=prev</id>
		<title>919dd: Protected &quot;Module:Lang&quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Lang?diff=969&amp;oldid=prev"/>
		<updated>2025-08-29T22:07:10Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/Module:Lang&quot; title=&quot;Module:Lang&quot;&gt;Module:Lang&lt;/a&gt;&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&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:07, 29 August 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&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;!-- diff cache key mediawiki:diff:1.41:old-274:rev-969 --&gt;
&lt;/table&gt;</summary>
		<author><name>919dd</name></author>
	</entry>
	<entry>
		<id>https://hna.wiki/Module:Lang?diff=274&amp;oldid=prev</id>
		<title>ReinDevildom: Created page with &quot;local p = {} local param = {} local langCode = require(&#039;Module:Lang/code&#039;) local lib = require(&#039;Module:Feature&#039;)  function trim(s) 	return s:match &#039;^%s*(.-)%s*$&#039; end  function p.main(frame) 	local args = require(&#039;Module:Arguments&#039;).getArgs(frame, { 		parentFirst = true, 		wrappers = { 			&#039;Template:Lang&#039; 		} 	}) 	return p._main(args) end  function eachLang(altLangs, args, tBlock, key, value) 	local part = mw.html.create(&#039;span&#039;) 	local vertical = args.vertical or nil 	loca...&quot;</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Lang?diff=274&amp;oldid=prev"/>
		<updated>2025-08-29T15:30:11Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} local param = {} local langCode = require(&amp;#039;Module:Lang/code&amp;#039;) local lib = require(&amp;#039;Module:Feature&amp;#039;)  function trim(s) 	return s:match &amp;#039;^%s*(.-)%s*$&amp;#039; end  function p.main(frame) 	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, { 		parentFirst = true, 		wrappers = { 			&amp;#039;Template:Lang&amp;#039; 		} 	}) 	return p._main(args) end  function eachLang(altLangs, args, tBlock, key, value) 	local part = mw.html.create(&amp;#039;span&amp;#039;) 	local vertical = args.vertical or nil 	loca...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local param = {}&lt;br /&gt;
local langCode = require(&amp;#039;Module:Lang/code&amp;#039;)&lt;br /&gt;
local lib = require(&amp;#039;Module:Feature&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function trim(s)&lt;br /&gt;
	return s:match &amp;#039;^%s*(.-)%s*$&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		parentFirst = true,&lt;br /&gt;
		wrappers = {&lt;br /&gt;
			&amp;#039;Template:Lang&amp;#039;&lt;br /&gt;
		}&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function eachLang(altLangs, args, tBlock, key, value)&lt;br /&gt;
	local part = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
	local vertical = args.vertical or nil&lt;br /&gt;
	local append = {}&lt;br /&gt;
	if langCode[key] then&lt;br /&gt;
		if not(args.mini) then&lt;br /&gt;
			part:wikitext(&amp;#039;&amp;lt;u&amp;gt;&amp;#039; .. langCode[key] .. &amp;#039;&amp;lt;/u&amp;gt;&amp;#039; .. &amp;#039;: &amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if not(args.selective) then&lt;br /&gt;
			part:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;lang&amp;#039;, key)&lt;br /&gt;
				:wikitext(value)&lt;br /&gt;
		else&lt;br /&gt;
			part:node(p.SelectiveSpan(value, key))&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Auto romanization if none given&lt;br /&gt;
		if lib.isEmpty(tBlock[key .. &amp;#039;_rm&amp;#039;]) and args.auto_rm then&lt;br /&gt;
			local rm&lt;br /&gt;
			if key == &amp;#039;ru&amp;#039; then&lt;br /&gt;
				rm = require(&amp;#039;Module:Ru-rm&amp;#039;)._main{value}&lt;br /&gt;
			elseif key == &amp;#039;ko&amp;#039; then&lt;br /&gt;
				rm = require(&amp;#039;Module:Ko-rm&amp;#039;)._main{value}&lt;br /&gt;
			end&lt;br /&gt;
			-- mw.logObject(rm, &amp;#039;result&amp;#039;)&lt;br /&gt;
			if lib.isNotEmpty(rm) then&lt;br /&gt;
				args[key .. &amp;#039;_rm&amp;#039;] = rm&lt;br /&gt;
				tBlock[key .. &amp;#039;_rm&amp;#039;] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Special font for chinese rm due to Rubik&amp;#039;s lack of support for some tones&lt;br /&gt;
		if lib.isNotEmpty(tBlock[key .. &amp;#039;_rm&amp;#039;]) and lib.inArray({&amp;#039;zh&amp;#039;, &amp;#039;zh-Hans&amp;#039;, &amp;#039;zh-Hant&amp;#039;}, key) then&lt;br /&gt;
			args[key .. &amp;#039;_rm&amp;#039;] = &amp;#039;&amp;lt;span lang=&amp;quot;zh-rm&amp;quot;&amp;gt;&amp;#039; .. args[key .. &amp;#039;_rm&amp;#039;] .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Romanization&lt;br /&gt;
		if lib.isNotEmpty(tBlock[key .. &amp;#039;_rm&amp;#039;]) then&lt;br /&gt;
			table.insert(append, &amp;#039;&amp;lt;i&amp;gt;&amp;#039; .. args[key .. &amp;#039;_rm&amp;#039;] .. &amp;#039;&amp;lt;/i&amp;gt;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Translation&lt;br /&gt;
		if lib.isNotEmpty(tBlock[key .. &amp;#039;_tl&amp;#039;]) then&lt;br /&gt;
			if vertical then&lt;br /&gt;
				table.insert(append, args[key .. &amp;#039;_tl&amp;#039;])&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(append, &amp;#039;&amp;quot;&amp;#039; .. args[key .. &amp;#039;_tl&amp;#039;] .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Literal translation&lt;br /&gt;
		if lib.isNotEmpty(tBlock[key .. &amp;#039;_lit&amp;#039;]) then &lt;br /&gt;
			table.insert(append, &amp;#039;lit. &amp;quot;&amp;#039; .. args[key .. &amp;#039;_lit&amp;#039;] .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Build end string&lt;br /&gt;
		if #append&amp;gt;0 and vertical then&lt;br /&gt;
			part:wikitext(&amp;#039;&amp;lt;br /&amp;gt;&amp;#039; .. table.concat(append, &amp;#039;&amp;lt;br /&amp;gt;&amp;#039;))&lt;br /&gt;
		elseif #append&amp;gt;0 then&lt;br /&gt;
			part:wikitext(&amp;#039; &amp;#039; .. table.concat(append, &amp;#039;, &amp;#039;):gsub(&amp;#039;&amp;quot;, &amp;#039;,&amp;#039;,&amp;quot; &amp;#039;))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		part:wikitext(key .. &amp;#039;: &amp;#039; .. value)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(altLangs, tostring(part))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local out = mw.html.create(&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local tBlock = {sort = true, mini = true, selective = true, vertical = true}&lt;br /&gt;
&lt;br /&gt;
	--Obtain all _tn keys&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if mw.ustring.find(k, &amp;#039;_rm$&amp;#039;)&lt;br /&gt;
			or mw.ustring.find(k, &amp;#039;_tl$&amp;#039;)&lt;br /&gt;
			or mw.ustring.find(k, &amp;#039;_lit$&amp;#039;) then&lt;br /&gt;
			tBlock[k] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	--Obtain all numerical keys&lt;br /&gt;
	for k,v in ipairs(args) do&lt;br /&gt;
		tBlock[k] = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--Output default Value&lt;br /&gt;
	out:wikitext(args[1])&lt;br /&gt;
&lt;br /&gt;
	local altLangs = {}&lt;br /&gt;
	--Process Sort Paremeter (Split by Delimiter: comma)&lt;br /&gt;
	for sKey in string.gmatch(args.sort or &amp;#039;&amp;#039;, &amp;#039;([^,]+)&amp;#039;) do&lt;br /&gt;
		if not(tBlock[sKey]) and args[sKey] then&lt;br /&gt;
			eachLang(altLangs, args, tBlock, sKey, args[sKey])&lt;br /&gt;
			tBlock[sKey]=true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--Process Rest&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		if not(tBlock[key]) then&lt;br /&gt;
			eachLang(altLangs, args, tBlock, key, value)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #altLangs&amp;gt;0 then&lt;br /&gt;
		if not(args.mini) then&lt;br /&gt;
			out:wikitext(&amp;#039; (&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		out:wikitext(table.concat(altLangs,&amp;#039;; &amp;#039;))&lt;br /&gt;
		if not(args.mini) then&lt;br /&gt;
			out:wikitext(&amp;#039;)&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SelectiveSpan(s, lang, if1all)&lt;br /&gt;
	--initial check, return blank if nil&lt;br /&gt;
	if s then else return &amp;#039;&amp;#039; end&lt;br /&gt;
	--mw.logObject(s,&amp;#039;Input&amp;#039;) --debug&lt;br /&gt;
	&lt;br /&gt;
	--initialize tables&lt;br /&gt;
	local span = {}&lt;br /&gt;
	local nospan = {}&lt;br /&gt;
	local split = {}&lt;br /&gt;
	&lt;br /&gt;
	--separate the string through unicode codepoints as default lua split cannot handle non-UTF-8 characters&lt;br /&gt;
	for c in mw.ustring.gcodepoint(s) do&lt;br /&gt;
		--mw.logObject(c,&amp;#039;c&amp;#039;)       --debug&lt;br /&gt;
		table.insert(split, mw.ustring.char(c))&lt;br /&gt;
	end&lt;br /&gt;
	--mw.logObject(split,&amp;#039;split&amp;#039;)   --debug&lt;br /&gt;
	&lt;br /&gt;
	--separate the split string into ASCII and non-ASCII, include anything inside &amp;#039;&amp;lt;&amp;gt;&amp;#039; as ASCII to not mess with html tags rendering&lt;br /&gt;
	local loopnum = 1&lt;br /&gt;
	local html, link = false, false&lt;br /&gt;
	while split[loopnum] do&lt;br /&gt;
		--check for start of html tag&lt;br /&gt;
		if split[loopnum] == &amp;#039;&amp;lt;&amp;#039; then&lt;br /&gt;
			html = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--check for start of link&lt;br /&gt;
		if (split[loopnum] == &amp;#039;[&amp;#039; and split[loopnum+1] == &amp;#039;[&amp;#039;) then&lt;br /&gt;
			link = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		if (split[loopnum]:find(&amp;#039;[\201-\255ÊêÔôƠơƯưẮắẤấẾếỐốỚớỨứẰằẦầỀềỒồỜờỪừẢảẲẳẨẩẺẻỂểỈỉỎỏỔổỞởỦủỬửỶỷẴẵẪẫẼẽỄễỖỗỠỡỮữỸỹẠạẶặẬậẸẹỆệỊịỌọỘộỢợỤụỰựỴỵ]&amp;#039;) and html == false and link == false) then&lt;br /&gt;
			span[loopnum] = split[loopnum]&lt;br /&gt;
		else&lt;br /&gt;
			nospan[loopnum] = split[loopnum]&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--check for end of html tag&lt;br /&gt;
		if split[loopnum] == &amp;#039;&amp;gt;&amp;#039; then&lt;br /&gt;
			html = false&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--check for end of link&lt;br /&gt;
		if (split[loopnum] == &amp;#039;|&amp;#039; or (split[loopnum] == &amp;#039;]&amp;#039; and split[loopnum+1] == &amp;#039;]&amp;#039;)) then&lt;br /&gt;
			link = false&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		loopnum = loopnum + 1&lt;br /&gt;
	end&lt;br /&gt;
	--mw.logObject(span,&amp;#039;span&amp;#039;)     --debug&lt;br /&gt;
	--mw.logObject(nospan,&amp;#039;nospan&amp;#039;) --debug&lt;br /&gt;
	&lt;br /&gt;
	if (if1all and next(span, nil) ~= nil) then return mw.html.create(&amp;#039;span&amp;#039;):attr(&amp;#039;lang&amp;#039;, lang):wikitext(s) end&lt;br /&gt;
	&lt;br /&gt;
	--build the string while applying the lang span to the non-ASCII characters only&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local s = mw.html.create()&lt;br /&gt;
	while (span[i] or nospan[i]) do&lt;br /&gt;
		if span[i] then&lt;br /&gt;
			local text = mw.html.create()&lt;br /&gt;
			local try = true&lt;br /&gt;
			text:wikitext(span[i])&lt;br /&gt;
			while try do&lt;br /&gt;
				if span[i+1] then &lt;br /&gt;
					text:wikitext(span[i+1])&lt;br /&gt;
					i = i + 1&lt;br /&gt;
				else&lt;br /&gt;
					try = false&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			s:tag(&amp;#039;span&amp;#039;):attr(&amp;#039;lang&amp;#039;, lang):node(text):done()&lt;br /&gt;
		elseif nospan[i] then&lt;br /&gt;
			s:wikitext(nospan[i])&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--mw.logObject(s,&amp;#039;Output&amp;#039;) --debug&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.CleanTT(tx)&lt;br /&gt;
	local full = tx&lt;br /&gt;
	local result = tx&lt;br /&gt;
	for tooltip, display in string.gmatch(full, &amp;#039;&amp;lt;span[^&amp;gt;]+title=&amp;quot;([^&amp;gt;]-)&amp;quot;&amp;gt;(.-)&amp;lt;/span&amp;gt;&amp;#039;) do&lt;br /&gt;
		search_str = &amp;#039;&amp;lt;span[^&amp;gt;]+title=&amp;quot;&amp;#039; .. tooltip .. &amp;#039;&amp;quot;&amp;gt;(&amp;#039; .. display .. &amp;#039;)&amp;lt;/span&amp;gt;&amp;lt;span[^&amp;gt;]+&amp;gt;&amp;lt;span[^&amp;gt;]+&amp;gt;&amp;#039; .. display .. &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;span[^&amp;gt;]+&amp;gt;&amp;#039; .. tooltip .. &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		result = result:gsub(search_str, display)&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>ReinDevildom</name></author>
	</entry>
</feed>