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

nogajun
nogajun

_

青空文庫のテキストを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

ふりがなの抜けがあるなと思ったら

青空文庫のテキストに、ルビの始まりを示す「|」がついてないのが多いね。 ふりがなはついているので「《》」の前にある漢字を調べて「|」をつけて置換する下処理も必要だな。

青空文庫のルビ抜き出し正規表現は

これが最強っぽい。

「※」って何かと思えば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-alignstyle: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