Ruby 1.9.0 で tDiary を動かしてみる (Ruby1.8.5と共用できるよ)
前の日記の続き。 1.8/1.9両対応なんて無理ですかねぇ?ってことなので、 1.8.5 と 1.9.0 の両方で動くように頑張ってみた。
- http://www.machu.jp/dist/tdiary-2.2.0/compatible.rb.txt
- http://www.machu.jp/dist/tdiary-2.2.0/ruby-1.9.diff.txt
いまのところ、日記の表示、日記の更新(tDiary, Wikiスタイル)までできた。 でも、ツッコミを入れるとエラーになったり、キャッシュを消さないと動かなかったりと、まだまだ不安定すぎる。 それに jdate プラグインを入れると動かない。
とりあえず今はここまでだなぁ。
compatible.rb
tDiary で使う範囲で、 1.8と1.9で非互換なメソッドを吸収する compatible.rb を作ってみた。
- 1.9 で無くなったメソッドを復活させる (String#to_a, String#each)
- 1.9 で追加されたメソッドに(適当に)対応させる (String#force_encoding, String#bytesize)
unless "".respond_to?('to_a') class String def to_a [ self ] end end end unless "".respond_to?('force_encoding') class String def force_encoding(encoding) end end end unless "".respond_to?('bytesize') class String alias bytesize size end end class String def method_missing(name, *args, &block) each_line.__send__(name, *args, &block) end end
index.rb, update.rb
- 起動オプションに --encoding=EUC-JP を付ける (ここだけ1.8非互換)
- $defout を $stdout に
- body.size.to_s を body.bytesize.to_s に
- 出力直前に body の encoding を ASCII-8BIT に変更 (なぜかこうしないと 1.9 でエラーになる)
String#bytesize と String#force_encoding は compatible.rb で定義しているので 1.8 でも OK 。
tdiary.rb
- 1.9 だと instance_variables が文字列ではなくシンボルを返すので、文字列に変換
- 1.9 だと eval で定義したローカル変数が外部に反映されないので、 eval 呼び出し前にローカル変数を定義(いい方法が思いつかないので適当に対処)
plugin/00default.rb
以下の箇所が EUC-JP だと動かない。とりあえず保留(ダメじゃん)。
if /[\x80-\xff]/
plugin/ja/05referer.rb
エスケープ文字を「\」から「\\」へ変更。