青空文庫テキストをLibreOffice odtにしてルビを振る

青空文庫のテキストをLibreOfficeのodtにしたのはいいけれど、ルビがそのままだとうっとうしい。 で、ルビを一括置換できないか考えたけどLibreOfficeの「検索と置換」では正規表現で検索はできても、ルビに置換まではできそうになかったので、一度フラットODF(fodt)にしてsedを使ってタグを置き換えたらうまくいったのでメモ。
青空文庫の特殊記号
青空文庫のテキストから引用。
ルビを振る漢字は「|」から始まって「《」まで。 ふりがなは「《」から「》」まで。
-------------------------------------------------------
【テキスト中に現れる記号について】
《》:ルビ
(例)焦躁《しょうそう》
|:ルビの付く文字列の始まりを特定する記号
(例)始終|圧《おさ》えつけていた
[#]:入力者注 主に外字の説明や、傍点の位置の指定
(数字は、JIS X 0213の面区点番号またはUnicode、底本のページと行数)
(例)※[#「さんずい+闊」、第4水準2-79-45]
[#]:入力者注 主に外字の説明や、傍点の位置の指定
(例)がらくた[#「がらくた」に傍点]
-------------------------------------------------------
LibreOfficeフラットodtのルビ確認
ルビがどんなタグで囲まれているかわからなかったので、小さなfodtファイルを作って見てみたところ、 ルビを振る漢字は _< text:ruby-base>要素で囲み、ふりがなは < text:ruby-text>要素で囲む。 ルビ全体を囲む < text:ruby>_要素のスタイルはそのまま使っても大丈夫そうなので流用する。
<text:ruby text:style-name="Ru1">
<text:ruby-base>漢字</text:ruby-base>
<text:ruby-text>かんじ</text:ruby-text>
</text:ruby>
sedで置換してみる
単純にいけるかと思ったけど漢字にマッチさせる [一-龠] がうまくいかない。 Shift JISだしと思って [亜-煕] を使うとうまくマッチしたのでこっちを採用。 ということで、こんな感じで置換すると無事fodtでルビを振ることができましたとさ。
sed -e 's/|\([亜-煕]\+\)《\([^》]*\)》/<text:ruby text:style-name="Ru1"><text:ruby-base>\1<\/text:ruby-base><text:ruby-text>\2<\/text:ruby-text><\/text:ruby>/g' ルビを振るファイル.fodt > 出力.fodt
ふりがなの抜けがあるなと思ったら
青空文庫のテキストに、ルビの始まりを示す「|」がついてないのが多いね。 ふりがなはついているので「《》」の前にある漢字を調べて「|」をつけて置換する下処理も必要だな。
青空文庫のルビ抜き出し正規表現は
これが最強っぽい。
-
satomacoto: 青空文庫のルビのマイニングをやり直した: http://satomacoto.blogspot.jp/2012/01/blog-post_13.html
((※[[^]]+?]|[一-龠々])+?|(?<=|)([^|]+?))《([^》]+?)》
「※」って何かと思えばShift JIS範囲外の漢字だそうで。完全に見てなかったわ。
2015/08/27 追記
「 [一-龠] がうまくいかない」と書いてますが、 [亜-煕] のほうがうまくいかない場合とルビの始まりを示す「|」がついてないほうが多いので、その場合はこっちのほうがうまくいきます。
sed -e 's/\([一-龠]\+\)《\([^》]*\)》/<text:ruby text:style-name="Ru1"><text:ruby-base>\1<\/text:ruby-base><text:ruby-text>\2<\/text:ruby-text><\/text:ruby>/g' ルビを振るファイル.fodt > 出力.fodt
ルビの位置設定
ルビの位置を変更する場合は、 style:ruby-properties style:ruby-align と style:ruby-position を設定すると良いようです。ルビを121で設定する場合は、こんな感じ。
sed '/<office:automatic-styles>/a<style:style style:name="Ru1" style:family="ruby"><style:ruby-properties style:ruby-align="distribute-space" style:ruby-position="above"/></style:style>' ルビを振るファイル.fodt > 出力.fodt