Spaces:
Running
Running
| // 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"] = "く"; | |