2.0ゲームしたり・・・メニューコンテンツへスキップホームゲーム攻略メモ「小説家になろう」のepub化スクリプトを作り直したどうも私です。先日作った、「小説家になろう」のepub化スクリプトですが、気にくわないので作り直しました。いうわけで、今日はそのお話し。Webに最適化された小説をRe:VIEW形式にするには無理があった先日作ったepub化スクリプトは、小説家になろうからスクレイピングして、Re:VIEW形式に変換して、epub化するというものです。「小説家になろう」で掲載されるコンテンツは、基本的にWebで見る事を前提に書かれているのですが、図表のようなものもテキストで表現されることが多いのです。リスト表記だったりもHTMLのULやOLタグを使ったものではなく、「・」を多用したりして表現されている場合がほとんどです。その表現も、HTMLを用いて表現されているわけなんですが、Re:VIEW形式は独自形式で、どちらかというとmarkdown形式に近い記法です。このRe:VIEW形式の変換過程で、どうしても表現が崩れてしまうんですよね。大きな違いは、小説家になろうの本文には、パラグラフの概念がありません。HTML的に言えば、Pタグがありません。パラグラフは、BRタグを使って表現します。いうか、小説家になろうの本文には、BRタグとルビに関するタグしかありません。italicやboldがあってもいいと思いますが、見たことないですね。一方で、Re:VIEW形式にはパラグラフ(段落)の概念があり、基本的に文章はパラグラフ単位で書いていきます。まーこのへんは、markdownと一緒ですね。最終的なアウトプットは、縦書きepubファイルですんで、縦書き用の表現に修正しないといけないのですが、いくつかの箇所で自動化では難しい場面に遭遇してしまい、Re:VIEWで作る事は断念しました。断念というか、捨てたというか。今回の用途に向かなかったというだけど、Re:VIEW自体は優れた組版?ソフトだと思います。私が物書きであるならば、Re:VIEWを使って作文をしたいと思うぐらいにRe:VIEWを気に入っています。空白行を挿入できないのは問題なんですがね。Re:VIEWがだめならpandocはどうだRe:VIEWはダメだった。pandocではどうだと思い立ったのが、昨日の晩。pandocは、ドキュメントの相互変換が出来るソフトウェアで、私のmacにもインストールされています。pandocの入力にmarkdownを使い、出力をepub3でと考えました。小説家になろうのスクレイピングしてからの、markdown化ですが、基本的にBRタグの除去と改行の調整、あとは縦中横の処理を追加するぐらいで、ルビに関してはそのままです。そもそも、markdownにはルビのルールがありません。どんなmarkdownのflavorであっても、ルビはHTMLタグで表現します。markdownのダメなところの1つです。HTMLのルビは非常に煩雑でmarkdownの良さがなくなります。Re:VIEWとか青空文庫形式ならまだ許容範囲なんですがね。pandocのepub化には、metadataを記載したyamlファイルを作成してパラメータとして渡します。pandocのマニュアルにはpage-progression-directionというパラメータが記載されており、縦書きepubを作る上で重要なパラメータです。この値に、rtlを指定することで、ページ送りが右開きになります。デフォルトは左開きなわけですけど、縦書きで左開きは、、、少なくとも私は読めません。いざスクリプトをpandoc用に修正してepubファイルを作ってみたんですが、見事にpage-progression-directionが無視されているではありませんか。いやいや、何がおかしいんだ?と出来上がったepubファイルを解凍してばらして、opfファイルを見てみると、本来page-progression-directionが書いてなければならいspineタグのattributeに書いてないのです。pandocと叩いてみたら、page-progression-directionの記載があるじゃありませんか。なんだよ、バージョン的には対応してるじゃないか。何をやってもpage-progression-directionがだめ。これがダメだと、まったく使い物にならない。いざいざ考えてみるとそうなんだよね。epubで検索するといっぱい日本語のサイト出てくるけど、縦書きを検索キーワードに追加すると、ガッツリ減る。ザ・正解というようなサイトが見当たらない。しまいには、でんでんコンバータを使え的なのが見えたりで、お話になりません。コンバータは優れたサービスだとは思いますが、私の要件には合ってません。コマンドライン一発で、epubファイルが出来るのが素敵なわけですよ。コンバータは、文字数制限がきつい。小説家になろうで長く連載しているものは100万字を平気で超えてきます。それを1ファイルのepubにしてしまうので、でんでんコンバータでは能力不足なわけですね。page-progression-directionが使えないとなった今、pandocの路線は消えたので、Re:VIEWに戻るべきかと悩みましたが、次の結論に至りました。ないなら作ればいいじゃない、自力でepub化するもちろん自力と言っても、手作業をするつもりはありません。いうわけで、数時間で作りました。もー半日潰しちゃったなー。縦中横の処理シェルスクリプトからEPUBファイル化のためにZIPで固めるこんな感じです。2〜5はrubyで作ったスクリプトで処理して、1と6が普通にシェルスクリプトです。シェルスクリプトを叩けば、カレントディレクトリにepubファイルが出来上がるというわけです。出来上がったepubファイルをiBookで開いて、それなりに満足。スタイルシートは調整が必要だけども、表記が崩れる事もほとんどない(現時点でチェックしてる限りは)。4のEPUB用メタデータ作成も、EPUBの仕様(今回はEPUB3の仕様に合わせた)を把握してみたら、わりと簡単にできたので、実はepubファイル作るのは難しくはないのかもしれませんね。(※凝ったことしなければの話ですが)5のスクレイピングですが、各話を連続してスクレイピングしようとすると、サーバから拒絶されちゃいます。各話のスクレイピングの間にsleepを置いて、3秒間隔で処理するようにしています。もんだから、話数が多いと自然と処理に時間がかかります。narou.rbもそういう感じみたいだし。言ったところで、今日はここまで。したら、次回あたり作ったスクリプトの解説を書くかもしれない。