ニュースサイトから記事本文を抜き出して利用しようという作業をやってみて、<ruby>
要素がほかの要素に比べてかなり異質なものあることに気がつきました。
ニュースの本文は
...<p><span class="colorC"><ruby>気象庁<rt>きしょうちょう</rt></ruby></span>は「もっと<a href="javascript:void(0)" class="dicWin" id="id-0000"><ruby><span class="under">二酸化炭素</span><rt>にさんかたんそ</rt></ruby></a>を<ruby>出<rt>だ</rt></ruby>さないようにしなければなりません」と<ruby>話<rt>はな</rt></ruby>しています。</p>...のようになっています。BeautifulSoup の
.text
で単純にタグを削除するだけでは気象庁きしょうちょうは「もっと二酸化炭素にさんかたんそを出ださないようにしなければなりません」と話はなしています。と、ルビが本文に混じってしまい、まともな文になりません。事前に
rt
要素を削除しておく必要があります。
実際に行った作業は「HTML からタグを除去して本文を取り出す」なのですが、単純に行って得られるものは上記のとおりで、それを「本文」とは呼べないと思うのです。
マークアップ言語
はじめに、
気象庁は「もっと二酸化炭素を出さないようにしなければなりません」と話しています。
という“内容”そのものがあります。これに“意味”をつけるために、たとえば「気象庁」は固有名詞という意味をつけるためにこれを <span>
で囲み、それからこの文ひとつでひとつの段落という意味をつけるためにこれを <p>
で囲みます。これがマークアップであり、そのためのタグであるはずです。
次の段階で、これをどう表示するか、たとえば固有名詞は文字を赤色にし、段落はそのはじめに改行する、というものはさらに分離してスタイルシートで記述することになっています。
逆向きに考えてみます。ブラウザで表示されるもののソースから表現のスタイルを取り除き、“意味”づけのタグを取り除いたら、残るのは“内容”そのものでなければならないはずです。
ところが今回の例では上述のように、余計なものが残ったままになります。
ルビは“内容”か
私は「ふりがなは内容そのものではなく、それに付け加えているもの」と考えますので、「余計なもの」と書きました。たとえば、ここの言葉は重要と思って下線を付ける、固有名詞ははっきり分かるように文字の色を他と違える、というのと同じで、内容に対して何らか助けのために付け加えているものだと思います。ですから、そういったものを剥ぎ取ったときには残っていてはならないと考えます。
そう考えたときに、現在の仕様の <rt>
はかなり異質です。下線や色付けがタグ内の属性 (attribute) とそれに紐付けられるスタイルで表現されるように、ふりがなもタグではなく属性で示されるのが適当だと思います。
仮に <span>
に ruby
という属性が定義されているとして
...<p><span class="colorC" ruby="きしょうちょう">気象庁</span>は「...」と<span ruby="はな">話</span>しています。</p>...
と書くのがもっとも自然のように感じます。
既存の仕様である <a>
を逆に考えてみましょう。<a>
にとって属性 href
は、それがなければほとんど意味がないくらい重要なものです。
もっと<a href="example.html>二酸化炭素</a>を出さないようにしなければなりません
だからと言ってもしそれがタグになっていて
もっと<a>二酸化炭素<href>example.html</href></a>を出さないようにしなければなりません
と書かれるものだとしたら、その違和感がわかろうというものです。
<rt> のあり方
前節に書いたように、ルビは属性で指定されるのが自然だと思います。ではどうすればいいのか。
「<ruby>関連要素って駄目駄目」に、この問題の歴史 (なんと不幸な!) から対案まで解説されていました。この記事をぜひじっくり読んでいただきたい。
この記事の「脱法ルビ」が、当面の対応策です。仕様に反せず、仕様内でできる策です。現状ここまでできるのですから、ここに示されているスタイルをレンダリングエンジン側で装備し、属性名を data-ruby
ではなく ruby
とできるよう仕様のほうが改訂されたら、当分は現在の <ruby>
, <rt>
との共存期間があったとしても、もうほとんど解決ではないですか。
……と思ったら、このスタイル、すなわち display: ruby-text
を実装しているのは Gecko (Firefox) だけで、Webkit (Safari) も Blink (Chrome) も未対応でした (2018年6月現在)。ひどい状況です。
ルビを実際に使う人やデザイナのほとんどは、ほんの少し首をかしげるくらいはあっても、仕様に従って使うだけで、その仕様がどうあるべきかまで問い返したりはしません。そもそも世界のうちでごく限られた言語だけでしか知られておらず、その中でも使う人はごく少数ですから、問題にする人も滅多にいなければ対応もぜんぜん進まないのでしょう。ほんとうに不幸です。