やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

HTMLのrubyを使うと文字列検索でヒットしなくなることがある

 たとえば「文字列(もじれつ)検索(けんさく)」のようなルビがあるとき、「文字列検索」というテキストでは一致せず検索ヒットしない。「文字列」や「検索」でないとヒットしない。知らなかった。困る。

実例

文字列もじれつ検索けんさく

 上記は以下HTMLで書かれている。

<ruby>文字列<rp></rp><rt>もじれつ</rt><rp></rp></ruby><ruby>検索<rp></rp><rt>けんさく</rt><rp></rp></ruby>

 このとき、ブラウザでCtrl+Fキーを押し、「文字列検索」というテキストを入力して検索しても上記にはヒットしない。ヒットするのはルビがない箇所だけだ。

 「は?」と思うだろう。私は思った。困る。とっても困る。これは罠になる。ルビの使用を禁止すべきという過激派がでてもおかしくないほどヤバイ。

 「文字列」や「検索」ならヒットする。このことから、別の<ruby>要素として分離したテキストはつなげて検索できないようだ。だとすれば、ルビを細かく振るのは悪手になる。

 上記の例ならまだしも、もし人名や固有名詞など重要な箇所だったらひどいことになる。

 たとえば山田太郎さんがとある文書から自分の名前がかかれた箇所を検索したいとき。「山田太郎」や「山田太郎(やまだたろう)」はヒットするけど、「山田(やまだ)太郎(たろう)」や「山(やま)田(だ)太(た)郎(ろう)」などルビの振り方が違うだけでヒットしなくなってしまう。

 「山田」や「太郎」で検索すれば済むときもあるだろうが、もし山田次郎や鈴木太郎がいるときはそれらもヒットしてしまう。なのでフルネームで検索したい。でもルビの振り方でヒットするところと、しないところが出てしまう。

 これは困る。「山田太郎」でテキスト検索すると、以下のうち一番上のものしかヒットしない。

実例 HTML Text
山田太郎やまだたろう <ruby>山田太郎<rp>(</rp><rt>やまだたろう</rt><rp>)</rp></ruby> 山田太郎(やまだたろう)
山田やまだ太郎たろう <ruby>山田<rp>(</rp><rt>やまだ</rt><rp>)</rp></ruby><ruby>太郎<rp>(</rp><rt>たろう</rt><rp>)</rp></ruby> 山田(やまだ)太郎(たろう)
やまろう <ruby>山<rp>(</rp><rt>やま</rt><rp>)</rp></ruby><ruby>田<rp>(</rp><rt>だ</rt><rp>)</rp></ruby><ruby>太<rp>(</rp><rt>た</rt><rp>)</rp></ruby><ruby>郎<rp>(</rp><rt>ろう</rt><rp>)</rp></ruby> 山(やま)田(だ)太(た)郎(ろう)

 以下のような理由でルビを細かく分けたいときがある。

  • 苗字と名前で分けたい
  • 漢字の勉強をするため正確なルビを知りたい

 でも、それをやるとフルネームで一致しなくなってしまう。

 「読みやすいようにルビを振ったよ。親切でしょ?」と思ってた? 残念でした。検索に難ありでーす。

困っちゃう

 これはあやまりです。

 上記のように訓読みのとき、送り仮名と一緒に検索することがある。だが「誤り」と検索しても上記にはヒットしない。「誤」で検索するしかない。もちろんそうすると「誤謬」などにもヒットしてしまい絞り込めない。

 どうあっても以下は両立しない。

  • ルビを振りたい
  • 文字列検索にヒットさせたい

 ああああああああああああストレスじゃぁあああああ。なんでこんなところでトレードオフが発生するんじゃあああああ!!!!!!!

 こうしてルビはないがしろにされるのだった。だってルビ自体書くのが大変だし。頑張ってルビを振ったのに、検索ヒットしなくなるとか……。ガッカリだよ。君には失望した。

 そうとも、ルビだって「ないがしろ」ではヒットしない。「ないがし」でないとヒットしないんだ! 馬鹿野郎! なんてバカなんだ。そんな検索の仕方しないわ! 正確な漢字がよくわからないからルビを振っているし、振ってほしいのに、正確な漢字やルビを知らないと検索できないって、そんなの使えねーよ。こっちがバカ仕様から逆算して検索ワードを用いらなければならないとか、バカなの? 脳内にパーサ実装してなきゃ使えないとかバカなの? そんな高度な脳をもっていたら苦労しないわ! バカでもサクッと検索したいからテキスト検索したいんだっつーの。そっちがバカだとバカなこっちは困るんだよバカ。

ルビ

 そもそもHTMLでもrubyの仕様はコロコロ変わっている。<rb>,<rbc>,<rtc>のような要素もあったが、今では廃止されている。また、CSSではruby-align, ruby-position, ruby-mergeなどルビ周りのプロパティはほとんど未実装だ。

 まだ知らない罠があってもおかしくない。ルビを振るのが恐くなってきた。

所感

 rubyはクソだった。検索や置換はコピーとおなじくらい重要な操作。そこに難癖がついてしまうとなると使用を控えざるを得ない。それくらいにクリティカルだと思う。

 今はまだ大して問題になっていない。そもそもルビは最近実装されてきたものだし。漢字圏だけだし。けれどこれから先はどうかな? 大量の文書があってもヒットしないことが増えてゆくのでは?

  • ルビ分割したら分割単位でしか検索ヒットしなくなる
  • 訓読みにルビを振ったら送り仮名をつけて検索してもヒットしなくなる

 ルビはできるだけ全体にかかるようにしよう。訓読みにはルビを振らないようにしよう。え、そんな複雑なことを考えるくらいならルビなんて使いたくない? 同感です。

対象環境

$ uname -a
Linux raspberrypi 5.10.63-v7l+ #1496 SMP Wed Dec 1 15:58:56 GMT 2021 armv7l GNU/Linux