電書協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」のような形で出力されますが、仕様です。

 一応ダウンロード版もご用意しました。以下からダウンロードしていただけます。


 分割したいソースファイルをアイコンにドラッグ&ドロップすれば分割されます。

 分割したいソースファイルをバッチファイルにドラッグ&ドロップすれば分割されます。
 なお、事前にActiveperl等のperl環境のインストールが必要です。

(2013.2.04)

コメント / トラックバック 4 件

  1. おの@サイバーテック より:

    こんにちは。逆に複数のEPUB用XHTMLを統合するツールなんていうのはご存知ですか?

  2. Jun Tajima より:

    小野さんご無沙汰しております(笑)。汎用ツールとしてはちょっと聞いたことがないですが、ロジック的にはできないこともないかなとは思います。ただ、同一の名前の画像ファイルやXHTMLファイルをうまくマージすることを考えると結構面倒そうです。

  3. おの@サイバーテック より:

    有難うございます。そうですよね、マージ系が結構複雑そうですね。
    やはり手作業が最後の、そして最強の手段ですね。

  4. Jun Tajima より:

    EPUBの使用的には複数の画像フォルダやXHTMLフォルダを含むのはOKだった記憶があるので、やれないこともないかなとは思うんですけどね。フォルダを分けてパスの部分だけ書き換えるようなスクリプトを書けば。ただ、ビューア側がそれを正常に表示できるかなというのはちょっと心配です。
    電子雑誌トルタルがそういうEPUBだったような。

コメントをどうぞ

プロフィール
Jun Tajima

こちらにて、電子書籍&Web制作を担当しています。
このブログは、EPUB3をはじめとした電子書籍制作担当オペレータからの、「電子書籍の制作時にたとえばこんな問題が出てきていますよ」的な「現地レポート」です。少しでも早い段階で快適な電子書籍閲覧・制作環境が整うことを願って、現場からの声を発信していこうと目論んでおります。

当ブログ内の記事・資料は、私の所属しております組織の許諾を得て掲載していますが、内容は私個人の見解に基づくものであり、所属する組織の見解を代表するものではありません。また、本ブログの情報・ツールを利用したことにより、直接的あるいは間接的に損害や債務が発生した場合でも、私および私の所属する組織は一切の責任を負いかねます。