iPhoneオライリー本アプリをkindlegenするときにエラー
[ガジェット]たった600円でオライリー本をiPadやKindleで読む。すてき。- このブログは証明できない。
を真似してkindle用ファイルを作ってみたら、少しはまったのでメモ。
購入したのは Programming PHP(エクステンションの作り方が知りたかった)。
まず、
Payloadというフォルダの中にappファイルがあります。
は、Windowsだと “(アプリ名).app” フォルダだった。
また、kindelgen を実行すると、
Error(prcgen): TOC section scope is not included in the parent chapter:BCMath Arbitrary Precision Mathematics (”BCMath~”というのは書籍内に含まれる章の名前)
というエラーが発生した。
エラーメッセージでググッたところ
http://www.mobipocket.com/forum/viewtopic.php?p=49267&sid=494a2df12b48a1e8fdca8ae0e7bfb752
がヒット。どうも、「toc.ncx」と「content.opfのspine要素」の整合性が取れていないためらしい。
toc.ncxの該当部分は
<navPoint id="id2424422" playOrder="1004">
<navLabel>
<text>B.1. Optional Extensions Listing</text>
</navLabel>
<content src="apb.html#progphp2-APP-B-SECT-1"/>
<navPoint id="id2424885" playOrder="1005">
<navLabel>
<text>BCMath Arbitrary Precision Mathematics</text>
</navLabel>
<content src="re514.html"/>
</navPoint>
となっているが、id2424422とid2424885の両方ともspineに含まれていない。
(id2424422はアンカー指定となっているためかmanifest要素にさえ含まれていない。apb.html自体はさらに親のid2424369として含まれている)
試行錯誤の結果わかったのは、navPointに含まれるidは親も子もspineの中に記述されていないと駄目らしいということ。
・content.opf の spine にid2424885(子)を追加。
・toc.ncxのid2424422(親)のIDをid2424369(apb.htmlのID)に書き換え。
でコンパイルを通りmobiファイルが生成された。
kindle for PCで動作を確認したところ、本文は正しく表示された。ただ、目次のほうはkindle for PC に機能自体がないのでうまく動いているかどうか不明。
余談:epubファイルを作成するとき、本来はmimetypeを一番初めに無圧縮で格納しないといけないのだが、そこは適当でもkindlegenは大丈夫だった。