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