[ガジェット]たった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は大丈夫だった。