32nd Diary

トップ | 最新 | 過去の日記 | もっと過去の日記

2004年
5月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
めーるあどれす
ruby -rbase64 -e'puts Base64.decode64 %q(dGFrYW5vMzJAZ21haWwuY29t)'



2004-05-19 (Wednesday) [長年日記]

[Ruby] 青空文庫のルビ

青空文庫形式のルビをhtmlのrubyタグに変換するのを作ってみた.

とは言っても,日本語の正規処理の一部がうまく動いてない気がするのでどうも挙動がおかしいことがある*1のですけど.

やは,今気づいたが,破壊的なメソッドであるのにも関わらず!を付け忘れてるな.後で直しておこう...

*1 挙動がおかしいことがある:今回の場合,具体的には「暖」という字が含まれる場合など.

  def expandRuby(src)
    rubyleft = '<ruby><rb>'
    rubycenter = '</rb><rp>(</rp><rt>'
    rubyright = '</rt><rp>)</rp></ruby>'
    ret = true
    while ret
      # x + ( + y + ) | x + ( + y + )
      ret = src.sub!(/|(.+?)《([^》]+?)》|(.+?)《([^》]+?)》/,
                     "|\\1\\3《\\2\\4》")
    end
    src.gsub!(/|(.+?)《(.+?)》/, "#{rubyleft}\\1#{rubycenter}\\2#{rubyright}")
    return src
  end

個人的に気をつけた点としては,二段階の展開により,連続したルビをひとつにまとめているところ.

たとえば,"|無《む》|垢《く》"という連続したルビがあったときに,まとめないで展開すると,()()となる.

これはルビに対応したブラウザなら文字の上に読みが表示されるが,対応していないブラウザだと「無(む)垢(く)」と表示され,結局ウザイ.

そこで,ひとつにまとめることによって,無垢(むく)としている.

対応したブラウザなら見かけはさほど変化ないが,未対応のブラウザだと「無垢(むく)」となる.こっちのほうが若干マシだろう.

で,実質未対応のブラウザ=京ぽんのOperaとなるわけですけど.(ぶ

正規表現を参考にしたのはperlで青空文庫をhtmlに変換するやつのソース.

rubyのソースが見たい,という場合はrubyで青空文庫をTeXに変換するやつが参考になると思います.

本日のPingbacks(全0件)