UNPKG

@dsquare-gbu/kuroshiro

Version:

kuroshiro is a Japanese language library for converting Japanese sentence to Hiragana, Katakana or Romaji with furigana and okurigana modes supported.

1,769 lines (1,660 loc) 59.9 kB
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Kuroshiro = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ "use strict"; var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { return typeof obj === "undefined" ? "undefined" : _typeof2(obj); } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj); }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); } }return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; }; }(); var _util = require("./util"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * Kuroshiro Class */ var Kuroshiro = function () { /** * Constructor * @constructs Kuroshiro */ function Kuroshiro() { _classCallCheck(this, Kuroshiro); this._analyzer = null; } /** * Initialize Kuroshiro * @memberOf Kuroshiro * @instance * @returns {Promise} Promise object represents the result of initialization */ _createClass(Kuroshiro, [{ key: "init", value: function init(analyzer) { if (!analyzer || (typeof analyzer === "undefined" ? "undefined" : _typeof(analyzer)) !== "object" || typeof analyzer.init !== "function" || typeof analyzer.parse !== "function") { throw new Error("Invalid initialization parameter."); } else if (this._analyzer == null) { try { var _this = this; return analyzer.init().then(function () { _this._analyzer = analyzer; }); } catch (err) { throw err; } } else { throw new Error("Kuroshiro has already been initialized."); } } /** * Convert given string to target syllabary with options available * @memberOf Kuroshiro * @instance * @param {string} str Given String * @param {Object} [options] Settings Object * @param {string} [options.to="hiragana"] Target syllabary ["hiragana"|"katakana"|"romaji"] * @param {string} [options.mode="normal"] Convert mode ["normal"|"spaced"|"okurigana"|"furigana"] * @param {string} [options.romajiSystem="hepburn"] Romanization System ["nippon"|"passport"|"hepburn"] * @param {string} [options.delimiter_start="("] Delimiter(Start) * @param {string} [options.delimiter_end=")"] Delimiter(End) * @returns {Promise} Promise object represents the result of conversion */ }, { key: "convert", value: function convert(str, options) { options = options || {}; options.to = options.to || "hiragana"; options.mode = options.mode || "normal"; options.romajiSystem = options.romajiSystem || _util.ROMANIZATION_SYSTEM.HEPBURN; options.delimiter_start = options.delimiter_start || "("; options.delimiter_end = options.delimiter_end || ")"; str = str || ""; if (["hiragana", "katakana", "romaji"].indexOf(options.to) === -1) { throw new Error("Invalid Target Syllabary."); } if (["normal", "spaced", "okurigana", "furigana"].indexOf(options.mode) === -1) { throw new Error("Invalid Conversion Mode."); } var ROMAJI_SYSTEMS = Object.keys(_util.ROMANIZATION_SYSTEM).map(function (e) { return _util.ROMANIZATION_SYSTEM[e]; }); if (ROMAJI_SYSTEMS.indexOf(options.romajiSystem) === -1) { throw new Error("Invalid Romanization System."); } return this._analyzer.parse(str).then(function (rawTokens) { var tokens = (0, _util.patchTokens)(rawTokens); if (options.mode === "normal" || options.mode === "spaced") { switch (options.to) { case "katakana": if (options.mode === "normal") { return tokens.map(function (token) { return token.reading; }).join(""); } return tokens.map(function (token) { return token.reading; }).join(" "); case "romaji": var romajiConv = function romajiConv(token) { var preToken = void 0; if ((0, _util.hasJapanese)(token.surface_form)) { preToken = token.pronunciation || token.reading; } else { preToken = token.surface_form; } return (0, _util.toRawRomaji)(preToken, options.romajiSystem); }; if (options.mode === "normal") { return tokens.map(romajiConv).join(""); } return tokens.map(romajiConv).join(" "); case "hiragana": for (var hi = 0; hi < tokens.length; hi++) { if ((0, _util.hasKanji)(tokens[hi].surface_form)) { if (!(0, _util.hasKatakana)(tokens[hi].surface_form)) { tokens[hi].reading = (0, _util.toRawHiragana)(tokens[hi].reading); } else { // handle katakana-kanji-mixed tokens tokens[hi].reading = (0, _util.toRawHiragana)(tokens[hi].reading); var tmp = ""; var hpattern = ""; for (var hc = 0; hc < tokens[hi].surface_form.length; hc++) { if ((0, _util.isKanji)(tokens[hi].surface_form[hc])) { hpattern += "(.*)"; } else { hpattern += (0, _util.isKatakana)(tokens[hi].surface_form[hc]) ? (0, _util.toRawHiragana)(tokens[hi].surface_form[hc]) : tokens[hi].surface_form[hc]; } } var hreg = new RegExp(hpattern); var hmatches = hreg.exec(tokens[hi].reading); if (hmatches) { var pickKJ = 0; for (var hc1 = 0; hc1 < tokens[hi].surface_form.length; hc1++) { if ((0, _util.isKanji)(tokens[hi].surface_form[hc1])) { tmp += hmatches[pickKJ + 1]; pickKJ++; } else { tmp += tokens[hi].surface_form[hc1]; } } tokens[hi].reading = tmp; } } } else { tokens[hi].reading = tokens[hi].surface_form; } } if (options.mode === "normal") { return tokens.map(function (token) { return token.reading; }).join(""); } return tokens.map(function (token) { return token.reading; }).join(" "); default: throw new Error("Unknown option.to param"); } } else if (options.mode === "okurigana" || options.mode === "furigana") { var notations = []; // [basic, basic_type[1=kanji,2=kana,3=others], notation, pronunciation] for (var i = 0; i < tokens.length; i++) { var strType = (0, _util.getStrType)(tokens[i].surface_form); switch (strType) { case 0: notations.push([tokens[i].surface_form, 1, (0, _util.toRawHiragana)(tokens[i].reading), tokens[i].pronunciation || tokens[i].reading]); break; case 1: var pattern = ""; var isLastTokenKanji = false; var subs = []; // recognize kanjis and group them for (var c = 0; c < tokens[i].surface_form.length; c++) { if ((0, _util.isKanji)(tokens[i].surface_form[c])) { if (!isLastTokenKanji) { // ignore successive kanji tokens (#10) isLastTokenKanji = true; pattern += "(.*)"; subs.push(tokens[i].surface_form[c]); } else { subs[subs.length - 1] += tokens[i].surface_form[c]; } } else { isLastTokenKanji = false; subs.push(tokens[i].surface_form[c]); pattern += (0, _util.isKatakana)(tokens[i].surface_form[c]) ? (0, _util.toRawHiragana)(tokens[i].surface_form[c]) : tokens[i].surface_form[c]; } } var reg = new RegExp("^" + pattern + "$"); var matches = reg.exec((0, _util.toRawHiragana)(tokens[i].reading)); if (matches) { var pickKanji = 1; for (var c1 = 0; c1 < subs.length; c1++) { if ((0, _util.isKanji)(subs[c1][0])) { notations.push([subs[c1], 1, matches[pickKanji], (0, _util.toRawKatakana)(matches[pickKanji])]); pickKanji += 1; } else { notations.push([subs[c1], 2, (0, _util.toRawHiragana)(subs[c1]), (0, _util.toRawKatakana)(subs[c1])]); } } } else { notations.push([tokens[i].surface_form, 1, (0, _util.toRawHiragana)(tokens[i].reading), tokens[i].pronunciation || tokens[i].reading]); } break; case 2: for (var c2 = 0; c2 < tokens[i].surface_form.length; c2++) { notations.push([tokens[i].surface_form[c2], 2, (0, _util.toRawHiragana)(tokens[i].reading[c2]), tokens[i].pronunciation && tokens[i].pronunciation[c2] || tokens[i].reading[c2]]); } break; case 3: for (var c3 = 0; c3 < tokens[i].surface_form.length; c3++) { notations.push([tokens[i].surface_form[c3], 3, tokens[i].surface_form[c3], tokens[i].surface_form[c3]]); } break; default: throw new Error("Unknown strType"); } } var result = ""; switch (options.to) { case "katakana": if (options.mode === "okurigana") { for (var n0 = 0; n0 < notations.length; n0++) { if (notations[n0][1] !== 1) { result += notations[n0][0]; } else { result += notations[n0][0] + options.delimiter_start + (0, _util.toRawKatakana)(notations[n0][2]) + options.delimiter_end; } } } else { // furigana for (var n1 = 0; n1 < notations.length; n1++) { if (notations[n1][1] !== 1) { result += notations[n1][0]; } else { result += "<ruby>" + notations[n1][0] + "<rp>" + options.delimiter_start + "</rp><rt>" + (0, _util.toRawKatakana)(notations[n1][2]) + "</rt><rp>" + options.delimiter_end + "</rp></ruby>"; } } } return result; case "romaji": if (options.mode === "okurigana") { for (var n2 = 0; n2 < notations.length; n2++) { if (notations[n2][1] !== 1) { result += notations[n2][0]; } else { result += notations[n2][0] + options.delimiter_start + (0, _util.toRawRomaji)(notations[n2][3], options.romajiSystem) + options.delimiter_end; } } } else { // furigana result += "<ruby>"; for (var n3 = 0; n3 < notations.length; n3++) { result += notations[n3][0] + "<rp>" + options.delimiter_start + "</rp><rt>" + (0, _util.toRawRomaji)(notations[n3][3], options.romajiSystem) + "</rt><rp>" + options.delimiter_end + "</rp>"; } result += "</ruby>"; } return result; case "hiragana": if (options.mode === "okurigana") { for (var n4 = 0; n4 < notations.length; n4++) { if (notations[n4][1] !== 1) { result += notations[n4][0]; } else { result += notations[n4][0] + options.delimiter_start + notations[n4][2] + options.delimiter_end; } } } else { // furigana for (var n5 = 0; n5 < notations.length; n5++) { if (notations[n5][1] !== 1) { result += notations[n5][0]; } else { result += "<ruby>" + notations[n5][0] + "<rp>" + options.delimiter_start + "</rp><rt>" + notations[n5][2] + "</rt><rp>" + options.delimiter_end + "</rp></ruby>"; } } } return result; default: throw new Error("Invalid Target Syllabary."); } } }); } }]); return Kuroshiro; }(); var Util = { isHiragana: _util.isHiragana, isKatakana: _util.isKatakana, isKana: _util.isKana, isKanji: _util.isKanji, isJapanese: _util.isJapanese, hasHiragana: _util.hasHiragana, hasKatakana: _util.hasKatakana, hasKana: _util.hasKana, hasKanji: _util.hasKanji, hasJapanese: _util.hasJapanese, kanaToHiragna: _util.kanaToHiragna, kanaToKatakana: _util.kanaToKatakana, kanaToRomaji: _util.kanaToRomaji }; Kuroshiro.Util = Util; exports.default = Kuroshiro; module.exports = exports["default"]; },{"./util":3}],2:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _core = require("./core"); var _core2 = _interopRequireDefault(_core); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = _core2.default; module.exports = exports["default"]; },{"./core":1}],3:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var KATAKANA_HIRAGANA_SHIFT = "\u3041".charCodeAt(0) - "\u30A1".charCodeAt(0); var HIRAGANA_KATAKANA_SHIFT = "\u30A1".charCodeAt(0) - "\u3041".charCodeAt(0); var 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 */ var 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 */ var 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 */ var 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 */ var 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 */ var 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 */ var hasHiragana = function hasHiragana(str) { for (var 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 */ var hasKatakana = function hasKatakana(str) { for (var 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 */ var hasKana = function hasKana(str) { for (var 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 */ var hasKanji = function hasKanji(str) { for (var 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 */ var hasJapanese = function hasJapanese(str) { for (var 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 */ var toRawHiragana = function toRawHiragana(str) { return splitChars(str).map(function (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 */ var toRawKatakana = function toRawKatakana(str) { return splitChars(str).map(function (ch) { if (ch > "\u3040" && ch < "\u3097") { return String.fromCharCode(ch.charCodeAt(0) + HIRAGANA_KATAKANA_SHIFT); } return ch; }).join(""); }; var splitChars = function splitChars(str) { try { return str.split(new RegExp("(?!$)", "u")); } catch (e) { return str.split(""); } }; /** * 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 */ var toRawRomaji = function toRawRomaji(str, system) { system = system || ROMANIZATION_SYSTEM.HEPBURN; var 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" } }; var reg_tsu = /(っ|ッ)([bcdfghijklmnopqrstuvwyz])/gm; var reg_xtsu = /っ|ッ/gm; var pnt = 0; var ch = void 0; var r = void 0; var 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) { var reg_hatu = new RegExp(/(ん|ン)(?=あ|い|う|え|お|ア|イ|ウ|エ|オ|ぁ|ぃ|ぅ|ぇ|ぉ|ァ|ィ|ゥ|ェ|ォ|や|ゆ|よ|ヤ|ユ|ヨ|ゃ|ゅ|ょ|ャ|ュ|ョ)/g); var match = void 0; var indices = []; while ((match = reg_hatu.exec(str)) !== null) { indices.push(match.index + 1); } if (indices.length !== 0) { var mStr = ""; for (var 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 var max = str.length; while (pnt <= max) { if (r = romajiSystem[system][str.subst