UNPKG

tamil-phonetic-transliterator

Version:

A TypeScript library for converting Tamil text to English transliteration

537 lines (534 loc) 15.4 kB
// src/rules.ts var rules_default = { letter_rule: { "\u0B85": "a", "\u0B86": "aa", "\u0B87": "i", "\u0B88": "ee", "\u0B89": "u", "\u0B8A": "oo", "\u0B8E": "e", "\u0B8F": "ye", "\u0B90": "ai", "\u0B92": "o", "\u0B93": "o", "\u0B83": "ak", "\u0B95\u0BCD": "k", "\u0B95": "ga", "\u0B95\u0BBE": "gaa", "\u0B95\u0BBF": "gi", "\u0B95\u0BC0": "gee", "\u0B95\u0BC1": "gu", "\u0B95\u0BC2": "goo", "\u0B95\u0BC6": "ge", "\u0B95\u0BC7": "ge", "\u0B95\u0BC8": "gai", "\u0B95\u0BCA": "go", "\u0B95\u0BCB": "go", "\u0B95\u0BCC": "gau", "\u0B99\u0BCD": "ng", "\u0B99": "nga", "\u0B99\u0BBE": "ngaa", "\u0B99\u0BBF": "ngi", "\u0B99\u0BC0": "ngee", "\u0B99\u0BC1": "ngu", "\u0B99\u0BC2": "ngoo", "\u0B99\u0BC6": "nge", "\u0B99\u0BC7": "ngae", "\u0B99\u0BC8": "ngai", "\u0B99\u0BCA": "ngo", "\u0B99\u0BCB": "ngoo", "\u0B99\u0BCC": "ngau", "\u0B9A\u0BCD": "ch", "\u0B9A": "sa", "\u0B9A\u0BBE": "saa", "\u0B9A\u0BBF": "si", "\u0B9A\u0BC0": "see", "\u0B9A\u0BC1": "su", "\u0B9A\u0BC2": "soo", "\u0B9A\u0BC6": "se", "\u0B9A\u0BC7": "sae", "\u0B9A\u0BC8": "sai", "\u0B9A\u0BCA": "so", "\u0B9A\u0BCB": "so", "\u0B9A\u0BCC": "sau", "\u0B9E\u0BCD": "nj", "\u0B9E": "nja", "\u0B9E\u0BBE": "njaa", "\u0B9E\u0BBF": "nji", "\u0B9E\u0BC0": "njee", "\u0B9E\u0BC1": "nju", "\u0B9E\u0BC2": "njoo", "\u0B9E\u0BC6": "njae", "\u0B9E\u0BC7": "njae", "\u0B9E\u0BC8": "njai", "\u0B9E\u0BCA": "njo", "\u0B9E\u0BCB": "njo", "\u0B9E\u0BCC": "njau", "\u0B9F\u0BCD": "t", "\u0B9F": "da", "\u0B9F\u0BBE": "daa", "\u0B9F\u0BBF": "di", "\u0B9F\u0BC0": "dee", "\u0B9F\u0BC1": "du", "\u0B9F\u0BC2": "doo", "\u0B9F\u0BC6": "de", "\u0B9F\u0BC7": "dae", "\u0B9F\u0BC8": "dai", "\u0B9F\u0BCA": "do", "\u0B9F\u0BCB": "do", "\u0B9F\u0BCC": "dau", "\u0BA3\u0BCD": "n", "\u0BA3": "na", "\u0BA3\u0BBE": "naa", "\u0BA3\u0BBF": "ni", "\u0BA3\u0BC0": "nee", "\u0BA3\u0BC1": "nu", "\u0BA3\u0BC2": "noo", "\u0BA3\u0BC6": "ne", "\u0BA3\u0BC7": "nae", "\u0BA3\u0BC8": "nai", "\u0BA3\u0BCA": "no", "\u0BA3\u0BCB": "no", "\u0BA3\u0BCC": "nau", "\u0BA4\u0BCD": "th", "\u0BA4": "dha", "\u0BA4\u0BBE": "dhaa", "\u0BA4\u0BBF": "dhi", "\u0BA4\u0BC0": "dhee", "\u0BA4\u0BC1": "dhu", "\u0BA4\u0BC2": "dhoo", "\u0BA4\u0BC6": "dhe", "\u0BA4\u0BC7": "dhae", "\u0BA4\u0BC8": "dhai", "\u0BA4\u0BCA": "dho", "\u0BA4\u0BCB": "dho", "\u0BA4\u0BCC": "dheu", "\u0BA8\u0BCD": "n", "\u0BA8": "na", "\u0BA8\u0BBE": "naa", "\u0BA8\u0BBF": "ni", "\u0BA8\u0BC0": "nee", "\u0BA8\u0BC1": "nu", "\u0BA8\u0BC2": "noo", "\u0BA8\u0BC6": "ne", "\u0BA8\u0BC7": "nae", "\u0BA8\u0BC8": "nai", "\u0BA8\u0BCA": "no", "\u0BA8\u0BCB": "no", "\u0BA8\u0BCC": "neu", "\u0BAA\u0BCD": "p", "\u0BAA": "ba", "\u0BAA\u0BBE": "baa", "\u0BAA\u0BBF": "bi", "\u0BAA\u0BC0": "bee", "\u0BAA\u0BC1": "bu", "\u0BAA\u0BC2": "boo", "\u0BAA\u0BC6": "be", "\u0BAA\u0BC7": "bae", "\u0BAA\u0BC8": "bai", "\u0BAA\u0BCA": "bo", "\u0BAA\u0BCB": "bo", "\u0BAA\u0BCC": "bau", "\u0BAE\u0BCD": "m", "\u0BAE": "ma", "\u0BAE\u0BBE": "maa", "\u0BAE\u0BBF": "mi", "\u0BAE\u0BC0": "mee", "\u0BAE\u0BC1": "mu", "\u0BAE\u0BC2": "moo", "\u0BAE\u0BC6": "me", "\u0BAE\u0BC7": "mae", "\u0BAE\u0BC8": "mai", "\u0BAE\u0BCA": "mo", "\u0BAE\u0BCB": "mo", "\u0BAE\u0BCC": "mau", "\u0BAF\u0BCD": "i", "\u0BAF": "ya", "\u0BAF\u0BBE": "yaa", "\u0BAF\u0BBF": "yi", "\u0BAF\u0BC0": "yee", "\u0BAF\u0BC1": "yu", "\u0BAF\u0BC2": "yoo", "\u0BAF\u0BC6": "ye", "\u0BAF\u0BC7": "yae", "\u0BAF\u0BC8": "yai", "\u0BAF\u0BCA": "yo", "\u0BAF\u0BCB": "yo", "\u0BAF\u0BCC": "yau", "\u0BB0\u0BCD": "r", "\u0BB0": "ra", "\u0BB0\u0BBE": "raa", "\u0BB0\u0BBF": "ri", "\u0BB0\u0BC0": "ree", "\u0BB0\u0BC1": "ru", "\u0BB0\u0BC2": "roo", "\u0BB0\u0BC6": "re", "\u0BB0\u0BC7": "rae", "\u0BB0\u0BC8": "rai", "\u0BB0\u0BCA": "ro", "\u0BB0\u0BCB": "ro", "\u0BB0\u0BCC": "rau", "\u0BB2\u0BCD": "l", "\u0BB2": "la", "\u0BB2\u0BBE": "laa", "\u0BB2\u0BBF": "li", "\u0BB2\u0BC0": "lee", "\u0BB2\u0BC1": "lu", "\u0BB2\u0BC2": "loo", "\u0BB2\u0BC6": "le", "\u0BB2\u0BC7": "lae", "\u0BB2\u0BC8": "lai", "\u0BB2\u0BCA": "lo", "\u0BB2\u0BCB": "lo", "\u0BB2\u0BCC": "lau", "\u0BB5\u0BCD": "v", "\u0BB5": "va", "\u0BB5\u0BBE": "vaa", "\u0BB5\u0BBF": "vi", "\u0BB5\u0BC0": "vee", "\u0BB5\u0BC1": "vu", "\u0BB5\u0BC2": "voo", "\u0BB5\u0BC6": "ve", "\u0BB5\u0BC7": "vae", "\u0BB5\u0BC8": "vai", "\u0BB5\u0BCA": "vo", "\u0BB5\u0BCB": "vo", "\u0BB5\u0BCC": "vau", "\u0BB4\u0BCD": "zh", "\u0BB4": "zha", "\u0BB4\u0BBE": "zhaa", "\u0BB4\u0BBF": "zhi", "\u0BB4\u0BC0": "zhee", "\u0BB4\u0BC1": "zhu", "\u0BB4\u0BC2": "zhoo", "\u0BB4\u0BC6": "zhe", "\u0BB4\u0BC7": "zhae", "\u0BB4\u0BC8": "zhai", "\u0BB4\u0BCA": "zho", "\u0BB4\u0BCB": "zho", "\u0BB4\u0BCC": "zhau", "\u0BB3\u0BCD": "l", "\u0BB3": "la", "\u0BB3\u0BBE": "laa", "\u0BB3\u0BBF": "li", "\u0BB3\u0BC0": "lee", "\u0BB3\u0BC1": "lu", "\u0BB3\u0BC2": "loo", "\u0BB3\u0BC6": "le", "\u0BB3\u0BC7": "lae", "\u0BB3\u0BC8": "lai", "\u0BB3\u0BCA": "lo", "\u0BB3\u0BCB": "lo", "\u0BB3\u0BCC": "lau", "\u0BB1\u0BCD": "r", "\u0BB1": "ra", "\u0BB1\u0BBE": "raa", "\u0BB1\u0BBF": "ri", "\u0BB1\u0BC0": "ree", "\u0BB1\u0BC1": "ru", "\u0BB1\u0BC2": "roo", "\u0BB1\u0BC6": "re", "\u0BB1\u0BC7": "rae", "\u0BB1\u0BC8": "rai", "\u0BB1\u0BCA": "ro", "\u0BB1\u0BCB": "ro", "\u0BB1\u0BCC": "rau", "\u0BA9\u0BCD": "n", "\u0BA9": "na", "\u0BA9\u0BBE": "naa", "\u0BA9\u0BBF": "ni", "\u0BA9\u0BC0": "nee", "\u0BA9\u0BC1": "nu", "\u0BA9\u0BC2": "noo", "\u0BA9\u0BC6": "ne", "\u0BA9\u0BC7": "ne", "\u0BA9\u0BC8": "nai", "\u0BA9\u0BCA": "no", "\u0BA9\u0BCB": "no", "\u0BA9\u0BCC": "nau", "\u0B94": "au", "\u0BB9\u0BCD": "h", "\u0BB9": "ha", "\u0BB9\u0BBE": "haa", "\u0BB9\u0BBF": "hi", "\u0BB9\u0BC0": "hee", "\u0BB9\u0BC1": "hu", "\u0BB9\u0BC2": "hoo", "\u0BB9\u0BC6": "he", "\u0BB9\u0BC7": "he", "\u0BB9\u0BC8": "hai", "\u0BB9\u0BCA": "ho", "\u0BB9\u0BCB": "ho", "\u0BB9\u0BCC": "hau", "\u0B9C\u0BCD": "j", "\u0B9C": "ja", "\u0B9C\u0BBE": "jaa", "\u0B9C\u0BBF": "ji", "\u0B9C\u0BC0": "jee", "\u0B9C\u0BC1": "ju", "\u0B9C\u0BC2": "joo", "\u0B9C\u0BC6": "je", "\u0B9C\u0BC7": "je", "\u0B9C\u0BC8": "jai", "\u0B9C\u0BCA": "jo", "\u0B9C\u0BCB": "jo", "\u0B9C\u0BCC": "jau", "\u0BB7\u0BCD": "sh", "\u0BB7": "sha", "\u0BB7\u0BBE": "shaa", "\u0BB7\u0BBF": "shi", "\u0BB7\u0BC0": "shee", "\u0BB7\u0BC1": "shu", "\u0BB7\u0BC2": "shoo", "\u0BB7\u0BC6": "she", "\u0BB7\u0BC7": "she", "\u0BB7\u0BC8": "shai", "\u0BB7\u0BCA": "sho", "\u0BB7\u0BCB": "sho", "\u0BB7\u0BCC": "shau", "\u0BB8\u0BCD": "s", "\u0BB8": "sa", "\u0BB8\u0BBE": "saa", "\u0BB8\u0BBF": "si", "\u0BB8\u0BC0": "see", "\u0BB8\u0BC1": "su", "\u0BB8\u0BC2": "soo", "\u0BB8\u0BC6": "se", "\u0BB8\u0BC7": "se", "\u0BB8\u0BC8": "sai", "\u0BB8\u0BCA": "so", "\u0BB8\u0BCB": "so", "\u0BB8\u0BCC": "sau", "\u0BB8\u0BCD\u0BB0\u0BC0": "shri", "\u0BB6\u0BCD": "s" }, ka_rule: { "\u0B95": "ka", "\u0B95\u0BBE": "kaa", "\u0B95\u0BBF": "ki", "\u0B95\u0BC0": "kee", "\u0B95\u0BC1": "ku", "\u0B95\u0BC2": "koo", "\u0B95\u0BC6": "ke", "\u0B95\u0BC7": "kae", "\u0B95\u0BC8": "kai", "\u0B95\u0BCA": "ko", "\u0B95\u0BCB": "ko", "\u0B95\u0BCC": "kau" }, sa_rule: { "\u0B9A": "cha", "\u0B9A\u0BBE": "chaa", "\u0B9A\u0BBF": "chi", "\u0B9A\u0BC0": "chee", "\u0B9A\u0BC1": "chu", "\u0B9A\u0BC2": "choo", "\u0B9A\u0BC6": "che", "\u0B9A\u0BC7": "chae", "\u0B9A\u0BC8": "chai", "\u0B9A\u0BCA": "cho", "\u0B9A\u0BCB": "cho", "\u0B9A\u0BCC": "chau" }, ta_rule: { "\u0B9F": "ta", "\u0B9F\u0BBE": "taa", "\u0B9F\u0BBF": "ti", "\u0B9F\u0BC0": "tee", "\u0B9F\u0BC1": "tu", "\u0B9F\u0BC2": "too", "\u0B9F\u0BC6": "te", "\u0B9F\u0BC7": "tae", "\u0B9F\u0BC8": "tai", "\u0B9F\u0BCA": "to", "\u0B9F\u0BCB": "to", "\u0B9F\u0BCC": "tau" }, pa_rule: { "\u0BAA": "pa", "\u0BAA\u0BBE": "paa", "\u0BAA\u0BBF": "pi", "\u0BAA\u0BC0": "pee", "\u0BAA\u0BC1": "pu", "\u0BAA\u0BC2": "poo", "\u0BAA\u0BC6": "pe", "\u0BAA\u0BC7": "pae", "\u0BAA\u0BC8": "pai", "\u0BAA\u0BCA": "po", "\u0BAA\u0BCB": "po", "\u0BAA\u0BCC": "pau" }, tha_rule: { "\u0BA4": "tha", "\u0BA4\u0BBE": "thaa", "\u0BA4\u0BBF": "thi", "\u0BA4\u0BC0": "thee", "\u0BA4\u0BC1": "thu", "\u0BA4\u0BC2": "thoo", "\u0BA4\u0BC6": "the", "\u0BA4\u0BC7": "thae", "\u0BA4\u0BC8": "thai", "\u0BA4\u0BCA": "tho", "\u0BA4\u0BCB": "tho", "\u0BA4\u0BCC": "thau" }, special_case: { "\u0BAA\u0BB2\u0BAE\u0BCD": "balam", "\u0BAA\u0BBE\u0BB0\u0BA4\u0BBF": "bharathi", "\u0BAA\u0BC2\u0BAE\u0BBF": "boomi", "\u0BAA\u0BBE\u0BB0\u0BA4\u0BAE\u0BCD": "bharatham", "\u0BAA\u0BAF\u0BA8\u0BCD\u0BA4\u0BC1": "bayanthu", "\u0BAA\u0BAF\u0BAE\u0BCD": "bayam", "\u0BAA\u0BBE\u0BB8\u0BCD\u0BAE\u0BA4\u0BBF": "basmati", "\u0BAA\u0BA8\u0BCD\u0BA4\u0BAE\u0BCD": "bandham", "\u0BAA\u0BBF\u0B9F\u0BBF": "pidi", "\u0BAA\u0B9F\u0BC1": "padu", "\u0BAA\u0B9F\u0BBE": "padaa", "\u0B9A\u0BB0\u0BBF": "seri", "\u0BAA\u0BC7\u0B9F\u0BCD\u0B9F\u0BC8": "paettai", "\u0BAA\u0BC1\u0BB0\u0BAE\u0BCD": "puram", "\u0BAA\u0B9F\u0BCD\u0B9F\u0BC1": "pattu", "\u0B9A\u0BC6\u0BA9\u0BCD\u0BA9\u0BC8": "chennai", "\u0BAA\u0BC6\u0B99\u0BCD\u0B95\u0BB3\u0BC2\u0BB0\u0BCD": "bengaloor" }, extras: { "": "a", "\u0BBE": "aa", "\u0BBF": "i", "\u0BC0": "ee", "\u0BC1": "u", "\u0BC2": "oo", "\u0BC6": "e", "\u0BC7": "ae", "\u0BC8": "ai", "\u0BCA": "o", "\u0BCB": "o", "\u0BCC": "au" } }; // src/olipeyappu.ts var vallinam = ["\u0B95", "\u0B9A", "\u0B9F", "\u0BA4", "\u0BAA", "\u0BB1"]; var mellinam = ["\u0B99", "\u0B9E", "\u0BA3", "\u0BA8", "\u0BAE", "\u0BA9"]; var idaiyinam = ["\u0BAF", "\u0BB0", "\u0BB2", "\u0BB5", "\u0BB4", "\u0BB3"]; var ka_rule = rules_default.ka_rule || {}; var sa_rule = rules_default.sa_rule || {}; var ta_rule = rules_default.ta_rule || {}; var pa_rule = rules_default.pa_rule || {}; var tha_rule = rules_default.tha_rule || {}; var extras = rules_default.extras || {}; function extras_comb(letter) { return Object.keys(extras).map((constant) => letter + constant); } function olipeyarppu(word_start, tam_word, prev_comb, next_next_char, next_char) { let roman_text = ""; if (word_start) { if (extras_comb("\u0B95").includes(tam_word)) { roman_text += ka_rule[tam_word] ?? ""; } else if (extras_comb("\u0BA4").includes(tam_word)) { roman_text += tha_rule[tam_word] ?? ""; } else if (extras_comb("\u0B9F").slice(2).includes(tam_word)) { roman_text += ta_rule[tam_word] ?? ""; } else if (extras_comb("\u0BAA").includes(tam_word)) { roman_text += pa_rule[tam_word] ?? ""; } else { roman_text += rules_default.letter_rule[tam_word] ?? ""; } } else if (tam_word === "\u0B95" && prev_comb === "\u0BB1\u0BC1") { roman_text += "ka"; } else if ([...vallinam, ...idaiyinam, ...mellinam, "\u0BB8", "\u0BB7"].some((letter) => prev_comb === letter + "\u0BCD")) { if (prev_comb === "\u0BA9\u0BCD") { if (tam_word === "\u0BB1\u0BC1") { roman_text += "dru"; } else if (tam_word === "\u0BB1\u0BBF") { roman_text += "dri"; } else if (tam_word === "\u0BB1") { roman_text += "dra"; } else if (tam_word === "\u0BB1\u0BC8") { roman_text += "drai"; } else if (extras_comb("\u0BAA").includes(tam_word)) { roman_text += rules_default.letter_rule[tam_word] || ""; } } if (roman_text === "" && ["\u0B95\u0BCD", "\u0B9A\u0BCD", "\u0B9F\u0BCD", "\u0BA4\u0BCD", "\u0BAA\u0BCD", "\u0BB1\u0BCD", "\u0BB7\u0BCD", "\u0BB8\u0BCD"].includes(prev_comb)) { roman_text += ka_rule[tam_word] || ""; roman_text += sa_rule[tam_word] || ""; roman_text += ta_rule[tam_word] || ""; roman_text += tha_rule[tam_word] || ""; roman_text += pa_rule[tam_word] || ""; } if (["\u0B9E\u0BCD", "\u0B99\u0BCD"].includes(prev_comb)) { for (const [key, value] of Object.entries(extras)) { if (vallinam.some((letter) => tam_word === letter + key)) { roman_text += value; } } } if (roman_text === "") { roman_text += rules_default.letter_rule[tam_word] || ""; } } else if (tam_word === "\u0BB1\u0BCD" && next_next_char === "\u0BB1") { roman_text += "t"; } else { roman_text += rules_default.letter_rule[tam_word] || ""; } return roman_text; } // src/index.ts var specialCase = rules_default.special_case || {}; function replaceWord(match) { return specialCase[match] || ""; } function translite(tamilText) { let romanText = ""; let wordStart = true; let i = 0; const pattern = Object.keys(specialCase).map(escapeRegExp).join("|"); tamilText = tamilText.replace(new RegExp(pattern, "g"), replaceWord); while (i < tamilText.length) { if (i + 1 < tamilText.length && rules_default.letter_rule.hasOwnProperty(tamilText.slice(i, i + 2))) { const tamWord = tamilText.slice(i, i + 2); const prevComb = tamilText.slice(i - 2, i); const nextNextChar = tamilText[i + 2] || ""; const nextChar = tamilText[i + 1] || ""; romanText += olipeyarppu(wordStart, tamWord, prevComb, nextNextChar, nextChar); i += 1; wordStart = false; } else if (rules_default.letter_rule.hasOwnProperty(tamilText[i] ?? "")) { const tamWord = tamilText[i]; const nextChar = tamilText[i + 1] || ""; const prevComb = tamilText.slice(i - 2, i); const nextNextChar = tamilText[i + 2] || ""; romanText += olipeyarppu(wordStart, tamWord ?? "", prevComb, nextNextChar, nextChar); } else { romanText += tamilText[i]; } i += 1; wordStart = false; if (i < tamilText.length && " \n,;:'-_(.$@#%*".includes(tamilText[i - 1] ?? "")) { wordStart = true; } } return romanText.trim(); } function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function convertTamilObjectToEnglish(obj) { const convertedObj = {}; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { const value = obj[key]; if (value !== void 0) { convertedObj[key] = translite(value); } } } return convertedObj; } var index_default = translite; export { convertTamilObjectToEnglish, index_default as default, translite };