epub2のtoc.ncxをepub3の目次に変換
2014/1/15 [17:37:13] (水) 

Sigilなどで作られるepub2ファイルをepub3ファイルに変換するための小ネタ。
・各xhtmlファイルのヘッダを書き換える
これはエディタのマクロや、スクリプトで一括可能。複数のファイルに対して検索置換できるエディタがあればこういう時に重宝する。
・opfファイルを書き換える
metadata部
epub3の書式に合わせて書き直し…ってほぼそのままでイケるような気がするけど、既存のEPUB3ファイルのopfファイルを開いてコピペ、それをひな形にしてepub2の方から必要なものを移植するのが確実かな。
manifest部
toc.ncxがらみの記述を削除。
新たにナビゲーション文書を設定・指定する。各プロパティ指定を確認。
spine部
toc.ncxがらみを削除。あとはそのまま。
guide部
まるごと削除
エディタやスクリプトで一括が可能だと思うけど、metadata部がちょっとメンドクサイので手作業コピペ。
・ナビゲーション文書を新規作成する。
ナビゲーション文書(たとえばnav.xhtml)を新たに作る必要がある。いまのところ、目次とランドマーク。ランドマークはopfファイルにguide部があれば、それをコピペして編集すればイケる。
epub2のtoc.ncxをepub3目次用のリストに変換するのが以下のスクリプト。
use XML::Simple;
my $ref = $p->XMLin(’toc.ncx’);
&ncx2nav($ref->{navMap}->{navPoint});
sub ncx2nav{
my $args = shift;
my $data;
foreach (keys %{$args}){
$data->{ $args->{$_}->{playOrder} } = {
src=>$args->{$_}->{content}->{src},
text=>$args->{$_}->{navLabel}->{text},
navPoint=>$args->{$_}->{navPoint}
};
}
print qq{<ol>};
foreach my $pos (sort {$a<=>$b;} keys %{$data}){
printf qq{<li><a href="%s">%s</a>},$data->{$pos}->{src},$data->{$pos}->{text};
if( ref($data->{$pos}->{navPoint}) ){
&ncx2nav($data->{$pos}->{navPoint});
}
print qq{</li>};
}
print qq{</ol>};
}
まとめて全部、一括変換するスクリプトを書こうとうだうだやってたんだけど、metadataの差の吸収が意外に面倒くさいので投げた。今日のところは。
…気力があったらそのうちスクリプトを書いて、もう少し丁寧に説明を書いておくかなぁ。

