Ubiquity用alc/eijiro検索コマンドを作ってみる
(追記: Ubiquity 0.1.7以降の対応済みソースはこちら: http://gist.github.com/86773 )
(追記: Ubiquity 0.5以降の対応済みソースはこちら: http://gist.github.com/144227 )
遅ればせながらUbiquityを使用しはじめた。
Ubiquityは、先に対象を入力してからコマンドを選べるところがいいですね。
- Ctrl+Spaceで窓を開く
- たとえば"shibuya"と入れる
- コマンドリストが出てくる
- ↑↓キーで選ぶ
- (tabキーだと最初コマンドが補完)
あと範囲選択しておいてから窓を開くと、それも対象としてプレビューしてくれるのもいい。
ブラウザ系プログラミングでお約束に近い「スペースアルクのサイトで英辞郎検索を行う」alcコマンドを作成してみました。
- 入力中はプレビューに検索結果を表示
- 実行すると検索結果ページを開く
Command Editor用alcコマンドソース
CmdUtils.CreateCommand({ name: "alc", icon: "http://www.alc.co.jp/favicon.ico", homepage: "http://d.hatena.ne.jp/bellbind/", author: {name: "bellbind", email: "bellbind@gmail.com"}, license: "GPL", description: "translate word by alc/eijiro \n" + "input command e.g.: \n" + " alc word \n" + "or: \n" + " alc 単語 ", help: "translate word by alc/eijiro", takes: {"input": noun_arb_text}, preview: function (pblock, input) { if (input.text.length == 0) { pblock.innerHTML = "<pre>" + this.description + "</pre>"; return; } var url = this._url(input); var embed_content = function (data) { var resultArea = jQuery(data).find("#resultArea").eq(0); var sas = resultArea.find(".sas"); var resultList = resultArea.find("#resultList"); jQuery(pblock).empty().append(sas).append(resultList); }; CmdUtils.previewGet(pblock, url, null, embed_content, "html"); }, execute: function (input) { if (input.text.length == 0) return; Utils.openUrlInBrowser(this._url(input)); }, _url: function (input) { var template = "http://eow.alc.co.jp/${word}/UTF-8?ref=sa"; return CmdUtils.renderTemplate(template, {word: encodeURI(input.text)}); } });
このコード全体をCommand Editorに追加コピーすれば使えるようになります。
感想
- CreateCommandとかの部分は、Template挿入してくれる
- (スペースのつけ方などのコーディングスタイルは気に入らないけど)
- Command Editorは自動保存、というか保存操作がない。編集内容が即反映
- jQuery前提で書けるのが便利
- (JS-1.8の機能も使えるかも?)
- License: GPLとかはテンプレートのまま使用した
- 構文エラーが出ないため、このあたりは修正しにくい
- 対話型作成環境がほしいかも
- (さしあたりevalとinspectかな)
- previewの引数pblockには前の内容が入っている
- (inputの内容ごとキャッシュできればいいのに)
Command Editorの内容は、一応shareボタンでgistで公開できるようだ。
cacheしてみる
CmdUtils.CreateCommand({ name: "alc", icon: "http://www.alc.co.jp/favicon.ico", homepage: "http://d.hatena.ne.jp/bellbind/", author: {name: "bellbind", email: "bellbind@gmail.com"}, license: "GPL", description: "translate word by alc/eijiro \n" + "input command e.g.: \n" + " alc word \n" + "or: \n" + " alc 単語 ", help: "translate word by alc/eijiro", takes: {"input": noun_arb_text}, preview: function (pblock, input) { var pnode = jQuery(pblock); var cache = this._preview_cache; var word = input.text; if (cache[word]) { pnode.replaceWith(cache[word]); return; } if (word.length == 0) { pnode.html("<pre>" + this.description + "</pre>"); cache[word] = pnode.clone(); return; } var url = this._url(word); var embed_content = function (data) { var resultArea = jQuery(data).find("#resultArea").eq(0); var sas = resultArea.find(".sas"); var resultList = resultArea.find("#resultList"); pnode.empty().append(sas).append(resultList); cache[word] = pnode.clone(); }; CmdUtils.previewGet(pblock, url, null, embed_content, "html"); }, execute: function (input) { if (input.text.length == 0) return; Utils.openUrlInBrowser(this._url(input.text)); }, _url: function (word) { var template = "http://eow.alc.co.jp/${word}/UTF-8?ref=sa"; return CmdUtils.renderTemplate(template, {word: encodeURI(word)}); }, _preview_cache: {} });
検索は機能してます。実際利いてるかはよくわかりません(タイムスタンプでも埋めればいいか)。