間違ったEPUBの正しい作り方(Linux, Mac, Cygwin編)

普通に正常なEPUBを作るのならば馬場さんのepubcheckの記事のようにepubcheckの-saveオプションを使って作るのが筋かと思うのですが、テスト用だったりなんだりで壊れたEPUB、間違ったEPUBを作る必要にせまられることがあります。

そのような際にはやっぱりzipコマンドでぽちぽちやる羽目になったりするのですが、何回かやるとめんどくさくなったので専用のコマンドを用意しました。EPUBのトップディレクトリに入って以下のコマンドを実行すると、一階層上のディレクトリにカレントディレクトリの名前がついたEPUBが出来ます。(タイトルにもありますがLinux環境用のコマンドとなります。筆者はWindows7+Cygwin+bashで動かして試しています。コマンドプロンプトについてはまた別の機会で扱うかも?)

zip -0 -X ../$(basename $(pwd)).epub mimetype; zip -r ../$(basename $(pwd)).epub * -x mimetype

上記だと同名EPUBがあった場合に更新になってしまうので、最初に削除するのもよいかもしれません。

rm ../$(basename $(pwd)).epub; zip -0 -X ../$(basename $(pwd)).epub mimetype; zip -r ../$(basename $(pwd)).epub * -x mimetype

実際の壊れたEPUBの作り方は以下になります。今回はEPUBの中のnavigationファイルにnavタグがないコンテンツを例として使いました。(ちなみに、現状の最新である3.0.1では、-mode expでエラーのあるコンテンツを食わせるとjava.lang.NullPointerExceptionで落ちてしまったので3.0-RC2で動かしています。ちょっとさぼってビルド済みのを使ったのがいけなかったのでしょうか?)

まずは、epubcheckでチェックして入れ込みたいエラーを確認します。

epubcheck-3.0-RC-2 $ java -jar epubcheck-3.0-RC-2.jar contents_nav_no_nav/ -mode exp
Epubcheck Version 3.0-RC-2

Validating against EPUB version 3.0
ERROR: contents_nav_no_nav.epub/item/navigation-documents.xhtml(8,7): assertion failed: Exactly one 'toc' nav element must be present

Check finished with warnings or errors

epubcheckのエラーについては電書ちゃんねるろすさん日本語訳を公開してくれています。専門用語ばりばりでちょっと難しいエラーメッセージが多いepubcheckなのでとても助かりますね。こちらによると。。。うーん載ってないですね。まあ作業中とありますし、これから充実していくことに期待しましょう!(プレッシャー)

今回のはあまり複雑なエラーでないですしそもそも自分で作ったエラーなので問題ないでしょう。opfファイルでnavigationファイルとして指定されたファイルはepub:type=”toc”なnavエレメントが一つはないとだめだよエラーですね。きちんとエラーがでているようです。

エラーが確認できたので、epubcheckでチェックしたディレクトリに移動して前述のコマンドを実行

epubcheck-3.0-RC-2 $ cd contents_nav_no_nav
contents_nav_no_nav $zip -0 -X ../$(basename $(pwd)).epub mimetype; zip -r ../$(basename $(pwd)).epub * -x mimetype

元のディレクトリに戻って出来たEPUBファイルがしっかり同じエラーでるか確かめる。

contents_nav_no_nav $cd ../
epubcheck-3.0-RC-2 $ java -jar epubcheck-3.0-RC-2.jar contents_nav_no_nav.epub
Epubcheck Version 3.0-RC-2

Validating against EPUB version 3.0
ERROR: contents_nav_no_nav.epub/item/navigation-documents.xhtml(8,7): assertion failed: Exactly one 'toc' nav element must be present

Check finished with warnings or errors

ディレクトリ移動する必要があるのがイケてないですが、そこは各自改良してお使いいただければと思います。正しい作り方とか生意気な銘打ってますが、なにか間違いなどありましたらご指摘いただければと思います。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ