「JavaScript Promiseの本」の PDF 生成

日本語 AsciiDoc を PDF 出力する方法を前回学びました。この知識を利用してインターネット上に公開されている日本語の AsciiDoc の書籍の PDF を生成してみます。

azu (Twitter: @azu_re) 氏が書籍「JavaScript Promiseの本」の AsciiDoc ソースを github https://github.com/azu/promises-book に公開されているのでこれを利用します。azu 氏のサイトでは Ruby のライブラリの Asciidoctor というプログラムを使用して PDF を生成しているようですが、ここではあえて a2x コマンドを使って PDF を生成してみます。動作確認は Fedora 21 でおこないました。

まずは、GitHub を clone します。

$ git clone https://github.com/azu/promises-book.git

内容を見ると、この書籍は複数の .adoc ファイルで構成されており、「promises-book/index.adoc」がトップのページとなっていることがわかります。この PDF を生成するには以下の a2x コマンドを使います。

$ cd promises-book/
$ a2x --format=pdf --doctype=book \
  --icons --icons-dir=/usr/share/asciidoc/images/icons \
  --fop --fop-opts='-c /usr/share/fop/conf/fop.xconf' \
  --xsl-file=/usr/share/fop/conf/fop-VL-PGothic.xsl \
  -k -v --no-xmllint index.adoc

上記のコマンドを実行するといくつかエラーが表示されます。1 個目のエラーとして以下のようなメッセージが表示されました。

...
asciidoc: include: promises-book/Ch3_Testing/mocha-promise.adoc
asciidoc: readme.adoc: line 11: reading: promises-book/Ch3_Testing/mocha-promise.adoc
asciidoc: FAILED: mocha-promise.adoc: line 7: unexpected error:
...

エラーメッセージの内容から推測して、「promises-book/Ch3_Testing/mocha-promise.adoc」ファイルの 7 行目あたりを確認してみると、行の左端に「>」の文字が配置されていることがわかります。これが原因でエラーとなっているようなので、以下のように「>」を削除して保存します。

変更前:

> Alternately, instead of using the done() callback, you can return a promise. This is useful if the APIs you are testing return promises instead of taking callbacks:

変更後:

 Alternately, instead of using the done() callback, you can return a promise. This is useful if the APIs you are testing return promises instead of taking callbacks:

同様にして「promises-book/Ch4_AdvancedPromises/promise-done.adoc」に関しても以下の 3 箇所の「>」を削除して保存します。

> ReferenceError: conosle is not defined
> Promise rejected but no error handlers were registered to it
> "Possibly unhandled ReferenceError. conosle is not defined

再度、上記の a2x コマンドを実行して PDF の生成を試みると、今度はつぎのエラーメッセージが表示されました。

...
a2x: chdir /home/user/Documents/promises-book
a2x: executing: "xsltproc"  --stringparam callout.graphics 1 --stringparam navig.graphics 1 --stringparam admon.textlabel 0 --stringparam admon.graphics 1 --stringparam admon.graphics.path "/usr/share/asciidoc/images/icons/" --stringparam callout.graphics.path "/usr/share/asciidoc/images/icons/callouts/" --stringparam navig.graphics.path "/usr/share/asciidoc/images/icons/" --stringparam toc.section.depth 1 --stringparam chunk.section.depth 0  --output "/home/user/Documents/promises-book/index.fo" "/usr/share/fop/conf/fop-VL-PGothic.xsl" "/home/user/Documents/promises-book/index.xml"

/home/user/Documents/promises-book/index.xml:3920: parser error : Unescaped '<' not allowed in attributes values
s://github.com/w3ctag/promises-guide">w3ctag/promises-guide</ulink> <ulink url="
                                                                               ^
...

エラーメッセージの「promises-book/index.xml:3920: parser error」に注目して、「promises-book/index.xml」ファイルの 3920 行目あたりをエディタで確認します。

<title>参考サイト</title>
<variablelist>
<varlistentry>
<term>
<ulink url="https://github.com/w3ctag/promises-guide">w3ctag/promises-guide</ulink> <ulink url="<literal>http://www.hcn.zaq.ne.jp/<emphasis>_</emphasis>/WEB/promises-guide-ja.html</literal>">(日本語訳)</ulink>
</term>

この .xml ファイルは a2x コマンド実行の途中過程で生成されたものなので、これを直接に修正しないで元の .adoc ファイルを修正するようにします。上記の .xml ファイルの内容から、「参考サイト」や「(日本語訳)」といったキーワードを grep で検索して .adoc ファイル内の問題の箇所を見つけます。

$ grep -r '参考サイト' *
...
Appendix-Glossary/resource-link.adoc:= 参考サイト
...

どうやら、「Appendix-Glossary/resource-link.adoc」ファイルの内容を修正すればよさそうです。「Appendix-Glossary/resource-link.adoc」ファイルをエディタで開くと以下の箇所が見つかりました。

= 参考サイト

https://github.com/w3ctag/promises-guide[w3ctag/promises-guide] link:++http://www.hcn.zaq.ne.jp/___/WEB/promises-guide-ja.html++[(日本語訳)]::
    Promisesのガイド - 概念的な説明はここから得たものが多い
    

エラーとなった原因はよくわかりませんが、とりあえず上記の 4 行目の 「 link:++http://www.hcn.zaq.ne.jp/___/WEB/promises-guide-ja.html++[(日本語訳)]」を削除してみます。

再び、上記の a2x コマンドを実行して PDF の生成を試みます。まだいくつかのエラーメッセージが表示されますが、PDF が生成されるところまできました。これで「index.pdf」が生成されました。

ついでに epub も生成してみましょう。

$ a2x -f docbook -d book -k -v --no-xmllint index.adoc
$ a2x -f epub -d book --icons --fop -k -v --no-xmllint index.xml

または

$ a2x --format=epub --doctype=book --icons --fop -k -v --no-xmllint index.adoc

これで「index.epub」が生成されました。

オリジナルのサイトで配布されている PDF と自分が作成した PDF の内容を見比べると、オリジナルの PDF のほうが随分と見栄えが良いことがわかりますが、なんとか日本語 PDF と epub を生成することができました。