ブラウザで英辞郎を検索する EijiroX

最近 Mac から Windows に乗り換えたのだけど、MacEijiro Viewer みたいな良い英辞郎検索ソフトが Windows には無いみたいなので作りました。(PDIC は英語版 Windows では文字化けした気が。あとインターフェイスがごちゃごちゃしてるしキーボードだけで使うように作られてないので好きではない)

辞書は同梱していません。自分で買ってください

Google ChromeOpera で使えます。(ただし Opera は動かすのがちょっと面倒)

Chrome Extension Gallery に登録しました。

ソースコードは MIT ライセンスで公開しています。

機能としては、

  • インクリメンタル検索(前方一致)
  • 見出し語の中から全文検索(full text ボタンを押したとき)
  • ブラウザの「戻る」ボタンでさっき検索した単語に戻れる(検索してから3秒以上新たな検索をしなかったときに履歴追加)
  • 検索結果の自動継ぎ足し
  • 検索結果の中の英単語をクリックしてまた検索できる
  • EijiroX ページ内の選択範囲が検索欄に自動で入り、出てくるボタンを押すか次に検索欄にフォーカスしたときに検索できる
  • 普通のウェブページでテキスト範囲を選択してからツールバーのボタンを押すと、その語句で検索できる
  • 発音記号がとても綺麗 (CharisSIL フォントヤバい)
  • CSS が自由に書ける

です。

辞書の変換

最初に辞書ファイルをデータベースに変換する必要があります。

英辞郎のフォルダに入っている英辞郎 (EIJI-***.TXT)、和英辞郎 (WAEI-***.TXT)、例辞郎 (REIJI-***.TXT)、略語郎 (RYAKU-***.TXT) のファイルを用意してください。(例えばうちは109版だったので EDP_109/EIJIRO/EIJI-109.TXT など)

Chrome拡張機能管理ページから EijiroX のオプションページを開いて、右上の▽をクリックすると以下のようになります。

ここでさっきの EIJI-***.TXT とかのファイルを選択して Store を押します。

けっこう時間がかかります。うちではだいたい30分ぐらい。その間はパソコンに触らないほうがいいと思います。かなり重くなるし、同時に別の作業をしているとデータベース作成中にタブがクラッシュすることが多いので。クラッシュしたらまた同じことを繰り返しやってください。

その間はデバッガーでバックグラウンドページのコンソールを開いてたら暇つぶしになるかも。

辞書をデータベースに変換するツール

データベースを作るときにどうしても Chrome が落ちてしまうという話があったので、英辞郎の辞書ファイルをデータベースにするだけのツールを作りました。

zip を展開すると、makedatabase.exe と sqlite3.exe という2つのファイルが入っています。そのフォルダに英辞郎の辞書ファイル(EIJI-***.TXT、WAEI-***.TXT など)を↓こんなふうに入れます。

それから makedatabase.exe をダブルクリックすると、コマンドウィンドウが開いて勝手に変換を始めます。

Chrome で作成するより時間はかかりますが、パソコンへの負荷は少ないと思います。うちでは大体1時間ぐらいでした。

完了すると database という名前のファイルが出来上がっているはずなので、それを既存のものと置き換えてやります。既存のファイルは↓のフォルダの中にあると思います。名前は数字で1文字(か2文字)のはずです。

C:\Users\ユーザー名\AppData\Local\Google\Chrome\User Data\Default\databases\chrome-extension_incofakicgjnjoggkkepbldklfocgafh_0\

それに database というファイルを上書き保存してやります。Chrome を終了してからやることをおすすめします。


変換ツールのソースコードは↓ここにあります。exe にするには exerb が必要ですが、Ruby がインストールしてあればそのまま実行できるはずです。

MacLinux の人は、makedatabase.rb と tiny_segmenter_mod.rb をダウンロードして、英辞郎の辞書ファイルを同じフォルダに入れて、ターミナルで

ruby makedatabase.rb

とやります。sqlite3 が入ってなかったらエラーが出ると思います。ChromeSQLite のバージョンと合わせるためには 3.6.18 が望ましいです(が、多少新しくてもたぶん問題ないです)。Snow Leopard の人は SQLite 3.6.17 が入ってると思うので大丈夫だと思います。Linux の人は SQLite 3.6.18 が http://www.sqlite.org/sqlite3-3.6.18.bin.gz からダウンロードできます。

database ファイルができたら Windows と同じように設定フォルダに入れます。Mac は↓です。Linux は知りません。

/Users/ユーザー名/Library/Application Support/Google/Chrome/Default/databases/chrome-extension_incofakicgjnjoggkkepbldklfocgafh_0/


Opera の場合は、下でも書いてますが単体では辞書を作れないので、Chrome で辞書を作る必要があったのですが、これを使えば簡単になります。詳しくは下を。

Chrome でアドレスバーから検索

Chrome ではオプションページの URL が

chrome-extension://incofakicgjnjoggkkepbldklfocgafh/public_html/index.html

という感じなのですが、Chrome のカスタム検索にこれを入れてもオプションページが開けません。

しかし、こんなふうにしたら開けることが分かりました。

javascript:location.href="chrome-extension://incofakicgjnjoggkkepbldklfocgafh/public_html/index.html#query=%s"

これをコピペして、カスタム検索の作成画面(わかりにくいですが、Preferences → Basics にあります)でこんなふうに検索を作成すれば、アドレスバーから "e"、スペース、単語、と検索できます。

Chrome Extension 版で他の extension と連携できるようにしました

バージョン1.05より、他の extension の content script などから↓このようにすると、ページ内に検索結果を表示したりできます。(EijiroX 自体にそういう機能をつける予定はありません)

chrome.extension.sendRequest(
  'incofakicgjnjoggkkepbldklfocgafh',
  {action: 'search', query: 'english', page: 1, full: false, limit: 10, html: true},
  function(response) {
    console.log(response);
    var range = document.createRange();
    range.selectNodeContents(dl);
    var df = range.createContextualFragment(response.results);
    dl.appendChild(df);
  }
);

引数について。

  • action → "search" 固定。
  • query → 検索語。日本語でも英語でもいい。
  • page → ページ数。自然数。指定しない場合は1。
  • full → 全文検索にするかどうか。指定しない場合は false。
  • limit → 検索結果の件数。指定しない場合は15。
  • html → 結果を HTML 形式で取得するかどうか。指定しない場合は false (配列で取得)。

前方一致検索ではだいたい 5ms から 100ms ぐらいで検索できると思います。逆に言えば、それ以下の時間でリクエストを立て続けに出してしまうと、処理できないことがあります。EijiroX では、最後の文字入力から 80ms 間何も文字入力がなければ検索することにしています。全文検索は数十ミリ秒から数秒かかります。

HTML で結果を取得しない場合は、response.results が、結果の各行を含む配列になります。行の形式は英辞郎形式です。

response.more が true なら、次のページがある(かもしれない)ということです。

HTML で結果を取得した場合は、↓のような感じで EijiroX のポップアップやオプションページで使ってるのと同じ HTML が返ります。

<dt class="entry-box">
  <span class="entry">
    <a title="English" href="#" class="implicit searchlink"><span class="query-highlight">English</span></a>
  </span>
  <span class="kind"><span class="bracket">{</span>名-1<span class="bracket">}</span></span>
  <span class="separator">:</span>
</dt>
<dd class="translation">
  英語
</dd>
<dd class="translation">
  <a title="English" href="#" class="implicit searchlink">English</a> <a title="is" href="#" class="implicit searchlink">is</a> <a title="a" href="#" class="implicit searchlink">a</a> '<a title="sound'" href="#" class="implicit searchlink">sound'</a> <a title="language" href="#" class="implicit searchlink">language</a>. <a title="Japanese" href="#" class="implicit searchlink">Japanese</a> <a title="is" href="#" class="implicit searchlink">is</a> <a title="a" href="#" class="implicit searchlink">a</a> '<a title="picture'" href="#" class="implicit searchlink">picture'</a> <a title="language" href="#" class="implicit searchlink">language</a>. 英語は音の言語である。日本語は絵画的な言語である。
</dd>

これを自分で用意した dl 要素の中に入れればそのまま結果表示になります。

見ての通り、class="implicit searchlink" というリンクがいっぱい入ってて、クリックすると "#" に飛んでしまうので、気に入らない場合は脱皮させたほうがいいかもしれません。

CSS は EijiroX のものが参考になると思います。

Opera

Chrome の人は以下は関係ないので飛ばしても大丈夫です。

Opera は 100MB 以上のデータベースを作れないようなので、Chrome でデータベース作成してから、そのファイルを Opera の設定ファイルにコピーすることにします。

また、Opera の場合は Opera UniteOpera WidgetOpera Extension の3つを作りました。それぞれ以下のような特徴があります。

  • Unite 版 (クリックでインストール)
    • タブとして開ける
    • Opera のカスタム検索が使える(アドレスバーに "e ほにゃらら" で検索できる。これがやりたかったから EijiroX を作った)
  • Widget 版 (クリックでインストール)
    • Opera を起動してなくてもいい
  • Extension 版 (クリックでインストール; Opera 11 alpha 以降のみ)
    • ツールバーをクリックしてポップアップが開く
    • ページ内の選択範囲で検索できる
    • Unite 版と連携できるので辞書を二重に作らなくていい

どれか一つだけ入れれば十分ですが、Unite 版と Extension 版を入れると Chrome 版相当になります。ちょっと面倒ですね。(でもアドレスバーから検索できるのはいいよ!)


まず、Chrome で上記の手順行ってデータベースを作成してください。

データベースファイルは、Windows 7Mac ではそれぞれ

C:\Users\ユーザー名\AppData\Local\Google\Chrome\User Data\Default\databases\chrome-extension_incofakicgjnjoggkkepbldklfocgafh_0\
/Users/ユーザー名/Library/Application Support/Google/Chrome/Default/databases/chrome-extension_incofakicgjnjoggkkepbldklfocgafh_0/

にあると思います。ファイル名はたぶん数字で一文字。

次に、Unite 版か Extension 版をインストールすると、設定フォルダが作られます。

C:\Users\ユーザー名\AppData\Local\Opera\Opera\widgets\
/Users/ユーザー名/Library/Application Support/Opera/widgets/

この中に wuid-4cea47b2-5aa9-010f-0e53-7da654b2c7a7 とかそんな感じのフォルダがいっぱいあると思うので、一番新しいフォルダに入ります。(widgets.dat というファイルを見ればちゃんと確認できる)

そこからまた何個か下って(一直線なので迷わないはず)、

C:\Users\ユーザー名\AppData\Local\Opera\Opera\widgets\wuid-4cea47b2-5aa9-010f-0e53-7da654b2c7a7\pstorage\02\03\00000000

がデータベースでした。

Widget 版の場合は

C:\Users\ユーザー名\AppData\Local\Opera\Widget Eijiro\wuid-4ce992c1-df14-013f-0995-611ed39cdd66/pstorage\02\03\00000000

でした。

データベースを確認したら、Unite や Extension や Widget を無効にしてからChrome で作ったファイルを Opera 用のフォルダに上書きコピーします。

これで Opera でも使えるようになります。

Opera Extension 版の場合は「Unite 版 EijiroX との通信」という設定項目を作りました。

これに自分の Opera Unite 版 EijiroX の URL を入れると、Unite 版と通信してくれるのでデータベースを何度もコピーしないですみます。


最後に、Unite 版をインストールした人はカスタム検索を作っておきましょう。

Google など適当なサイトの検索欄で右クリックして、「検索の作成」で、アドレス部分を

http://***.***.operaunite.com/eijiro/#query=%s

に変えます。*** の部分は自分用に書き換えて下さい。これでアドレスバーから検索できるようになります。

Opera Unite 版で検索サジェストに対応してみました

Opera 10.x まではブラウザの右上の検索欄からの検索でしかサジェストが使えませんでしたが、11 からはアドレスバーからの検索でもサジェスト対応してるのでこんなふうになります。

サジェストと言っても、サジェストされたやつを選択して検索するようなものではなくて、検索結果を見せるためのものなので、Google Instant Search に近いです。

やり方はサジェスト機能を使うを参考に、一旦検索を作ってから、設定フォルダ内にある search.ini を編集。WindowsMac でそれぞれ

C:\Users\ユーザー名\AppData\Roaming\Opera\Opera\search.ini
/Users/ユーザー名/Library/Preferences/Opera Preferences/search.ini

にあると思います。このファイルの EijiroX 検索のところを探して、Suggest Protocol と Suggest URL という行を追加して Opera を再起動してください。

[Search Engine 2]
UNIQUEID=4E112F5760092B47B8F97431094ED1E8
Name=Eijiro
Verbtext=0
URL=http://***.***.operaunite.com/eijiro/#query=%s
Suggest Protocol=JSON 
Suggest URL=http://***.***.operaunite.com/eijiro/suggest?query={SearchTerm}
Query=
Key=ej
Is post=0
UseTLD=0
Has endseparator=0
Encoding=UTF-8
Search Type=0
Position=-1
Nameid=0
Deleted=0