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の差の吸収が意外に面倒くさいので投げた。今日のところは。

…気力があったらそのうちスクリプトを書いて、もう少し丁寧に説明を書いておくかなぁ。


<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】