kuroshiro-enhance
Version:
kuroshiro is a Japanese language library for converting Japanese sentence to Hiragana, Katakana or Romaji with furigana and okurigana modes supported.
1,498 lines (1,467 loc) • 32.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.toRawRomaji = exports.toRawKatakana = exports.toRawHiragana = exports.patchTokens = exports.kanaToRomaji = exports.kanaToKatakana = exports.kanaToHiragna = exports.isKatakana = exports.isKanji = exports.isKana = exports.isJapanese = exports.isHiragana = exports.hasKatakana = exports.hasKanji = exports.hasKana = exports.hasJapanese = exports.hasHiragana = exports.getStrType = exports.ROMANIZATION_SYSTEM = void 0;
const KATAKANA_HIRAGANA_SHIFT = "\u3041".charCodeAt(0) - "\u30a1".charCodeAt(0);
const HIRAGANA_KATAKANA_SHIFT = "\u30a1".charCodeAt(0) - "\u3041".charCodeAt(0);
const ROMANIZATION_SYSTEM = exports.ROMANIZATION_SYSTEM = {
NIPPON: "nippon",
PASSPORT: "passport",
HEPBURN: "hepburn"
};
/**
* Check if given char is a hiragana
*
* @param {string} ch Given char
* @return {boolean} if given char is a hiragana
*/
const isHiragana = exports.isHiragana = function isHiragana(ch) {
ch = ch[0];
return ch >= "\u3040" && ch <= "\u309f";
};
/**
* Check if given char is a katakana
*
* @param {string} ch Given char
* @return {boolean} if given char is a katakana
*/
const isKatakana = exports.isKatakana = function isKatakana(ch) {
ch = ch[0];
return ch >= "\u30a0" && ch <= "\u30ff";
};
/**
* Check if given char is a kana
*
* @param {string} ch Given char
* @return {boolean} if given char is a kana
*/
const isKana = exports.isKana = function isKana(ch) {
return isHiragana(ch) || isKatakana(ch);
};
/**
* Check if given char is a kanji
*
* @param {string} ch Given char
* @return {boolean} if given char is a kanji
*/
const isKanji = exports.isKanji = function isKanji(ch) {
ch = ch[0];
return ch >= "\u4e00" && ch <= "\u9fcf" || ch >= "\uf900" && ch <= "\ufaff" || ch >= "\u3400" && ch <= "\u4dbf";
};
/**
* Check if given char is a Japanese
*
* @param {string} ch Given char
* @return {boolean} if given char is a Japanese
*/
const isJapanese = exports.isJapanese = function isJapanese(ch) {
return isKana(ch) || isKanji(ch);
};
/**
* Check if given string has hiragana
*
* @param {string} str Given string
* @return {boolean} if given string has hiragana
*/
const hasHiragana = exports.hasHiragana = function hasHiragana(str) {
for (let i = 0; i < str.length; i++) {
if (isHiragana(str[i])) return true;
}
return false;
};
/**
* Check if given string has katakana
*
* @param {string} str Given string
* @return {boolean} if given string has katakana
*/
const hasKatakana = exports.hasKatakana = function hasKatakana(str) {
for (let i = 0; i < str.length; i++) {
if (isKatakana(str[i])) return true;
}
return false;
};
/**
* Check if given string has kana
*
* @param {string} str Given string
* @return {boolean} if given string has kana
*/
const hasKana = exports.hasKana = function hasKana(str) {
for (let i = 0; i < str.length; i++) {
if (isKana(str[i])) return true;
}
return false;
};
/**
* Check if given string has kanji
*
* @param {string} str Given string
* @return {boolean} if given string has kanji
*/
const hasKanji = exports.hasKanji = function hasKanji(str) {
for (let i = 0; i < str.length; i++) {
if (isKanji(str[i])) return true;
}
return false;
};
/**
* Check if given string has Japanese
*
* @param {string} str Given string
* @return {boolean} if given string has Japanese
*/
const hasJapanese = exports.hasJapanese = function hasJapanese(str) {
for (let i = 0; i < str.length; i++) {
if (isJapanese(str[i])) return true;
}
return false;
};
/**
* Convert kana to hiragana
*
* @param {string} str Given string
* @return {string} Hiragana string
*/
const toRawHiragana = exports.toRawHiragana = function toRawHiragana(str) {
return [...str].map(ch => {
if (ch > "\u30a0" && ch < "\u30f7") {
return String.fromCharCode(ch.charCodeAt(0) + KATAKANA_HIRAGANA_SHIFT);
}
return ch;
}).join("");
};
/**
* Convert kana to katakana
*
* @param {string} str Given string
* @return {string} Katakana string
*/
const toRawKatakana = exports.toRawKatakana = function toRawKatakana(str) {
return [...str].map(ch => {
if (ch > "\u3040" && ch < "\u3097") {
return String.fromCharCode(ch.charCodeAt(0) + HIRAGANA_KATAKANA_SHIFT);
}
return ch;
}).join("");
};
/**
* Convert kana to romaji
*
* @param {string} str Given string
* @param {string} system To which romanization system the given string is converted
* @return {string} Romaji string
*/
const toRawRomaji = exports.toRawRomaji = function toRawRomaji(str, system) {
system = system || ROMANIZATION_SYSTEM.HEPBURN;
const romajiSystem = {
nippon: {
// 数字と記号
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"0": "0",
"!": "!",
"“": "\"",
"”": "\"",
"#": "#",
"$": "$",
"%": "%",
"&": "&",
"’": "'",
"(": "(",
")": ")",
"=": "=",
"~": "~",
"|": "|",
"@": "@",
"‘": "`",
"+": "+",
"*": "*",
";": ";",
":": ":",
"<": "<",
">": ">",
"、": ",",
"。": ".",
"/": "/",
"?": "?",
"_": "_",
"・": "・",
"「": "\"",
"」": "\"",
"{": "{",
"}": "}",
"¥": "\\",
"^": "^",
// 直音-清音(ア~ノ)
あ: "a",
い: "i",
う: "u",
え: "e",
お: "o",
ア: "a",
イ: "i",
ウ: "u",
エ: "e",
オ: "o",
か: "ka",
き: "ki",
く: "ku",
け: "ke",
こ: "ko",
カ: "ka",
キ: "ki",
ク: "ku",
ケ: "ke",
コ: "ko",
さ: "sa",
し: "si",
す: "su",
せ: "se",
そ: "so",
サ: "sa",
シ: "si",
ス: "su",
セ: "se",
ソ: "so",
た: "ta",
ち: "ti",
つ: "tu",
て: "te",
と: "to",
タ: "ta",
チ: "ti",
ツ: "tu",
テ: "te",
ト: "to",
な: "na",
に: "ni",
ぬ: "nu",
ね: "ne",
の: "no",
ナ: "na",
ニ: "ni",
ヌ: "nu",
ネ: "ne",
ノ: "no",
// 直音-清音(ハ~ヲ)
は: "ha",
ひ: "hi",
ふ: "hu",
へ: "he",
ほ: "ho",
ハ: "ha",
ヒ: "hi",
フ: "hu",
ヘ: "he",
ホ: "ho",
ま: "ma",
み: "mi",
む: "mu",
め: "me",
も: "mo",
マ: "ma",
ミ: "mi",
ム: "mu",
メ: "me",
モ: "mo",
や: "ya",
ゆ: "yu",
よ: "yo",
ヤ: "ya",
ユ: "yu",
ヨ: "yo",
ら: "ra",
り: "ri",
る: "ru",
れ: "re",
ろ: "ro",
ラ: "ra",
リ: "ri",
ル: "ru",
レ: "re",
ロ: "ro",
わ: "wa",
ゐ: "wi",
ゑ: "we",
を: "wo",
ワ: "wa",
ヰ: "wi",
ヱ: "we",
ヲ: "wo",
// 直音-濁音(ガ~ボ)、半濁音(パ~ポ)
が: "ga",
ぎ: "gi",
ぐ: "gu",
げ: "ge",
ご: "go",
ガ: "ga",
ギ: "gi",
グ: "gu",
ゲ: "ge",
ゴ: "go",
ざ: "za",
じ: "zi",
ず: "zu",
ぜ: "ze",
ぞ: "zo",
ザ: "za",
ジ: "zi",
ズ: "zu",
ゼ: "ze",
ゾ: "zo",
だ: "da",
ぢ: "di",
づ: "du",
で: "de",
ど: "do",
ダ: "da",
ヂ: "di",
ヅ: "du",
デ: "de",
ド: "do",
ば: "ba",
び: "bi",
ぶ: "bu",
べ: "be",
ぼ: "bo",
バ: "ba",
ビ: "bi",
ブ: "bu",
ベ: "be",
ボ: "bo",
ぱ: "pa",
ぴ: "pi",
ぷ: "pu",
ぺ: "pe",
ぽ: "po",
パ: "pa",
ピ: "pi",
プ: "pu",
ペ: "pe",
ポ: "po",
// 拗音-清音(キャ~リョ)
きゃ: "kya",
きゅ: "kyu",
きょ: "kyo",
しゃ: "sya",
しゅ: "syu",
しょ: "syo",
ちゃ: "tya",
ちゅ: "tyu",
ちょ: "tyo",
にゃ: "nya",
にゅ: "nyu",
にょ: "nyo",
ひゃ: "hya",
ひゅ: "hyu",
ひょ: "hyo",
みゃ: "mya",
みゅ: "myu",
みょ: "myo",
りゃ: "rya",
りゅ: "ryu",
りょ: "ryo",
キャ: "kya",
キュ: "kyu",
キョ: "kyo",
シャ: "sya",
シュ: "syu",
ショ: "syo",
チャ: "tya",
チュ: "tyu",
チョ: "tyo",
ニャ: "nya",
ニュ: "nyu",
ニョ: "nyo",
ヒャ: "hya",
ヒュ: "hyu",
ヒョ: "hyo",
ミャ: "mya",
ミュ: "myu",
ミョ: "myo",
リャ: "rya",
リュ: "ryu",
リョ: "ryo",
// 拗音-濁音(ギャ~ビョ)、半濁音(ピャ~ピョ)、合拗音(クヮ、グヮ)
ぎゃ: "gya",
ぎゅ: "gyu",
ぎょ: "gyo",
じゃ: "zya",
じゅ: "zyu",
じょ: "zyo",
ぢゃ: "dya",
ぢゅ: "dyu",
ぢょ: "dyo",
びゃ: "bya",
びゅ: "byu",
びょ: "byo",
ぴゃ: "pya",
ぴゅ: "pyu",
ぴょ: "pyo",
くゎ: "kwa",
ぐゎ: "gwa",
ギャ: "gya",
ギュ: "gyu",
ギョ: "gyo",
ジャ: "zya",
ジュ: "zyu",
ジョ: "zyo",
ヂャ: "dya",
ヂュ: "dyu",
ヂョ: "dyo",
ビャ: "bya",
ビュ: "byu",
ビョ: "byo",
ピャ: "pya",
ピュ: "pyu",
ピョ: "pyo",
クヮ: "kwa",
グヮ: "gwa",
// 小書きの仮名、符号
ぁ: "a",
ぃ: "i",
ぅ: "u",
ぇ: "e",
ぉ: "o",
ゃ: "ya",
ゅ: "yu",
ょ: "yo",
ゎ: "wa",
ァ: "a",
ィ: "i",
ゥ: "u",
ェ: "e",
ォ: "o",
ャ: "ya",
ュ: "yu",
ョ: "yo",
ヮ: "wa",
ヵ: "ka",
ヶ: "ke",
ん: "n",
ン: "n",
// ー: "",
" ": " ",
// 外来音(イェ~グォ)
いぇ: "ye",
// うぃ: "",
// うぇ: "",
// うぉ: "",
きぇ: "kye",
// くぁ: "",
くぃ: "kwi",
くぇ: "kwe",
くぉ: "kwo",
// ぐぁ: "",
ぐぃ: "gwi",
ぐぇ: "gwe",
ぐぉ: "gwo",
イェ: "ye",
// ウィ: "",
// ウェ: "",
// ウォ: "",
// ヴ: "",
// ヴァ: "",
// ヴィ: "",
// ヴェ: "",
// ヴォ: "",
// ヴュ: "",
// ヴョ: "",
キェ: "kya",
// クァ: "",
クィ: "kwi",
クェ: "kwe",
クォ: "kwo",
// グァ: "",
グィ: "gwi",
グェ: "gwe",
グォ: "gwo",
// 外来音(シェ~フョ)
しぇ: "sye",
じぇ: "zye",
すぃ: "swi",
ずぃ: "zwi",
ちぇ: "tye",
つぁ: "twa",
つぃ: "twi",
つぇ: "twe",
つぉ: "two",
// てぃ: "ti",
// てゅ: "tyu",
// でぃ: "di",
// でゅ: "dyu",
// とぅ: "tu",
// どぅ: "du",
にぇ: "nye",
ひぇ: "hye",
ふぁ: "hwa",
ふぃ: "hwi",
ふぇ: "hwe",
ふぉ: "hwo",
ふゅ: "hwyu",
ふょ: "hwyo",
シェ: "sye",
ジェ: "zye",
スィ: "swi",
ズィ: "zwi",
チェ: "tye",
ツァ: "twa",
ツィ: "twi",
ツェ: "twe",
ツォ: "two",
// ティ: "ti",
// テュ: "tyu",
// ディ: "di",
// デュ: "dyu",
// トゥ: "tu",
// ドゥ: "du",
ニェ: "nye",
ヒェ: "hye",
ファ: "hwa",
フィ: "hwi",
フェ: "hwe",
フォ: "hwo",
フュ: "hwyu",
フョ: "hwyo"
},
passport: {
// 数字と記号
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"0": "0",
"!": "!",
"“": "\"",
"”": "\"",
"#": "#",
"$": "$",
"%": "%",
"&": "&",
"’": "'",
"(": "(",
")": ")",
"=": "=",
"~": "~",
"|": "|",
"@": "@",
"‘": "`",
"+": "+",
"*": "*",
";": ";",
":": ":",
"<": "<",
">": ">",
"、": ",",
"。": ".",
"/": "/",
"?": "?",
"_": "_",
"・": "・",
"「": "\"",
"」": "\"",
"{": "{",
"}": "}",
"¥": "\\",
"^": "^",
// 直音-清音(ア~ノ)
あ: "a",
い: "i",
う: "u",
え: "e",
お: "o",
ア: "a",
イ: "i",
ウ: "u",
エ: "e",
オ: "o",
か: "ka",
き: "ki",
く: "ku",
け: "ke",
こ: "ko",
カ: "ka",
キ: "ki",
ク: "ku",
ケ: "ke",
コ: "ko",
さ: "sa",
し: "shi",
す: "su",
せ: "se",
そ: "so",
サ: "sa",
シ: "shi",
ス: "su",
セ: "se",
ソ: "so",
た: "ta",
ち: "chi",
つ: "tsu",
て: "te",
と: "to",
タ: "ta",
チ: "chi",
ツ: "tsu",
テ: "te",
ト: "to",
な: "na",
に: "ni",
ぬ: "nu",
ね: "ne",
の: "no",
ナ: "na",
ニ: "ni",
ヌ: "nu",
ネ: "ne",
ノ: "no",
// 直音-清音(ハ~ヲ)
は: "ha",
ひ: "hi",
ふ: "fu",
へ: "he",
ほ: "ho",
ハ: "ha",
ヒ: "hi",
フ: "fu",
ヘ: "he",
ホ: "ho",
ま: "ma",
み: "mi",
む: "mu",
め: "me",
も: "mo",
マ: "ma",
ミ: "mi",
ム: "mu",
メ: "me",
モ: "mo",
や: "ya",
ゆ: "yu",
よ: "yo",
ヤ: "ya",
ユ: "yu",
ヨ: "yo",
ら: "ra",
り: "ri",
る: "ru",
れ: "re",
ろ: "ro",
ラ: "ra",
リ: "ri",
ル: "ru",
レ: "re",
ロ: "ro",
わ: "wa",
ゐ: "i",
ゑ: "e",
を: "o",
ワ: "wa",
ヰ: "i",
ヱ: "e",
ヲ: "o",
// 直音-濁音(ガ~ボ)、半濁音(パ~ポ)
が: "ga",
ぎ: "gi",
ぐ: "gu",
げ: "ge",
ご: "go",
ガ: "ga",
ギ: "gi",
グ: "gu",
ゲ: "ge",
ゴ: "go",
ざ: "za",
じ: "ji",
ず: "zu",
ぜ: "ze",
ぞ: "zo",
ザ: "za",
ジ: "ji",
ズ: "zu",
ゼ: "ze",
ゾ: "zo",
だ: "da",
ぢ: "ji",
づ: "zu",
で: "de",
ど: "do",
ダ: "da",
ヂ: "ji",
ヅ: "zu",
デ: "de",
ド: "do",
ば: "ba",
び: "bi",
ぶ: "bu",
べ: "be",
ぼ: "bo",
バ: "ba",
ビ: "bi",
ブ: "bu",
ベ: "be",
ボ: "bo",
ぱ: "pa",
ぴ: "pi",
ぷ: "pu",
ぺ: "pe",
ぽ: "po",
パ: "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",
キャ: "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",
ぢゃ: "ja",
ぢゅ: "ju",
ぢょ: "jo",
びゃ: "bya",
びゅ: "byu",
びょ: "byo",
ぴゃ: "pya",
ぴゅ: "pyu",
ぴょ: "pyo",
// くゎ: "",
// ぐゎ: "",
ギャ: "gya",
ギュ: "gyu",
ギョ: "gyo",
ジャ: "ja",
ジュ: "ju",
ジョ: "jo",
ヂャ: "ja",
ヂュ: "ju",
ヂョ: "jo",
ビャ: "bya",
ビュ: "byu",
ビョ: "byo",
ピャ: "pya",
ピュ: "pyu",
ピョ: "pyo",
// クヮ: "",
// グヮ: "",
// 小書きの仮名、符号
ぁ: "a",
ぃ: "i",
ぅ: "u",
ぇ: "e",
ぉ: "o",
ゃ: "ya",
ゅ: "yu",
ょ: "yo",
ゎ: "wa",
ァ: "a",
ィ: "i",
ゥ: "u",
ェ: "e",
ォ: "o",
ャ: "ya",
ュ: "yu",
ョ: "yo",
ヮ: "wa",
ヵ: "ka",
ヶ: "ke",
ん: "n",
ン: "n",
// ー: "",
" ": " ",
// 外来音(イェ~グォ)
// いぇ: "",
// うぃ: "",
// うぇ: "",
// うぉ: "",
// きぇ: "",
// くぁ: "",
// くぃ: "",
// くぇ: "",
// くぉ: "",
// ぐぁ: "",
// ぐぃ: "",
// ぐぇ: "",
// ぐぉ: "",
// イェ: "",
// ウィ: "",
// ウェ: "",
// ウォ: "",
ヴ: "b"
// ヴァ: "",
// ヴィ: "",
// ヴェ: "",
// ヴォ: "",
// ヴュ: "",
// ヴョ: "",
// キェ: "",
// クァ: "",
// クィ: "",
// クェ: "",
// クォ: "",
// グァ: "",
// グィ: "",
// グェ: "",
// グォ: "",
// 外来音(シェ~フョ)
// しぇ: "",
// じぇ: "",
// すぃ: "",
// ずぃ: "",
// ちぇ: "",
// つぁ: "",
// つぃ: "",
// つぇ: "",
// つぉ: "",
// てぃ: "",
// てゅ: "",
// でぃ: "",
// でゅ: "",
// とぅ: "",
// どぅ: "",
// にぇ: "",
// ひぇ: "",
// ふぁ: "",
// ふぃ: "",
// ふぇ: "",
// ふぉ: "",
// ふゅ: "",
// ふょ: "",
// シェ: "",
// ジェ: "",
// スィ: "",
// ズィ: "",
// チェ: "",
// ツァ: "",
// ツィ: "",
// ツェ: "",
// ツォ: "",
// ティ: "",
// テュ: "",
// ディ: "",
// デュ: "",
// トゥ: "",
// ドゥ: "",
// ニェ: "",
// ヒェ: "",
// ファ: "",
// フィ: "",
// フェ: "",
// フォ: "",
// フュ: "",
// フョ: ""
},
hepburn: {
// 数字と記号
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"0": "0",
"!": "!",
"“": "\"",
"”": "\"",
"#": "#",
"$": "$",
"%": "%",
"&": "&",
"’": "'",
"(": "(",
")": ")",
"=": "=",
"~": "~",
"|": "|",
"@": "@",
"‘": "`",
"+": "+",
"*": "*",
";": ";",
":": ":",
"<": "<",
">": ">",
"、": ",",
"。": ".",
"/": "/",
"?": "?",
"_": "_",
"・": "・",
"「": "\"",
"」": "\"",
"{": "{",
"}": "}",
"¥": "\\",
"^": "^",
// 直音-清音(ア~ノ)
あ: "a",
い: "i",
う: "u",
え: "e",
お: "o",
ア: "a",
イ: "i",
ウ: "u",
エ: "e",
オ: "o",
か: "ka",
き: "ki",
く: "ku",
け: "ke",
こ: "ko",
カ: "ka",
キ: "ki",
ク: "ku",
ケ: "ke",
コ: "ko",
さ: "sa",
し: "shi",
す: "su",
せ: "se",
そ: "so",
サ: "sa",
シ: "shi",
ス: "su",
セ: "se",
ソ: "so",
た: "ta",
ち: "chi",
つ: "tsu",
て: "te",
と: "to",
タ: "ta",
チ: "chi",
ツ: "tsu",
テ: "te",
ト: "to",
な: "na",
に: "ni",
ぬ: "nu",
ね: "ne",
の: "no",
ナ: "na",
ニ: "ni",
ヌ: "nu",
ネ: "ne",
ノ: "no",
// 直音-清音(ハ~ヲ)
は: "ha",
ひ: "hi",
ふ: "fu",
へ: "he",
ほ: "ho",
ハ: "ha",
ヒ: "hi",
フ: "fu",
ヘ: "he",
ホ: "ho",
ま: "ma",
み: "mi",
む: "mu",
め: "me",
も: "mo",
マ: "ma",
ミ: "mi",
ム: "mu",
メ: "me",
モ: "mo",
や: "ya",
ゆ: "yu",
よ: "yo",
ヤ: "ya",
ユ: "yu",
ヨ: "yo",
ら: "ra",
り: "ri",
る: "ru",
れ: "re",
ろ: "ro",
ラ: "ra",
リ: "ri",
ル: "ru",
レ: "re",
ロ: "ro",
わ: "wa",
ゐ: "i",
ゑ: "e",
を: "o",
ワ: "wa",
ヰ: "i",
ヱ: "e",
ヲ: "o",
// 直音-濁音(ガ~ボ)、半濁音(パ~ポ)
が: "ga",
ぎ: "gi",
ぐ: "gu",
げ: "ge",
ご: "go",
ガ: "ga",
ギ: "gi",
グ: "gu",
ゲ: "ge",
ゴ: "go",
ざ: "za",
じ: "ji",
ず: "zu",
ぜ: "ze",
ぞ: "zo",
ザ: "za",
ジ: "ji",
ズ: "zu",
ゼ: "ze",
ゾ: "zo",
だ: "da",
ぢ: "ji",
づ: "zu",
で: "de",
ど: "do",
ダ: "da",
ヂ: "ji",
ヅ: "zu",
デ: "de",
ド: "do",
ば: "ba",
び: "bi",
ぶ: "bu",
べ: "be",
ぼ: "bo",
バ: "ba",
ビ: "bi",
ブ: "bu",
ベ: "be",
ボ: "bo",
ぱ: "pa",
ぴ: "pi",
ぷ: "pu",
ぺ: "pe",
ぽ: "po",
パ: "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",
キャ: "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",
ぢゃ: "ja",
ぢゅ: "ju",
ぢょ: "jo",
びゃ: "bya",
びゅ: "byu",
びょ: "byo",
ぴゃ: "pya",
ぴゅ: "pyu",
ぴょ: "pyo",
// くゎ: "",
// ぐゎ: "",
ギャ: "gya",
ギュ: "gyu",
ギョ: "gyo",
ジャ: "ja",
ジュ: "ju",
ジョ: "jo",
ヂャ: "ja",
ヂュ: "ju",
ヂョ: "jo",
ビャ: "bya",
ビュ: "byu",
ビョ: "byo",
ピャ: "pya",
ピュ: "pyu",
ピョ: "pyo",
// クヮ: "",
// グヮ: "",
// 小書きの仮名、符号
ぁ: "a",
ぃ: "i",
ぅ: "u",
ぇ: "e",
ぉ: "o",
ゃ: "ya",
ゅ: "yu",
ょ: "yo",
ゎ: "wa",
ァ: "a",
ィ: "i",
ゥ: "u",
ェ: "e",
ォ: "o",
ャ: "ya",
ュ: "yu",
ョ: "yo",
ヮ: "wa",
ヵ: "ka",
ヶ: "ke",
ん: "n",
ン: "n",
// ー: "",
" ": " ",
// 外来音(イェ~グォ)
いぇ: "ye",
うぃ: "wi",
うぇ: "we",
うぉ: "wo",
きぇ: "kye",
くぁ: "kwa",
くぃ: "kwi",
くぇ: "kwe",
くぉ: "kwo",
ぐぁ: "gwa",
ぐぃ: "gwi",
ぐぇ: "gwe",
ぐぉ: "gwo",
イェ: "ye",
ウィ: "wi",
ウェ: "we",
ウォ: "wo",
ヴ: "vu",
ヴァ: "va",
ヴィ: "vi",
ヴェ: "ve",
ヴォ: "vo",
ヴュ: "vyu",
ヴョ: "vyo",
キェ: "kya",
クァ: "kwa",
クィ: "kwi",
クェ: "kwe",
クォ: "kwo",
グァ: "gwa",
グィ: "gwi",
グェ: "gwe",
グォ: "gwo",
// 外来音(シェ~フョ)
しぇ: "she",
じぇ: "je",
// すぃ: "",
// ずぃ: "",
ちぇ: "che",
つぁ: "tsa",
つぃ: "tsi",
つぇ: "tse",
つぉ: "tso",
てぃ: "ti",
てゅ: "tyu",
でぃ: "di",
でゅ: "dyu",
とぅ: "tu",
どぅ: "du",
にぇ: "nye",
ひぇ: "hye",
ふぁ: "fa",
ふぃ: "fi",
ふぇ: "fe",
ふぉ: "fo",
ふゅ: "fyu",
ふょ: "fyo",
シェ: "she",
ジェ: "je",
// スィ: "",
// ズィ: "",
チェ: "che",
ツァ: "tsa",
ツィ: "tsi",
ツェ: "tse",
ツォ: "tso",
ティ: "ti",
テュ: "tyu",
ディ: "di",
デュ: "dyu",
トゥ: "tu",
ドゥ: "du",
ニェ: "nye",
ヒェ: "hye",
ファ: "fa",
フィ: "fi",
フェ: "fe",
フォ: "fo",
フュ: "fyu",
フョ: "fyo"
}
};
const reg_tsu = /(っ|ッ)([bcdfghijklmnopqrstuvwyz])/gm;
const reg_xtsu = /っ|ッ/gm;
let pnt = 0;
let ch;
let r;
let result = "";
// [PASSPORT] 長音省略 「―」の場合
if (system === ROMANIZATION_SYSTEM.PASSPORT) {
str = str.replace(/ー/gm, "");
}
// [NIPPON|HEPBURN] 撥音の特殊表記 a、i、u、e、o、y
if (system === ROMANIZATION_SYSTEM.NIPPON || system === ROMANIZATION_SYSTEM.HEPBURN) {
const reg_hatu = new RegExp(/(ん|ン)(?=あ|い|う|え|お|ア|イ|ウ|エ|オ|ぁ|ぃ|ぅ|ぇ|ぉ|ァ|ィ|ゥ|ェ|ォ|や|ゆ|よ|ヤ|ユ|ヨ|ゃ|ゅ|ょ|ャ|ュ|ョ)/g);
let match;
const indices = [];
while ((match = reg_hatu.exec(str)) !== null) {
indices.push(match.index + 1);
}
if (indices.length !== 0) {
let mStr = "";
for (let i = 0; i < indices.length; i++) {
if (i === 0) {
mStr += `${str.slice(0, indices[i])}'`;
} else {
mStr += `${str.slice(indices[i - 1], indices[i])}'`;
}
}
mStr += str.slice(indices[indices.length - 1]);
str = mStr;
}
}
// [ALL] kana to roman chars
const max = str.length;
while (pnt <= max) {
if (r = romajiSystem[system][str.substring(pnt, pnt + 2)]) {
result += r;
pnt += 2;
} else {
result += (r = romajiSystem[system][ch = str.substring(pnt, pnt + 1)]) ? r : ch;
pnt += 1;
}
}
result = result.replace(reg_tsu, "$2$2");
// [PASSPORT|HEPBURN] 子音を重ねて特殊表記
if (system === ROMANIZATION_SYSTEM.PASSPORT || system === ROMANIZATION_SYSTEM.HEPBURN) {
result = result.replace(/cc/gm, "tc");
}
result = result.replace(reg_xtsu, "tsu");
// [PASSPORT|HEPBURN] 撥音の特殊表記 b、m、p
if (system === ROMANIZATION_SYSTEM.PASSPORT || system === ROMANIZATION_SYSTEM.HEPBURN) {
result = result.replace(/nm/gm, "mm");
result = result.replace(/nb/gm, "mb");
result = result.replace(/np/gm, "mp");
}
// [NIPPON] 長音変換
if (system === ROMANIZATION_SYSTEM.NIPPON) {
result = result.replace(/aー/gm, "â");
result = result.replace(/iー/gm, "î");
result = result.replace(/uー/gm, "û");
result = result.replace(/eー/gm, "ê");
result = result.replace(/oー/gm, "ô");
}
// [HEPBURN] 長音変換
if (system === ROMANIZATION_SYSTEM.HEPBURN) {
result = result.replace(/aー/gm, "ā");
result = result.replace(/iー/gm, "ī");
result = result.replace(/uー/gm, "ū");
result = result.replace(/eー/gm, "ē");
result = result.replace(/oー/gm, "ō");
}
return result;
};
/**
* Get the type of given string
*
* @param {string} str Given string
* @return {number} Type number. 0 for pure kanji, 1 for kanji-kana-mixed, 2 for pure kana, 3 for others
*/
const getStrType = exports.getStrType = function getStrType(str) {
let hasKJ = false;
let hasHK = false;
for (let i = 0; i < str.length; i++) {
if (isKanji(str[i])) {
hasKJ = true;
} else if (isHiragana(str[i]) || isKatakana(str[i])) {
hasHK = true;
}
}
if (hasKJ && hasHK) return 1;
if (hasKJ) return 0;
if (hasHK) return 2;
return 3;
};
/**
* Patch tokens for conversion
* @param {Object} tokens Given tokens
* @return {Object} Patched tokens
*/
const patchTokens = exports.patchTokens = function patchTokens(tokens) {
// patch for token structure
for (let cr = 0; cr < tokens.length; cr++) {
if (hasJapanese(tokens[cr].surface_form)) {
if (!tokens[cr].reading) {
if (tokens[cr].surface_form.split("").every(isKana)) {
tokens[cr].reading = toRawKatakana(tokens[cr].surface_form);
} else {
tokens[cr].reading = tokens[cr].surface_form;
}
} else if (hasHiragana(tokens[cr].reading)) {
tokens[cr].reading = toRawKatakana(tokens[cr].reading);
}
} else {
tokens[cr].reading = tokens[cr].surface_form;
}
}
// patch for 助動詞"う" after 動詞
for (let i = 0; i < tokens.length; i++) {
if (tokens[i].pos && tokens[i].pos === "助動詞" && (tokens[i].surface_form === "う" || tokens[i].surface_form === "ウ")) {
if (i - 1 >= 0 && tokens[i - 1].pos && tokens[i - 1].pos === "動詞") {
tokens[i - 1].surface_form += "う";
if (tokens[i - 1].pronunciation) {
tokens[i - 1].pronunciation += "ー";
} else {
tokens[i - 1].pronunciation = `${tokens[i - 1].reading}ー`;
}
tokens[i - 1].reading += "ウ";
tokens.splice(i, 1);
i--;
}
}
}
// patch for "っ" at the tail of 動詞、形容詞
for (let j = 0; j < tokens.length; j++) {
if (tokens[j].pos && (tokens[j].pos === "動詞" || tokens[j].pos === "形容詞") && tokens[j].surface_form.length > 1 && (tokens[j].surface_form[tokens[j].surface_form.length - 1] === "っ" || tokens[j].surface_form[tokens[j].surface_form.length - 1] === "ッ")) {
if (j + 1 < tokens.length) {
tokens[j].surface_form += tokens[j + 1].surface_form;
if (tokens[j].pronunciation) {
tokens[j].pronunciation += tokens[j + 1].pronunciation;
} else {
tokens[j].pronunciation = `${tokens[j].reading}${tokens[j + 1].reading}`;
}
tokens[j].reading += tokens[j + 1].reading;
tokens.splice(j + 1, 1);
j--;
}
}
}
return tokens;
};
/**
* Convert kana to hiragana
*
* @param {string} str Given string
* @return {string} Hiragana string
*/
const kanaToHiragna = exports.kanaToHiragna = function kanaToHiragna(str) {
return toRawHiragana(str);
};
/**
* Convert kana to katakana
*
* @param {string} str Given string
* @return {string} Katakana string
*/
const kanaToKatakana = exports.kanaToKatakana = function kanaToKatakana(str) {
return toRawKatakana(str);
};
/**
* Convert kana to romaji
*
* @param {string} str Given string
* @param {string} system To which romanization system the given string is converted. ["nippon"|"passport"|"hepburn"]
* @return {string} Romaji string
*/
const kanaToRomaji = exports.kanaToRomaji = function kanaToRomaji(str, system) {
return toRawRomaji(str, system);
};