EB (電子ブック) と EPWING の電子辞書を、ピュアな Python だけで読むための ツールです。標準ライブラリしか使っていないので、C 拡張のビルドも インストールも要りません。
以前、長いこと Emacs の Lookup から NDTPD 経由で辞書を引いていました。
ローカルで ndtpd を動かして、辞書データを読ませる、という構成です
(libeb と NDTPD が Motoyuki Kasahara 氏、Lookup が Keisuke Nishida 氏の作
です)。ただ環境を新しくするたびに設定し直す羽目になり、そのうちだんだん腰が
重くなって使わなくなってしまいました。それならいっそ AI を使って Python で
書き直してしまえば、どこに持っていっても git clone するだけで
動くんじゃないの、というのがこのプロジェクトのアイディアです。
起動して「光」を検索するとこんな感じの画面になります。
word | 光█ 研究社新和英大辞典 1/252
────────────────────────────────────────────────────────────────────────────────
▸ 英 研究社新和英大辞典 光
英 研究社 新編英和活用大辞典 光 <1beam>
国 三省堂「大辞林」 ひかり【光】
国 広辞苑第五版 こう【光】(クワウ)
百 マイペディア 光 [ひかり] (市)
────────────────────────────────────────────────────────────────────────────────
hik̅a̅r̅i̅
ひかり 光
n.
1 [光明] (a) light; [光線] rays (of light); a ray; a beam (太い); [閃光] a flash;
────────────────────────────────────────────────────────────────────────────────
^P/^N select TAB kind ^U/^D scroll ^W delete word ^L refresh ESC quit
要りません。clone してそのまま実行できます。
$ git clone https://github.com/satorux/bkbook
$ cd bkbook
$ python3 -m bkbook tui ~/ebこれで全部です。どこからでも呼びたい場合は、辞書データのトップディレクトリを 指す alias を作ってください。
alias bkbook='python3 ~/src/bkbook/bkbook tui ~/eb'Python 3.9 以降で動きます。パッケージ化はしていません。標準ライブラリしか 使っていないものに、インストールという段階をわざわざ挟む理由もないかなと。
辞書データはコマンドラインで複数指定できます:
$ python -m bkbook tui ~/eb/plus ~/eb/genius複数の辞書データを置いたディレクトリを指定すると、その中の辞書が全部開きます。 こちらの方が便利です。
$ ls ~/eb
chujiten genius kojien plus wadai …
$ python -m bkbook tui ~/eb開いている辞書はキーを打つたびに全部検索されて、結果は交互に並べられるので、 先に開いた辞書のヒットが一覧の上に来ます。そして「どの辞書から先に聞きたいか」 は設定ファイルに書きます。
$ mkdir -p ~/.config/bkbook
$ python -m bkbook list --order ~/eb > ~/.config/bkbook/books.config
$ cat ~/.config/bkbook/books.config
srd-fpw # ランダムハウス英語辞典
plus # リーダーズ+プラス英和辞典
genius2 # ジーニアス英和大辞典
kojien # 広辞苑第五版list --order が、いま入っているものを推測順に並べて出すので、そこから始めて
好きに並べ替えてください。
名前は辞書が入っているディレクトリ名です。書かなかったものはそのあとに続いて、 英 → 国 → 百 の順、同じ種類の中では見出し語の多い順に並びます。これはあくまで 推測ではあります。
コマンドラインで辞書を並べれば、そちらが優先されて、書いた順に開きます。
$ python -m bkbook tui ~/eb/srd-fpw ~/eb/plus ~/eb/genius2 ~/eb/kojienヒットには 英 / 国 / 百 の印が付くので、種類をまたいだ一覧でもひと目で読めます。 印はタイトルが語っていればタイトルから決めますが (英和、百科)、語らない本も あります。惡魔の辭典 は Ambrose Bierce のあれなので中身は英語なのですが、 タイトルからはそれが分かりません。そういう本については最初の数語の見出しを 読んで、どの文字で書かれているかで判断しています。
問い合わせに答えられない辞書 (英語だけの本に日本語を投げた場合など) は、 エラーを出したりせず、単に何も出しません。
入力するにつれて見出し語の一覧がインクリメンタルに絞られて、選んでいるものの 項目がその下に出ます。辞書は何冊でも同時に開けます。キーを打つたびに全部が 検索されて結果が交互に並ぶので、1 冊が一覧を埋め尽くすことがなく、どの辞書からも 最良のヒットが画面に出てきます。冒頭の画面がその様子です。
ヒットにはそれぞれ出典の辞書名が付いて、選択中のものの完全なタイトルはヘッダに 出ます。Emacs の Lookup と同じく一覧を上、項目を下に積む配置なので、辞書名を 略さずに収められます。
結果は順位で交互に並ぶのですが、結果として種類ごとのまとまりになります。
英 のヒットの連なり、次に 国、次に 百、という具合です。TAB はその連なりを
1 つずつたどるのではなく、次の連なりの先頭へ飛びます。
| キー | |
|---|---|
↑ ↓ / ^P ^N |
見出し語を移動 |
PgUp PgDn |
10 件ずつ移動 |
^U ^D |
項目をスクロール |
^W |
検索語の末尾 1 語を削除 |
TAB |
次の種類の辞書へ飛ぶ |
^L |
再描画 |
ESC / ^C |
終了 |
先頭に * を付けると、反対側の端に錨を下ろします。*ization は ization で
終わる 見出し語を探します (DETAILS.md)。
^K を押すと、見出し語ではなく本文のほうを検索する側に切り替わります
(DETAILS.md)。
画面描画は標準ライブラリの curses です。ここでも追加で入れるライブラリは
ありません。色にはいっさい手を触れず、太字・淡色・反転しか使っていないので、
端末に設定したテーマがそのまま残ります。ちなみに日本語があると配置の計算が
急に面倒になります。1 文字が端末の 2 桁を占めることもあれば、結合文字なら
0 桁のこともあるので、幅は数えるのではなく、全部その場で測っています。
辞書には JIS X 0208 にない文字が出てきます。発音記号、合字、囲み数字、 記号のたぐいです。これらは辞書固有の符号のもとに、文字ではなく ビットマップとして入っています。符号はそれを定義した本の外では何の意味も 持ちません。0xa139 はある辞書では á で、隣の辞書ではまったく別の字です。 つまり Unicode への対応表は、形式にではなく本 1 冊 1 冊に属します。
ふつうはこの表を appendix (Motoyuki Kasahara 氏が libeb 用に公開した
*.app) が与えてくれます。bkbook もそれを読めますが、なくても困らない
ように、作者の手元のコレクション 20 冊分、あわせて 1 万項目あまりの対応表を
gaiji.py に内蔵しています。サブブックのタイトルで照合して勝手に当たるので、
設定は要りません。
その他の辞書に関しては appendix ファイルの利用をおすすめします
(DETAILS.md)。eb/appendix に置いておけば
勝手に拾いますし、-a で明示的に渡すこともできます。
対応のない符号は <gaiji=z1234> として残ります。黙って消えるより、目に
見えて grep もできるほうがよいので。
この表をどうやって起こしたかは DETAILS.md にあります。
DETAILS.md に、TUI 以外のすべてが入っています。
$ python -m unittest discover tests実物の辞書が要るテストは $BKBOOK_TEST_BOOK、またはリポジトリの隣の
eb/plus か plus/ を探して、なければスキップします。コレクション全体を
歩くテストは $BKBOOK_TEST_COLLECTION、または隣の eb/ を見ます。
BSD 3-Clause です。LICENSE を見てください。
EB Library (libeb) と同じライセンスにしてあります。
このライブラリの骨格は libeb 4.4.3 を読んで書きました (索引の B 木の走査、
検索語の正規化、比較関数、本文のエスケープシーケンスの解釈)。
_tables.py の表にいたっては setword.c からの書き写しです。なので LICENSE
には Motoyuki Kasahara 氏の著作権表示も併記して、BSD 3-Clause の第 1 項
(ソース再配布時に著作権表示を保持すること) を満たすようにしてあります。
各ソースファイルの先頭には SPDX の識別子を置いてあります。ライセンス全文の
代わりに LICENSE を指しているだけなので、2 行で済みます。
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2026 satorux**Motoyuki Kasahara 氏の著作権行を付けたのは、氏の仕事の上に立っている
ファイルです。**合わせて 10 個。zio.py book.py subbook.py
setword.py _tables.py match.py search.py text.py font.py は
libeb のソースを移したもので、それぞれの docstring にどの .c にあたるかを
書いてあります。appendix.py は移植ではありませんが、氏の設計した *.app
形式を読むためだけに存在するファイルなので入れました。
残りは氏の関与していないコードです。外字テーブル (gaiji.py) はビットマップを
読んで起こしたもの、項目の終わりの推定 (stopcode.py) は libeb がやらなかった
こと、TUI と CLI (tui.py cli.py layout.py) はこの道具のためだけのものです。
This is a personal project. The views, code, and opinions expressed here are my own and do not represent those of my current or past employers.