Last active
September 25, 2015 22:28
-
-
Save 958/994706 to your computer and use it in GitHub Desktop.
[keysnail]Japanese input plugin
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
// Info | |
let PLUGIN_INFO = | |
<KeySnailPlugin> | |
<name>Japanese Input</name> | |
<description>Japanese Input on KeySnail</description> | |
<author>958</author> | |
<version>0.0.2</version> | |
<updateURL>https://gist.github.com/958/994706/raw/japanese-input.ks.js</updateURL> | |
<iconURL>https://sites.google.com/site/958site/Home/files/japanese-input.ks.png</iconURL> | |
<license>MIT</license> | |
<include>main</include> | |
<detail lang="ja"><![CDATA[ | |
=== 概要 === | |
KeySnail が簡易的な日本語入力環境となります | |
もしもの時に役に立つかもしれません | |
=== 使い方 === | |
>|| | |
key.setEditKey('C-SPC', function (ev, arg) { | |
ext.exec('japanese-input', arg, ev); | |
}, '日本語に変換'); | |
||< | |
等として、テキストボックス上などで "katatumuri" と入力後 "C-SPC" を押してみてください | |
ただし KeySnail のプロンプト上では本エクステは使えません | |
]]></detail> | |
</KeySnailPlugin>; | |
// Main | |
plugins.ja_input = (function() { | |
const roma2kana = { | |
'a':'あ','i':'い','u':'う','e':'え','o':'お', | |
'ka':'か','ki':'き','ku':'く','ke':'け','ko':'こ', | |
'sa':'さ','si':'し','su':'す','se':'せ','so':'そ', | |
'ta':'た','ti':'ち','tu':'つ','te':'て','to':'と', | |
'na':'な','ni':'に','nu':'ぬ','ne':'ね','no':'の', | |
'ha':'は','hi':'ひ','hu':'ふ','he':'へ','ho':'ほ', | |
'ma':'ま','mi':'み','mu':'む','me':'め','mo':'も', | |
'ya':'や','yu':'ゆ','yo':'よ', | |
'ra':'ら','ri':'り','ru':'る','re':'れ','ro':'ろ', | |
'wa':'わ','wi':'うぃ','wu':'う','we':'うぇ','wo':'を', | |
'nn':'ん','n':'ん', | |
'la':'ぁ','li':'ぃ','lu':'ぅ','le':'ぇ','lo':'ぉ', | |
'xa':'ぁ','xi':'ぃ','xu':'ぅ','xe':'ぇ','xo':'ぉ', | |
'ltu':'っ','ltsu':'っ', | |
'xtu':'っ','xtsu':'っ', | |
'lya':'ゃ','lyu':'ゅ','lyo':'ょ', | |
'xya':'ゃ','xyu':'ゅ','xyo':'ょ', | |
'lwa':'ゎ','xwa':'ゎ', | |
'kya':'きゃ','kyi':'きぃ','kyu':'きゅ','kye':'きぇ','kyo':'きょ', | |
'sya':'しゃ','syi':'しぃ','syu':'しゅ','sye':'しぇ','syo':'しょ', | |
'sha':'しゃ','shi':'し','shu':'しゅ','she':'しぇ','sho':'しょ', | |
'tya':'ちゃ','tyi':'ちぃ','tyu':'ちゅ','tye':'ちぇ','tyo':'ちょ', | |
'cya':'ちゃ','cyi':'ちぃ','cyu':'ちゅ','cye':'ちぇ','cyo':'ちょ', | |
'cha':'ちゃ','chi':'ち','chu':'ちゅ','che':'ちぇ','cho':'ちょ', | |
'tsa':'つぁ','tsi':'つぃ','tsu':'つ','tse':'つぇ','tso':'つぉ', | |
'tha':'てゃ','thi':'てぃ','thu':'てゅ','the':'てぇ','tho':'てょ', | |
'nya':'にゃ','nyi':'にぃ','nyu':'にゅ','nye':'にぇ','nyo':'にょ', | |
'hya':'ひゃ','hyi':'ひぃ','hyu':'ひゅ','hye':'ひぇ','hyo':'ひょ', | |
'fa':'ふぁ','fi':'ふぃ','fu':'ふ','fe':'ふぇ','fo':'ふぉ', | |
'fya':'ふゃ','fyi':'ふぃ','fyu':'ふゅ','fye':'ふぇ','fyo':'ふょ', | |
'mya':'みゃ','myi':'みぃ','myu':'みゅ','mye':'みぇ','myo':'みょ', | |
'rya':'りゃ','ryi':'りぃ','ryu':'りゅ','rye':'りぇ','ryo':'りょ', | |
'ga':'が','gi':'ぎ','gu':'ぐ','ge':'げ','go':'ご', | |
'za':'ざ','zi':'じ','zu':'ず','ze':'ぜ','zo':'ぞ', | |
'da':'だ','di':'ぢ','du':'づ','de':'で','do':'ど', | |
'ba':'ば','bi':'び','bu':'ぶ','be':'べ','bo':'ぼ', | |
'va':'う゛ぁ','vi':'う゛ぃ','vu':'う゛','ve':'う゛ぇ','vo':'う゛ぉ', | |
'vya':'う゛ゃ','vyi':'う゛ぃ','vyu':'う゛ゅ','vye':'う゛ぇ','vyo':'う゛ょ', | |
'gya':'ぎゃ','gyi':'ぎぃ','gyu':'ぎゅ','gye':'ぎぇ','gyo':'ぎょ', | |
'ja':'じゃ','ji':'じ','ju':'じゅ','je':'じぇ','jo':'じょ', | |
'jya':'じゃ','jyi':'じ','jyu':'じゅ','jye':'じぇ','jyo':'じょ', | |
'zya':'じゃ','zyi':'じぃ','zyu':'じゅ','zye':'じぇ','zyo':'じょ', | |
'dya':'ぢゃ','dyi':'ぢぃ','dyu':'ぢゅ','dye':'ぢぇ','dyo':'ぢょ', | |
'dha':'でゃ','dhi':'でぃ','dhu':'でゅ','dhe':'でぇ','dho':'でょ', | |
'bya':'びゃ','byi':'びぃ','byu':'びゅ','bye':'びぇ','byo':'びょ', | |
'pa':'ぱ','pi':'ぴ','pu':'ぷ','pe':'ぺ','po':'ぽ', | |
'pya':'ぴゃ','pyi':'ぴぃ','pyu':'ぴゅ','pye':'ぴぇ','pyo':'ぴょ', | |
'.':'。',',':'、', | |
'-':'ー', | |
}; | |
let self = { | |
romaToHiragana: function (text) { | |
text = text.toLowerCase(); | |
const reLTU = new RegExp(/^([bcdfghjklmpqrstvwxyz])\1+/); | |
let kana = ''; | |
for (let i = 0; i < text.length; i++) { | |
let hit = false; | |
for (let len = (text.length - i > 3) ? text.length - 1 : 3; len > 0; len--) { | |
let roma = text.substr(i, len); | |
if (reLTU.test(roma)) { | |
kana += L('っ'); | |
hit = true; | |
break; | |
} else if (roma in roma2kana) { | |
i += len - 1; | |
kana += L(roma2kana[roma]); | |
hit = true; | |
break; | |
} | |
} | |
if (!hit) | |
kana += text.substr(i, 1); | |
} | |
return kana; | |
}, | |
translate: function(kana) { | |
let xhr = util.httpGet('http://www.google.com/transliterate?langpair=ja-Hira|ja&text='+encodeURIComponent(kana)); | |
try { | |
return JSON.parse(xhr.responseText); | |
}catch(e){util.message(e)} | |
} | |
}; | |
return self; | |
})(); | |
// Add ext | |
plugins.withProvides(function(provide) { | |
function getTargetText(input) { | |
const inputValue = input.value; | |
const reRoma = new RegExp(/[a-z,./\\<>?_;:\]+*}@\[`{1-9!"#$%&'()-^=~|]/i); | |
while (1) { | |
let prevChar = inputValue.charAt(input.selectionStart - 1); | |
if (reRoma.test(prevChar)) | |
goDoCommand('cmd_selectCharPrevious'); | |
else | |
break; | |
} | |
return inputValue.slice(input.selectionStart, input.selectionEnd); | |
} | |
provide('japanese-input', | |
function(ev, arg) { | |
let text = getTargetText(ev.originalTarget); | |
if (text.length == 0) return; | |
let kana = plugins.ja_input.romaToHiragana(text); | |
let results = plugins.ja_input.translate(kana); | |
if (!results) return; | |
let selector = (function () { | |
let jp = ""; | |
for (let i = 0; i < results.length; i++) { | |
let result = results[i]; | |
prompt.selector({ | |
collection: result[1], | |
actions: [[function(i) { | |
if (i >= 0) { | |
jp += result[1][i]; | |
selector.next(); | |
} | |
}, "select"]] | |
}); | |
yield; | |
} | |
command.insertText(jp); | |
})(); | |
selector.next(); | |
}, M({ja:'日本語に変換',en:'Janapese input'})); | |
}, PLUGIN_INFO); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment