UNPKG

jaconv

Version:

Japanese character conversion library

356 lines (300 loc) 5.88 kB
//--------------------------------------------------------------------- // 全角・半角変換 // // 2005/2/26 Kazuhiko Arase // const 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', '{', '{', '|', '|', '}', '}', '~', '~' ]; const kanaData = [ '。', '。', '「', '「', '」', '」', '、', '、', '・', '・', 'ヲ', 'ヲ', 'ァ', 'ァ', 'ィ', 'ィ', 'ゥ', 'ゥ', 'ェ', 'ェ', 'ォ', 'ォ', 'ャ', 'ャ', 'ュ', 'ュ', 'ョ', 'ョ', 'ッ', 'ッ', 'ー', 'ー', 'ア', 'ア', 'イ', 'イ', 'ウ', 'ウ', 'エ', 'エ', 'オ', 'オ', 'カ', 'カ', 'キ', 'キ', 'ク', 'ク', 'ケ', 'ケ', 'コ', 'コ', 'ガ', 'ガ', 'ギ', 'ギ', 'グ', 'グ', 'ゲ', 'ゲ', 'ゴ', 'ゴ', 'サ', 'サ', 'シ', 'シ', 'ス', 'ス', 'セ', 'セ', 'ソ', 'ソ', 'ザ', 'ザ', 'ジ', 'ジ', 'ズ', 'ズ', 'ゼ', 'ゼ', 'ゾ', 'ゾ', 'タ', 'タ', 'チ', 'チ', 'ツ', 'ツ', 'テ', 'テ', 'ト', 'ト', 'ダ', 'ダ', 'ヂ', 'ヂ', 'ヅ', 'ヅ', 'デ', 'デ', 'ド', 'ド', 'ナ', 'ナ', 'ニ', 'ニ', 'ヌ', 'ヌ', 'ネ', 'ネ', 'ノ', 'ノ', 'ハ', 'ハ', 'ヒ', 'ヒ', 'フ', 'フ', 'ヘ', 'ヘ', 'ホ', 'ホ', 'バ', 'バ', 'ビ', 'ビ', 'ブ', 'ブ', 'ベ', 'ベ', 'ボ', 'ボ', 'パ', 'パ', 'ピ', 'ピ', 'プ', 'プ', 'ペ', 'ペ', 'ポ', 'ポ', 'マ', 'マ', 'ミ', 'ミ', 'ム', 'ム', 'メ', 'メ', 'モ', 'モ', 'ヤ', 'ヤ', 'ユ', 'ユ', 'ヨ', 'ヨ', 'ラ', 'ラ', 'リ', 'リ', 'ル', 'ル', 'レ', 'レ', 'ロ', 'ロ', 'ワ', 'ワ', 'ン', 'ン', 'ヴ', 'ヴ', '゛', '゙', '゜', '゚', 'ヰ', 'イ', 'ヱ', 'エ', 'ヮ', 'ワ', 'ヵ', 'カ', 'ヶ', 'ケ' ]; declare type StringMap = { [k : string] : string }; const createConversionMap = function(data : string[]) { const map1 : StringMap = {}; const map2 : StringMap = {}; const add = function(s1 : string, s2 : string) { if (!map1[s1]) { map1[s1] = s2; } if (!map2[s2]) { map2[s2] = s1; } }; const convert = function(s : string, reverse : boolean) { const map = !reverse? map1 : map2; let converted = ''; for (let i = 0; i < s.length; i += 1) { if (i + 1 < s.length) { const c = map[s.substring(i, i + 2)]; if (c) { converted += c; i += 1; continue; } } const 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; } const len = data.length / 2; for (let i = 0; i < len; i += 1) { add(data[i * 2], data[i * 2 + 1]); } return { convert : convert }; }; //--------------------------------------------------------- // 全角-半角 マッピング (ASCII) // const asciiMap = createConversionMap(asciiData); //--------------------------------------------------------- // 全角-半角 マッピング (カタカナ) // const kanaMap = createConversionMap(kanaData); // exports /** * 全角英数記号を半角に変換します。 */ export function toHanAscii(s : string) { return asciiMap.convert(s, true); } /** * 半角英数記号を全角に変換します。 */ export function toZenAscii(s : string) { return asciiMap.convert(s, false); } /** * 全角カタカナを半角に変換します。 */ export function toHanKana(s : string) { return kanaMap.convert(s, false); } /** * 半角カタカナを全角に変換します。 */ export function toZenKana(s : string) { return kanaMap.convert(s, true); } /** * 全角英数記号、カタカナを半角に変換します。 * (toHanAscii, toHanKana の組み合わせ) */ export function toHan(s : string) { return toHanAscii(toHanKana(s) ); } /** * 半角英数記号、カタカナを全角に変換します。 * (toZenAscii, toZenKana の組み合わせ) */ export function toZen(s : string) { return toZenAscii(toZenKana(s) ); } /** * 全角英数記号を半角に、半角カタカナを全角に変換します。 * (toHanAscii, toZenKana の組み合わせ) */ export function normalize(s : string) { return toHanAscii(toZenKana(s) ); }