Last active
August 29, 2015 14:10
-
-
Save shunito/dc151159d3651ef6e6ef to your computer and use it in GitHub Desktop.
分かち書きされたよみがなをブライユ式点字(Unicode)に変換
This file contains 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