電書協EPUB3用XHTMLファイルを自動分割する
先日1月18日に、JEPAセミナー「EPUB 第18回 EPUB 3制作の現場から II 」に登壇させていただきました。ご来場いただいたみなさまありがとうございます。私が最初でその後に話題のSF小説「Gene Mapper」作者の藤井太洋さん、最後に「電子雑誌トルタル」の古田靖さんと小嶋智さんのセッションという構成でした。
200人の会場が満員に近い盛況ぶりで、とても有り難いことだと思っております。動画がこちらにアップされておりますので、ご興味をお持ちの方はご覧になってみてください。
さて、今回は当日私のセッションの中のInDesignからXHTMLを書き出すパートの中で、XHTMLの途中で1ページ画像を挿入するために自動分割する部分のシステム開発がまだ間に合っていないために、手動で分割しているというお話をさせていただいたのですが、その後(必要に迫られて)ファイル分割スクリプトを制作いたしましたので、アフターフォロー的な意味合いを込めまして発表させていただきます。
なお、これはあくまで「電書協EPUB3制作ガイド」仕様のEPUB用XHTMLファイル専用の分割スクリプトですので、全てのEPUB用XHTMLファイルに使えるわけではありません。
また、このスクリプトを使用したことに伴う損害等に関しましては、私として一切の責任は負いかねますので、あくまで自己責任でご利用ください。
use utf8;
#Encode/File::Basenameモジュールをインポート
use Encode qw/encode decode/;
use File::Basename qw/basename dirname/;
#引数1で指定した分割するファイルをインポート
$splitFilePath = $ARGV[0];
$splitFilePath = decode(‘UTF-8’, $splitFilePath);
open(IN,”$splitFilePath”);
#改行コードの統一処理、行ごとに再分割してリストに格納
@mySPLITFILEtxts = <IN>;
$mySPLITFILEtxts = join(“”,@mySPLITFILEtxts);
$mySPLITFILEtxts =~ s@\x0D\x0A@\x0D@g;
$mySPLITFILEtxts =~ s@\x0A@\x0D@g;
$mySPLITFILEtxts = decode(‘UTF-8’, $mySPLITFILEtxts);
@eachLine = split(“\x0D”,$mySPLITFILEtxts);
close (IN);
#入力ファイルのフォルダパス、拡張子を取ったファイル名を取得
my $myDirName = dirname $splitFilePath;
my $myFileName = basename $splitFilePath;
$myFileName =~ s@\.xhtml@@;
#ヘッダ部分を抽出して変数リストに格納
my @headerBlockTxt;
foreach $line (@eachLine){
if ($line =~ /<div class=\”main\”>/){
last;
} else {
push(@headerBlockTxt,$line)
}
}
#——————-分割処理——————-
#出力用変数リスト定義、連番カウント用変数定義
my @outputTxt = ();
my $outputFileCount = 1;
#文書先頭〜<div class=”main”>までは捨てる
foreach $line (@eachLine){
if ($line =~ /<div class=\”main\”>/){
@outputTxt = ();
#分割マークで区切られたブロックの出力
} elsif ($line =~ /■+分割■+|〓+分割〓+|〓+1ページ図入る〓+/){
my $finalOutputPath = $myDirName . “/” . $myFileName . “_” . $outputFileCount . ‘.xhtml’;
open(OUT,”> $finalOutputPath”);
foreach (@headerBlockTxt){print OUT $_ . “\n”;}
print OUT ‘<div class=”main”>’ . “\n”;
foreach (@outputTxt){print OUT $_ . “\n”;}
print OUT ‘</div>’ . “\n” . ‘</body>’ . “\n” . ‘</html>’;
close (OUT);
@outputTxt = ();
$outputFileCount++;
$outputFileCount++;
#最後の分割マーク〜文書末ブロックの出力
} elsif ($line =~ /<\/html>/){
my $finalOutputPath = $myDirName . “/” . $myFileName . “_” . $outputFileCount . ‘.xhtml’;
open(OUT,”> $finalOutputPath”);
foreach (@headerBlockTxt){print OUT $_ . “\n”;}
print OUT ‘<div class=”main”>’ . “\n”;
foreach (@outputTxt){print OUT $_ . “\n”;}
print OUT ‘</html>’;
close (OUT);
@outputTxt = ();
$outputFileCount++;
$outputFileCount++;
} else {
push(@outputTxt,$line);
}
}
exit;
以上のスクリプトを「splitfile.pl」等の名前で保存し、xhtmlファイルを分割したい行に
「■分割■」「〓分割〓」「〓1ページ図入る〓」
などと指定しておいてから(分割文字に関しては、必要でしたら適宜書き換えてご使用ください)、ターミナルで
perl パス名+splitfile.pl パス名+処理するxhtmlファイル名
と入力して実行すれば、指定したxhtmlファイルと同じフォルダに分割後のファイルが連番出力されます。分割ファイルの間に1ページ画像を配置したxhtmlファイルを挿入していくことを想定していますので、連番ファイル名は「p-000_1.xhtml」、「p-000_3.xhtml」のような形で出力されますが、仕様です。
一応ダウンロード版もご用意しました。以下からダウンロードしていただけます。
電書協EPUB用XHTMLファイル分割.app
1 file(s) 59.42 KB
分割したいソースファイルをアイコンにドラッグ&ドロップすれば分割されます。
DensyokyoXHTML_split.bat
1 file(s) 4.08 KB
分割したいソースファイルをバッチファイルにドラッグ&ドロップすれば分割されます。
なお、事前にActiveperl等のperl環境のインストールが必要です。
(2013.2.04)
2015/04/02 14:32
こんにちは。逆に複数のEPUB用XHTMLを統合するツールなんていうのはご存知ですか?
2015/04/02 14:41
小野さんご無沙汰しております(笑)。汎用ツールとしてはちょっと聞いたことがないですが、ロジック的にはできないこともないかなとは思います。ただ、同一の名前の画像ファイルやXHTMLファイルをうまくマージすることを考えると結構面倒そうです。
2015/04/02 16:08
有難うございます。そうですよね、マージ系が結構複雑そうですね。
やはり手作業が最後の、そして最強の手段ですね。
2015/04/02 16:12
EPUBの使用的には複数の画像フォルダやXHTMLフォルダを含むのはOKだった記憶があるので、やれないこともないかなとは思うんですけどね。フォルダを分けてパスの部分だけ書き換えるようなスクリプトを書けば。ただ、ビューア側がそれを正常に表示できるかなというのはちょっと心配です。
電子雑誌トルタルがそういうEPUBだったような。