|
|
|
// Dictionary for Romaji to Hiragana conversion
|
|
|
|
const romajiToHiraganaMap = {
|
|
|
|
'a': 'あ', 'i': 'い', 'u': 'う', 'e': 'え', 'o': 'お',
|
|
|
|
'ka': 'か', 'ki': 'き', 'ku': 'く', 'ke': 'け', 'ko': 'こ',
|
|
|
|
'sa': 'さ', 'shi': 'し', 'su': 'す', 'se': 'せ', 'so': 'そ',
|
|
|
|
'ta': 'た', 'chi': 'ち', 'tsu': 'つ', 'te': 'て', 'to': 'と', 'っ': 'っ', '-': 'っ',
|
|
|
|
'na': 'な', 'ni': 'に', 'nu': 'ぬ', 'ne': 'ね', 'no': 'の',
|
|
|
|
'ha': 'は', 'hi': 'ひ', 'fu': 'ふ', 'he': 'へ', 'ho': 'ほ',
|
|
|
|
'ma': 'ま', 'mi': 'み', 'mu': 'む', 'me': 'め', 'mo': 'も',
|
|
|
|
'ya': 'や', 'yu': 'ゆ', 'yo': 'よ',
|
|
|
|
'ra': 'ら', 'ri': 'り', 'ru': 'る', 're': 'れ', 'ro': 'ろ',
|
|
|
|
'wa': 'わ', 'wo': 'を', 'n': 'ん',
|
|
|
|
'ga': 'が', 'gi': 'ぎ', 'gu': 'ぐ', 'ge': 'げ', 'go': 'ご',
|
|
|
|
'za': 'ざ', 'ji': 'じ', 'zu': 'ず', 'ze': 'ぜ', 'zo': 'ぞ',
|
|
|
|
'da': 'だ', 'ji': 'ぢ', 'zu': 'づ', 'de': 'で', 'do': 'ど',
|
|
|
|
'ba': 'ば', 'bi': 'び', 'bu': 'ぶ', 'be': 'べ', 'bo': 'ぼ',
|
|
|
|
'pa': 'ぱ', 'pi': 'ぴ', 'pu': 'ぷ', 'pe': 'ぺ', 'po': 'ぽ',
|
|
|
|
'kya': 'きゃ', 'kyu': 'きゅ', 'kyo': 'きょ',
|
|
|
|
'sha': 'しゃ', 'shu': 'しゅ', 'sho': 'しょ',
|
|
|
|
'cha': 'ちゃ', 'chu': 'ちゅ', 'cho': 'ちょ',
|
|
|
|
'nya': 'にゃ', 'nyu': 'にゅ', 'nyo': 'にょ',
|
|
|
|
'hya': 'ひゃ', 'hyu': 'ひゅ', 'hyo': 'ひょ',
|
|
|
|
'mya': 'みゃ', 'myu': 'みゅ', 'myo': 'みょ',
|
|
|
|
'rya': 'りゃ', 'ryu': 'りゅ', 'ryo': 'りょ',
|
|
|
|
'gya': 'ぎゃ', 'gyu': 'ぎゅ', 'gyo': 'ぎょ',
|
|
|
|
'ja': 'じゃ', 'ju': 'じゅ', 'jo': 'じょ',
|
|
|
|
'bya': 'びゃ', 'byu': 'びゅ', 'byo': 'びょ',
|
|
|
|
'pya': 'ぴゃ', 'pyu': 'ぴゅ', 'pyo': 'ぴょ'
|
|
|
|
};
|
|
|
|
|
|
|
|
function romajiToHiragana(romaji) {
|
|
|
|
// Sort the keys in descending order by length to handle multi-character matches
|
|
|
|
const sortedKeys = Object.keys(romajiToHiraganaMap).sort((a, b) => b.length - a.length);
|
|
|
|
|
|
|
|
let hiragana = '';
|
|
|
|
let i = 0;
|
|
|
|
|
|
|
|
while (i < romaji.length) {
|
|
|
|
let matchFound = false;
|
|
|
|
|
|
|
|
for (let key of sortedKeys) {
|
|
|
|
if (romaji.startsWith(key, i)) {
|
|
|
|
hiragana += romajiToHiraganaMap[key];
|
|
|
|
i += key.length;
|
|
|
|
matchFound = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// If no match found, add the character as is and move on
|
|
|
|
if (!matchFound) {
|
|
|
|
hiragana += romaji[i];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return hiragana;
|
|
|
|
}
|
|
|
|
|
|
|
|
function insertHiragana (p1, romaji, p2) {
|
|
|
|
const newParagraph = document.createElement("p");
|
|
|
|
const paragraphText = p1 + romajiToHiragana(romaji) + p2;
|
|
|
|
newParagraph.innerHTML = `${paragraphText}`;
|
|
|
|
return newParagraph;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Example usage:
|
|
|
|
// console.log(romajiToHiragana('konbanwa')); // Outputs: こんばんは
|
|
|
|
// console.log(romajiToHiragana('ohayou')); // Outputs: おはよう
|
|
|
|
|
|
|
|
// Dictionary for Romaji to Katakana conversion
|
|
|
|
const romajiToKatakanaMap = {
|
|
|
|
'a': 'ア', 'i': 'イ', 'u': 'ウ', 'e': 'エ', 'o': 'オ',
|
|
|
|
'ka': 'カ', 'ki': 'キ', 'ku': 'ク', 'ke': 'ケ', 'ko': 'コ',
|
|
|
|
'sa': 'サ', 'shi': 'シ', 'su': 'ス', 'se': 'セ', 'so': 'ソ',
|
|
|
|
'ta': 'タ', 'chi': 'チ', 'tsu': 'ツ', 'te': 'テ', 'to': 'ト', '-': 'っ',
|
|
|
|
'na': '', 'ni': '', 'nu': '', 'ne': '', 'no': '',
|
|
|
|
'ha': '', 'hi': '', 'fu': '', 'he': '', 'ho': '',
|
|
|
|
'ma': '', 'mi': '', 'mu': '', 'me': '', 'mo': '',
|
|
|
|
'ya': '', 'yu': '', 'yo': '',
|
|
|
|
'ra': '', 'ri': '', 'ru': '', 're': '', 'ro': '',
|
|
|
|
'wa': '', 'wo': '', 'n': '',
|
|
|
|
'ga': 'ガ', 'gi': 'ギ', 'gu': 'グ', 'ge': 'ゲ', 'go': 'ゴ',
|
|
|
|
'za': 'ザ', 'ji': 'ジ', 'zu': 'ズ', 'ze': 'ゼ', 'zo': 'ゾ',
|
|
|
|
'da': 'ダ', 'ji': 'ヂ', 'zu': '', 'de': 'デ', 'do': 'ド',
|
|
|
|
'ba': '', 'bi': '', 'bu': '', 'be': '', 'bo': '',
|
|
|
|
'pa': '', 'pi': '', 'pu': '', 'pe': '', 'po': '',
|
|
|
|
'kya': 'きゃ', 'kyu': 'きゅ', 'kyo': 'きょ',
|
|
|
|
'sha': 'しゃ', 'shu': 'しゅ', 'sho': 'しょ',
|
|
|
|
'cha': 'ちゃ', 'chu': 'ちゅ', 'cho': 'ちょ',
|
|
|
|
'nya': 'にゃ', 'nyu': 'にゅ', 'nyo': 'にょ',
|
|
|
|
'hya': 'ひゃ', 'hyu': 'ひゅ', 'hyo': 'ひょ',
|
|
|
|
'mya': 'みゃ', 'myu': 'みゅ', 'myo': 'みょ',
|
|
|
|
'rya': 'りゃ', 'ryu': 'りゅ', 'ryo': 'りょ',
|
|
|
|
'gya': 'ぎゃ', 'gyu': 'ぎゅ', 'gyo': 'ぎょ',
|
|
|
|
'ja': 'じゃ', 'ju': 'じゅ', 'jo': 'じょ',
|
|
|
|
'bya': 'びゃ', 'byu': 'びゅ', 'byo': 'びょ',
|
|
|
|
'pya': 'ぴゃ', 'pyu': 'ぴゅ', 'pyo': 'ぴょ'
|
|
|
|
};
|
|
|
|
|
|
|
|
function romajiToKatakana(romaji) {
|
|
|
|
// Sort the keys in descending order by length to handle multi-character matches
|
|
|
|
const sortedKeys = Object.keys(romajiToKatakanaMap).sort((a, b) => b.length - a.length);
|
|
|
|
|
|
|
|
let katakana = '';
|
|
|
|
let i = 0;
|
|
|
|
|
|
|
|
while (i < romaji.length) {
|
|
|
|
let matchFound = false;
|
|
|
|
|
|
|
|
for (let key of sortedKeys) {
|
|
|
|
if (romaji.startsWith(key, i)) {
|
|
|
|
katakana += romajiToKatakanaMap[key];
|
|
|
|
i += key.length;
|
|
|
|
matchFound = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// If no match found, add the character as is and move on
|
|
|
|
if (!matchFound) {
|
|
|
|
katakana += romaji[i];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return katakana;
|
|
|
|
}
|
|
|
|
|
|
|
|
export { romajiToHiragana, insertHiragana }
|