whiteleaf7 / narou

Narou.rb - 小説家になろうのダウンローダ&縦書き整形&管理アプリ。Kindle(などの電子書籍端末)でなろうを読む場合に超便利です!
Other
483 stars 56 forks source link

バージョン 1.1.1 以降のAozoraEpub3改造版に Narou.rb の CSS が適用されない #419

Open happynow opened 5 months ago

happynow commented 5 months ago

状況整理

AozoraEpub3(以下、Aozora)の改造版は、電書協の制作ガイドに準拠するため、 バージョン 1.1.1 からepubファイル^1とそのテンプレートのディレクトリ構成を変更した。

Narou.rb でこの新しい改造版を使うと CSS やフォントを Aozora 側にコピーする際、 コピー先のディレクトリがなくてエラーが発生。 その後、プログラムが改修されエラーは出なくなったものの、 コピー先のパスが正しくないため、新しい改造版では Narou.rb の CSS が反映されなかった。

AozoraEpub3 の仕様

カスタムテンプレートのパス

本家も改造版もカスタムテンプレートファイルは下記のようなパスに配置する必要がある(フォントファイルは除く)

オリジナルのテンプレートファイルのパスが C:/AozoraEpub3-1.1.1b22Q/template/item/style/aozora.css であれば、カスタムテンプレートのパスは C:/AozoraEpub3-1.1.1b22Q/template/item/style_custom/aozora.css になる

(参考)AozoraEpub3 でカスタムテンプレートを処理してる箇所 Epub3Writer.java#L402-L406

CSS のインポート構成について[^2]

・電書協フォーマットに対応した改造版には book-style.css というメインのCSSがある。 ・他の CSS はこの book-style.css@import 文で取り込まれる ・作品の本文HTMLは book-style.css だけをリンクする

book-style.css …… 本文HTMLが取り込むCSS
  │
  ├─ style-reset.css …… book-style.css にインポートされるCSS
  ├─ style-standard.css …… 〃
  ├─ style-advance.css …… 〃
  ├─ aozora.css ………〃
  ├─ font.css ………〃
  └─ text.css ………〃

[^2]: 「電書協 EPUB 3 制作ガイド ver.1.1.3」76ページにも記載がある。 http://ebpaj.jp/counsel/guide よりダウロード可能。

happynow commented 5 months ago

下記の案をもとに修正してPRしてみました。#420

ひとつの対応案

下記のようにメインの book-style.css の最後に Narou.rb のCSSファイルの内容を追記する。 こうすれば Narou.rb のスタイル定義が最後になり同じセレクタなら優先的に使われる。

book-style.css

@charset "UTF-8";
@import "style-reset.css";
@import "style-standard.css";
@import "style-advance.css";
@import "aozora.css";
@import "font.css";
@import "text.css";

‥ Aozora のスタイル定義 ‥

/*** [START] Narou.rb embedded custom style ***/

‥ Narou.rb のスタイル定義を追記 ‥

/*** [END]  Narou.rb embedded custom style ***/

また追記方式なら、Aozoraが資材を改訂してもNarou.rbの資材をそのまま使える可能性が高くなる。 現行でも chuki_tag.txt は追記で更新している。

kokotaro commented 4 months ago

リクエスト内容だと初期状態でstyle_customがないのでエラーが発生してました。 ディレクトリ作成でエラー解消されるので、style_customが無ければディレクトリ作成する処理追加で問題ないんじゃないかと

コードは適当なのですがディレクトリ判定して、無ければ作成してから渡すといいのかな?と def self.get_custom_file_path(file_path) puts "IN: self.get_custom_file_path" custom_file_path = File.join(File.dirname(file_path) + "_custom") unless File.directory?(custom_file_path) FileUtils.mkdir_p(custom_file_path) end File.join(File.dirname(file_path) + "_custom", File.basename(file_path)) end

happynow commented 4 months ago

@kokotaro ご指摘ありがとうございます。恥ずかしいバグでした。 修正案は少し変更させて頂きました。 FileUtils.mkdir_p は対象ディレクトリが存在しても実行できるので、ディレクトリ存在チェックは取り除きました。 https://github.com/whiteleaf7/narou/pull/420/commits/de425147a0b12dcbfac538ca5a2e37cb711fff8e でコミットしました。