Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bkbook

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 以降で動きます。パッケージ化はしていません。標準ライブラリしか 使っていないものに、インストールという段階をわざわざ挟む理由もないかなと。

TUI

辞書データはコマンドラインで複数指定できます:

$ 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/plusplus/ を探して、なければスキップします。コレクション全体を 歩くテストは $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) はこの道具のためだけのものです。

Disclaimer

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.

About

EB(電子ブック)と EPWING の電子辞書を読むピュアPython のリーダー

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages