Skip to content
Masayoshi Takahashi edited this page May 7, 2016 · 4 revisions

Re:VIEW-EPUBMakerの仕組み

(ここに記述している内容は、現時点ではスタンドアロン実装の review-epubmaker のことではなく review-epubmaker-ng の実装についてです。動作互換性の確認がとれたところで移行する予定です)

コマンドライン

review-epubmaker-ng YAMLファイル [生成ePUBファイル名]

生成ePUBファイル名を省略すると、YAMLファイルのbookname設定が使われます。拡張子.epubが付くので、指定時には「.epub」は含めないでください。

たとえば日にちベースの名前にしたければ「review-epubmaker-ng config.yaml hoge-$(LC_TIME=C date ‘+%Y%m%d’)」とすれば、「hoge-20131014.epub」のようなファイルが生成されます。

処理の流れ (reviewepubmaker.rb#produce)

  1. YAMLファイルを読み込みます。ReVIEWのデフォルト→YAMLの値で上書き→epubmakerの値で未設定箇所を充当 という適用順序になっています。

  2. カレントにランダムなテンポラリフォルダを作成します。

  3. (YAMLで定義しているなら)hook_beforeprocessのフックスクリプトを実行します。スクリプトには、2.のテンポラリフォルダ名が引数として渡されます。この後にスタイルシートを取り込むので、SaSSなどを事前実行したいときにはここで呼び出すとよいでしょう。以降もそうですがフックスクリプトは実行属性が付いている必要があり、またカレントにある場合は「./スクリプト名」のように記述しないと呼び出しに失敗します。

  4. YAMLのstylesheetに配列で指定されたスタイルシート群をテンポラリフォルダにコピーします。

  5. 前付のうち、カバー(cover)、大扉(titlepage・titlepagefile)、原書大扉(originaltitlefile)、クレジット(credit)で実在するファイルが指定されていればそのままコピーします。ただし大扉だけは、titlepage=true、titlepagefile=nilの場合はテンプレートから生成します(#build_titlepage)。

  6. (YAMLで定義しているなら)hook_afterfrontmatterのフックスクリプトを実行します。スクリプトには、2.のテンポラリフォルダ名が引数として渡されます。5.までに登録した内容とPREDEFで定義している内容との間で何か挿入したいときには、ここで調整します。テンポラリフォルダにはtoc-html.txtというファイル(フォーマットは次節参照)があり、あとでePUBを作成するときにはここで定義した内容に従ってパッキングされます。たとえば何かHTMLファイルを差し込みたいときにはそのファイルをテンポラリフォルダにコピーし、toc-html.txtにエントリを追加します。

  7. PREDEF/CHAPS/POSTDEFからreview-compileでHTMLをビルドします(#build_body)。PARTがあり、ファイル名指定がなされているときには普通の章と同様にビルド(#build_chap)、見出し指定の場合はテンプレートから作成します(#build_part。part_1、part_2、…というファイル名になります)。PREDEF/CHAPS/POSTDEFから生成されるファイル名は通常そのReVIEWファイルのものが使われますが、YAMLでrename_for_legacy: trueが指定されているときにはPREDEFはpre01,pre02,…、CHAPSはchap01,chap02,…、POSTDEFはpost01,post02,…となります。PREDEFの採番レベルはpre_secnolevel、CHAPSの採番レベルはsecnolevel、POSTDEFの採番レベルはpost_secnolevelが使われます。

  8. (YAMLで定義しているなら)hook_afterbodyのフックスクリプトを実行します。スクリプトには、2.のテンポラリフォルダ名が引数として渡されます。7.でできたHTMLファイルを再加工したり、目次を変更したりするのに使うとよいでしょう。

  9. プロフィール(profile)、広告(advfile)、奥付(colophon)で指定したファイルを(存在すれば)後付部分としてコピーします。FIXME:現時点でcolophonにファイル名ではなく「true」を指定するとテンプレートから作成します。

  10. (YAMLで定義しているなら)hook_afterbackmatterのフックスクリプトを実行します。スクリプトには、2.のテンポラリフォルダ名が引数として渡されます。9.の後付部分をさらに加工したり何か途中に挿入したいときに使います。

  11. テンポラリディレクトリのtoc-html.txtをもとに、ePUBの文章部のパッキング情報を作成します(#push_contents)。

  12. 画像をテンポラリディレクトリのimagesサブフォルダにコピーします。YAMLのimagedirで定義したもの、カレントのcovers、カレントのadvの中にある画像拡張子(jpg/jpeg/gif/png)付きファイルが中のサブフォルダも含めてimagesにコピーされます。

  13. (YAMLで定義しているなら)hook_aftercopyimageのフックスクリプトを実行します。スクリプトには、2.のテンポラリフォルダ名が引数として渡されます。12.のほかに画像をコピーしたいときに使うとよいでしょう。

  14. テンポラリディレクトリのimagesサブフォルダからePUBの画像のパッキング情報を作成します(Producer#import_imageinfo)。

  15. epubmakerライブラリのProducer#produceを呼び出します。この内部では2つめのテンポラリディレクトリを作成し、ここまでに蓄積したePUBパッキング情報と、最初のテンポラリディレクトリから、ePUBのためのフォルダを構成します(mimetype、OEBPS、META-INFなど)。

  16. zipアーカイブ前の最後のタイミングで(YAMLで定義しているなら)hook_prepackのフックスクリプトを実行します。スクリプトには、15.の「2つめのテンポラリフォルダ名」が引数として渡されます。opf構成ファイル、ncx目次ファイルなどを調整したいときに使います。

  17. すべて準備ができたら、Producer#produceがzipでアーカイブします(zipコマンド内容はYAMLのzip_stage1、zip_stage2)。

YAMLでdebug:trueを有効にすると、処理の流れをログで提示するとともに、15.の「2つめのテンポラリフォルダ」は、booknameで指定した名前のフォルダ名としてカレントに作成され、処理が終わっても削除されなくなります。

toc-html.txt

プロセス2.のテンポラリフォルダには、toc-html.txtというファイルが作られます。このファイルは次のいずれかの書式で、あとでePUBパッキングの際の目次およびファイルアーカイブ情報となります。

見出しレベル <TAB> ファイル名 <TAB> 見出し
見出しレベル <TAB> ファイル名 <TAB> 見出し <TAB> 補助情報
見出しレベル <TAB> ファイル名#アンカー <TAB> 見出し
見出しレベル <TAB> ファイル名#アンカー <TAB> 見出し <TAB> 補助情報

「見出しレベル」には数値を入れ、部=0、章=1、節=2、…となります(PREDEF/CHAPS/POSTDEFからの抽出では単にHTMLのheaderから取っています。PARTの場合はh1から取ってレベルを0にするロジックになっています)。目次にはtoclevelで指定したレベルまでのものが入ります。

「ファイル名」は実際のHTMLファイルです。HTMLファイルは通常章単位になっているので節や項にはリンクで対処しますが、その場合には「#アンカー」書式でidを指定します。

「見出し」は目次に入る見出しとなります。エスケープ前のものを指定します。(FIXME:要確認)

「補助情報」はデフォルト挙動を変えたいときのパラメータです。「変数=値」形式で、「,」で区切って複数指定可能です。

  • id=識別子:通常、コンテンツIDはファイル名+アンカーから拡張子を除いたものから#などの記号を-に変換したものになります。特別にほかの識別子を使いたいときにはこれで指定します。ReVIEWファイル側で見出しにIDを明示指定しているときには自動でそれがここに指定されます。

  • force_include=true:ePUBパッキングする際にtoclevelとの兼ね合いなどでファイルが収録対象から漏れることがありますが、この補助情報を付けていると必ず収録します。PREDEF/CHAPS/POSTDEFのファイルの最初に発見した見出しには必ずこれが付きます。