tamil-phonetic-transliterator
Version:
A TypeScript library for converting Tamil text to English transliteration
537 lines (534 loc) • 15.4 kB
JavaScript
// 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
};