<?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%3Aar-translit</id>
	<title>Module:ar-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%3Aar-translit"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:ar-translit&amp;action=history"/>
	<updated>2026-04-06T07:34:09Z</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:ar-translit&amp;diff=234175&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;-- Authors: Benwing, ZxxZxxZ, Atitarev  local export = {}  local U = mw.ustring.char local rfind = mw.ustring.find local rsubn = mw.ustring.gsub local rmatch = mw.ustring.matc...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:ar-translit&amp;diff=234175&amp;oldid=prev"/>
		<updated>2021-08-23T14:44:35Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- Authors: Benwing, ZxxZxxZ, Atitarev  local export = {}  local U = mw.ustring.char local rfind = mw.ustring.find local rsubn = mw.ustring.gsub local rmatch = mw.ustring.matc...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Authors: Benwing, ZxxZxxZ, Atitarev&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local U = mw.ustring.char&lt;br /&gt;
local rfind = mw.ustring.find&lt;br /&gt;
local rsubn = mw.ustring.gsub&lt;br /&gt;
local rmatch = mw.ustring.match&lt;br /&gt;
local rsplit = mw.text.split&lt;br /&gt;
local gcodepoint = mw.ustring.gcodepoint&lt;br /&gt;
&lt;br /&gt;
-- assigned below&lt;br /&gt;
local has_diacritics&lt;br /&gt;
&lt;br /&gt;
-- version of rsubn() that discards all but the first return value&lt;br /&gt;
local function rsub(term, foo, bar)&lt;br /&gt;
	local retval = rsubn(term, foo, bar)&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local zwnj = U(0x200c) -- zero-width non-joiner&lt;br /&gt;
local alif_madda = U(0x622)&lt;br /&gt;
local alif_hamza_below = U(0x625)&lt;br /&gt;
local alif = U(0x627)&lt;br /&gt;
local taa_marbuuTa = U(0x629)&lt;br /&gt;
local laam = U(0x644)&lt;br /&gt;
local waaw = U(0x648)&lt;br /&gt;
local alif_maqSuura = U(0x649)&lt;br /&gt;
local yaa = U(0x64A)&lt;br /&gt;
local fatHataan = U(0x64B)&lt;br /&gt;
local Dammataan = U(0x64C)&lt;br /&gt;
local kasrataan = U(0x64D)&lt;br /&gt;
local fatHa = U(0x64E)&lt;br /&gt;
local Damma = U(0x64F)&lt;br /&gt;
local kasra = U(0x650)&lt;br /&gt;
local shadda = U(0x651)&lt;br /&gt;
local sukuun = U(0x652)&lt;br /&gt;
local dagger_alif = U(0x670)&lt;br /&gt;
local alif_waSl = U(0x671)&lt;br /&gt;
--local zwj = U(0x200d) -- zero-width joiner&lt;br /&gt;
local lrm = U(0x200e) -- left-to-right mark&lt;br /&gt;
local rlm = U(0x200f) -- right-to-left mark&lt;br /&gt;
&lt;br /&gt;
local tt = {&lt;br /&gt;
	-- consonants&lt;br /&gt;
	[&amp;quot;ب&amp;quot;]=&amp;quot;b&amp;quot;, [&amp;quot;ت&amp;quot;]=&amp;quot;t&amp;quot;, [&amp;quot;ث&amp;quot;]=&amp;quot;ṯ&amp;quot;, [&amp;quot;ج&amp;quot;]=&amp;quot;j&amp;quot;, [&amp;quot;ح&amp;quot;]=&amp;quot;ḥ&amp;quot;, [&amp;quot;خ&amp;quot;]=&amp;quot;ḵ&amp;quot;,&lt;br /&gt;
	[&amp;quot;د&amp;quot;]=&amp;quot;d&amp;quot;, [&amp;quot;ذ&amp;quot;]=&amp;quot;ḏ&amp;quot;, [&amp;quot;ر&amp;quot;]=&amp;quot;r&amp;quot;, [&amp;quot;ز&amp;quot;]=&amp;quot;z&amp;quot;, [&amp;quot;س&amp;quot;]=&amp;quot;s&amp;quot;, [&amp;quot;ش&amp;quot;]=&amp;quot;š&amp;quot;,&lt;br /&gt;
	[&amp;quot;ص&amp;quot;]=&amp;quot;ṣ&amp;quot;, [&amp;quot;ض&amp;quot;]=&amp;quot;ḍ&amp;quot;, [&amp;quot;ط&amp;quot;]=&amp;quot;ṭ&amp;quot;, [&amp;quot;ظ&amp;quot;]=&amp;quot;ẓ&amp;quot;, [&amp;quot;ع&amp;quot;]=&amp;quot;ʿ&amp;quot;, [&amp;quot;غ&amp;quot;]=&amp;quot;ḡ&amp;quot;,&lt;br /&gt;
	[&amp;quot;ف&amp;quot;]=&amp;quot;f&amp;quot;, [&amp;quot;ق&amp;quot;]=&amp;quot;q&amp;quot;, [&amp;quot;ك&amp;quot;]=&amp;quot;k&amp;quot;, [&amp;quot;ڪ&amp;quot;]=&amp;quot;k&amp;quot;, [&amp;quot;ل&amp;quot;]=&amp;quot;l&amp;quot;, [&amp;quot;م&amp;quot;]=&amp;quot;m&amp;quot;, [&amp;quot;ن&amp;quot;]=&amp;quot;n&amp;quot;,&lt;br /&gt;
	[&amp;quot;ه&amp;quot;]=&amp;quot;h&amp;quot;,&lt;br /&gt;
	-- tāʾ marbūṭa (special) - always after a fátḥa (a), silent at the end of&lt;br /&gt;
	-- an utterance, &amp;quot;t&amp;quot; in ʾiḍāfa or with pronounced tanwīn. We catch&lt;br /&gt;
	-- most instances of tāʾ marbūṭa before we get to this stage.&lt;br /&gt;
	[taa_marbuuTa]=&amp;quot;t&amp;quot;, -- tāʾ marbūṭa = ة&lt;br /&gt;
	-- control characters&lt;br /&gt;
	[zwnj]=&amp;quot;-&amp;quot;, -- ZWNJ (zero-width non-joiner)&lt;br /&gt;
	-- [zwj]=&amp;quot;&amp;quot;, -- ZWJ (zero-width joiner)&lt;br /&gt;
	-- rare letters&lt;br /&gt;
	[&amp;quot;پ&amp;quot;]=&amp;quot;p&amp;quot;, [&amp;quot;چ&amp;quot;]=&amp;quot;č&amp;quot;, [&amp;quot;ڤ&amp;quot;]=&amp;quot;v&amp;quot;, [&amp;quot;ڥ&amp;quot;]=&amp;quot;v&amp;quot;, [&amp;quot;گ&amp;quot;]=&amp;quot;g&amp;quot;, [&amp;quot;ڨ&amp;quot;]=&amp;quot;g&amp;quot;, [&amp;quot;ڧ&amp;quot;]=&amp;quot;q&amp;quot;, [&amp;quot;ڢ&amp;quot;]=&amp;quot;f&amp;quot;, [&amp;quot;ں&amp;quot;]=&amp;quot;n&amp;quot;, [&amp;quot;ڭ&amp;quot;]=&amp;quot;g&amp;quot;,&lt;br /&gt;
	-- semivowels or long vowels, alif, hamza, special letters&lt;br /&gt;
	[&amp;quot;ا&amp;quot;]=&amp;quot;ā&amp;quot;, -- ʾalif&lt;br /&gt;
	-- hamzated letters&lt;br /&gt;
	[&amp;quot;أ&amp;quot;]=&amp;quot;ʾ&amp;quot;, -- hamza over alif&lt;br /&gt;
	[alif_hamza_below]=&amp;quot;ʾ&amp;quot;, -- hamza under alif&lt;br /&gt;
	[&amp;quot;ؤ&amp;quot;]=&amp;quot;ʾ&amp;quot;, -- hamza over wāw&lt;br /&gt;
	[&amp;quot;ئ&amp;quot;]=&amp;quot;ʾ&amp;quot;, -- hamza over yā&lt;br /&gt;
	[&amp;quot;ء&amp;quot;]=&amp;quot;ʾ&amp;quot;, -- hamza on the line&lt;br /&gt;
	-- long vowels&lt;br /&gt;
	[waaw]=&amp;quot;w&amp;quot;, --&amp;quot;ū&amp;quot; after ḍamma (u) and not before diacritic&lt;br /&gt;
	[yaa]=&amp;quot;y&amp;quot;, --&amp;quot;ī&amp;quot; after kasra (i) and not before diacritic&lt;br /&gt;
	[alif_maqSuura]=&amp;quot;ā&amp;quot;, -- ʾalif maqṣūra&lt;br /&gt;
	[alif_madda]=&amp;quot;ʾā&amp;quot;, -- ʾalif madda&lt;br /&gt;
	[alif_waSl]= &amp;quot;&amp;quot;, -- hamzatu l-waṣl&lt;br /&gt;
	[dagger_alif] = &amp;quot;ā&amp;quot;, -- ʾalif xanjariyya = dagger ʾalif (Koranic diacritic)&lt;br /&gt;
	-- short vowels, šádda and sukūn&lt;br /&gt;
	[fatHataan]=&amp;quot;an&amp;quot;, -- fatḥatan&lt;br /&gt;
	[Dammataan]=&amp;quot;un&amp;quot;, -- ḍammatan&lt;br /&gt;
	[kasrataan]=&amp;quot;in&amp;quot;, -- kasratan&lt;br /&gt;
	[fatHa]=&amp;quot;a&amp;quot;, -- fatḥa&lt;br /&gt;
	[Damma]=&amp;quot;u&amp;quot;, -- ḍamma&lt;br /&gt;
	[kasra]=&amp;quot;i&amp;quot;, -- kasra&lt;br /&gt;
	-- šadda - doubled consonant&lt;br /&gt;
	[sukuun]=&amp;quot;&amp;quot;, --sukūn - no vowel&lt;br /&gt;
	-- ligatures&lt;br /&gt;
	[&amp;quot;ﻻ&amp;quot;]=&amp;quot;lā&amp;quot;,&lt;br /&gt;
	[&amp;quot;ﷲ&amp;quot;]=&amp;quot;llāh&amp;quot;,&lt;br /&gt;
	-- taṭwīl&lt;br /&gt;
	[&amp;quot;ـ&amp;quot;]=&amp;quot;&amp;quot;, -- taṭwīl, no sound&lt;br /&gt;
	-- numerals&lt;br /&gt;
	[&amp;quot;١&amp;quot;]=&amp;quot;1&amp;quot;, [&amp;quot;٢&amp;quot;]=&amp;quot;2&amp;quot;, [&amp;quot;٣&amp;quot;]=&amp;quot;3&amp;quot;, [&amp;quot;٤&amp;quot;]=&amp;quot;4&amp;quot;, [&amp;quot;٥&amp;quot;]=&amp;quot;5&amp;quot;,&lt;br /&gt;
	[&amp;quot;٦&amp;quot;]=&amp;quot;6&amp;quot;, [&amp;quot;٧&amp;quot;]=&amp;quot;7&amp;quot;, [&amp;quot;٨&amp;quot;]=&amp;quot;8&amp;quot;, [&amp;quot;٩&amp;quot;]=&amp;quot;9&amp;quot;, [&amp;quot;٠&amp;quot;]=&amp;quot;0&amp;quot;,&lt;br /&gt;
	-- punctuation (leave on separate lines)&lt;br /&gt;
	[&amp;quot;؟&amp;quot;]=&amp;quot;?&amp;quot;, -- question mark&lt;br /&gt;
	[&amp;quot;«&amp;quot;]=&amp;#039;“&amp;#039;, -- quotation mark&lt;br /&gt;
	[&amp;quot;»&amp;quot;]=&amp;#039;”&amp;#039;, -- quotation mark&lt;br /&gt;
	[&amp;quot;٫&amp;quot;]=&amp;quot;.&amp;quot;, -- decimal point&lt;br /&gt;
	[&amp;quot;٬&amp;quot;]=&amp;quot;,&amp;quot;, -- thousands separator&lt;br /&gt;
	[&amp;quot;٪&amp;quot;]=&amp;quot;%&amp;quot;, -- percent sign&lt;br /&gt;
	[&amp;quot;،&amp;quot;]=&amp;quot;,&amp;quot;, -- comma&lt;br /&gt;
	[&amp;quot;؛&amp;quot;]=&amp;quot;;&amp;quot; -- semicolon&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local sun_letters = &amp;quot;تثدذرزسشصضطظلن&amp;quot;&lt;br /&gt;
-- For use in implementing sun-letter assimilation of ال (al-)&lt;br /&gt;
local ttsun1 = {}&lt;br /&gt;
local ttsun2 = {}&lt;br /&gt;
local ttsun3 = {}&lt;br /&gt;
for cp in gcodepoint(sun_letters) do&lt;br /&gt;
	local ch = U(cp)&lt;br /&gt;
	ttsun1[ch] = tt[ch]&lt;br /&gt;
	ttsun2[&amp;quot;l-&amp;quot; .. ch] = tt[ch] .. &amp;quot;-&amp;quot; .. ch&lt;br /&gt;
	table.insert(ttsun3, tt[ch])&lt;br /&gt;
end&lt;br /&gt;
-- For use in implementing elision of al-&lt;br /&gt;
local sun_letters_tr = table.concat(ttsun3, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local consonants_needing_vowels = &amp;quot;بتثجحخدذرزسشصضطظعغفقكڪلمنهپچڤگڨڧڢںڭأإؤئءةﷲ&amp;quot;&lt;br /&gt;
-- consonants on the right side; includes alif madda&lt;br /&gt;
local rconsonants = consonants_needing_vowels .. &amp;quot;ويآ&amp;quot;&lt;br /&gt;
-- consonants on the left side; does not include alif madda&lt;br /&gt;
local lconsonants = consonants_needing_vowels .. &amp;quot;وي&amp;quot;&lt;br /&gt;
-- Arabic semicolon, comma, question mark; taṭwīl; period, exclamation point,&lt;br /&gt;
-- single quote for bold/italic, double quotes for quoted material&lt;br /&gt;
local punctuation = &amp;quot;؟،؛&amp;quot; .. &amp;quot;ـ&amp;quot; .. &amp;quot;.!&amp;#039;&amp;quot; .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
local space_like = &amp;quot;%s&amp;#039;&amp;quot; .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
local space_like_class = &amp;quot;[&amp;quot; .. space_like .. &amp;quot;]&amp;quot;&lt;br /&gt;
local numbers = &amp;quot;١٢٣٤٥٦٧٨٩٠&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local before_diacritic_checking_subs = {&lt;br /&gt;
	------------ transformations prior to checking for diacritics --------------&lt;br /&gt;
	-- convert llh for allāh into ll+shadda+dagger-alif+h&lt;br /&gt;
	{&amp;quot;لله&amp;quot;, &amp;quot;للّٰه&amp;quot;},&lt;br /&gt;
	-- shadda+short-vowel (including tanwīn vowels, i.e. -an -in -un) gets&lt;br /&gt;
	-- replaced with short-vowel+shadda during NFC normalisation, which&lt;br /&gt;
	-- MediaWiki does for all Unicode strings; however, it makes the&lt;br /&gt;
	-- transliteration process inconvenient, so undo it.&lt;br /&gt;
	{&amp;quot;([&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. fatHa .. Damma .. kasra .. dagger_alif .. &amp;quot;])&amp;quot; .. shadda, shadda .. &amp;quot;%1&amp;quot;},&lt;br /&gt;
	-- ignore alif jamīla (otiose alif in 3pl verb forms)&lt;br /&gt;
	--     #1: handle ḍamma + wāw + alif (final -ū)&lt;br /&gt;
	{Damma .. waaw .. alif, Damma .. waaw},&lt;br /&gt;
	--     #2: handle wāw + sukūn + alif (final -w in -aw in defective verbs)&lt;br /&gt;
	--     this must go before the generation of w, which removes the waw here.&lt;br /&gt;
	{waaw .. sukuun .. alif, waaw .. sukuun},&lt;br /&gt;
	-- ignore final alif or alif maqṣūra following fatḥatan (e.g. in accusative&lt;br /&gt;
	-- singular or words like عَصًا &amp;quot;stick&amp;quot; or هُدًى &amp;quot;guidance&amp;quot;; this is called&lt;br /&gt;
	-- tanwin nasb)&lt;br /&gt;
	{fatHataan .. &amp;quot;[&amp;quot; .. alif .. alif_maqSuura .. &amp;quot;]&amp;quot;, fatHataan},&lt;br /&gt;
	-- same but with the fatḥatan placed over the alif or alif maqṣūra&lt;br /&gt;
	-- instead of over the previous letter (considered a misspelling but&lt;br /&gt;
	-- common)&lt;br /&gt;
	{&amp;quot;[&amp;quot; .. alif .. alif_maqSuura .. &amp;quot;]&amp;quot; .. fatHataan, fatHataan},&lt;br /&gt;
	-- tāʾ marbūṭa should always be preceded by fatḥa, alif, alif madda or&lt;br /&gt;
	-- dagger alif; infer fatḥa if not&lt;br /&gt;
	{&amp;quot;([^&amp;quot; .. fatHa .. alif .. alif_madda .. dagger_alif .. &amp;quot;])&amp;quot; .. taa_marbuuTa, &amp;quot;%1&amp;quot; .. fatHa .. taa_marbuuTa},&lt;br /&gt;
	-- similarly for alif between consonants, possibly marked with shadda&lt;br /&gt;
	-- (does not apply to initial alif, which is silent when not marked with&lt;br /&gt;
	-- hamza, or final alif, which might be pronounced as -an)&lt;br /&gt;
	{&amp;quot;([&amp;quot; .. lconsonants .. &amp;quot;]&amp;quot; .. shadda .. &amp;quot;?)&amp;quot; .. alif .. &amp;quot;([&amp;quot; .. rconsonants .. &amp;quot;])&amp;quot;,&lt;br /&gt;
		&amp;quot;%1&amp;quot; .. fatHa .. alif .. &amp;quot;%2&amp;quot;},&lt;br /&gt;
	-- infer fatḥa in case of non-fatḥa + alif/alif-maqṣūra + dagger alif&lt;br /&gt;
	{&amp;quot;([^&amp;quot; .. fatHa .. &amp;quot;])([&amp;quot; .. alif .. alif_maqSuura .. &amp;quot;]&amp;quot; .. dagger_alif .. &amp;quot;)&amp;quot;, &amp;quot;%1&amp;quot; .. fatHa .. &amp;quot;%2&amp;quot;},&lt;br /&gt;
	-- infer kasra in case of hamza-under-alif not + kasra&lt;br /&gt;
	{alif_hamza_below .. &amp;quot;([^&amp;quot; .. kasra .. kasrataan .. &amp;quot;])&amp;quot;, alif_hamza_below .. kasra .. &amp;quot;%1&amp;quot;},&lt;br /&gt;
	-- ignore dagger alif placed over regular alif or alif maqṣūra&lt;br /&gt;
	{&amp;quot;([&amp;quot; .. alif .. alif_maqSuura .. &amp;quot;])&amp;quot; .. dagger_alif, &amp;quot;%1&amp;quot;},&lt;br /&gt;
&lt;br /&gt;
	----------- rest of these concern definite article alif-lām ----------&lt;br /&gt;
	-- in kasra/ḍamma + alif + lam, make alif into hamzatu l-waṣl, so we&lt;br /&gt;
	-- handle cases like بِالتَّوْفِيق (bi-t-tawfīq) correctly&lt;br /&gt;
	{&amp;quot;([&amp;quot; .. Damma .. kasra .. &amp;quot;])&amp;quot; .. alif .. laam, &amp;quot;%1&amp;quot; .. alif_waSl .. laam},&lt;br /&gt;
	-- al + consonant + shadda (only recognize word-initially if regular alif): remove shadda&lt;br /&gt;
	{&amp;quot;^(&amp;quot; .. alif .. fatHa .. &amp;quot;?&amp;quot; .. laam .. &amp;quot;[&amp;quot; .. lconsonants .. &amp;quot;])&amp;quot; .. shadda, &amp;quot;%1&amp;quot;},&lt;br /&gt;
	{&amp;quot;(&amp;quot; .. space_like_class .. alif .. fatHa .. &amp;quot;?&amp;quot; .. laam .. &amp;quot;[&amp;quot; .. lconsonants .. &amp;quot;])&amp;quot; .. shadda, &amp;quot;%1&amp;quot;},&lt;br /&gt;
	{&amp;quot;(&amp;quot; .. alif_waSl .. fatHa .. &amp;quot;?&amp;quot; .. laam .. &amp;quot;[&amp;quot; .. lconsonants .. &amp;quot;])&amp;quot; .. shadda, &amp;quot;%1&amp;quot;},&lt;br /&gt;
	-- handle l- hamzatu l-waṣl or word-initial al-&lt;br /&gt;
	{&amp;quot;^&amp;quot; .. alif .. fatHa .. &amp;quot;?&amp;quot; .. laam, &amp;quot;al-&amp;quot;},&lt;br /&gt;
	{&amp;quot;(&amp;quot; .. space_like_class .. &amp;quot;)&amp;quot; .. alif .. fatHa .. &amp;quot;?&amp;quot; .. laam, &amp;quot;%1al-&amp;quot;},&lt;br /&gt;
	-- next one for bi-t-tawfīq&lt;br /&gt;
	{&amp;quot;([&amp;quot; .. Damma .. kasra .. &amp;quot;])&amp;quot; .. alif_waSl .. fatHa .. &amp;quot;?&amp;quot; .. laam, &amp;quot;%1-l-&amp;quot;},&lt;br /&gt;
	-- next one for remaining hamzatu l-waṣl (at beginning of word)&lt;br /&gt;
	{alif_waSl .. fatHa .. &amp;quot;?&amp;quot; .. laam, &amp;quot;l-&amp;quot;},&lt;br /&gt;
	-- special casing if the l in al- has a shadda on it (as in الَّذِي &amp;quot;that&amp;quot;),&lt;br /&gt;
	-- so we don&amp;#039;t mistakenly double the dash&lt;br /&gt;
	{&amp;quot;l%-&amp;quot; .. shadda, &amp;quot;ll&amp;quot;},&lt;br /&gt;
	-- implement assimilation of sun letters&lt;br /&gt;
	{&amp;quot;l%-[&amp;quot; .. sun_letters .. &amp;quot;]&amp;quot;, ttsun2},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Transliterate the word(s) in TEXT. LANG (the language) and SC (the script)&lt;br /&gt;
-- are ignored. OMIT_I3RAAB means leave out final short vowels (ʾiʿrāb).&lt;br /&gt;
-- GRAY_I3RAAB means render transliterate short vowels (ʾiʿrāb) in gray.&lt;br /&gt;
-- FORCE_TRANSLIT causes even non-vocalized text to be transliterated&lt;br /&gt;
-- (normally the function checks for non-vocalized text and returns nil,&lt;br /&gt;
-- since such text is ambiguous in transliteration).&lt;br /&gt;
function export.tr(text, lang, sc, omit_i3raab, gray_i3raab, force_translit)&lt;br /&gt;
	-- make it possible to call this function from a template&lt;br /&gt;
	if type(text) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local function f(x) return (x ~= &amp;quot;&amp;quot;) and x or nil end&lt;br /&gt;
		text, lang, sc, omit_i3raab, force_translit =&lt;br /&gt;
			f(text.args[1]), f(text.args[2]), f(text.args[3]), f(text.args[4]), f(text.args[5])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, sub in ipairs(before_diacritic_checking_subs) do&lt;br /&gt;
		text = rsub(text, sub[1], sub[2])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not force_translit and not has_diacritics(text) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	------------ transformations after checking for diacritics --------------&lt;br /&gt;
	-- Replace plain alif with hamzatu l-waṣl when followed by fatḥa/ḍamma/kasra.&lt;br /&gt;
	-- Must go after handling of initial al-, which distinguishes alif-fatḥa&lt;br /&gt;
	-- from alif w/hamzatu l-waṣl. Must go before generation of ū and ī, which&lt;br /&gt;
	-- eliminate the ḍamma/kasra.&lt;br /&gt;
	text = rsub(text, alif .. &amp;quot;([&amp;quot; .. fatHa .. Damma .. kasra .. &amp;quot;])&amp;quot;, alif_waSl .. &amp;quot;%1&amp;quot;)&lt;br /&gt;
	-- ḍamma + waw not followed by a diacritic is ū, otherwise w&lt;br /&gt;
	text = rsub(text, Damma .. waaw .. &amp;quot;([^&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. fatHa .. Damma .. kasra .. shadda .. sukuun .. dagger_alif .. &amp;quot;])&amp;quot;, &amp;quot;ū%1&amp;quot;)&lt;br /&gt;
	text = rsub(text, Damma .. waaw .. &amp;quot;$&amp;quot;, &amp;quot;ū&amp;quot;)&lt;br /&gt;
	-- kasra + yaa not followed by a diacritic (or ū from prev step) is ī, otherwise y&lt;br /&gt;
	text = rsub(text, kasra .. yaa .. &amp;quot;([^&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. fatHa .. Damma .. kasra .. shadda .. sukuun .. dagger_alif .. &amp;quot;ū])&amp;quot;, &amp;quot;ī%1&amp;quot;)&lt;br /&gt;
	text = rsub(text, kasra .. yaa .. &amp;quot;$&amp;quot;, &amp;quot;ī&amp;quot;)&lt;br /&gt;
	-- convert shadda to double letter.&lt;br /&gt;
	text = rsub(text, &amp;quot;(.)&amp;quot; .. shadda, &amp;quot;%1%1&amp;quot;)&lt;br /&gt;
	if not omit_i3raab and gray_i3raab then -- show ʾiʿrāb grayed in transliteration&lt;br /&gt;
		-- decide whether to gray out the t in ﺓ. If word begins with al- or l-, yes.&lt;br /&gt;
		-- Otherwise, no if word ends in a/i/u, yes if ends in an/in/un.&lt;br /&gt;
		text = rsub(text, &amp;quot;^(a?l%-[^%s]+)&amp;quot; .. taa_marbuuTa .. &amp;quot;([&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. fatHa .. Damma .. kasra .. &amp;quot;])&amp;quot;,&lt;br /&gt;
			&amp;#039;%1&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;t&amp;lt;/span&amp;gt;%2&amp;#039;)&lt;br /&gt;
		text = rsub(text, &amp;quot;(&amp;quot; .. space_like_class .. &amp;quot;a?l%-[^%s]+)&amp;quot; .. taa_marbuuTa .. &amp;quot;([&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. fatHa .. Damma .. kasra .. &amp;quot;])&amp;quot;,&lt;br /&gt;
			&amp;#039;%1&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;t&amp;lt;/span&amp;gt;%2&amp;#039;)&lt;br /&gt;
		text = rsub(text, taa_marbuuTa .. &amp;quot;([&amp;quot; .. fatHa .. Damma .. kasra .. &amp;quot;])&amp;quot;, &amp;quot;t%1&amp;quot;)&lt;br /&gt;
		text = rsub(text, taa_marbuuTa .. &amp;quot;([&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. &amp;quot;])&amp;quot;,&lt;br /&gt;
			&amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;t&amp;lt;/span&amp;gt;%1&amp;#039;)&lt;br /&gt;
		text = rsub(text, &amp;quot;.&amp;quot;, {&lt;br /&gt;
			[fatHataan] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;an&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
			[kasrataan] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;in&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
			[Dammataan] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;un&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		})&lt;br /&gt;
		text = rsub(text, &amp;quot;([&amp;quot; .. fatHa .. Damma .. kasra .. &amp;quot;])(&amp;quot; .. space_like_class .. &amp;quot;)&amp;quot;,&lt;br /&gt;
			function(vowel, space)&lt;br /&gt;
				vowel_repl = {&lt;br /&gt;
					[fatHa] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt; &amp;#039;,&lt;br /&gt;
					[kasra] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;i&amp;lt;/span&amp;gt; &amp;#039;,&lt;br /&gt;
					[Damma] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;u&amp;lt;/span&amp;gt; &amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
				return vowel_repl[vowel] .. space&lt;br /&gt;
			end&lt;br /&gt;
		)&lt;br /&gt;
		text = rsub(text, &amp;quot;[&amp;quot; .. fatHa .. Damma .. kasra .. &amp;quot;]$&amp;quot;, {&lt;br /&gt;
			[fatHa] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;a&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
			[kasra] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;i&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
			[Damma] = &amp;#039;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;u&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		})&lt;br /&gt;
		text = rsub(text, &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color: #888888&amp;quot;&amp;gt;&amp;#039;, &amp;quot;&amp;quot;)&lt;br /&gt;
	elseif omit_i3raab then -- omit ʾiʿrāb in transliteration&lt;br /&gt;
		text = rsub(text, &amp;quot;[&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		text = rsub(text, &amp;quot;[&amp;quot; .. fatHa .. Damma .. kasra .. &amp;quot;](&amp;quot; .. space_like_class .. &amp;quot;)&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
		text = rsub(text, &amp;quot;[&amp;quot; .. fatHa .. Damma .. kasra .. &amp;quot;]$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	-- tāʾ marbūṭa should not be rendered by -t if word-final even when&lt;br /&gt;
	-- ʾiʿrāb (desinential inflection) is shown; instead, use (t) before&lt;br /&gt;
	-- whitespace, nothing when final; but render final -ﺍﺓ and -ﺁﺓ as -āh,&lt;br /&gt;
	-- consistent with Wehr&amp;#039;s dictionary&lt;br /&gt;
	-- Left-to-right or right-to-left mark at end of text will prevent tāʾ marbūṭa&lt;br /&gt;
	-- from being transliterated correctly.&lt;br /&gt;
	text = string.gsub(text, lrm, &amp;quot;&amp;quot;)&lt;br /&gt;
	text = string.gsub(text, rlm, &amp;quot;&amp;quot;)&lt;br /&gt;
	text = rsub(text, &amp;quot;([&amp;quot; .. alif .. alif_madda .. &amp;quot;])&amp;quot; .. taa_marbuuTa .. &amp;quot;$&amp;quot;, &amp;quot;%1h&amp;quot;)&lt;br /&gt;
	-- Ignore final tāʾ marbūṭa (it appears as &amp;quot;a&amp;quot; due to the preceding&lt;br /&gt;
	-- short vowel). Need to do this after graying or omitting word-final&lt;br /&gt;
	-- ʾiʿrāb.&lt;br /&gt;
	text = rsub(text, taa_marbuuTa .. &amp;quot;$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	text = rsub(text, taa_marbuuTa .. &amp;quot;(%p)&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	if not omit_i3raab then -- show ʾiʿrāb in transliteration&lt;br /&gt;
		text = rsub(text, taa_marbuuTa .. &amp;quot;(&amp;quot; .. space_like_class .. &amp;quot;)&amp;quot;, &amp;quot;(t)%1&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		-- When omitting ʾiʿrāb, show all non-absolutely-final instances of&lt;br /&gt;
		-- tāʾ marbūṭa as (t), with trailing ʾiʿrāb omitted.&lt;br /&gt;
		text = rsub(text, taa_marbuuTa, &amp;quot;(t)&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	-- tatwīl should be rendered as - at beginning or end of word. It will&lt;br /&gt;
	-- be rendered as nothing in the middle of a word (FIXME, do we want&lt;br /&gt;
	-- this?)&lt;br /&gt;
	text = rsub(text, &amp;quot;^ـ&amp;quot;, &amp;quot;-&amp;quot;)&lt;br /&gt;
	text = rsub(text, &amp;quot;(&amp;quot; .. space_like_class .. &amp;quot;)ـ&amp;quot;,&lt;br /&gt;
		&amp;quot;%1-&amp;quot;)&lt;br /&gt;
	text = rsub(text, &amp;quot;ـ$&amp;quot;, &amp;quot;-&amp;quot;)&lt;br /&gt;
	text = rsub(text, &amp;quot;ـ(&amp;quot; .. space_like_class .. &amp;quot;)&amp;quot;, &amp;quot;-%1&amp;quot;)&lt;br /&gt;
	-- Now convert remaining Arabic chars according to table.&lt;br /&gt;
	text = rsub(text, &amp;quot;.&amp;quot;, tt)&lt;br /&gt;
	text = rsub(text, &amp;quot;aā&amp;quot;, &amp;quot;ā&amp;quot;)&lt;br /&gt;
	-- Implement elision of al- after a final vowel. We do this&lt;br /&gt;
	-- conservatively, only handling elision of the definite article rather&lt;br /&gt;
	-- than elision in other cases of hamzat al-waṣl (e.g. form-I imperatives&lt;br /&gt;
	-- or form-VII and above verbal nouns) partly because elision in&lt;br /&gt;
	-- these cases isn&amp;#039;t so common in MSA and partly to avoid excessive&lt;br /&gt;
	-- elision in case of words written with initial bare alif instead of&lt;br /&gt;
	-- properly with hamzated alif. Possibly we should reconsider.&lt;br /&gt;
	-- At the very least we currently don&amp;#039;t handle elision of الَّذِي (allaḏi)&lt;br /&gt;
	-- correctly because we special-case it to appear without the hyphen;&lt;br /&gt;
	-- perhaps we should reconsider that.&lt;br /&gt;
	text = rsub(text, &amp;quot;([aiuāīū]&amp;#039;* +&amp;#039;*)a([&amp;quot; .. sun_letters_tr .. &amp;quot;]%-)&amp;quot;,&lt;br /&gt;
		&amp;quot;%1%2&amp;quot;)&lt;br /&gt;
	if gray_i3raab then&lt;br /&gt;
		text = rsub(text, &amp;quot;([aiuāīū]&amp;#039;*&amp;lt;/span&amp;gt;&amp;#039;* +&amp;#039;*)a([&amp;quot; .. sun_letters_tr .. &amp;quot;]%-)&amp;quot;,&lt;br /&gt;
			&amp;quot;%1%2&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	-- Special-case the transliteration of allāh, without the hyphen&lt;br /&gt;
	text = rsub(text, &amp;quot;^(a?)l%-lāh&amp;quot;, &amp;quot;%1llāh&amp;quot;)&lt;br /&gt;
	text = rsub(text, &amp;quot;(&amp;quot; .. space_like_class .. &amp;quot;a?)l%-lāh&amp;quot;, &amp;quot;%1llāh&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local has_diacritics_subs = {&lt;br /&gt;
	-- FIXME! What about lam-alif ligature?&lt;br /&gt;
	-- remove punctuation and shadda&lt;br /&gt;
	-- must go before removing final consonants&lt;br /&gt;
	{&amp;quot;[&amp;quot; .. punctuation .. shadda .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
	-- Remove consonants at end of word or utterance, so that we&amp;#039;re OK with&lt;br /&gt;
	-- words lacking iʿrāb (must go before removing other consonants).&lt;br /&gt;
	-- If you want to catch places without iʿrāb, comment out the next two lines.&lt;br /&gt;
	{&amp;quot;[&amp;quot; .. lconsonants .. &amp;quot;]$&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
	{&amp;quot;[&amp;quot; .. lconsonants .. &amp;quot;](&amp;quot; .. space_like_class .. &amp;quot;)&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
	-- remove consonants (or alif) when followed by diacritics&lt;br /&gt;
	-- must go after removing shadda&lt;br /&gt;
	-- do not remove the diacritics yet because we need them to handle&lt;br /&gt;
	-- long-vowel sequences of diacritic + pseudo-consonant&lt;br /&gt;
	{&amp;quot;[&amp;quot; .. lconsonants .. alif .. &amp;quot;]([&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. fatHa .. Damma .. kasra .. sukuun .. dagger_alif .. &amp;quot;])&amp;quot;, &amp;quot;%1&amp;quot;},&lt;br /&gt;
	-- the following two must go after removing consonants w/diacritics because&lt;br /&gt;
	-- we only want to treat vocalic wāw/yā&amp;#039; in them (we want to have removed&lt;br /&gt;
	-- wāw/yā&amp;#039; followed by a diacritic)&lt;br /&gt;
	-- remove ḍamma + wāw&lt;br /&gt;
	{Damma .. waaw, &amp;quot;&amp;quot;},&lt;br /&gt;
	-- remove kasra + yā&amp;#039;&lt;br /&gt;
	{kasra .. yaa, &amp;quot;&amp;quot;},&lt;br /&gt;
	-- remove fatḥa/fatḥatan + alif/alif-maqṣūra&lt;br /&gt;
	{&amp;quot;[&amp;quot; .. fatHataan .. fatHa .. &amp;quot;][&amp;quot; .. alif .. alif_maqSuura .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
	-- remove diacritics&lt;br /&gt;
	{&amp;quot;[&amp;quot; .. fatHataan .. Dammataan .. kasrataan .. fatHa .. Damma .. kasra .. sukuun .. dagger_alif .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
	-- remove numbers, hamzatu l-waṣl, alif madda&lt;br /&gt;
	{&amp;quot;[&amp;quot; .. numbers .. &amp;quot;ٱ&amp;quot; .. &amp;quot;آ&amp;quot; .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;},&lt;br /&gt;
	-- remove non-Arabic characters&lt;br /&gt;
	{&amp;quot;[^&amp;quot; .. U(0x0600) .. &amp;quot;-&amp;quot; .. U(0x06FF) .. U(0x0750) .. &amp;quot;-&amp;quot; .. U(0x077F) ..&lt;br /&gt;
			 U(0x08A0) .. &amp;quot;-&amp;quot; .. U(0x08FF) .. U(0xFB50) .. &amp;quot;-&amp;quot; .. U(0xFDFF) ..&lt;br /&gt;
			 U(0xFE70) .. &amp;quot;-&amp;quot; .. U(0xFEFF) .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- declared as local above&lt;br /&gt;
function has_diacritics(text)&lt;br /&gt;
	local count&lt;br /&gt;
	text, count = rsubn(text, &amp;quot;[&amp;quot; .. lrm .. rlm .. &amp;quot;]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	if count &amp;gt; 0 then&lt;br /&gt;
		require(&amp;quot;Module:debug&amp;quot;).track(&amp;quot;ar-translit/lrm or rlm&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	for _, sub in ipairs(has_diacritics_subs) do&lt;br /&gt;
		text = rsub(text, unpack(sub))&lt;br /&gt;
	end&lt;br /&gt;
	return #text == 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return true if transliteration TR is an irregular transliteration of&lt;br /&gt;
-- ARABIC. Return false if ARABIC can&amp;#039;t be transliterated. For purposes of&lt;br /&gt;
-- establishing regularity, hyphens are ignored and word-final tāʾ marbūṭa&lt;br /&gt;
-- can be transliterated as &amp;quot;(t)&amp;quot;, &amp;quot;&amp;quot; or &amp;quot;t&amp;quot;.&lt;br /&gt;
function export.irregular_translit(arabic, tr)&lt;br /&gt;
	if not arabic or arabic == &amp;quot;&amp;quot; or not tr or tr == &amp;quot;&amp;quot; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local regtr = export.tr(arabic)&lt;br /&gt;
	if not regtr or regtr == tr then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local arwords = rsplit(arabic, &amp;quot; &amp;quot;)&lt;br /&gt;
	local regwords = rsplit(regtr, &amp;quot; &amp;quot;)&lt;br /&gt;
	local words = rsplit(tr, &amp;quot; &amp;quot;)&lt;br /&gt;
	if #regwords ~= #words or #regwords ~= #arwords then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	for i=1,#regwords do&lt;br /&gt;
		local regword = regwords[i]&lt;br /&gt;
		local word = words[i]&lt;br /&gt;
		local arword = arwords[i]&lt;br /&gt;
		-- Resolve final (t) in auto-translit to t, h or nothing&lt;br /&gt;
		if rfind(regword, &amp;quot;%(t%)$&amp;quot;) then&lt;br /&gt;
			regword = rfind(word, &amp;quot;āh$&amp;quot;) and rsub(regword, &amp;quot;%(t%)$&amp;quot;, &amp;quot;h&amp;quot;) or&lt;br /&gt;
				rfind(word, &amp;quot;t$&amp;quot;) and rsub(regword, &amp;quot;%(t%)$&amp;quot;, &amp;quot;t&amp;quot;) or&lt;br /&gt;
				rsub(regword, &amp;quot;%(t%)$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Resolve clitics + short a + alif-lām, which may get auto-transliterated&lt;br /&gt;
		-- to contain long ā, to short a if the manual translit has it; note&lt;br /&gt;
		-- that currently in cases with assimilated l, the auto-translit will&lt;br /&gt;
		-- fail, so we won&amp;#039;t ever get here and don&amp;#039;t have to worry about&lt;br /&gt;
		-- auto-translit l against manual-translit assimilated char.&lt;br /&gt;
		local clitic_chars = &amp;quot;^[وفكل]&amp;quot; -- separate line to avoid L2R display weirdness&lt;br /&gt;
		if rfind(arword, clitic_chars .. fatHa .. &amp;quot;?[&amp;quot; .. alif .. alif_waSl .. &amp;quot;]&amp;quot; .. laam) and rfind(word, &amp;quot;^[wfkl]a%-&amp;quot;) then&lt;br /&gt;
			regword = rsub(regword, &amp;quot;^([wfkl])ā&amp;quot;, &amp;quot;%1a&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Ignore hyphens when comparing&lt;br /&gt;
		if rsub(regword, &amp;quot;%-&amp;quot;, &amp;quot;&amp;quot;) ~= rsub(word, &amp;quot;%-&amp;quot;, &amp;quot;&amp;quot;) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;br /&gt;
&lt;br /&gt;
-- For Vim, so we get 4-space tabs&lt;br /&gt;
-- vim: set ts=4 sw=4 noet:&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>