Skip to content

Instantly share code, notes, and snippets.

@958
Last active September 25, 2015 22:28
Show Gist options
  • Save 958/994706 to your computer and use it in GitHub Desktop.
Save 958/994706 to your computer and use it in GitHub Desktop.
[keysnail]Japanese input plugin
// 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