PHPでルビを振る

(1/1)
書籍で難読字の上に小さな文字で読み仮名を振ってある場合があるが、あれをルビと呼ぶ。
これまでもInternetExplorerではルビがサポートされていたが、HTML5で正式に <ruby> タグがサポートされたので、今回はPHPを用いてテキストにルビを振るプログラムを作ってみることにする。

(2021年7月10日)PHP8対応,リファラ・チェック追加,大幅改訂

目次

サンプル・プログラムの実行例

PHPでルビを振る

サンプル・プログラム

プログラムを実行すると、左側のテキストボックスにサンプル・テキストが表示される。これは当サイトの「西暦1000年 - 藤原彰子が中宮に」の中の一節である。
【使い方】に示しているように、[変換] ボタンを押すことで右側にルビ付きテキストが表示されるだろう。<ruby> タグがサポートされていない(IE以外のHTML5非対応ブラウザ)の場合、ルビは(...)のように表示される。

解説:辞書ファイル

0036: //辞書ファイル
0037: define('FNAME_DICTIONARY', './dictionary.txt');
0038: define('DIC_COMMENT', "/^\#/ui");  //辞書内コメント行の形式
0039: define('FLAG_ONCE', TRUE);          //2回目以降もルビ振りしたいならFALSE
0040: 

今回は、ルビを振るための辞書ファイルを事前に用意する。
ダウンロードしたZIPファイルに格納されているサンプル辞書ファイル "dictionary.txt" のように、対象となる文字と読み仮名をタブ区切りで記述する。
対象文字は漢字だけでなく、ひらがなや半角英数字でもかまわない。

一般的に、ルビはテキストの中で最初にあらわれる対象文字にのみ振られる。
ただ、2回目以降も振りたい場合があるかもしれないので、定数 FLAG_ONCE で制御できるようにしてある。

解説:ルビ振り

0217: /**
0218:  * ルビを振る
0219:  * @param   string $str対象文字列(1行)
0220:  * @return  stringルビ振りテキスト
0221: */
0222: function addRuby($str) {
0223:     global $Dictionary;
0224: 
0225:     foreach($Dictionary as $word=>$ruby) {
0226:         //まだルビが振られていない単語にルビを振る
0227:         if (! $ruby['flag']) {
0228:             $pat = "/({$word})/ui";
0229: $rep =<<< EOT
0230: <ruby>
0231: <rb>$1</rb>
0232: <rp style="color:blue;">(</rp>
0233: <rt style="font-size:60%; color:blue;">{$ruby['word']}</rt>
0234: <rp style="color:blue;">)</rp>
0235: </ruby>
0236: 
0237: EOT;
0238:             //初回登場のみルビ振り
0239:             if (FLAG_ONCE) {
0240:                 $str2 = preg_replace($pat$rep$str, 1);
0241:                 if ($str != $str2) {
0242:                     $Dictionary[$word]['flag'] = TRUE;
0243:                     $str = $str2;
0244:                 }
0245:             //2回目以降もルビ振り
0246:             } else {
0247:                 $str = preg_replace($pat$rep$str);
0248:             }
0249:         }
0250:     }
0251:     return $str;
0252: }

プログラムの最初に辞書ファイルを読み込み、実際のルビ振りはユーザー定義関数 addRuby で行っている。

ルビ振りの実体は、正規表現を使った文字列置換関数  preg_replace  である。
このため、原文にHTMLテキストを指定した場合、alt属性の中にパターン・マッチングする文字列があると、それもルビ振りしてしまうという弱点がある。

ルビにまつわる雑学

活版印刷の頃、日本では5号活字に対する振り仮名として7号活字を用いていた。
7号は5.25ポイントに相当するが、イギリスから輸入された5.25ポイント・サイズの活字の呼び名が宝石の ruby(ルビー)であったことから、ルビと呼ばれるようになった。

19世紀後半のイギリスでは、4.5ポイントは diamond(ダイヤモンド)、5ポイントは pearl(真珠)といった具合に、活字の大きさに対して宝石の名前を付けていた。

スクリプト言語としてPHPと人気を二分する Ruby であるが、開発者まつもとひろゆきの同僚の誕生日が7月であったことから、7月の誕生石ルビーの名が冠せられた。

参考サイト

(この項おわり)
header