Module:User:Thecurran/Deva-Latn-translit

Ut Wikiwurdboek
local export = {}
local gsub = mw.ustring.gsub
local match = mw.ustring.match
local sub = mw.ustring.sub

local c = {
	["Deva"] = {
		["k"] = "क",  ["kh"] = "ख",  ["g"] = "ग", ["gh"] = "घ",   ["ṅ"] = "ङ", 
		["c"] = "च",  ["ch"] = "छ",  ["j"] = "ज",  ["jh"] = "झ",  ["ñ"] = "ञ", 
		["ṭ"] = "ट",  ["ṭh"] = "ठ",   ["ḍ"] = "ड", ["ḍh"] = "ढ",   ["ṇ"] = "ण", 
		["t"] = "त",  ["th"] = "थ",   ["d"] = "द", ["dh"] = "ध",   ["n"] = "न", 
		["p"] = "प",  ["ph"] = "फ",  ["b"] = "ब",  ["bh"] = "भ",  ["m"] = "म",  
		["y"] = "य",   ["r"] = "र",   ["l"] = "ल",   ["ḷ"] = "ळ",  ["v"] = "व", 
		["ś"] = "श",   ["ṣ"] = "ष",   ["s"] = "स",  ["h"] = "ह",   ["ʔ"] = "ॽ", 
		["q"] = "क़",  ["k͟h"] = "ख़",  ["ġ"] = "ग़",   ["z"] = "ज़",  ["ž"] = "झ़", 
		["ṛ"] = "ड़",  ["ṛh"] = "ढ़",   ["ṉ"] = "ऩ",  ["f"] = "फ़",  ["ẏ"] = "य़", 
		["ṟ"] = "ऱ",    ["ḻ"] = "ऴ",  ["ç"] = "श़", 
		["g̤"] = "ॻ",    ["j̤"] = "ॼ",  ["d̤"] = "ॾ",  ["b̤"] = "ॿ", 
		["kt"] = "क्त", ["kṣ"] = "क्ष", ["jñ"] = "ज्ञ",  ["tt"] = "त्त", ["tr"] = "त्र", 
		["dd"] = "द्द", ["ddh"] = "द्ध", ["db"] = "द्ब", ["dbh"] = "द्भ", ["dm"] = "द्म", 
		["dy"] = "द्य",  ["dv"] = "द्व", ["śr"] = "श्र", ["śn"] = "श्न", ["str"] = "स्त्र", 
		["hm"] = "ह्म",  ["hy"] = "ह्म", 
		
		["æ"] = "ॲ",    ["ǣ"] = "ऄ", ["a"] = "अ",  ["ā"] = "आ", 
		["i"] = "इ",    ["ī"] = "ई",  ["u"] = "उ",  ["ū"] = "ऊ", 
		["r̥"] = "ऋ",    ["r̥̄"] = "ॠ", ["l̥"] = "ऌ",  ["l̥̄"] = "ॡ", 
		["ê"] = "ऍ",    ["e"] = "ऎ",  ["ē"] = "ए",  ["ai"] = "ऐ", 
		["ô"] = "ऑ",   ["o"] = "ऒ", ["ō"] = "ओ", ["au"] = "औ",  ["m͒"] = "ऀ",   
		["m̐"] = "ँ",   ["ṁ"] = "ं", ["ḥ"] = "ः",  ["'"] = "ऽ",  ["."] = "्",  
--Nukta↘, ↖Candrabindu,  Anusvara,     Visarga,       Agravaha,     Virama, 
		["̊"] = "़",    [""] = "",
	},
	
	["Khmr"] = {
		["k"] = "ក",  ["kh"] = "ខ", ["g"] = "គ", ["gh"] = "ឃ",   ["ṅ"] = "ង", 
		["c"] = "ច",  ["ch"] = "ឆ", ["j"] = "ជ", ["jh"] = "ឈ",  ["ñ"] = "ញ", 
		["ṭ"] = "ដ",  ["ṭh"] = "ឋ", ["ḍ"] = "ឌ", ["ḍh"] = "ឍ",   ["ṇ"] = "ណ",  
		["t"] = "ត",  ["th"] = "ថ", ["d"] = "ទ", ["dh"] = "ធ",   ["n"] = "ន", 
		["p"] = "ប",  ["ph"] = "ផ", ["b"] = "ព", ["bh"] = "ភ",   ["m"] = "ម", 
		["y"] = "យ",   ["r"] = "រ",  ["l"] = "ល", ["ḷ"] = "ឡ",    ["v"] = "វ", 
		["ś"] = "ឝ",   ["ṣ"] = "ឞ", ["s"] = "ស", ["h"] = "ហ",    ["ʔ"] = "អ", 
			
		                              ["a"] = "អ",  ["ā"] = "អា", 
		["i"] = "ឥ",   ["ī"] = "ឦ",  ["u"] = "ឧ",  ["ū"] = "ឩ",  ["uk"] = "ឨ", 
		["r̥"] = "ឫ",   ["r̥̄"] = "ឬ",  ["l̥"] = "ឭ",  ["l̥̄"] = "ឮ", 
		                			  ["ē"] = "ឯ", ["ai"] = "ឰ", 
		["ô"] = "ឪ",   ["o"] = "ឲ",  ["ō"] = "ឱ",  ["au"] = "ឳ", 
		["ṁ"] = "ំ",     ["ḥ"] = "ះ",  ["'"] = "ៜ",   ["."] = "៑",      ["̊"] = "ំ", 
--       Anusvara,       Visarga,      Agravaha,      Virama,         Nukta, 
		[""] = "", 
	},
	
	["Mymr"] = {
		["k"] = "က",  ["kh"] = "ခ",  ["g"] = "ဂ", ["gh"] = "ဃ",  ["ṅ"] = "င", 
		["c"] = "စ",   ["ch"] = "ဆ", ["j"] = "ဇ", ["jh"] = "ဈ",  ["ñ"] = "ဉ", 
		["ṭ"] = "ဋ",   ["ṭh"] = "ဌ",  ["ḍ"] = "ဍ", ["ḍh"] = "ဎ",  ["ṇ"] = "ဏ", 
		["t"] = "တ",  ["th"] = "ထ", ["d"] = "ဒ", ["dh"] = "ဓ",   ["n"] = "န", 
		["p"] = "ပ",   ["ph"] = "ဖ",  ["b"] = "ဗ", ["bh"] = "ဘ", ["m"] = "မ", 
		["y"] = "ယ",   ["r"] = "ရ",  ["l"] = "လ", ["ḷ"] = "ဠ",  ["v"] = "ဝ", 
		["ś"] = "ၐ",    ["ṣ"] = "ၑ",  ["s"] = "သ", ["h"] = "ဟ", 
		["ss"] = "ဿ", ["ññ"] = "ည", 
		["g̤"] = "ၚ",    ["j̤"] = "ၛ",  ["d̤"] = "ၜ",  ["b̤"] = "ၝ", ["św"] = "ၡ", 
--		 Mon ṅa,         Mon jha,       Mon bba,      Mon bbe,     S'gaw śa, 
	   ["thw"] = "ၥ", ["pw"] = "ၦ", ["ṇw"] = "ၮ", ["yw"] = "ၯ", ["ghw"] = "ၰ", 
--		Pwo tha,       Pwo pwa,      Pwo ṇa,         Pwo ywa,       Pwo ghwa, 
		["q"] = "ၵ",   ["k͟h"] = "ၶ",  ["ġ"] = "ၷ",  ["ç"] = "ၸ",  ["z"] = "ၹ", 
--		 Shan ka,       Shan kha,      Shan ga,       Shan ca,       Shan za, 
		["ẏ"] = "ၺ",   ["ṛ"] = "ၻ", ["ṉ"] = "ၼ",  ["p̊"] = "ၽ",  ["f"] = "ၾ", 
--		 Shan ña,        Shan da,      Shan na,       Shan pha,      Shan fa, 
		["b̊"] = "ၿ",   ["ṛh"] = "ႀ", ["ž"] = "ႁ",   ["f̊"] = "ႎ", 
--		 Shan ba,       Shan tha,      Shan ha,       Palaung fa, 
	   ["kk"] = "က္က", ["kkh"] = "က္ခ", ["gg"] = "ဂ္ဂ", ["ggh"] = "ဂ္ဃ",
		["cc"] = "စ္စ", ["cch"] = "စ္ဆ", ["jj"] = "ဇ္ဇ", ["jjh"] = "ဇ္ဈ",
		["ṭṭ"] = "ဋ္ဋ", ["ṭṭh"] = "ဋ္ဌ", ["ḍḍ"] = "ဍ္ဍ", ["ḍḍh"] = "ဍ္ဎ",
	   ["tt"] = "တ္တ", ["tth"] = "တ္ထ", ["dd"] = "ဒ္ဒ", ["ddh"] = "ဒ္ဓ",
		["pp"] = "ပ္ပ", ["pph"] = "ပ္ဖ", ["bb"] = "ဗ္ဗ", ["bbh"] = "ဗ္ဘ",
		["ñc"] = "ဉ္စ", ["ñch"] = "ဉ္ဆ", ["ñj"] = "ဉ္ဇ", ["ñjh"] = "ဉ္ဈ",
		["ṇṭ"] = "ဏ္ဋ", ["ṇḍ"] = "ဏ္ဍ",
		["nt"] = "န္တ", ["nth"] = "န္ထ", ["nd"] = "န္ဒ", ["ndh"] = "န္ဓ",  ["nn"] = "န္န",
		["mp"] = "မ္ပ", ["mb"] = "မ္ဗ", ["mbh"] = "မ္ဘ", ["mm"] = "မ္မ",

		                               ["a"] = "အ", ["ā"] = "အာ", 
		["i"] = "ဣ",   ["ī"] = "ဤ",  ["u"] = "ဥ",  ["ū"] = "ဦ", 
		["r̥"] = "ၒ",    ["r̥̄"] = "ၓ",   ["l̥"] = "ၔ",  ["l̥̄"] = "ၕ", 
		                ["e"] = "ဧ",   ["ē"] = "ဨ", 
		                			   ["ō"] = "ဩ", ["au"] = "ဪ", 
		["ṁ"] = "ံ",      ["ḥ"] = "း",   ["'"] = "်",   ["."] = "္",     ["̊"] = "့", 
--       Anusvara,        Visarga,       Agravaha,    Virama,         Nukta, 	
		[""] = "",
	},
		
	["Sinh"] = {
		["k"] = "ක", ["kh"] = "ඛ", ["g"] = "ග", ["gh"] = "ඝ", ["ṅ"] = "ඞ", 
		["c"] = "ච", ["ch"] = "ඡ", ["j"] = "ජ", ["jh"] = "ඣ", ["ñ"] = "ඤ", 
		["ṭ"] = "ට", ["ṭh"] = "ඨ", ["ḍ"] = "ඩ", ["ḍh"] = "ඪ", ["ṇ"] = "ණ", 
		["t"] = "ත", ["th"] = "ථ", ["d"] = "ද", ["dh"] = "ධ", ["n"] = "න", 
		["p"] = "ප", ["ph"] = "ඵ", ["b"] = "බ", ["bh"] = "භ", ["m"] = "ම", 
		["y"] = "ය", ["r"] = "ර", ["l"] = "ල",   ["ḷ"] = "ළ",  ["v"] = "ව", 
		["ś"] = "ශ",  ["ṣ"] = "ෂ",  ["s"] = "ස", ["h"] = "හ", ["g͜n"] = "ඥ", 
		["ṁ͜g"] = "ඟ", ["ṁ͜j"] = "ඦ", ["ṁ͜ḍ"] = "ඬ", ["ṁ͜d"] = "ඳ", ["ṁ͜b"] = "ඹ", 
		["f"] = "ෆ", 
		
		["æ"] = "ඇ",   ["ǣ"] = "ඈ", ["a"] = "අ",  ["ā"] = "ආ", 
		["i"] = "ඉ",   ["ī"] = "ඊ",  ["u"] = "උ",   ["ū"] = "ඌ", 
		["r̥"] = "ඍ",  ["r̥̄"] = "ඎ", ["l̥"] = "ඏ",  ["l̥̄"] = "ඐ", 
		               ["e"] = "එ",   ["ē"] ="ඒ",  ["ai"] = "ඓ", 
		               ["o"] = "ඔ",   ["ō"] = "ඕ", ["au"] = "ඖ", 
		["ṁ"] = "ං", ["ḥ"] = "ඃ", ["."] = "්",
		 Anusvara,     Visarga,      Virama, 
		[""] = "",
	},

	["Thai"] = {
		["k"] = "ก", ["kh"] = "ข", ["g"] = "ค", ["gh"] = "ฆ", ["ṅ"] = "ง", 
		["c"] = "จ", ["ch"] = "ฉ", ["j"] = "ช", ["jh"] = "ฌ", ["ñ"] = "ญ", 
		["ṭ"] = "ฏ", ["ṭh"] = "ฐ", ["ḍ"] = "ฑ", ["ḍh"] = "ฒ", ["ṇ"] = "ณ", 
		["t"] = "ต", ["th"] = "ถ", ["d"] = "ท", ["dh"] = "ธ", ["n"] = "น", 
		["p"] = "ป", ["ph"] = "ผ", ["b"] = "พ", ["bh"] = "ภ", ["m"] = "ม", 
		["y"] = "ย", ["r"] = "ร", ["l"] = "ล", ["v"] = "ว", ["s"] = "ส", 
		["h"] = "ห", ["ḷ"] = "ฬ", 
	
		["a"] = "อ", ["ā"] = "อา",
		["i"] = "อิ", ["ī"] = "อี",
		["u"] = "อุ", ["ū"] = "อู",
		["e"] = "อเ", --to be swapped later
		["o"] = "อโ", --to be swapped later
	
		["ṃ"] = "ํ",
		["ḥ"] = "",
		[""] = "",
	},
	
}

local v = {
	["Deva"] = {
									  ["a"] = "", 	 ["ā"] = " ा", 
		["i"] = " ि",  ["ī"] = " ी",  ["u"] = " ु",  ["ū"] = " ू", 
		["r̥"] = " ृ",  ["r̥̄"] = " ॄ",  ["l̥"] = " ॢ",  ["l̥̄"] = " ॣ", 
		["ê"] = " ॅ",  ["e"] = " ॆ",  ["ē"] = " े",  ["ai"] = " ै", 
		["ô"] = " ॉ",  ["o"] = " ो",  ["ō"] = " ो",  ["au"] = " ौ", 
		[""] = "",
	},

	["Khmr"] = {
									  ["a"] = "",     ["ā"] = " ា", 
		["i"] = " ិ",	 ["ī"] = " ី", 	 ["u"] = " ុ",	  ["ū"] = " ូ", 
		["y"] = " ឹ",	 ["yy"] = " ឺ",	 ["ua"] = " ួ",	["oe"] = " ើ", 
		["ya"] = " ឿ",	["ie"] = " ៀ", ["ē"] = " េ", ["ae"] = " ែ", 
		["ai"] = " ៃ",				    ["ō"] = " ោ", ["au"] = " ៅ", 
		[""] = "",
	},

	["Mymr"] = {
								["a"] = "", ["ā"] = " ာ", 
--									tall ["ā"] = " ါ", 
		["i"] = " ိ", 	["ī"] = " ီ",	["u"] = " ု", 	["ū"] = " ူ",
		["ē"] = " ေ", 	["ai"] = " ဲ", 	
--		above ["ē"] = " ဵ", Mon ["ī"] = " ဳ", Mon ["ō"] = " ဴ",
		["ō"] = " ော",
		[""] = "",
	},

	["Sinh"] = {
		["a"] = "", ["ā"] = "ා", 
		["i"] = "ි", ["ī"] = "ී",
		["u"] = "ු", ["ū"] = "ූ",
		["ē"] = "ෙ",
		["ō"] = "ො",
		[""] = "",
	},

	["Thai"] = {
		["a"] = "", ["ā"] = "า", 
		["i"] = "ิ", ["ī"] = "ี",
		["u"] = "ุ", ["ū"] = "ู",
		["e"] = "เ",
		["o"] = "โ",
		[""] = "",
	},

}

local s = {
	["Deva"] = {
		["0"] = "०", ["1"] = "१", ["2"] = "२", ["3"] = "३", ["4"] = "४",
		["5"] = "५", ["6"] = "६", ["7"] = "७", ["8"] = "८", ["9"] = "९", 
		["."] = "।", ["-"] = "-",
	},

	["Khmr"] = {
		["0"] = "០", ["1"] = "១", ["2"] = "២", ["3"] = "៣", ["4"] = "៤", 
		["5"] = "៥", ["6"] = "៦", ["7"] = "៧", ["8"] = "៨", ["9"] = "៩", 
		["."] = "។", ["-"] = "-",
	},

	["Mymr"] = {
		["0"] = "၀", ["1"] = "၁", ["2"] = "၂", ["3"] = "၃", ["4"] = "၄", 
		["5"] = "၅", ["6"] = "၆", ["7"] = "၇", ["8"] = "၈", ["9"] = "၉", 
		["."] = "။", ["-"] = "-",
	},

	["Sinh"] = {
		["0"] = "0", ["1"] = "1", ["2"] = "2", ["3"] = "3", ["4"] = "4", 
		["5"] = "5", ["6"] = "6", ["7"] = "7", ["8"] = "8", ["9"] = "9", 
		["."] = ".", ["-"] = "-",
	},

	["Thai"] = {
		["0"] = "๐", ["1"] = "๑", ["2"] = "๒", ["3"] = "๓", ["4"] = "๔", 
		["5"] = "๕", ["6"] = "๖", ["7"] = "๗", ["8"] = "๘", ["9"] = "๙", 
		["."] = ".", ["-"] = "-",
	},

}

local join = {
	["Deva"] = "्",
	["Khmr"] = "្",
	["Mymr"] = "္",
	["Sinh"] = "්",
	["Thai"] = "ฺ",
}

local kill = {
	["Deva"] = "्",
	["Khmr"] = "៑",
	["Mymr"] = "်",
	["Sinh"] = "්",
	["Thai"] = "ฺ",
}

local function return_error(text)
	return error(("Unrecognised part: \"%s\""):format(text))
end

function export.tr(text, script)
	if type(text) == "table" then
		text, script = text.args[1], text.args[2]
	end
	text = gsub(text, "[0-9\.]", s[script])
	
	for word in mw.ustring.gmatch(text, "[aāiīuūeoṃḥkhgṅcjñṭḍṇtdnpbmyrlḷvs]+") do
		local word_conv, orig_word = {}, word
		word = gsub(word, "([aāiīuūeo][ṃḥ]?)", "%1 ")
		word = gsub(word, " $", "")
	
		for syllable in mw.text.gsplit(word, " ") do
			if not match(syllable, "[aāiīuūeoṃḥ]$") then
				syllable = syllable .. "a" .. kill[script]
			end
			syllable = gsub(syllable, "^([khgṅcjñṭḍṇtdnpbmyrlḷvs]*)([aāiīuūeo])([ṃḥ]?)([्៑်්ฺ]?)$", function(onset, vowel, coda, optJoin)
				if onset == "" then
					onset = vowel
					vowel = ""
				end
				if not c[script][onset] then
					if match(onset, "^[ṅñṇnm]") then
						onset = c[script][sub(onset, 1, 1)] .. join[script] ..
							(c[script][sub(onset, 2, -1)] or return_error(onset))
							
					elseif match(onset, "h$") and sub(onset, 1, 1) == sub(onset, 2, 2) then
						onset = (c[script][sub(onset, 1, 1)] or return_error(onset)) .. join[script] ..
							(c[script][sub(onset, 2, -1)] or return_error(onset))
							
					else
						temp = {}
						for character in mw.text.gsplit(onset, "") do
							table.insert(temp, (c[script][character] or return_error(onset)))
						end
						onset = table.concat(temp, join[script])
					end
				else
					onset = c[script][onset]
				end
				
				return onset .. (v[script][vowel] or return_error(vowel)) .. c[script][coda] .. optJoin
			end)
				
			table.insert(word_conv, syllable)
		end
		
		word = table.concat(word_conv, "")
		if script == "Thai" then
			word = gsub(word, "(.)([เโ])", "%2%1")
		end
		if script == "Mymr" then
			word = gsub(word, "([ဝခဂငဒပ])(္.)ာ", "%1%2ါ")
			word = gsub(word, "([ဝခဂငဒပ])ာ", "%1ါ")
			word = gsub(word, "္[ယဝ]", { ["္ယ"] = "ျ", ["္ဝ"] = "ွ" })
		end
		text = gsub(text, orig_word, word)
	end
	return text
end

return export