日本の本のルビ(ふりがな)の文字には出版社や時代ごとに2つに大別されるルールがあります。「小書きのカナをそのまま使う」か「大書きのカナに変換して入れる」かです。大書きルールの場合には拗音・促音を「っ」→「つ」のように置換して入れます。これは元々は活版の時代にルビサイズの小書きのカナは潰れてしまって読めなくなる懸念があったことからできたルールではないかと推測しているのですが、現在のように印刷技術が発達してサイズの小さな文字でも十分な可読性が得られるようになっても依然として「大書きのカナに変換して入れる」ルールは残っていたりします。EPUBでも場合によっては要求されますので、機械的に処理できないかと思い、Xhtml内でのルビを対象とした小書きのカナ→大書きのカナの置換スクリプトをPerlで書いてみました。
#! /usr/bin/perl
use utf8;
use Encode qw/encode decode/;
# 変換Textファイルのパスを取得
$convertTextFilePath = $ARGV[0];
$convertTextFilePath = decode('UTF-8', $convertTextFilePath);
# 各テキストファイルを展開、置換
open(IN,"$convertTextFilePath");
@importedTxts = <IN>;
$importedTxt = join("",@importedTxts);
$importedTxt = decode('UTF-8', $importedTxt);
close (IN);
#置換処理
my $replacedTxt = & textReplace ($importedTxt);
#出力
$replacedTxt = encode('UTF-8', $replacedTxt);
open(OUT,"> $convertTextFilePath");
print OUT $replacedTxt;
close (OUT);
exit;
sub textReplace {
#置換テキストの取得
my $targetText = $_[0];
my @rtBlocks;
@rtBlocks = $targetText =~ m/<rt>[^<>]+?<\/rt>/g;
foreach $rtBlock(@rtBlocks){
my $rtBlockConverted = $rtBlock;
$rtBlockConverted =~ tr/ぁぃぅぇぉゕゖっゃゅょゎァィゥェォヵㇰヶㇱㇲッㇳㇴㇵㇶㇷㇸㇹㇺャュョㇻㇼㇽㇾㇿヮ/あいうえおかけつやゆよわアイウエオカクケシスツトヌハヒフヘホムヤユヨラリルレロワ/;
$targetText =~ s/$rtBlock/$rtBlockConverted/g;
}
return $targetText;
}ターミナルで
perl このスクリプトのパス 処理対象ファイルのパスの順で指定すれば処理されます。
こんな感じ。
なお、小書きのカナ→大書きのカナの場合には自動で処理できますが、大書きのカナ→小書きのカナの場合は小書きにしていい文字なのかそうでないのかの推測が機械的にはできませんので位置を特定しての手作業になるかと思っています。
