//--------------------------------------------------------------------- // ヘボン式ローマ字変換 // // Copyright (c) 2011 Kazuhiko Arase // // URL: https://github.com/kazuhikoarase/jaconv // // Licensed under the MIT license: // http://www.opensource.org/licenses/mit-license.php // //--------------------------------------------------------------------- var jaconv; (function (jaconv) { // 'ん' は、別途ハンドリングするのでデータに含めない var hebonMap = { 'あ': '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', 'ゐ': 'I', 'ゑ': 'E', 'を': 'O', 'ぁ': 'A', 'ぃ': 'I', 'ぅ': 'U', 'ぇ': 'E', 'ぉ': 'O', 'が': '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', 'ちぇ': 'CHE', 'にゃ': 'NYA', 'にゅ': 'NYU', 'にょ': 'NYO', 'ひゃ': 'HYA', 'ひゅ': 'HYU', 'ひょ': 'HYO', 'みゃ': 'MYA', 'みゅ': 'MYU', 'みょ': 'MYO', 'りゃ': 'RYA', 'りゅ': 'RYU', 'りょ': 'RYO', 'ぎゃ': 'GYA', 'ぎゅ': 'GYU', 'ぎょ': 'GYO', 'じゃ': 'JA', 'じゅ': 'JU', 'じょ': 'JO', 'びゃ': 'BYA', 'びゅ': 'BYU', 'びょ': 'BYO', 'ぴゃ': 'PYA', 'ぴゅ': 'PYU', 'ぴょ': 'PYO' }; var aaSet = { 'AA': true, 'EE': true, 'II': false, 'OO': true, 'OU': true, 'UU': true }; var getHebon = function (s, index) { var h = null; var c = null; if (index + 1 < s.length) { c = s.substring(index, index + 2); h = hebonMap[c]; } if (!h && index < s.length) { c = s.substring(index, index + 1); h = hebonMap[c]; } return { c: c, h: h || null }; }; /** * 全角ひらがなをヘボン式ローマ字で半角英文字に変換します。 */ function toHebon(s) { var hebon = ''; var lastHebon = ''; var lastChar = ''; var i = 0; while (i < s.length) { var hr = getHebon(s, i); if (hr.c == 'っ') { // 'っち' var nextHr = getHebon(s, i + 1); if (nextHr.h != null) { if (nextHr.h.indexOf('CH') == 0) { hr.h = 'T'; } else { hr.h = nextHr.h.substring(0, 1); } } } else if (hr.c == 'ん') { // B,M,P の前の 'ん' は 'M' とする。 var nextHr = getHebon(s, i + 1); if (nextHr.h != null && 'BMP'.indexOf(nextHr.h.charAt(0)) != -1) { hr.h = 'M'; } else { hr.h = 'N'; } } else if (hr.c == 'ー') { // 長音は無視 hr.h = ''; } if (hr.h != null) { // 変換できる文字の場合 if (lastHebon != null) { // 連続する母音の除去 var htest = lastHebon + hr.h; if (htest.length > 2) { htest = htest.substring(htest.length - 2); } if (aaSet[htest]) { hr.h = ''; } } hebon += hr.h; } else { // 変換できない文字の場合 hebon += hr.c; } lastHebon = hr.h; lastChar = hr.c; i += hr.c.length; } return hebon; } jaconv.toHebon = toHebon; })(jaconv || (jaconv = {})); var jaconv; (function (jaconv) { var minHira = 'ぁ'.charCodeAt(0); var maxHira = 'ゖ'.charCodeAt(0); var minKata = 'ァ'.charCodeAt(0); var maxKata = 'ヶ'.charCodeAt(0); /** * 全角ひらがなを全角カタカナに変換します。 */ function toKatakana(s) { var res = ''; for (var i = 0; i < s.length; i += 1) { var cd = s.charCodeAt(i); res += (minHira <= cd && cd <= maxHira) ? String.fromCharCode(cd - minHira + minKata) : s.charAt(i); } return res; } jaconv.toKatakana = toKatakana; /** * 全角カタカナを全角ひらがなに変換します。 */ function toHiragana(s) { var res = ''; for (var i = 0; i < s.length; i += 1) { var cd = s.charCodeAt(i); res += (minKata <= cd && cd <= maxKata) ? String.fromCharCode(cd - minKata + minHira) : s.charAt(i); } return res; } jaconv.toHiragana = toHiragana; })(jaconv || (jaconv = {})); //--------------------------------------------------------------------- // node // var jaconv; (function (jaconv) { if (typeof exports === 'object') { module.exports = jaconv; } })(jaconv || (jaconv = {})); //--------------------------------------------------------------------- // 全角・半角変換 // // 2005/2/26 Kazuhiko Arase // var jaconv; (function (jaconv) { var asciiData = [ '\u0020', '\u3000', '!', '!', // 2重引用符 //'\"', '"', '\"', '”', '\"', '“', '#', '#', '$', '$', '%', '%', '&', '&', '\'', '’', '(', '(', ')', ')', '*', '*', '+', '+', ',', ',', '-', '-', '.', '.', '/', '/', '0', '0', '1', '1', '2', '2', '3', '3', '4', '4', '5', '5', '6', '6', '7', '7', '8', '8', '9', '9', ':', ':', ';', ';', '<', '<', '=', '=', '>', '>', '?', '?', '@', '@', 'A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E', 'E', 'F', 'F', 'G', 'G', 'H', 'H', 'I', 'I', 'J', 'J', 'K', 'K', 'L', 'L', 'M', 'M', 'N', 'N', 'O', 'O', 'P', 'P', 'Q', 'Q', 'R', 'R', 'S', 'S', 'T', 'T', 'U', 'U', 'V', 'V', 'W', 'W', 'X', 'X', 'Y', 'Y', 'Z', 'Z', '[', '[', // 円記号 //'\\', '\', '\\', '¥', ']', ']', '^', '^', '_', '_', '`', '‘', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'e', 'e', 'f', 'f', 'g', 'g', 'h', 'h', 'i', 'i', 'j', 'j', 'k', 'k', 'l', 'l', 'm', 'm', 'n', 'n', 'o', 'o', 'p', 'p', 'q', 'q', 'r', 'r', 's', 's', 't', 't', 'u', 'u', 'v', 'v', 'w', 'w', 'x', 'x', 'y', 'y', 'z', 'z', '{', '{', '|', '|', '}', '}', '~', '~' ]; var kanaData = [ '。', '。', '「', '「', '」', '」', '、', '、', '・', '・', 'ヲ', 'ヲ', 'ァ', 'ァ', 'ィ', 'ィ', 'ゥ', 'ゥ', 'ェ', 'ェ', 'ォ', 'ォ', 'ャ', 'ャ', 'ュ', 'ュ', 'ョ', 'ョ', 'ッ', 'ッ', 'ー', 'ー', 'ア', 'ア', 'イ', 'イ', 'ウ', 'ウ', 'エ', 'エ', 'オ', 'オ', 'カ', 'カ', 'キ', 'キ', 'ク', 'ク', 'ケ', 'ケ', 'コ', 'コ', 'ガ', 'ガ', 'ギ', 'ギ', 'グ', 'グ', 'ゲ', 'ゲ', 'ゴ', 'ゴ', 'サ', 'サ', 'シ', 'シ', 'ス', 'ス', 'セ', 'セ', 'ソ', 'ソ', 'ザ', 'ザ', 'ジ', 'ジ', 'ズ', 'ズ', 'ゼ', 'ゼ', 'ゾ', 'ゾ', 'タ', 'タ', 'チ', 'チ', 'ツ', 'ツ', 'テ', 'テ', 'ト', 'ト', 'ダ', 'ダ', 'ヂ', 'ヂ', 'ヅ', 'ヅ', 'デ', 'デ', 'ド', 'ド', 'ナ', 'ナ', 'ニ', 'ニ', 'ヌ', 'ヌ', 'ネ', 'ネ', 'ノ', 'ノ', 'ハ', 'ハ', 'ヒ', 'ヒ', 'フ', 'フ', 'ヘ', 'ヘ', 'ホ', 'ホ', 'バ', 'バ', 'ビ', 'ビ', 'ブ', 'ブ', 'ベ', 'ベ', 'ボ', 'ボ', 'パ', 'パ', 'ピ', 'ピ', 'プ', 'プ', 'ペ', 'ペ', 'ポ', 'ポ', 'マ', 'マ', 'ミ', 'ミ', 'ム', 'ム', 'メ', 'メ', 'モ', 'モ', 'ヤ', 'ヤ', 'ユ', 'ユ', 'ヨ', 'ヨ', 'ラ', 'ラ', 'リ', 'リ', 'ル', 'ル', 'レ', 'レ', 'ロ', 'ロ', 'ワ', 'ワ', 'ン', 'ン', 'ヴ', 'ヴ', '゛', '゙', '゜', '゚', 'ヰ', 'イ', 'ヱ', 'エ', 'ヮ', 'ワ', 'ヵ', 'カ', 'ヶ', 'ケ' ]; var createConversionMap = function (data) { var map1 = {}; var map2 = {}; var add = function (s1, s2) { if (!map1[s1]) { map1[s1] = s2; } if (!map2[s2]) { map2[s2] = s1; } }; var convert = function (s, reverse) { var map = !reverse ? map1 : map2; var converted = ''; for (var i = 0; i < s.length; i += 1) { if (i + 1 < s.length) { var c = map[s.substring(i, i + 2)]; if (c) { converted += c; i += 1; continue; } } var c = map[s.substring(i, i + 1)]; if (c) { converted += c; continue; } // 変換テーブルに該当無し converted += s.substring(i, i + 1); } return converted; }; if (data.length % 2 != 0) { throw 'bad data length:' + data.length; } var len = data.length / 2; for (var i = 0; i < len; i += 1) { add(data[i * 2], data[i * 2 + 1]); } return { convert: convert }; }; //--------------------------------------------------------- // 全角-半角 マッピング (ASCII) // var asciiMap = createConversionMap(asciiData); //--------------------------------------------------------- // 全角-半角 マッピング (カタカナ) // var kanaMap = createConversionMap(kanaData); // exports /** * 全角英数記号を半角に変換します。 */ function toHanAscii(s) { return asciiMap.convert(s, true); } jaconv.toHanAscii = toHanAscii; /** * 半角英数記号を全角に変換します。 */ function toZenAscii(s) { return asciiMap.convert(s, false); } jaconv.toZenAscii = toZenAscii; /** * 全角カタカナを半角に変換します。 */ function toHanKana(s) { return kanaMap.convert(s, false); } jaconv.toHanKana = toHanKana; /** * 半角カタカナを全角に変換します。 */ function toZenKana(s) { return kanaMap.convert(s, true); } jaconv.toZenKana = toZenKana; /** * 全角英数記号、カタカナを半角に変換します。 * (toHanAscii, toHanKana の組み合わせ) */ function toHan(s) { return toHanAscii(toHanKana(s)); } jaconv.toHan = toHan; /** * 半角英数記号、カタカナを全角に変換します。 * (toZenAscii, toZenKana の組み合わせ) */ function toZen(s) { return toZenAscii(toZenKana(s)); } jaconv.toZen = toZen; /** * 全角英数記号を半角に、半角カタカナを全角に変換します。 * (toHanAscii, toZenKana の組み合わせ) */ function normalize(s) { return toHanAscii(toZenKana(s)); } jaconv.normalize = normalize; })(jaconv || (jaconv = {})); //# sourceMappingURL=jaconv.js.map