<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://petitplanet.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ALang</id>
	<title>Module:Lang - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://petitplanet.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ALang"/>
	<link rel="alternate" type="text/html" href="https://petitplanet.wiki/index.php?title=Module:Lang&amp;action=history"/>
	<updated>2026-04-15T04:41:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://petitplanet.wiki/index.php?title=Module:Lang&amp;diff=37&amp;oldid=prev</id>
		<title>Stevium: Created Module:Lang</title>
		<link rel="alternate" type="text/html" href="https://petitplanet.wiki/index.php?title=Module:Lang&amp;diff=37&amp;oldid=prev"/>
		<updated>2025-11-09T09:39:47Z</updated>

		<summary type="html">&lt;p&gt;Created Module:Lang&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Source: https://genshin-impact.fandom.com/wiki/Module:Lang&lt;br /&gt;
&lt;br /&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>Stevium</name></author>
	</entry>
</feed>