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: {}
});

検索は機能してます。実際利いてるかはよくわかりません(タイムスタンプでも埋めればいいか)。