<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://test.st34an.tech/index.php?action=history&amp;feed=atom&amp;title=Module%3AScript_utilities</id>
	<title>Module:Script utilities - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://test.st34an.tech/index.php?action=history&amp;feed=atom&amp;title=Module%3AScript_utilities"/>
	<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Script_utilities&amp;action=history"/>
	<updated>2026-04-10T17:28:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://test.st34an.tech/index.php?title=Module:Script_utilities&amp;diff=23&amp;oldid=prev</id>
		<title>Jsrs701: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Script_utilities&amp;diff=23&amp;oldid=prev"/>
		<updated>2026-04-10T07:25:47Z</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;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 07:25, 10 April 2026&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 mediawikidb:diff:1.41:old-22:rev-23 --&gt;
&lt;/table&gt;</summary>
		<author><name>Jsrs701</name></author>
	</entry>
	<entry>
		<id>https://test.st34an.tech/index.php?title=Module:Script_utilities&amp;diff=22&amp;oldid=prev</id>
		<title>bob&gt;Djpwikiadmin at 04:01, 7 September 2023</title>
		<link rel="alternate" type="text/html" href="https://test.st34an.tech/index.php?title=Module:Script_utilities&amp;diff=22&amp;oldid=prev"/>
		<updated>2023-09-07T04:01:50Z</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;
--[=[&lt;br /&gt;
	Modules used:&lt;br /&gt;
	[[Module:script utilities/data]]&lt;br /&gt;
	[[Module:scripts]]&lt;br /&gt;
	[[Module:senseid]] (only when id&amp;#039;s present)&lt;br /&gt;
	[[Module:string utilities]] (only when hyphens in Korean text or spaces in vertical text)&lt;br /&gt;
	[[Module:languages]]&lt;br /&gt;
	[[Module:parameters]]&lt;br /&gt;
	[[Module:utilities/format_categories]]&lt;br /&gt;
	[[Module:debug/track]]&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
function export.is_Latin_script(sc)&lt;br /&gt;
	-- Latn, Latf, Latnx, pjt-Latn&lt;br /&gt;
	return sc:getCode():find(&amp;quot;Lat&amp;quot;) and true or false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[{{temp|#invoke:script utilities|lang_t}}&lt;br /&gt;
This is used by {{temp|lang}} to wrap portions of text in a language tag. See there for more information.]==]&lt;br /&gt;
function export.lang_t(frame)&lt;br /&gt;
	local plain_param = {}&lt;br /&gt;
	&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true},&lt;br /&gt;
		[2] = { allow_empty = true, default = &amp;quot;&amp;quot; },&lt;br /&gt;
		[&amp;quot;sc&amp;quot;] = plain_param,&lt;br /&gt;
		[&amp;quot;face&amp;quot;] = plain_param,&lt;br /&gt;
		[&amp;quot;class&amp;quot;] = plain_param,&lt;br /&gt;
	}&lt;br /&gt;
	-- Check parameters&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params, nil, &amp;quot;script utilities&amp;quot;, &amp;quot;lang_t&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local lang = args[1] or &amp;quot;und&amp;quot;&lt;br /&gt;
	local sc = args[&amp;quot;sc&amp;quot;]&lt;br /&gt;
	local text = args[2]&lt;br /&gt;
	&lt;br /&gt;
	lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(lang, 1, true)&lt;br /&gt;
	sc = sc and require(&amp;quot;Module:scripts&amp;quot;).getByCode(sc, &amp;quot;sc&amp;quot;) or lang:findBestScript(text)&lt;br /&gt;
	&lt;br /&gt;
	text = require(&amp;quot;Module:links&amp;quot;).embedded_language_links(&lt;br /&gt;
		{&lt;br /&gt;
			term = text,&lt;br /&gt;
			lang = lang,&lt;br /&gt;
			sc = sc&lt;br /&gt;
		},&lt;br /&gt;
		false&lt;br /&gt;
	)&lt;br /&gt;
	&lt;br /&gt;
	local face = args[&amp;quot;face&amp;quot;]&lt;br /&gt;
	local class = args[&amp;quot;class&amp;quot;]&lt;br /&gt;
	&lt;br /&gt;
	return export.tag_text(text, lang, sc, face, class)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Ustring turns on the codepoint-aware string matching. The basic string function&lt;br /&gt;
-- should be used for simple sequences of characters, Ustring function for&lt;br /&gt;
-- sets – [].&lt;br /&gt;
local function trackPattern(text, pattern, tracking, ustring)&lt;br /&gt;
	local find = ustring and mw.ustring.find or string.find&lt;br /&gt;
	if pattern and find(text, pattern) then&lt;br /&gt;
		require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;script/&amp;quot; .. tracking)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function track(text, lang, sc)&lt;br /&gt;
	local u = mw.ustring.char&lt;br /&gt;
	&lt;br /&gt;
	if lang and text then&lt;br /&gt;
		local langCode = lang:getCode()&lt;br /&gt;
		&lt;br /&gt;
		-- [[Special:WhatLinksHere/Template:tracking/script/ang/acute]]&lt;br /&gt;
		if langCode == &amp;quot;ang&amp;quot; then&lt;br /&gt;
			local decomposed = mw.ustring.toNFD(text)&lt;br /&gt;
			local acute = u(0x301)&lt;br /&gt;
			&lt;br /&gt;
			trackPattern(decomposed, acute, &amp;quot;ang/acute&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		--[=[&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Greek/wrong-phi]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Greek/wrong-theta]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Greek/wrong-kappa]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Greek/wrong-rho]]&lt;br /&gt;
			ϑ, ϰ, ϱ, ϕ should generally be replaced with θ, κ, ρ, φ.&lt;br /&gt;
		]=]&lt;br /&gt;
		elseif langCode == &amp;quot;el&amp;quot; or langCode == &amp;quot;grc&amp;quot; then&lt;br /&gt;
			trackPattern(text, &amp;quot;ϑ&amp;quot;, &amp;quot;Greek/wrong-theta&amp;quot;)&lt;br /&gt;
			trackPattern(text, &amp;quot;ϰ&amp;quot;, &amp;quot;Greek/wrong-kappa&amp;quot;)&lt;br /&gt;
			trackPattern(text, &amp;quot;ϱ&amp;quot;, &amp;quot;Greek/wrong-rho&amp;quot;)&lt;br /&gt;
			trackPattern(text, &amp;quot;ϕ&amp;quot;, &amp;quot;Greek/wrong-phi&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
			--[=[&lt;br /&gt;
			[[Special:WhatLinksHere/Template:tracking/script/Ancient Greek/spacing-coronis]]&lt;br /&gt;
			[[Special:WhatLinksHere/Template:tracking/script/Ancient Greek/spacing-smooth-breathing]]&lt;br /&gt;
			[[Special:WhatLinksHere/Template:tracking/script/Ancient Greek/wrong-apostrophe]]&lt;br /&gt;
				When spacing coronis and spacing smooth breathing are used as apostrophes, &lt;br /&gt;
				they should be replaced with right single quotation marks (’).&lt;br /&gt;
			]=]&lt;br /&gt;
			if langCode == &amp;quot;grc&amp;quot; then&lt;br /&gt;
				trackPattern(text, u(0x1FBD), &amp;quot;Ancient Greek/spacing-coronis&amp;quot;)&lt;br /&gt;
				trackPattern(text, u(0x1FBF), &amp;quot;Ancient Greek/spacing-smooth-breathing&amp;quot;)&lt;br /&gt;
				trackPattern(text, &amp;quot;[&amp;quot; .. u(0x1FBD) .. u(0x1FBF) .. &amp;quot;]&amp;quot;, &amp;quot;Ancient Greek/wrong-apostrophe&amp;quot;, true)&lt;br /&gt;
			end&lt;br /&gt;
		&lt;br /&gt;
		-- [[Special:WhatLinksHere/Template:tracking/script/Russian/grave-accent]]&lt;br /&gt;
		elseif langCode == &amp;quot;ru&amp;quot; then&lt;br /&gt;
			local decomposed = mw.ustring.toNFD(text)&lt;br /&gt;
			&lt;br /&gt;
			trackPattern(decomposed, u(0x300), &amp;quot;Russian/grave-accent&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		-- [[Special:WhatLinksHere/Template:tracking/script/Tibetan/trailing-punctuation]]&lt;br /&gt;
		elseif langCode == &amp;quot;bo&amp;quot; then&lt;br /&gt;
			trackPattern(text, &amp;quot;[་།]$&amp;quot;, &amp;quot;Tibetan/trailing-punctuation&amp;quot;, true)&lt;br /&gt;
			trackPattern(text, &amp;quot;[་།]%]%]$&amp;quot;, &amp;quot;Tibetan/trailing-punctuation&amp;quot;, true)&lt;br /&gt;
&lt;br /&gt;
		--[=[&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Thai/broken-ae]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Thai/broken-am]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Thai/wrong-rue-lue]]&lt;br /&gt;
		]=]&lt;br /&gt;
		elseif langCode == &amp;quot;th&amp;quot; then&lt;br /&gt;
			trackPattern(text, &amp;quot;เ&amp;quot;..&amp;quot;เ&amp;quot;, &amp;quot;Thai/broken-ae&amp;quot;)&lt;br /&gt;
			trackPattern(text, &amp;quot;ํ[่้๊๋]?า&amp;quot;, &amp;quot;Thai/broken-am&amp;quot;, true)&lt;br /&gt;
			trackPattern(text, &amp;quot;[ฤฦ]า&amp;quot;, &amp;quot;Thai/wrong-rue-lue&amp;quot;, true)&lt;br /&gt;
&lt;br /&gt;
		--[=[&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Lao/broken-ae]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Lao/broken-am]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Lao/possible-broken-ho-no]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Lao/possible-broken-ho-mo]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Lao/possible-broken-ho-lo]]&lt;br /&gt;
		]=]&lt;br /&gt;
		elseif langCode == &amp;quot;lo&amp;quot; then&lt;br /&gt;
			trackPattern(text, &amp;quot;ເ&amp;quot;..&amp;quot;ເ&amp;quot;, &amp;quot;Lao/broken-ae&amp;quot;)&lt;br /&gt;
			trackPattern(text, &amp;quot;ໍ[່້໊໋]?າ&amp;quot;, &amp;quot;Lao/broken-am&amp;quot;, true)&lt;br /&gt;
			trackPattern(text, &amp;quot;ຫນ&amp;quot;, &amp;quot;Lao/possible-broken-ho-no&amp;quot;)&lt;br /&gt;
			trackPattern(text, &amp;quot;ຫມ&amp;quot;, &amp;quot;Lao/possible-broken-ho-mo&amp;quot;)&lt;br /&gt;
			trackPattern(text, &amp;quot;ຫລ&amp;quot;, &amp;quot;Lao/possible-broken-ho-lo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		--[=[&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Lü/broken-ae]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/script/Lü/possible-wrong-sequence]]&lt;br /&gt;
		]=]&lt;br /&gt;
		elseif langCode == &amp;quot;khb&amp;quot; then&lt;br /&gt;
			trackPattern(text, &amp;quot;ᦵ&amp;quot;..&amp;quot;ᦵ&amp;quot;, &amp;quot;Lü/broken-ae&amp;quot;)&lt;br /&gt;
			trackPattern(text, &amp;quot;[ᦀ-ᦫ][ᦵᦶᦷᦺ]&amp;quot;, &amp;quot;Lü/possible-wrong-sequence&amp;quot;, true)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Wraps the given text in HTML tags with appropriate CSS classes (see [[WT:CSS]]) for the [[Module:languages#Language objects|language]] and script. This is required for all non-English text on Wiktionary.&lt;br /&gt;
The actual tags and CSS classes that are added are determined by the &amp;lt;code&amp;gt;face&amp;lt;/code&amp;gt; parameter. It can be one of the following:&lt;br /&gt;
; {{code|lua|&amp;quot;term&amp;quot;}}&lt;br /&gt;
: The text is wrapped in {{code|html|2=&amp;lt;i class=&amp;quot;(sc) mention&amp;quot; lang=&amp;quot;(lang)&amp;quot;&amp;gt;...&amp;lt;/i&amp;gt;}}.&lt;br /&gt;
; {{code|lua|&amp;quot;head&amp;quot;}}&lt;br /&gt;
: The text is wrapped in {{code|html|2=&amp;lt;strong class=&amp;quot;(sc) headword&amp;quot; lang=&amp;quot;(lang)&amp;quot;&amp;gt;...&amp;lt;/strong&amp;gt;}}.&lt;br /&gt;
; {{code|lua|&amp;quot;hypothetical&amp;quot;}}&lt;br /&gt;
: The text is wrapped in {{code|html|2=&amp;lt;span class=&amp;quot;hypothetical-star&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;i class=&amp;quot;(sc) hypothetical&amp;quot; lang=&amp;quot;(lang)&amp;quot;&amp;gt;...&amp;lt;/i&amp;gt;}}.&lt;br /&gt;
; {{code|lua|&amp;quot;bold&amp;quot;}}&lt;br /&gt;
: The text is wrapped in {{code|html|2=&amp;lt;b class=&amp;quot;(sc)&amp;quot; lang=&amp;quot;(lang)&amp;quot;&amp;gt;...&amp;lt;/b&amp;gt;}}.&lt;br /&gt;
; {{code|lua|nil}}&lt;br /&gt;
: The text is wrapped in {{code|html|2=&amp;lt;span class=&amp;quot;(sc)&amp;quot; lang=&amp;quot;(lang)&amp;quot;&amp;gt;...&amp;lt;/span&amp;gt;}}.&lt;br /&gt;
The optional &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt; parameter can be used to specify an additional CSS class to be added to the tag.]==]&lt;br /&gt;
function export.tag_text(text, lang, sc, face, class, id)&lt;br /&gt;
	if not sc then&lt;br /&gt;
		sc = lang:findBestScript(text)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	track(text, lang, sc)&lt;br /&gt;
		&lt;br /&gt;
	-- Replace space characters with newlines in Mongolian-script text, which is written top-to-bottom.&lt;br /&gt;
	if sc:getDirection() == &amp;quot;down&amp;quot; and text:find(&amp;quot; &amp;quot;) then&lt;br /&gt;
		text = require(&amp;quot;Module:munge_text&amp;quot;)(text, function(txt)&lt;br /&gt;
			-- having extra parentheses makes sure only the first return value gets through&lt;br /&gt;
			return (txt:gsub(&amp;quot; +&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;))&lt;br /&gt;
		end)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Hack Korean script text to remove hyphens.&lt;br /&gt;
	-- XXX: This should be handled in a more general fashion, but needs to&lt;br /&gt;
	-- be efficient by not doing anything if no hyphens are present, and currently this is the only&lt;br /&gt;
	-- language needing such processing.&lt;br /&gt;
	-- 20220221: Also convert 漢字(한자) to ruby, instead of needing [[Template:Ruby]].&lt;br /&gt;
	if sc:getCode() == &amp;quot;Kore&amp;quot; and (text:find(&amp;quot;%-&amp;quot;) or text:find(&amp;quot;[()]&amp;quot;)) then&lt;br /&gt;
		local m_scripts = require(&amp;quot;Module:scripts&amp;quot;)&lt;br /&gt;
		text = require(&amp;quot;Module:munge_text&amp;quot;)(text, function(txt)&lt;br /&gt;
			txt = txt:gsub(&amp;quot;%-&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			txt = mw.ustring.gsub(txt, &amp;quot;([&amp;quot;.. m_scripts.getByCode(&amp;quot;Hani&amp;quot;):getCharacters() .. &amp;quot;]+)%(([&amp;quot; .. m_scripts.getByCode(&amp;quot;Hang&amp;quot;):getCharacters() .. &amp;quot;]+)%)&amp;quot;, &amp;quot;&amp;lt;ruby&amp;gt;%1&amp;lt;rp&amp;gt;(&amp;lt;/rp&amp;gt;&amp;lt;rt&amp;gt;%2&amp;lt;/rt&amp;gt;&amp;lt;rp&amp;gt;)&amp;lt;/rp&amp;gt;&amp;lt;/ruby&amp;gt;&amp;quot;)&lt;br /&gt;
			return txt&lt;br /&gt;
		end)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if sc:getCode() == &amp;quot;Imag&amp;quot; then&lt;br /&gt;
		face = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function class_attr(classes)&lt;br /&gt;
		-- if the script code is hyphenated (i.e. language code-script code, add the last component as a class as well)&lt;br /&gt;
		-- e.g. ota-Arab adds both Arab and ota-Arab as classes&lt;br /&gt;
		if mw.ustring.find(sc:getCode(), &amp;quot;%-&amp;quot;) then&lt;br /&gt;
			table.insert(classes, 1, (mw.ustring.gsub(sc:getCode(), &amp;quot;.+%-&amp;quot;, &amp;quot;&amp;quot;)))&lt;br /&gt;
			table.insert(classes, 2, sc:getCode())&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(classes, 1, sc:getCode())&lt;br /&gt;
		end&lt;br /&gt;
		if class and class ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			table.insert(classes, class)&lt;br /&gt;
		end&lt;br /&gt;
		return &amp;#039;class=&amp;quot;&amp;#039; .. table.concat(classes, &amp;#039; &amp;#039;) .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function tag_attr(...)&lt;br /&gt;
		local output = {}&lt;br /&gt;
		if id then&lt;br /&gt;
			table.insert(output, &amp;#039;id=&amp;quot;&amp;#039; .. require(&amp;quot;Module:senseid&amp;quot;).anchor(lang, id) .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(output, class_attr({...}) )&lt;br /&gt;
		&lt;br /&gt;
		if lang then&lt;br /&gt;
			table.insert(output, &amp;#039;lang=&amp;quot;&amp;#039; .. lang:getCode() .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return table.concat(output, &amp;quot; &amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if face == &amp;quot;hypothetical&amp;quot; then&lt;br /&gt;
	-- [[Special:WhatLinksHere/Template:tracking/script-utilities/face/hypothetical]]&lt;br /&gt;
		require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;script-utilities/face/hypothetical&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = mw.loadData(&amp;quot;Module:script utilities/data&amp;quot;).faces[face or &amp;quot;nil&amp;quot;]&lt;br /&gt;
	&lt;br /&gt;
	local post = &amp;quot;&amp;quot;&lt;br /&gt;
	if sc:getDirection() == &amp;quot;rtl&amp;quot; and (face == &amp;quot;translation&amp;quot; or mw.ustring.find(text, &amp;quot;%p$&amp;quot;)) then&lt;br /&gt;
		post = &amp;quot;&amp;amp;lrm;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Add a script wrapper&lt;br /&gt;
	if data then&lt;br /&gt;
		return ( data.prefix or &amp;quot;&amp;quot; ) .. &amp;#039;&amp;lt;&amp;#039; .. data.tag .. &amp;#039; &amp;#039; .. tag_attr(data.class) .. &amp;#039;&amp;gt;&amp;#039; .. text .. &amp;#039;&amp;lt;/&amp;#039; .. data.tag .. &amp;#039;&amp;gt;&amp;#039; .. post&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;#039;Invalid script face &amp;quot;&amp;#039; .. face .. &amp;#039;&amp;quot;.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Tags the transliteration for given text {translit} and language {lang}. It will add the language, script subtag (as defined in [https://www.rfc-editor.org/rfc/bcp/bcp47.txt BCP 47 2.2.3]) and [https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir dir] (directional) attributes as needed.&lt;br /&gt;
The optional &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; parameter can be one of the following:&lt;br /&gt;
; {{code|lua|&amp;quot;term&amp;quot;}}&lt;br /&gt;
: tag transliteration for {{temp|mention}}&lt;br /&gt;
; {{code|lua|&amp;quot;usex&amp;quot;}}&lt;br /&gt;
: tag transliteration for {{temp|usex}}&lt;br /&gt;
; {{code|lua|&amp;quot;head&amp;quot;}}&lt;br /&gt;
: tag transliteration for {{temp|head}}&lt;br /&gt;
; {{code|lua|&amp;quot;default&amp;quot;}}&lt;br /&gt;
: default&lt;br /&gt;
The optional &amp;lt;code&amp;gt;attributes&amp;lt;/code&amp;gt; parameter is used to specify additional HTML attributes for the tag.]==]&lt;br /&gt;
function export.tag_translit(translit, lang, kind, attributes, is_manual)&lt;br /&gt;
	if type(lang) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		lang = lang.getCode and lang:getCode()&lt;br /&gt;
			or error(&amp;quot;Second argument to tag_translit should be a language code or language object.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = mw.loadData(&amp;quot;Module:script utilities/data&amp;quot;).translit[kind or &amp;quot;default&amp;quot;]&lt;br /&gt;
	&lt;br /&gt;
	local opening_tag = {}&lt;br /&gt;
	&lt;br /&gt;
	table.insert(opening_tag, data.tag)&lt;br /&gt;
	if lang == &amp;quot;ja&amp;quot; then&lt;br /&gt;
		table.insert(opening_tag, &amp;#039;class=&amp;quot;&amp;#039; .. (data.classes and data.classes .. &amp;quot; &amp;quot; or &amp;quot;&amp;quot;) .. (is_manual and &amp;quot;manual-tr &amp;quot; or &amp;quot;&amp;quot;) .. &amp;#039;tr&amp;quot;&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(opening_tag, &amp;#039;lang=&amp;quot;&amp;#039; .. lang .. &amp;#039;-Latn&amp;quot;&amp;#039;)&lt;br /&gt;
		table.insert(opening_tag, &amp;#039;class=&amp;quot;&amp;#039; .. (data.classes and data.classes .. &amp;quot; &amp;quot; or &amp;quot;&amp;quot;) .. (is_manual and &amp;quot;manual-tr &amp;quot; or &amp;quot;&amp;quot;) .. &amp;#039;tr Latn&amp;quot;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if data.dir then&lt;br /&gt;
		table.insert(opening_tag, &amp;#039;dir=&amp;quot;&amp;#039; .. data.dir .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(opening_tag, attributes)&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;lt;&amp;quot; .. table.concat(opening_tag, &amp;quot; &amp;quot;) .. &amp;quot;&amp;gt;&amp;quot; .. translit .. &amp;quot;&amp;lt;/&amp;quot; .. data.tag .. &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.tag_transcription(transcription, lang, kind, attributes)&lt;br /&gt;
	if type(lang) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		lang = lang.getCode and lang:getCode()&lt;br /&gt;
			or error(&amp;quot;Third argument to tag_translit should be a language code or language object.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = mw.loadData(&amp;quot;Module:script utilities/data&amp;quot;).transcription[kind or &amp;quot;default&amp;quot;]&lt;br /&gt;
	&lt;br /&gt;
	local opening_tag = {}&lt;br /&gt;
	&lt;br /&gt;
	table.insert(opening_tag, data.tag)&lt;br /&gt;
	if lang == &amp;quot;ja&amp;quot; then&lt;br /&gt;
		table.insert(opening_tag, &amp;#039;class=&amp;quot;&amp;#039; .. (data.classes and data.classes .. &amp;quot; &amp;quot; or &amp;quot;&amp;quot;) .. &amp;#039;ts&amp;quot;&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(opening_tag, &amp;#039;lang=&amp;quot;&amp;#039; .. lang .. &amp;#039;-Latn&amp;quot;&amp;#039;)&lt;br /&gt;
		table.insert(opening_tag, &amp;#039;class=&amp;quot;&amp;#039; .. (data.classes and data.classes .. &amp;quot; &amp;quot; or &amp;quot;&amp;quot;) .. &amp;#039;ts Latn&amp;quot;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if data.dir then&lt;br /&gt;
		table.insert(opening_tag, &amp;#039;dir=&amp;quot;&amp;#039; .. data.dir .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(opening_tag, attributes)&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;lt;&amp;quot; .. table.concat(opening_tag, &amp;quot; &amp;quot;) .. &amp;quot;&amp;gt;&amp;quot; .. transcription .. &amp;quot;&amp;lt;/&amp;quot; .. data.tag .. &amp;quot;&amp;gt;&amp;quot;	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[Generates a request to provide a term in its native script, if it is missing. This is used by the {{temp|rfscript}} template as well as by the functions in [[Module:links]].&lt;br /&gt;
The function will add entries to one of the subcategories of [[:Category:Requests for native script by language]], and do several checks on the given language and script. In particular:&lt;br /&gt;
* If the script was given, a subcategory named &amp;quot;Requests for (script) script&amp;quot; is added, but only if the language has more than one script. Otherwise, the main &amp;quot;Requests for native script&amp;quot; category is used.&lt;br /&gt;
* Nothing is added at all if the language has no scripts other than Latin and its varieties.]==]&lt;br /&gt;
function export.request_script(lang, sc, usex, nocat, sort_key)&lt;br /&gt;
	local scripts = lang.getScripts and lang:getScripts() or error(&amp;#039;The language &amp;quot;&amp;#039; .. lang:getCode() .. &amp;#039;&amp;quot; does not have the method getScripts. It may be unwritten.&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	-- By default, request for &amp;quot;native&amp;quot; script&lt;br /&gt;
	local cat_script = &amp;quot;native&amp;quot;&lt;br /&gt;
	local disp_script = &amp;quot;script&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- If the script was not specified, and the language has only one script, use that.&lt;br /&gt;
	if not sc and #scripts == 1 then&lt;br /&gt;
		sc = scripts[1]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Is the script known?&lt;br /&gt;
	if sc and sc:getCode() ~= &amp;quot;None&amp;quot; then&lt;br /&gt;
		-- If the script is Latin, return nothing.&lt;br /&gt;
		if export.is_Latin_script(sc) then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if (not scripts[1]) or sc:getCode() ~= scripts[1]:getCode() then&lt;br /&gt;
			disp_script = sc:getCanonicalName()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- The category needs to be specific to script only if there is chance of ambiguity. This occurs when when the language has multiple scripts (or with codes such as &amp;quot;und&amp;quot;).&lt;br /&gt;
		if (not scripts[1]) or scripts[2] then&lt;br /&gt;
			cat_script = sc:getCanonicalName()&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- The script is not known.&lt;br /&gt;
		-- Does the language have at least one non-Latin script in its list?&lt;br /&gt;
		local has_nonlatin = false&lt;br /&gt;
		&lt;br /&gt;
		for i, val in ipairs(scripts) do&lt;br /&gt;
			if not export.is_Latin_script(val) then&lt;br /&gt;
				has_nonlatin = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- If there are no non-Latin scripts, return nothing.&lt;br /&gt;
		if not has_nonlatin then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local category&lt;br /&gt;
	&lt;br /&gt;
	if usex then&lt;br /&gt;
		local usex_type = usex == &amp;quot;quote&amp;quot; and &amp;quot;quotations&amp;quot; or &amp;quot;usage examples&amp;quot;&lt;br /&gt;
		category = &amp;quot;Requests for &amp;quot; .. cat_script .. &amp;quot; script in &amp;quot; .. lang:getCanonicalName() .. &amp;quot; &amp;quot; .. usex_type&lt;br /&gt;
	else&lt;br /&gt;
		category = &amp;quot;Requests for &amp;quot; .. cat_script .. &amp;quot; script for &amp;quot; .. lang:getCanonicalName() .. &amp;quot; terms&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;lt;small&amp;gt;[&amp;quot; .. disp_script .. &amp;quot; needed]&amp;lt;/small&amp;gt;&amp;quot; ..&lt;br /&gt;
		(nocat and &amp;quot;&amp;quot; or require(&amp;quot;Module:utilities/format_categories&amp;quot;)({category}, lang, sort_key))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[This is used by {{temp|rfscript}}. See there for more information.]==]&lt;br /&gt;
function export.template_rfscript(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = { required = true, default = &amp;quot;und&amp;quot; },&lt;br /&gt;
		[&amp;quot;sc&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;usex&amp;quot;] = { type = &amp;quot;boolean&amp;quot; },&lt;br /&gt;
		[&amp;quot;quote&amp;quot;] = { type = &amp;quot;boolean&amp;quot; },&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = { type = &amp;quot;boolean&amp;quot; },&lt;br /&gt;
		[&amp;quot;sort&amp;quot;] = {},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params, nil, &amp;quot;script utilities&amp;quot;, &amp;quot;template_rfscript&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(args[1], 1, &amp;quot;allow etym&amp;quot;)&lt;br /&gt;
	local sc = args.sc and require(&amp;quot;Module:scripts&amp;quot;).getByCode(args.sc, true)&lt;br /&gt;
&lt;br /&gt;
	local ret = export.request_script(lang, sc, args.quote and &amp;quot;quote&amp;quot; or args.usex, args.nocat, args.sort)&lt;br /&gt;
	&lt;br /&gt;
	if ret == &amp;quot;&amp;quot; then&lt;br /&gt;
		error(&amp;quot;This language is written in the Latin alphabet. It does not need a native script.&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		return ret&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.checkScript(text, scriptCode, result)&lt;br /&gt;
	local scriptObject = require(&amp;quot;Module:scripts&amp;quot;).getByCode(scriptCode)&lt;br /&gt;
	&lt;br /&gt;
	if not scriptObject then&lt;br /&gt;
		error(&amp;#039;The script code &amp;quot;&amp;#039; .. scriptCode .. &amp;#039;&amp;quot; is not recognized.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local originalText = text&lt;br /&gt;
	&lt;br /&gt;
	-- Remove non-letter characters.&lt;br /&gt;
	text = mw.ustring.gsub(text, &amp;quot;[%A]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- Remove all characters of the script in question.&lt;br /&gt;
	text = mw.ustring.gsub(text, &amp;quot;[&amp;quot; .. scriptObject:getCharacters() .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if text ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		if type(result) == &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(result)&lt;br /&gt;
		else&lt;br /&gt;
			error(&amp;#039;The text &amp;quot;&amp;#039; .. originalText .. &amp;#039;&amp;quot; contains the letters &amp;quot;&amp;#039; .. text .. &amp;#039;&amp;quot; that do not belong to the &amp;#039; .. scriptObject:getDisplayForm() .. &amp;#039;.&amp;#039;, 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>bob&gt;Djpwikiadmin</name></author>
	</entry>
</feed>