Ubiquityを使って英単語を調べる
FireFoxのプラグインでUbiquityというのがあります。他のWebサイトの機能をコマンドとして登録して使用できる、User MashUpを可能にするFirefox上の環境です。将来的にはFirefoxのURLバーに実装されるかも知れません(URLをWebのドキュメントがある場所であると考えるのではなく、Web上のリソースに対するリクエストような考えると割と自然な進歩?)。
ブラウザの新境地? Ubiquityが変える衝撃のブラウザ体験 (1/2):
http://www.itmedia.co.jp/enterprise/articles/0808/31/news003.html
まあ、そういうわけでどういうものかちょっと気になって見てみて、最近APIが公開されたiknowという英語学習SNSの単語検索を呼び出すコマンドを作成してみました。
コード
CmdUtils.CreateCommand({
name: "iknow_search",
icon: "http://example.com/example.png",
homepage: "http://example.com/",
author: { name: "xxxx", email: "xxxxx@gmail.com"},
license: "GPL",
description: "search words or pharase in iknow",
help: "iknow",
takes: {"input": noun_arb_text},
preview: function( pblock, input ) {
var baseUrl = "http://api.iknow.co.jp/items/matching/${word}.${format}";
var tempUrl = {"word":input.text,"format":"json"}
var params = {include_sentences:"true"};
pblock.innerHTML = "";
jQuery.getJSON(CmdUtils.renderTemplate(baseUrl,tempUrl),params,function(resp){
jQuery.each(resp,function(i){
pblock.innerHTML += this.responses[0].text + "<br/>";
pblock.innerHTML += this.sentences[0].text + "<br/>";
pblock.innerHTML += this.sentences[0].translations[0].text + "<br/>";
});
});
},
execute: function(input) {
var baseUrl ="http://www.iknow.co.jp/items/search?keyword=${QUERY}";
var tempUrl = {"QUERY":input.text};
var urlString = CmdUtils.renderTemplate(baseUrl, tempUrl);
Utils.openUrlInBrowser(urlString);
}
});
Ubiquityコマンドの作成
Ubiquityコマンド作成の情報は、現状下記のリンクかソースを見るしかないくらい少なく、しかも上記のコマンドはまだプレビューで訳を表示しEnterキーでiKnowのサイトで該当のアイテム検索結果を表示するのみですが、行数の割には用を足しているかと思います。Ubiquity導入後、Command Editorを使用して上記のコードを貼付ければ使用できます。
Labs/Ubiquity/Ubiquity 0.1 Author Tutorial
https://wiki.mozilla.org/Labs/Ubiquity/Ubiquity_0.1_Author_Tutorial
上のチュートリアルに載っている事ですが簡単に作り方を説明したいと思います。
CmdUtils.CreateCommand({
name: "hello-world",
execute: function() {
displayMessage( "Hello, World!" );
}
})
ubiquityコマンドは、cmd_<コマンド名>というfunctionがあればそれを参照するのですが、普通はCmdUtils.CreateCommand()というユーティリティ関数を使用して作成します。上記のコードはその最も単純な例です。
CreateCommandに渡すオブジェクトのnameとexecuteというプロパティに、それぞれコマンド名の文字列と実行する関数を指定します。execute(コマンドの実行)はUbiquityのコンソールにコマンド名を入力しEnterを押した時点で実行されます。displayMessage()を実行すると、MacならGrowl,WindowsならUbiquityのコマンドの下に引数に与えた文字列が表示されます。
CmdUtilsにはコマンド作成以外にも、ユーザーがブラウザで選択中の箇所にテキストやHTMLを挿入(setSelection),IPから位置情報を取得(getGeoLocation),文字列のテンプレート処理(renderTemplate)などコマンド作成を楽にする関数が用意されており、これまたドキュメントは少ないのですが、ソースはこちらで見る事ができます。
プレビューの表示
Ubiquityではユーザーの入力に応じて出力されるプレビューウインドウがあり、こちらはCreateCommandに渡すオブジェクトのpreviewプロパティに、HTML文字列か関数を指定する事で実現できます。下記は冒頭のコマンドでのpreview部分です。
preview: function( pblock, input ) { var baseUrl = "http://api.iknow.co.jp/items/matching/${word}.${format}"; var tempUrl = {"word":input.text,"format":"json"} var params = {include_sentences:"true"}; pblock.innerHTML = ""; jQuery.getJSON(CmdUtils.renderTemplate(baseUrl,tempUrl),params,function(resp){ jQuery.each(resp,function(i){ pblock.innerHTML += this.responses[0].text + "<br/>"; pblock.innerHTML += this.sentences[0].text + "<br/>"; pblock.innerHTML += this.sentences[0].translations[0].text + "<br/>"; }); }); },.....
previewは第一引数にpreviewエリアに表示するDOM要素を、第二引数にユーザーから渡されるコマンドの引数をとっています。コマンドの引数はtakeプロパティで、どのnoun_typeで取得するか指定できます。
takes: {"input": noun_arb_text},
引数データの扱い
noun_typeは引数の制約や、コマンドの補完機能(例えば日付データが入力されたら、日付データを引数にとるコマンドをUbiquityがサジェストする)に使用され、下記のようなnoun_typeがあります。また、CmdUtilsを使用してカスタムのnoun_typeを作成する事ができます。
- noun_type_arb_text
- noun_type_date
- noun_type_language
- noun_type_people
- noun_type_place
- noun_type_tab
noun_typeのソースは下記で確認する事ができます
nountypes.js
一方、コマンドの引数としてpreviewやexecute(の第二引数)に渡されるオブジェクトは、下記のようなプロパティを持ちます。
- inputObject.text // 文字列
- inputObject.html //タグを含む整形されたHTML
- inputObject.data // 文字列以外のnoun_typeのデータ
- inputObject.summary // 長い文字列の要約版
iknow-searchのpreviewで行っているのは、コマンドの引数から(テンプレート機能を使用して)URL文字列を組み立て、JSONでリクエストを取得、preview用のDOMに結果を反映するという一連の処理ですが、uqibuityではjQueryが使用できるため簡単に実装できます。
また同様に、コマンド入力後Enterを押した時に実行されるexecuteでは、Utils.openUrlInBrowser()を使用してブラウザで該当のURL(検索結果ページ)を開くようになっています。
まだまだ発展途上(というかできたばかり)のコンセプトですが、Webの機能をお手軽にコマンドにできるのはこれから重宝しそうです。
追記:Ubiquity のアップデートに合わせて、コードも少し書き換えました



[...] Ubiquityを使って英単語を調べる « bit sized (tags: iknow ubiquity) [...]
links for 2009-02-10 « 個人的な雑記
2月 10, 2009 10:03 pm
[...] » 以前、ubiquityを使って英単語を調べるというエントリを書いたが、mozilla [...]
Ubiquityを使って英単語を調べる – smart.fm (iknow)経由 « bit sized
8月 20, 2009 9:21 am