Re:VIEWでEPUBを生成できない場合の対処
問題
Re:VIEWでEPUBを生成する際に、以下のエラーが発生していました:
ERROR entity expansion has grown too large
これは、REXMLライブラリ(Rubyの標準XMLパーサー)のエンティティ展開テキスト制限に関する問題です。デフォルトでは、REXMLはXMLエンティティ展開攻撃を防ぐために、展開されるテキストのサイズに制限を設けています。しかし、大きなドキュメントを処理する場合、この制限が原因でエラーが発生することがあります。
参考
こちらのissueでこちらの問題が議論されていました。
https://github.com/kmuto/review/issues/1929
こちらのプルリクでrubyにentity_expansion_text_limitが導入され、Re:VIEWでエラーがでるようになりました。
https://github.com/ruby/rexml/pull/202
修正手順
-
プロジェクトのルートディレクトリ(articlesフォルダ)に
review-ext.rb
ファイルを作成します。 -
以下の内容を
review-ext.rb
ファイルに記述します:
#!/usr/bin/env ruby
# REXMLのエンティティ展開テキスト制限を設定
require 'rexml/document'
REXML::Security.entity_expansion_text_limit = 102400 # 10万に設定
puts "REXML entity expansion text limit set to #{REXML::Security.entity_expansion_text_limit}"
-
rake epub
コマンドを実行して、EPUBを生成します。
解説
- Re:VIEWは
review-ext.rb
ファイルが存在する場合、ビルドプロセスで自動的にこのファイルを読み込みます。 - このファイルでREXMLのエンティティ展開テキスト制限を大きな値(10万)に設定することで、大きなドキュメントでも処理できるようになります。
- コンソール出力に「REXML entity expansion text limit set to 102400 」と表示されれば、設定が正しく適用されています。
注意点
- この修正は、XMLエンティティ展開攻撃に対する保護を弱めることになります。しかし、信頼できるコンテンツのみを処理する場合は問題ありません。
- 値を大きくしすぎると、メモリ使用量が増加する可能性があります。必要に応じて値を調整してください。