開発とか戯曲のテキストをEPUB3形式の電子書籍にするコンバーター『Θέσπης』(テスピス)を、そろそろルビ対応させようと思った。※上演時間推定と、文字から人物の性質を感じ取れないようにするためなどのポリシーに沿っている。稽古でも、読めない字が出てきてひっかかることはほとんどない。(あれ、きらい)そんな理由で、『Θέσπης』(テスピス)にルビの変換機能を搭載するのは、自分はいらないしぃ、後回しでいいかな、とか思っていた。いかんいかん、よく考えてみたら自分も印刷用の台本に、ワープロの機能で時々ルビを振っていた。難しい言い回しを登場人物がわざわざ言うときとか、歴史上の人物名が出てくる時とか。いるじゃん、ルビ機能。仕様を決めて、変換方法を探ってみる。ルビの書式としては、青空文庫で使われている形式にしようと思う。2.入力-1上のリンク先の「入力の実際」の項の、「(5)特殊な表記」に、ルビの表し方が書いてある。だいたいこういうことかしら。「文字」に「ルビ」をふるふむ。漢字にルビふりたいだけなら、漢字の後に《》でくくってルビを書けば良い。漢字以外のものにルビを振りたかったり、四字熟語の後2文字にだけルビを振りたかったりする場合は、|で範囲の先頭を指定した上で、《》でくくってルビを書けば良い。月日は百代《はくたい》の過客《かかく》にして、行《ゆき》かふ年も又|Traveler《旅人》也という記述をすると、「百代」に「はくたい」が、「過客」に「かかく」が、「行」に「ゆき」が、「Traveler」に「旅人」が、ルビとしてふられる。そんでもってHTMLでルビを表現するには、<ruby>謹賀新年<rp>(</rp><rt>きんがしんねん</rt><rp>)</rp></ruby>のように書く。<rp></rp>でくくってある部分は、ルビ非対応ブラウザ(EPUBで言えばリーディングシステム)では表示され、ルビ対応ブラウザでは表示されない部分。上のように書くと、ルビ非対応の際は「謹賀新年(きんがしんねん)」と表示される。だいたいわかった気が。いうわけで、このルビの書式にマッチする正規表現を書いてみよう!正規表現というのは、複雑な条件の文字検索をするための表記方法で、長文を書く人は多少かじっているだけで恐ろしく効率が違ってくるものなんだけど、まぁそういうのは置いといて、うむ、書いてみる。新年だし、書かき初ぞめだね。思ったけど、一発で書けるのこれ?深く考えずに2回に分けるか。試行錯誤の末、こうなった。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パターン書いた。一発で書けるのかもしれないけれど、そこまでこだわりないしぃ。