InDesignが書き出すEPUBのモノルビの後始末

InDesignが吐き出したEPUBファイルを電書協準拠のEPUBファイルにしてね、という話。
電書協準拠というのは、フォルダ構成やファイル命名規則、スタイルシート群のことで、雛形に流しこめばほぼOK。
ただ、小見出しや圏点、縦中横などはInDesignで作成時にあてられたスタイルを確認してコンバートする必要があったり手作業がそれなりに積み上がる。
中でもルビがやっかいだった。
「No.36【CS5.5】EPUB関連 EPUB3.0対応」InDesignの勉強部屋
http://study-room.info/id/studyroom/cs5/study36.html
↑こちらに詳しい。
グループルビはそのまんま。
一文字ずつモノルビをあてた場合もそのまんま。
問題なのが、モノルビを二文字など複数文字にあてた場合だ…ていうか「モノルビ」っていうぐらいなんだから複数の文字に使うのがどうかしてるだろ。
「準拠」にモノルビ(じゆんきよ)の場合、EPUBに書き出すと
<ruby>準拠<rp>(</rp><rt>じゆん きよ</rt><rp>)</rp></ruby>
グループルビの中、ルビが「じゆん」「全角空白」「きよ」となってしまう。
(EPUBはモノルビの rbタグは使えないので、グループルビの rtタグになる)
ルビに意味不明な空白などありえない。きちんとひと文字ずつのルビにしてやる必要がある。
<ruby>準<rp>(</rp><rt>じゆん</rt><rp>)</rp></ruby><ruby>拠<rp>(</rp><rt>きよ</rt><rp>)</rp></ruby>
学術書系や小説なら時代ものなどはこのルビ修正だけで生き地獄。しくしく。
てことで、InDesignの吐き出すEPUBの変なモノルビを、ひと文字ずつの正しいグループルビに変換するサブルーチンを書いた。
my $_monoruby = sub{
my $str = shift;
if($str =~ m!<ruby>([^<]+)<rp>\(</rp><rt>([^<]+)</rt><rp>\)</rp></ruby>!){
my @k = split(//, $1);
my @r = split(/ /, $2);
return $str if ! @r;
return $str if( scalar(@k) != scalar(@r) );
my @mono_ruby;
while(my $kanji = shift(@k)){
my $yomi = shift(@r);
push(@mono_ruby, sprintf qq{<ruby>%s<rp>(</rp><rt>%s</rt><rp>)</rp></ruby>}, $kanji, $yomi);
}
return join(’’, @mono_ruby);
}
else{
return $str;
}
};
$line =~ s!<ruby[^>]+>!<ruby>!g;
$line =~ s!(<ruby>[^<]+<rp>\(</rp><rt>[^<]+</rt><rp>\)</rp></ruby>)!$_monoruby->($1)!eg;
ソフトが書き出すものだからツールで変換するのが確実。ひとの手でひとつずつ修正してたら、まず間違いなくどこかでミス・タイポが入りこむ。
ほんとperlがなかったらと思うとぞっとする。

この手の細かいスクリプトがあちこちのフォルダに散らばってる。
そのうち整理してまとめなきゃと思いつつ、汎用、使いまわしを考えすぎると、結局使う時に面倒が増えたりして使い勝手の悪いものになるからなあ。悩みどころ。

