// General functions function addDotsToWord(word, previous) { var preDot = ""; var postDot = ""; // if word begins with a vowel: dot before if (isVowel(word.charAt(0))) { preDot = "."; } // if word is a cmene: dot after if (!isVowel(word.charAt(word.length - 1))) { postDot = "."; // and except for preceding selma'o DOI or LA, also a dot before if (!previous || (previous !== "doi" && previous !== "la")) { // TODO: check if there are more of these preDot = "."; } } return preDot + word + postDot; } function isVowel(c) { return c === "a" || c === "e" || c === "i" || c === "o" || c === "u" || c === "y"; } function arrayToString(array) { var result = ""; for (var i = 0; i < array.length - 1; i++) { result += array[i] + " "; } result += array[array.length - 1]; return result; } // Latin mode function transcribeToLatin(text) { var result = []; for (var i in text) { result.push(addDotsToWord(text[i], text[i - 1])); } return result; } // Cyrillic mode function transcribeToCyrillic(text) { var result = []; for (var i in text) { result.push(wordToCyrillic(addDotsToWord(text[i], text[i - 1]))); } return result; } function wordToCyrillic(word) { var cyrillicWord = ""; for (var i = 0; i < word.length; i++) { var letter = word.charAt(i); var cyrillicLetter = cyrillicTable[letter]; if (!cyrillicLetter) { cyrillicLetter = letter; } cyrillicWord += cyrillicLetter; } return cyrillicWord; } var cyrillicTable = {}; cyrillicTable["b"] = "б"; cyrillicTable["c"] = "ш"; cyrillicTable["d"] = "д"; cyrillicTable["f"] = "ф"; cyrillicTable["g"] = "г"; cyrillicTable["j"] = "ж"; cyrillicTable["k"] = "к"; cyrillicTable["l"] = "л"; cyrillicTable["m"] = "м"; cyrillicTable["n"] = "н"; cyrillicTable["p"] = "п"; cyrillicTable["r"] = "р"; cyrillicTable["s"] = "с"; cyrillicTable["t"] = "т"; cyrillicTable["v"] = "в"; cyrillicTable["x"] = "х"; cyrillicTable["z"] = "з"; cyrillicTable["a"] = "а"; cyrillicTable["e"] = "е"; cyrillicTable["i"] = "и"; cyrillicTable["o"] = "о"; cyrillicTable["u"] = "у"; cyrillicTable["y"] = "ъ"; // Tengwar mode function transcribeToTengwar(text) { var result = []; for (var i in text) { result.push(wordToTengwar(addDotsToWord(text[i], text[i - 1]))); } return result; } function wordToTengwar(word) { var tengwarWord = ""; var canUseTehta = false; for (var i = 0; i < word.length; i++) { var letter = word.charAt(i); if (letter === "'") { tengwarWord += "" // halla canUseTehta = false; continue; } if (letter === ".") { // It would have been enough to set canUseTehta to true to get ":" for ".i", // but Tengwar Unicode fonts do not have tehta placement rules for the "lowered pusta", // which I render as the ASCII "." (period). // Therefore, add an extra case for ".i". if (word.length > i + 1 && word.charAt(i + 1) === "i") { // And also prevent longer words. if (word.length === i + 2 || word.charAt(i + 2) === " ") { tengwarWord += ""; // double pusta i++; canUseTehta = false; continue; } } tengwarWord += "."; canUseTehta = false; continue; } var tehta = tehtaTable[letter]; if (tehta) { if (i < word.length - 1 && tehtaTable[word.charAt(i + 1)]) { // diphtong tengwarWord += tengwaTable[letter]; tengwarWord += tehtaTable[word.charAt(i + 1)]; i++; canUseTehta = false; continue; } else if (!canUseTehta) { tengwarWord += ""; // short carrier tengwarWord += tehta; canUseTehta = true; continue; } else { tengwarWord += tehta; canUseTehta = false; continue; } } var tengwa = tengwaTable[letter]; if (tengwa) { tengwarWord += tengwa; canUseTehta = true; continue; } tengwarWord += "?"; } return tengwarWord; } var tengwaTable = {}; tengwaTable["b"] = ""; tengwaTable["c"] = ""; tengwaTable["d"] = ""; tengwaTable["f"] = ""; tengwaTable["g"] = ""; tengwaTable["j"] = ""; tengwaTable["k"] = ""; tengwaTable["l"] = ""; tengwaTable["m"] = ""; tengwaTable["n"] = ""; tengwaTable["p"] = ""; tengwaTable["r"] = ""; tengwaTable["s"] = ""; tengwaTable["t"] = ""; tengwaTable["v"] = ""; tengwaTable["x"] = ""; tengwaTable["z"] = ""; tengwaTable["a"] = ""; tengwaTable["e"] = ""; tengwaTable["i"] = ""; tengwaTable["o"] = ""; tengwaTable["u"] = ""; tengwaTable["y"] = ""; var tehtaTable = {}; tehtaTable["a"] = ""; tehtaTable["e"] = ""; tehtaTable["i"] = ""; tehtaTable["o"] = ""; tehtaTable["u"] = ""; tehtaTable["y"] = ""; // Hiragana mode function transcribeToHiragana(text) { var result = []; for (var i in text) { result.push(wordToHiragana(addDotsToWord(text[i], text[i - 1]))); } return result; } function wordToHiragana(word) { var hiraganaWord = ""; for (var i = 0; i < word.length; i++) { var next = word.charAt(i); var nextTwo = word.substring(i, i + 2); console.log(hiraganaTable["co"]); if (hiraganaTable[nextTwo]) { hiraganaWord += hiraganaTable[nextTwo]; i++; continue; } if (hiraganaTable[next]) { hiraganaWord += hiraganaTable[next]; continue; } hiraganaWord += next; // TODO this should not happen, of course } return hiraganaWord; } var hiraganaTable = {}; hiraganaTable["a"] = "あ"; hiraganaTable["e"] = "え"; hiraganaTable["i"] = "い"; hiraganaTable["o"] = "お"; hiraganaTable["u"] = "う"; hiraganaTable["ca"] = "しあ"; hiraganaTable["ce"] = "しえ"; hiraganaTable["ci"] = "し"; hiraganaTable["co"] = "しお"; hiraganaTable["cu"] = "しう"; hiraganaTable["c"] = "し"; hiraganaTable["ca"] = ""; hiraganaTable["ce"] = ""; hiraganaTable["ci"] = ""; hiraganaTable["co"] = ""; hiraganaTable["cu"] = ""; hiraganaTable["c"] = ""; hiraganaTable["ka"] = "か"; hiraganaTable["ke"] = "け"; hiraganaTable["ki"] = "き"; hiraganaTable["ko"] = "こ"; hiraganaTable["ku"] = "く"; hiraganaTable["k"] = "く";