PDF教材をHTMLに変換する 2

「学校」にフリガナをつけると下のようになります。

学校 がっこう

手書きや、印刷では「学校」の文字の上に専用の小さいかなを付けているのでしょうが、
WEBではどのようになっているのでしょうか。

WEBでフリガナをつけるには次のような記号列が必要です。
(以下の文を仮にHTML文ということにします)。

<ruby> <rb>学校</rb> <rp>(</rp> <rt>がっこう</rt> <rp>)</rp> </ruby>

これをブラウザ(Micosoft EgeとかChrome)が解釈して、上のように「学校」の上にルビをつけます。

上のHTML文で「(」と「)」で囲まれた部分は、ブラウザが正しくルビが付けられなかったとき、
かっこでかなをつけることになります。

 

さて、教材でカナが付けられたているところは、
全部上のようなHTML文にしなければいけません。

実際の作業では、最初は該当漢字にいちいち手作業で上のHTML文に置換作業をしていたのですが、
いかにも非効率なので、プログラム処理をすることにしました。

仕事は印刷本の章単位(ファイル単位)で行います。
当該章で指定の漢字すべてを一斉にカナ付けするのは、いとも簡単なことです。

しかし、問題はその漢字の出現ヶ所全部にカナをつけるのではなく、
付けるところと付けないところがあるので、その法則がわかればいいのですが、
どのような法則があるのかわかりません。
私には気まぐれ(子供が読みやすいように)にカナ付けしているように見えます。

ともかく、その法則は分からないままに、指定の場所にどうやって適切に漢字にルビを付けるかです。

 

言語はPythonを使いました。
Pythonを使った理由は、Pythonはインタプリターでチョコチョコと結果を見ながら作業できるし、
最近の流行り(はやり)だし、その分無料の開発環境も手軽に使えるとかもあります。

考えてみれば、昔はこの手のプログラミングではPerlをよく使っていたのですが、
Perlはえらく難しい方向にいって、その分人気を落としているようですし、
未だに古いPerlを使うもの芸がないのでこの際Pythonを選択しました。

私はPerlと特に縁があるわけでもないので、
どちらでもいいのですが、昔馴染みのPerlが落ち目になっていることは多少残念に思っていますが、
反面、新たな言語を勉強するのもまた「ラッキー!」かなと思います。

 

さて、ルビ付けプログラムです。

辞書を作って、ある漢字がでてきたらルビを付けるプログラムは、
議論の余地なく簡単です。

問題は、同じ漢字でもルビをどこに付けて、どこに付けないかです。

先にも書きましたが、章の初めから、一つ目はつけるとかあるいは二つ目までルビを付けるとか、
ルビ付けのルールがあればそれに従うので、それはそれで簡単なことですが、
教材は全く気まぐれに、ルビをつけたり付けなかったりしています。

まず考えたのは、「学校」に「がっこう」とルビをつけ、「学」に「がく」あるいは「まなぶ」と付けてはいかないので、
漢字のでる環境(コンテクスト)でルビを付けるかどうかを判定することにしました。

すなわち、「学校」という文脈の中の「学」は単独の処理をしない、ことにしました。
最初にルビをつけない文脈には防御用のタグで囲い、この中ではルビ処理をしないことにします。

これは比較的簡単にプロぐラム化できます。

しかし問題は、「学」=「まなぶ」が沢山でてきたとき、どれにカナを付けるかです。
結局、この章の何番目の「学」にカナを付け、それ以外の場所にはカナを付けないことにするかのプログラムです。

その「学」が章のなかで何番目に出現するか数えるのが厄介でしたが、
エディタでAtomを使えば、比較的簡単に何番目の出現かカウントできることが分かったので、
プログラムの半分はOKです。
(2番目のロジックが簡単であれば、最初の文脈を使うロジックは不要かもしれません。)

 

実際のプログラムでは、漢字辞書を固定しある漢字について、すべての行を舐めるのがいいのか、
行を固定して、すべての漢字辞書を舐めるのがいいのか、迷いましたが、
後者を選択しました。

ファイルの1行を取り出して、辞書に該当する漢字があるか調べて、
あれば、ルビうち処理をして行きます。
このとき、当該漢字は何番目であったかの情報保存が必要になります。

色々やったのですが、結局辞書を固定するロジックの方が簡単だと分かりました。

 

Pythonでは、ファイルからある文字列を検索して、別の文字列に置換する方法が、
二つ(それ以上かもしれません。)あります。

一つは正規表現(re)を使う方法、もう一つは単純に文字を置換する(replace)する方法です。
結論から言えば、正規表現を使うまでもなく、単純に置換する方法で十分でありベターだと分かりました。

さて、漢字の出現ヶ所をどのようにプログラムで見つけるか。

私は、該当する漢字で当該ファイルを分割(split)して配列に入れ、
配列インデックスで「何番目」の出現かを算出しました。

当該漢字をHTMLカナ文字列を置換します。

 

ところが、確か正規表現を使った場合、ブラウザで表示する分には関係のないのですが、
不必要は空白文字(改行も)が入っています。

 

漢字にルビを付けるプログラムは、ここまででいいのですが、
逆にルビを取り払って元の文章に返すプログラムもこの際考えてみました。

 

error: コピーできません !!