Epubcheckのバージョンアップで仕様が変わったことについて

　EPUBをリリースする前には必ずW3Cの公的なチェッカーであるEpubcheckに通してエラー等が出ていないかを確認する必要がありますが、そのEpubcheckに制作サイドとしては結構重要な変更があったようなので書いておきます。

<div style="padding-left:1em" class="clear">
<h3 style="border-bottom: medium solid gray">OPFのManifestに記述されていないファイルがパッケージに入っていてもエラーにならなくなった</h3>
　どうもEpubcheckのバージョンが4.2.6から5.0.0に上がる際にかなり重要な変更があったようです。具体的には<strong>4.2.6まではEPUB内のManifestに記述されていないファイルがパッケージ内にあることは許容されておらず、エラー扱いになっていましたが、5.0.0ではエラーにならなくなりました</strong>。

<a href="https://github.com/w3c/epubcheck/releases" rel="noopener" target="_blank">https://github.com/w3c/epubcheck/releases</a> の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)


が関連するらしいとのこと。

　まあ<strong>5.0.0以降でもEpubcheckの実行時に-uオプションを付けることでファイルの混入をチェックすることはできる</strong>ようなのですが、扱いとして「エラーではない」ことになったということです。
</div>

<div style="padding-left:1em" class="clear">
<h3 style="border-bottom: medium solid gray">Epubcheckの出してくるアラートの区分</h3>
　ここであらためてEpubcheckの出すメッセージの種類を確認しておきます。以下の4種類の分類があるようです。

<ul>
<li><strong>Fatal Error（致命的エラー）</li>
<li><strong>Error（エラー）</strong></li>
<li><strong>Warnings（警告）</strong></li>
<li><strong>Usage（利用法情報）</strong></li>
</ul>

　このうち、<strong>Fatal Error</strong>および<strong>Error</strong>は修正しないと流通が許されない種類のもので、<strong>Warnings</strong>は警告程度のニュアンスなので流通させること自体は問題ないはずですが、電子取次の規約を理由に修正を求められることはあるようです。まあ「非推奨」くらいの意味合いかと思いますので新規にデータを作る際には直した方が無難ではあるでしょう。<strong>Usage</strong>は単なる内部データの状況のレポートなので出ていても問題は無いはずです。とは言え今回のポイントである意図しないファイルがEPUBパッケージ内に入ったまま流通してしまうことはもちろん良くはないので、管理面でチェックしておきたくはあります。
　また、Fatal Error／Error／Warningsは「標準エラー出力」でアラートを出しているようですが、Usageは「標準出力」扱いなので、ターミナル等でepubcheckを直に使う分には問題ないですが、外部言語等でアラートの内容を取得している場合には「2&gt;&amp;1」のような指定を追加してメッセージをマージする必要があるようです。
</div>

<div style="padding-left:1em" class="clear">
<h3 style="border-bottom: medium solid gray">-uオプションで混入自体は検出できるが･･･</h3>
　さて前述したように、

 
<pre class="lang:sh decode:true " >java -jar Epubcheckのフォルダへのパス/epubcheck.jar -u テストファイルへのパス/test.epub</pre> 


のように-uオプションを指定すればmanifestに記述されていないファイルの混入をチェックすることはできます。ただし、電書協ガイドのテンプレートに入っているstyle-check.cssに関連するレポートもたくさんUSAGE扱いで出てきてしまいます。これはEpubcheckの機能での選別はできそうにないので、USAGE扱いの中の特定のメッセージだけを出したければ後からフィルタリングするしかないことにはなります。まあstyle-check.css自体、内容確認の際にだけ有効にして使うためのものですので消しても実害はないはずですが、電子取次の内部チェッカーで引っかかって戻ってくる可能性が無いとも言えないのでできればそのままにしておきたいところです。
</div>

<div style="padding-left:1em" class="clear">
<h3 style="border-bottom: medium solid gray">Epubcheckのアラートをフィルタリングして必要なものだけ出すようにしてみる</h3>
　ということでちょっとコードを書いてみました。

 
<pre class="lang:perl decode:true " >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&gt;&amp;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;</pre> 


　ぐらいの感じでしょうか。ターミナルで

 
<pre class="lang:sh decode:true " >perl このコードのファイルのパス epubcheckのパス チェックするEPUBのパス</pre> 


　の形で指定すれば使えます。

　これを取り込んだ<strong>「EPUB3トータルデータチェッカー2.5.0」</strong>は<a href="http://sanyoshasmds.xsrv.jp/main/?page_id=184" rel="noopener" target="_blank"><strong>こちら</strong></a>からダウンロードできます。