戯曲のテキストをEPUB3形式の電子書籍にするコンバーター『Θέσπης』(テスピス)を、そろそろルビ対応させようと思った。
ぼく自身は、戯曲を書く際は、
- 自分が書けない漢字はなるべく書かない
- 難しい熟語は使わない
- 一文字で3音以上ある漢字はなるべくひらがな表記にする ※文字量で上演時間を推定するため
- セリフ中の登場人物名はカタカナで表記する ※上演時間推定と、文字から人物の性質を感じ取れないようにするため
などのポリシーに沿っている。
なので稽古でも、読めない字が出てきてひっかかることはほとんどない。(あれ、きらい)
そんな理由で、『Θέσπης』(テスピス)にルビの変換機能を搭載するのは、自分はいらないしぃ、後回しでいいかな、とか思っていた。
だけど、いかんいかん、よく考えてみたら自分も印刷用の台本に、ワープロの機能で時々ルビを振っていた。
敢えて難しい言い回しを登場人物がわざわざ言うときとか、歴史上の人物名が出てくる時とか。
いるじゃん、ルビ機能。
とりあえず準備をしておこう。
仕様を決めて、変換方法を探ってみる。
まず、ルビの書式としては、青空文庫で使われている形式にしようと思う。
上のリンク先の「入力の実際」の項の、「(5)特殊な表記」に、ルビの表し方が書いてある。
だいたいこういうことかしら。
- 漢字以外の文字+漢字+《ルビ》 → 「漢字」に「ルビ」をふる
- |または|(※全角)+文字+《ルビ》 → 「文字」に「ルビ」をふる
ふむ。
漢字にルビふりたいだけなら、漢字の後に《》でくくってルビを書けば良い。
漢字以外のものにルビを振りたかったり、四字熟語の後2文字にだけルビを振りたかったりする場合は、|で範囲の先頭を指定した上で、《》でくくってルビを書けば良い。
例えば、
月日は百代《はくたい》の過客《かかく》にして、行《ゆき》かふ年も又|Traveler《旅人》也
という記述をすると、「百代」に「はくたい」が、「過客」に「かかく」が、「行」に「ゆき」が、「Traveler」に「旅人」が、ルビとしてふられる。
なるへそ。
そんでもってHTMLでルビを表現するには、
<ruby>謹賀新年<rp>(</rp><rt>きんがしんねん</rt><rp>)</rp></ruby>
のように書く。<rp></rp>でくくってある部分は、ルビ非対応ブラウザ(EPUBで言えばリーディングシステム)では表示され、ルビ対応ブラウザでは表示されない部分。
つまり上のように書くと、ルビ非対応の際は「謹賀新年(きんがしんねん)」と表示される。
だいたいわかった気が。
というわけで、このルビの書式にマッチする正規表現を書いてみよう!
正規表現というのは、複雑な条件の文字検索をするための表記方法で、長文を書く人は多少かじっているだけで恐ろしく効率が違ってくるものなんだけど、まぁそういうのは置いといて、うむ、書いてみる。
新年だし、書き初めだね。
と思ったけど、一発で書けるのこれ?
深く考えずに2回に分けるか。
試行錯誤の末、こうなった。PHPね。
<?php // サンプルのテキスト $text = '都《みやこ》は雲《くも》と霞《かすみ》の遙《はる》か向《む》こう、|MOUNTAIN《やま》を幾《いく》つもこえ、関《せき》所《しょ》を幾《いく》つも通《とお》って|ようやく《At Last》|辿り着《たどりつ》きます'; echo ruby_replace($text); // ルビ変換の実験 function ruby_replace($text) { return preg_replace( array( '/([\||])([\sぁ-んァ-ヶー一-龠0-9!?a-zA-Z0-9!?]+)《([\sぁ-んァ-ヶー一-龠0-9!?a-zA-Z0-9!?]+)》/u', '/([^一-龠]*)([一-龠]+)《([\sぁ-んァ-ヶー一-龠0-9!?a-zA-Z0-9!?]+)》/u', ), array( '<ruby>$2<rp>(</rp><rt>$3</rt><rp>)</rp></ruby>', '$1<ruby>$2<rp>(</rp><rt>$3</rt><rp>)</rp></ruby>' ), $text); }
結局、語の区切りとして「|」を使う場合と使わない場合の2パターン書いた。一発で書けるのかもしれないけれど、そこまでこだわりないしぃ。
動かしてみた。
元のテキスト。
変換後のテキスト。
そしてそのHTMLでの表現。
だいたい大丈夫そうだが、実際に『Θέσπης』(テスピス)に取り入れるには、もっともっと実験したいところ。今回書いたパターンにひっかからない例外がありそう。
正規表現極めているひとのアドバイスも欲しいっす。
以上、大多数の演劇の人にはなんのこっちゃが満載の、正規表現書き初めでした。