EPUBをリリースする前には必ずW3Cの公的なチェッカーであるEpubcheckに通してエラー等が出ていないかを確認する必要がありますが、そのEpubcheckに制作サイドとしては結構重要な変更があったようなので書いておきます。
OPFのManifestに記述されていないファイルがパッケージに入っていてもエラーにならなくなった
どうもEpubcheckのバージョンが4.2.6から5.0.0に上がる際にかなり重要な変更があったようです。具体的には4.2.6まではEPUB内のManifestに記述されていないファイルがパッケージ内にあることは許容されておらず、エラー扱いになっていましたが、5.0.0ではエラーにならなくなりました。https://github.com/w3c/epubcheck/releases のEpubcheck v5.0.0のFeaturesにある
report as a usage when no reference were found to manifest items (09244a4), closes #1452
report as usage container resources not listed in manifest (f81b423)
が関連するらしいとのこと。
まあ5.0.0以降でもEpubcheckの実行時に-uオプションを付けることでファイルの混入をチェックすることはできるようなのですが、扱いとして「エラーではない」ことになったということです。
Epubcheckの出してくるアラートの区分
ここであらためてEpubcheckの出すメッセージの種類を確認しておきます。以下の4種類の分類があるようです。- Fatal Error(致命的エラー)
- Error(エラー)
- Warnings(警告)
- Usage(利用法情報)
このうち、Fatal ErrorおよびErrorは修正しないと流通が許されない種類のもので、Warningsは警告程度のニュアンスなので流通させること自体は問題ないはずですが、電子取次の規約を理由に修正を求められることはあるようです。まあ「非推奨」くらいの意味合いかと思いますので新規にデータを作る際には直した方が無難ではあるでしょう。Usageは単なる内部データの状況のレポートなので出ていても問題は無いはずです。とは言え今回のポイントである意図しないファイルがEPUBパッケージ内に入ったまま流通してしまうことはもちろん良くはないので、管理面でチェックしておきたくはあります。
また、Fatal Error/Error/Warningsは「標準エラー出力」でアラートを出しているようですが、Usageは「標準出力」扱いなので、ターミナル等でepubcheckを直に使う分には問題ないですが、外部言語等でアラートの内容を取得している場合には「2>&1」のような指定を追加してメッセージをマージする必要があるようです。
-uオプションで混入自体は検出できるが・・・
さて前述したように、java -jar Epubcheckのフォルダへのパス/epubcheck.jar -u テストファイルへのパス/test.epub
のように-uオプションを指定すればmanifestに記述されていないファイルの混入をチェックすることはできます。ただし、電書協ガイドのテンプレートに入っているstyle-check.cssに関連するレポートもたくさんUSAGE扱いで出てきてしまいます。これはEpubcheckの機能での選別はできそうにないので、USAGE扱いの中の特定のメッセージだけを出したければ後からフィルタリングするしかないことにはなります。まあstyle-check.css自体、内容確認の際にだけ有効にして使うためのものですので消しても実害はないはずですが、電子取次の内部チェッカーで引っかかって戻ってくる可能性が無いとも言えないのでできればそのままにしておきたいところです。
Epubcheckのアラートをフィルタリングして必要なものだけ出すようにしてみる
ということでちょっとコードを書いてみました。use utf8;
######### Epubcheckを-uオプション付きで実行し、電書協ガイドのstyle-check.css関連のアラートを除外して結果を出力する #########
#Encodeモジュールをインポート
use Encode qw/encode decode/;
#epubcheckのファイルパスを指定
my $epubCheckPath = $ARGV[0];
$epubCheckPath = decode('UTF-8', $epubCheckPath);
#チェックするepubのファイルパスを指定
my $epubFilePath = $ARGV[1];
$epubFilePath = decode('UTF-8', $epubFilePath);
#epubcheckを実行して結果を取得
my $epubFilePathEscaped = "'" . $epubFilePath . "'";
my $epubcheckcommand = "export _JAVA_OPTIONS=-Dfile.encoding=UTF-8;java -jar " . $epubCheckPath . " -u " . $epubFilePathEscaped . " 2>&1";
my $epubcheckResult = `$epubcheckcommand`;
#epubcheck実行結果を出力
my @selectedLogTexts;
$epubcheckResult =~ s@\x0D\x0A@\x0D@g;
$epubcheckResult =~ s@\x0A@\x0D@g;
@epubcheckResultTxts = split("\x0D",$epubcheckResult);
#style-check.css関連のアラートをハネる
foreach (@epubcheckResultTxts) {
unless ($_ =~ /^USAGE.+?style\-check\.css.+?$/){push(@selectedLogTexts, $_);}
}
$epubcheckResult = join("\x0D\x0A",@selectedLogTexts);
print $epubcheckResult . "\r\n";
exit;
ぐらいの感じでしょうか。ターミナルで
perl このコードのファイルのパス epubcheckのパス チェックするEPUBのパス
の形で指定すれば使えます。
これを取り込んだ「EPUB3トータルデータチェッカー2.5.0」はこちらからダウンロードできます。