@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
JavaScript
(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