「小説家になろう」のepub化スクリプトを作り直した

どうも私です。

先日作った、「小説家になろう」のepub化スクリプトですが、気にくわないので作り直しました。というわけで、今日はそのお話し。

失敗1 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に対応したのが、比較的最近(と言っても数年前)という話なので、もしかしてpandocのバージョンが古い?と思い、ターミナルへおもむろにman pandocと叩いてみたら、page-progression-directionの記載があるじゃありませんか。なんだよ、バージョン的には対応してるじゃないか。

しかし、何をやってもpage-progression-directionがだめ。これがダメだと、まったく使い物にならない。

いざいざ考えてみるとそうなんだよね。pandoc epubで検索するといっぱい日本語のサイト出てくるけど、縦書きを検索キーワードに追加すると、ガッツリ減る。そして、ザ・正解というようなサイトが見当たらない。

しまいには、でんでんコンバータを使え的なのが見えたりで、お話になりません。

でんでんコンバータは優れたサービスだとは思いますが、私の要件には合ってません。コマンドライン一発で、epubファイルが出来るのが素敵なわけですよ。またでんでんコンバータは、文字数制限がきつい。小説家になろうで長く連載しているものは100万字を平気で超えてきます。それを1ファイルのepubにしてしまうので、でんでんコンバータでは能力不足なわけですね。

page-progression-directionが使えないとなった今、pandocの路線は消えたので、Re:VIEWに戻るべきかと悩みましたが、次の結論に至りました。

ないなら作ればいいじゃない、自力でepub化する

もちろん自力と言っても、手作業をするつもりはありません。あくまで自動化が前提です。

というわけで、数時間で作りました。もー半日潰しちゃったなー。

処理の流れはこんな感じ

  1. シェルスクリプトからプログラムをキック
  2. EPUBファイルの作業ディレクトリ作成
  3. 小説家になろうのncodeから該当の小説情報と各話のリンクを取得
  4. EPUB用のメタデータをテンプレートから作成
  5. 各話の本文をスクレイピングしてEPUB用のコンテンツファイルを作成
    1. 余計なタグの処理
    2. 縦中横の処理
  6. シェルスクリプトからEPUBファイル化のためにZIPで固める

こんな感じです。2〜5はrubyで作ったスクリプトで処理して、1と6が普通にシェルスクリプトです。なので、シェルスクリプトを叩けば、カレントディレクトリにepubファイルが出来上がるというわけです。

出来上がったepubファイルをiBookで開いて、それなりに満足。スタイルシートは調整が必要だけども、表記が崩れる事もほとんどない(現時点でチェックしてる限りは)。

4のEPUB用メタデータ作成も、EPUBの仕様(今回はEPUB3の仕様に合わせた)を把握してみたら、わりと簡単にできたので、実はepubファイル作るのは難しくはないのかもしれませんね。(※凝ったことしなければの話ですが)

5のスクレイピングですが、各話を連続してスクレイピングしようとすると、サーバから拒絶されちゃいます。なので、各話のスクレイピングの間にsleepを置いて、3秒間隔で処理するようにしています。

なもんだから、話数が多いと自然と処理に時間がかかります。これは仕方ないね。narou.rbもそういう感じみたいだし。

と言ったところで、今日はここまで。
もしかしたら、次回あたり作ったスクリプトの解説を書くかもしれない。