Last active
August 29, 2015 14:10
-
-
Save shunito/dc151159d3651ef6e6ef to your computer and use it in GitHub Desktop.
分かち書きされたよみがなをブライユ式点字(Unicode)に変換
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Kana to Braille | |
| // Copyright 2014 Shunsuke Ito | |
| // 分かち書きされたよみがなをブライユ式点字(Unicode)に変換 | |
| // http://ja.wikipedia.org/wiki/%E7%82%B9%E5%AD%97 | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| (function(definition) { | |
| // CommonJS | |
| if (typeof exports === "object") { | |
| module.exports = definition(); | |
| // RequireJS | |
| } else if (typeof define === "function" && define.amd) { | |
| define(definition); | |
| // <script> | |
| } else { | |
| Braille = definition(); | |
| } | |
| })(function() { | |
| 'use strict'; | |
| var Braille = function Braille() {}; | |
| var charlist = []; | |
| // 拗音 (拗音符 '⠈') | |
| // 拗音などは複数文字置換のため行列の先頭において先に処理する | |
| // TODO: 開拗音・合拗音など | |
| charlist.push([/きゃ/g, '⠈' + '⠡']); | |
| charlist.push([/きゅ/g, '⠈' + '⠩']); | |
| charlist.push([/きょ/g, '⠈' + '⠪']); | |
| charlist.push([/しゃ/g, '⠈' + '⠱']); | |
| charlist.push([/しゅ/g, '⠈' + '⠹']); | |
| charlist.push([/しょ/g, '⠈' + '⠺']); | |
| charlist.push([/ちゃ/g, '⠈' + '⠕']); | |
| charlist.push([/ちゅ/g, '⠈' + '⠝']); | |
| charlist.push([/ちょ/g, '⠈' + '⠞']); | |
| charlist.push([/にゃ/g, '⠈' + '⠅']); | |
| charlist.push([/にゅ/g, '⠈' + '⠍']); | |
| charlist.push([/にょ/g, '⠈' + '⠎']); | |
| charlist.push([/ひゃ/g, '⠈' + '⠥']); | |
| charlist.push([/ひゅ/g, '⠈' + '⠭']); | |
| charlist.push([/ひょ/g, '⠈' + '⠮']); | |
| charlist.push([/みゃ/g, '⠈' + '⠵']); | |
| charlist.push([/みゅ/g, '⠈' + '⠽']); | |
| charlist.push([/みょ/g, '⠈' + '⠾']); | |
| charlist.push([/りゃ/g, '⠈' + '⠑']); | |
| charlist.push([/りゅ/g, '⠈' + '⠙']); | |
| charlist.push([/りょ/g, '⠈' + '⠚']); | |
| // 濁音+拗音 (濁音符と拗音符:'⠘') | |
| charlist.push([/ぎゃ/g, '⠘' + '⠡']); | |
| charlist.push([/ぎゅ/g, '⠘' + '⠩']); | |
| charlist.push([/ぎょ/g, '⠘' + '⠪']); | |
| charlist.push([/じゃ/g, '⠘' + '⠱']); | |
| charlist.push([/じゅ/g, '⠘' + '⠹']); | |
| charlist.push([/じょ/g, '⠘' + '⠺']); | |
| charlist.push([/ぢゃ/g, '⠘' + '⠕']); | |
| charlist.push([/ぢゅ/g, '⠘' + '⠝']); | |
| charlist.push([/ぢょ/g, '⠘' + '⠞']); | |
| charlist.push([/びゃ/g, '⠘' + '⠥']); | |
| charlist.push([/びゅ/g, '⠘' + '⠭']); | |
| charlist.push([/びょ/g, '⠘' + '⠮']); | |
| // 半濁音+拗音 (半濁音符と拗音符:'⠨') | |
| charlist.push([/ぴゃ/g, '⠨' + '⠥']); | |
| charlist.push([/ぴゅ/g, '⠨' + '⠭']); | |
| charlist.push([/ぴょ/g, '⠨' + '⠮']); | |
| // 濁音 (濁音符 '⠐') | |
| charlist.push([/が/g, '⠐' + '⠡']); | |
| charlist.push([/ぎ/g, '⠐' + '⠣']); | |
| charlist.push([/ぐ/g, '⠐' + '⠩']); | |
| charlist.push([/げ/g, '⠐' + '⠫']); | |
| charlist.push([/ご/g, '⠐' + '⠪']); | |
| charlist.push([/ざ/g, '⠐' + '⠱']); | |
| charlist.push([/じ/g, '⠐' + '⠳']); | |
| charlist.push([/ず/g, '⠐' + '⠹']); | |
| charlist.push([/ぜ/g, '⠐' + '⠻']); | |
| charlist.push([/ぞ/g, '⠐' + '⠺']); | |
| charlist.push([/だ/g, '⠐' + '⠕']); | |
| charlist.push([/ぢ/g, '⠐' + '⠗']); | |
| charlist.push([/づ/g, '⠐' + '⠝']); | |
| charlist.push([/で/g, '⠐' + '⠟']); | |
| charlist.push([/ど/g, '⠐' + '⠞']); | |
| charlist.push([/ば/g, '⠐' + '⠥']); | |
| charlist.push([/び/g, '⠐' + '⠧']); | |
| charlist.push([/ぶ/g, '⠐' + '⠭']); | |
| charlist.push([/べ/g, '⠐' + '⠯']); | |
| charlist.push([/ぼ/g, '⠐' + '⠮']); | |
| // 半濁音 (半濁音符:'⠠') | |
| charlist.push([/ぱ/g, '⠠' + '⠥']); | |
| charlist.push([/ぴ/g, '⠠' + '⠧']); | |
| charlist.push([/ぷ/g, '⠠' + '⠭']); | |
| charlist.push([/ぺ/g, '⠠' + '⠯']); | |
| charlist.push([/ぽ/g, '⠠' + '⠮']); | |
| // 記号・促音符など | |
| charlist.push([/ /g, '⠀']); | |
| charlist.push([/ /g, '⠀']); | |
| charlist.push([/ん/g, '⠴']); | |
| charlist.push([/っ/g, '⠂']); | |
| charlist.push([/ー/g, '⠒']); | |
| charlist.push([/、/g, '⠰' + '⠀']); | |
| charlist.push([/。/g, '⠲' + '⠀' + '⠀']); | |
| charlist.push([/〜/g, '⠤' + '⠤']); | |
| charlist.push([/[「」]/g, '⠤']); | |
| charlist.push([/[()()]/g, '⠶']); | |
| charlist.push([/[\??]/g, '⠢']); | |
| charlist.push([/[!!]/g, '⠖']); | |
| charlist.push([/・/g, '⠐' + '⠀']); | |
| charlist.push([/\./g, '⠂']); | |
| charlist.push([/,/g, '⠄']); | |
| // 五十音 | |
| charlist.push([/あ/g, '⠁']); | |
| charlist.push([/い/g, '⠃']); | |
| charlist.push([/う/g, '⠉']); | |
| charlist.push([/え/g, '⠋']); | |
| charlist.push([/お/g, '⠊']); | |
| charlist.push([/か/g, '⠡']); | |
| charlist.push([/き/g, '⠣']); | |
| charlist.push([/く/g, '⠩']); | |
| charlist.push([/け/g, '⠫']); | |
| charlist.push([/こ/g, '⠪']); | |
| charlist.push([/さ/g, '⠱']); | |
| charlist.push([/し/g, '⠳']); | |
| charlist.push([/す/g, '⠹']); | |
| charlist.push([/せ/g, '⠻']); | |
| charlist.push([/そ/g, '⠺']); | |
| charlist.push([/た/g, '⠕']); | |
| charlist.push([/ち/g, '⠗']); | |
| charlist.push([/つ/g, '⠝']); | |
| charlist.push([/て/g, '⠟']); | |
| charlist.push([/と/g, '⠞']); | |
| charlist.push([/な/g, '⠅']); | |
| charlist.push([/に/g, '⠇']); | |
| charlist.push([/ぬ/g, '⠍']); | |
| charlist.push([/ね/g, '⠏']); | |
| charlist.push([/の/g, '⠎']); | |
| charlist.push([/は/g, '⠥']); | |
| charlist.push([/ひ/g, '⠧']); | |
| charlist.push([/ふ/g, '⠭']); | |
| charlist.push([/へ/g, '⠯']); | |
| charlist.push([/ほ/g, '⠮']); | |
| charlist.push([/ま/g, '⠵']); | |
| charlist.push([/み/g, '⠷']); | |
| charlist.push([/む/g, '⠽']); | |
| charlist.push([/め/g, '⠿']); | |
| charlist.push([/も/g, '⠾']); | |
| charlist.push([/や/g, '⠌']); | |
| charlist.push([/ゆ/g, '⠬']); | |
| charlist.push([/よ/g, '⠜']); | |
| charlist.push([/ら/g, '⠑']); | |
| charlist.push([/り/g, '⠓']); | |
| charlist.push([/る/g, '⠙']); | |
| charlist.push([/れ/g, '⠛']); | |
| charlist.push([/ろ/g, '⠚']); | |
| charlist.push([/わ/g, '⠄']); | |
| charlist.push([/ゐ/g, '⠆']); | |
| charlist.push([/ゑ/g, '⠖']); | |
| charlist.push([/を/g, '⠔']); | |
| Braille.toBraille = function(str) { | |
| var i, l, c, t, fAlf, fNum, str2 = ''; | |
| if (typeof(str) !== 'string') { | |
| return null; | |
| } | |
| // 数字とアルファベット変換 | |
| // TODO: 一続きの語中で英語→日本語と変化する場合には、その間に第一つなぎ符を挿入 | |
| fAlf = fNum = false; | |
| for (i = 0, l = str.length; i < l; i++) { | |
| c = str.substr(i, 1); | |
| t = ''; | |
| // 外字引用符が必要かどうか (外字引用符 '⠦') | |
| // とりあえずアルファベット連続は全て外字引用符で挟む | |
| // TODO: 一文字の場合外字符のみにする | |
| if (c.match(/[a-zA-Z]/)) { | |
| if (fAlf === false) { | |
| str2 += '⠦'; | |
| fAlf = true; | |
| } | |
| // 大文字符(外字引用符 '⠠') | |
| // TODO: 二重大文字符の対応 | |
| if (c.match(/[A-Z]/)) { | |
| str2 += '⠠'; | |
| } | |
| } else { | |
| // 外字引用符を閉じてクリア | |
| if (fAlf === true) { | |
| str2 += '⠴'; | |
| fAlf = false; | |
| } | |
| } | |
| // 数符が必要かどうか (数符 '⠼') | |
| // 数字の連続に数符はひとつ | |
| if (c.match(/[0-9]/)) { | |
| if (fNum === false) { | |
| str2 += '⠼' | |
| fNum = true; | |
| } | |
| } else { | |
| fNum = false; | |
| } | |
| switch (c.toLowerCase()) { | |
| case '0': | |
| str2 += '⠚'; | |
| break; | |
| case '1': | |
| str2 += '⠁'; | |
| break; | |
| case '2': | |
| str2 += '⠃'; | |
| break; | |
| case '3': | |
| str2 += '⠉'; | |
| break; | |
| case '4': | |
| str2 += '⠙'; | |
| break; | |
| case '5': | |
| str2 += '⠑'; | |
| break; | |
| case '6': | |
| str2 += '⠋'; | |
| break; | |
| case '7': | |
| str2 += '⠛'; | |
| break; | |
| case '8': | |
| str2 += '⠓'; | |
| break; | |
| case '9': | |
| str2 += '⠊'; | |
| break; | |
| case 'a': | |
| str2 += '⠁'; | |
| break; | |
| case 'b': | |
| str2 += '⠃'; | |
| break; | |
| case 'c': | |
| str2 += '⠉'; | |
| break; | |
| case 'd': | |
| str2 += '⠙'; | |
| break; | |
| case 'e': | |
| str2 += '⠑'; | |
| break; | |
| case 'f': | |
| str2 += '⠋'; | |
| break; | |
| case 'g': | |
| str2 += '⠛'; | |
| break; | |
| case 'h': | |
| str2 += '⠓'; | |
| break; | |
| case 'i': | |
| str2 += '⠊'; | |
| break; | |
| case 'j': | |
| str2 += '⠚'; | |
| break; | |
| case 'k': | |
| str2 += '⠅'; | |
| break; | |
| case 'l': | |
| str2 += '⠇'; | |
| break; | |
| case 'm': | |
| str2 += '⠍'; | |
| break; | |
| case 'n': | |
| str2 += '⠝'; | |
| break; | |
| case 'o': | |
| str2 += '⠕'; | |
| break; | |
| case 'p': | |
| str2 += '⠏'; | |
| break; | |
| case 'q': | |
| str2 += '⠟'; | |
| break; | |
| case 'r': | |
| str2 += '⠗'; | |
| break; | |
| case 's': | |
| str2 += '⠎'; | |
| break; | |
| case 't': | |
| str2 += '⠞'; | |
| break; | |
| case 'u': | |
| str2 += '⠥'; | |
| break; | |
| case 'v': | |
| str2 += '⠧'; | |
| break; | |
| case 'w': | |
| str2 += '⠺'; | |
| break; | |
| case 'x': | |
| str2 += '⠭'; | |
| break; | |
| case 'y': | |
| str2 += '⠽'; | |
| break; | |
| case 'z': | |
| str2 += '⠵'; | |
| break; | |
| default: | |
| // 数字とアルファベット以外はそのまま | |
| str2 += c; | |
| } | |
| } | |
| // 外字引用符が閉じられていない場合閉じる | |
| if (fAlf === true) { | |
| str2 += '⠴'; | |
| } | |
| str = str2; | |
| // 文字列変換 | |
| for (i = 0, l = charlist.length; i < l; i++) { | |
| t = charlist[i][0]; | |
| c = charlist[i][1]; | |
| str = str.replace(t, c); | |
| } | |
| return str; | |
| }; | |
| Braille.toKana = function(str) { | |
| var i, l, c, t, fAlf, fNum, fUpper, str2 = ''; | |
| var codes = []; | |
| if (typeof(str) !== 'string') { | |
| return null; | |
| } | |
| console.log(str); | |
| codes = str.split(';'); | |
| fAlf = fNum = fUpper = false; | |
| for (i = 0, l = codes.length; i < l; i++) { | |
| c = codes[i] + ';'; | |
| // 文字列の終わり | |
| if (c === ';') { | |
| break; | |
| } | |
| // 数符 | |
| if (c === '⠼') { | |
| fNum = true; | |
| continue; | |
| } | |
| // 外字引用符 | |
| if (c === '⠦') { | |
| fAlf = true; | |
| continue; | |
| } | |
| // 大文字符 | |
| if (c === '⠠') { | |
| fUpper = true; | |
| continue; | |
| } | |
| if (fAlf) { | |
| switch (c) { | |
| case '⠴': | |
| // 外字引用符閉じ | |
| fAlf = false; | |
| fUpper = false; | |
| break; | |
| case '⠁': | |
| str2 += 'a'; | |
| break; | |
| case '⠃': | |
| str2 += 'b'; | |
| break; | |
| case '⠉': | |
| str2 += 'c'; | |
| break; | |
| case '⠙': | |
| str2 += 'd'; | |
| break; | |
| case '⠑': | |
| str2 += 'e'; | |
| break; | |
| case '⠋': | |
| str2 += 'f'; | |
| break; | |
| case '⠛': | |
| str2 += 'g'; | |
| break; | |
| case '⠓': | |
| str2 += 'h'; | |
| break; | |
| case '⠊': | |
| str2 += 'i'; | |
| break; | |
| case '⠚': | |
| str2 += 'j'; | |
| break; | |
| case '⠅': | |
| str2 += 'k'; | |
| break; | |
| case '⠇': | |
| str2 += 'l'; | |
| break; | |
| case '⠍': | |
| str2 += 'm'; | |
| break; | |
| case '⠝': | |
| str2 += 'n'; | |
| break; | |
| case '⠕': | |
| str2 += 'o'; | |
| break; | |
| case '⠏': | |
| str2 += 'p'; | |
| break; | |
| case '⠟': | |
| str2 += 'q'; | |
| break; | |
| case '⠗': | |
| str2 += 'r'; | |
| break; | |
| case '⠎': | |
| str2 += 's'; | |
| break; | |
| case '⠞': | |
| str2 += 't'; | |
| break; | |
| case '⠥': | |
| str2 += 'u'; | |
| break; | |
| case '⠧': | |
| str2 += 'v'; | |
| break; | |
| case '⠺': | |
| str2 += 'w'; | |
| break; | |
| case '⠭': | |
| str2 += 'x'; | |
| break; | |
| case '⠽': | |
| str2 += 'y'; | |
| break; | |
| case '⠵': | |
| str2 += 'z'; | |
| break; | |
| default: | |
| // 数字とアルファベット以外はそのまま | |
| str2 += c; | |
| fAlf = false; | |
| fUpper = false; | |
| } | |
| if (fUpper) { | |
| // TODO: 結合前にちゃんと大文字にする | |
| c = str2.substr(-1, 1).toUpperCase(); | |
| str2 = str2.substr(0, str2.length - 1) + c; | |
| } | |
| } else if (fNum) { | |
| switch (c) { | |
| case '⠚': | |
| str2 += '0'; | |
| break; | |
| case '⠁': | |
| str2 += '1'; | |
| break; | |
| case '⠃': | |
| str2 += '2'; | |
| break; | |
| case '⠉': | |
| str2 += '3'; | |
| break; | |
| case '⠙': | |
| str2 += '4'; | |
| break; | |
| case '⠑': | |
| str2 += '5'; | |
| break; | |
| case '⠋': | |
| str2 += '6'; | |
| break; | |
| case '⠛': | |
| str2 += '7'; | |
| break; | |
| case '⠓': | |
| str2 += '8'; | |
| break; | |
| case '⠊': | |
| str2 += '9'; | |
| break; | |
| default: | |
| // 数字とアルファベット以外はそのまま | |
| str2 += c; | |
| fNum = false; | |
| } | |
| } else { | |
| str2 += c; | |
| } | |
| } | |
| str = str2; | |
| for (i = 0, l = charlist.length; i < l; i++) { | |
| t = charlist[i][0]; | |
| c = charlist[i][1]; | |
| t = t.toString().replace("/g", "").replace("/", ""); | |
| str = str.replace(c, t); | |
| } | |
| return str; | |
| }; | |
| // モジュールのエクスポート | |
| return Braille; | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment