entaPub — どんな EPUB も、安全に、最後まで読む
壊れた本も、作りの古い本も、悪意のある本も。entaPub は EPUB を安全に開き、直せるところは直して、本の姿を保ったまま読み手へ渡す読書エンジンです。
開けない本を、なくしたい。 EPUB は世界中で使われる電子書籍の形式ですが、実際に出回っている本には、規格どおりでないもの、途中で壊れたもの、古い作りのものが少なくありません。entaPub は、そうした本でもできる限り開き、しかも読む人の端末を危険にさらさない、Rust で書かれた EPUB の読み取りエンジンです。
特徴#
壊れていても読める
まず規格どおりに厳密に読み、だめなときだけ XML の修復、HTML としての読み直し、本の組み立て直しへと段階を追って復旧します。
何を直したかが分かる
どの段階でどう直したかを、確からしさと一緒に診断として残します。「なんとなく表示できた」で終わらせません。
本を開くだけで外へ通信しない
外部の CSS や画像を読みに行かず、本の中にあるものだけで組み立てます。
実行できるものは取り除く
script・iframe・javascript: などを外し、外したことを記録します。
本の外のファイルに触れない
../ や絶対パスで本の外を指す参照は受け付けません。
大きすぎる本でも止まらない
ファイルの大きさ・展開量・入れ子の深さ・要素の数に上限を置き、極端な本でも端末を固まらせません。
メモリ安全
Rust の unsafe を禁止し、AFL++ による fuzz で壊れた入力を大量に試しています。
本の姿をそのまま届ける
傍点・縦書き・字下げは本文の一部。危険な指定だけを外し、縦書き・ルビ・固定レイアウト・見開きを保ちます。
EPUB 2 も EPUB 3 も
新しい本も、古い作りの本も、同じ入口で読めます。
読むことと、作ること#
entaPub には、同じ入力から必ず同じ EPUB を組み立てる「Builder」も含まれています。KuroEditor で書いた原稿を EPUB に仕上げるのはこの Builder、KuroViewer で本を開くのは Reader。読む側と作る側を同じ考え方で作ることで、Entamy の製品は電子書籍を最初から最後まで自分たちの手で扱えます。
| 対応形式 | EPUB 2 / EPUB 3(固定レイアウト・縦書き・ルビ・見開き) |
|---|---|
| 復旧 | 厳密 → XML 修復 → HTML として読み直し → 本の組み立て直し(各段階を診断として記録) |
| 安全性 | 外部通信なし・実行要素の除去・本の外への参照の拒否・資源の上限 |
| 実装 | Rust(unsafe 禁止)・AFL++ による fuzz |
| 使っている製品 | KuroViewer(読む)・KuroEditor(作る) |
| 提供形態 | Entamy の製品に組み込んで使用(オープンソース化は未定) |
オープンソース化する場合は、Kuro License(MIT + 権利者表記)で公開する予定です。
