Relative Path プラグイン、バージョンアップ作業中

しばらく政治経済とか国際ニュースとかに興味が移っていたのですが、久しぶりにコンピュータの世界へと舞い戻ってきました cuzic です。よろしくお願いします。

この連休は自分の自由になるような時間を十分にとることができて、「Relative Path プラグイン」の更新作業にいそしんでいました。まだ十分に検証できておりませんが、私の環境では機嫌よく動作しているようです。

目玉機能は次の2つです。

  • Ajax サポート
  • スタティックファイルフィルタ機能

まずいくつかあった不具合点の修正から説明します。

Ruby の super の挙動の揺らぎに対応

どうも Ruby の super の挙動が私の環境と違う動作の環境があったようです。そのため、動作しないという不具合があったようです。私の環境で再現しないため、対応が遅れました。みなさまご迷惑をおかけいたしました。
この現象に気づくことができたのは id:RSS さんや 、樂水開発日記 での指摘のおかげです。
大変ありがとうございました。

テスト環境に対応

id:ujihisa さんや、id:iRSS さんから指摘されていましたが、テスト環境では動作しないという不具合があったようです。これまたご迷惑をおかけいたしました。修正を取り込みました。

Ajax サポート

XMLHTTPRequest で受けているリクエストの場合は、今のリクエストの URI ではなく、HTTP_REFERERURI を基点として、相対パスを計算します。
この対応により、Ajax によって生成されるリンクの URL についても適切な相対パスが出力されます。
おそらくまだ完璧な動作ではありませんが、同一のコントローラ内での XMLHTTPRequest であれば正常に動作するでしょう。

スタティックファイルフィルタ機能

今回導入された目玉機能です。
まずは導入した経緯から。streamlined_generator というものがあります。streamlined_generator はとても美しい Scaffold のようなデータベースの管理画面を作成するもので、私は一度使っただけでとても好きになってしまいました。

しかしながら、streamlined_generator は次の点で RelatiePath プラグインとの相性が良くなかったようです。1点は、Ajax で生成されるエレメント中にリンクが含まれている点です。これは先ほどの Ajax サポートを実装することで解決できました。
もう1点は、css が使われており、その中で画像ファイルが指定されている箇所がある点です。その設定で使われている DXImageTransform.Microsoft.AlphaImageLoader という画像フィルタは、画像ファイルへのリンクを css ファイルからの相対パスではなく、今閲覧中のページからの相対パスで記述することを要求します。

これは難題です。CSS は静的ファイルで、その画像ファイルはその中に書かれているのに対して適切な相対パスは閲覧中のページによって異なるからです。

しかしながら私はどうしても streamlined_generator をそのままで使いたかったので、なんとかしてしまいました。実装したのは、public/ ディレクトリ以下にあるようなスタティックファイルの内容を動的に変更するフィルタ機能です。変更するファイル名の正規表現、変更箇所を特定するための正規表現、そして変更後の文字列を返すブロックの3つを指定することで、スタティックファイルを出力するときにその内容を HTTP_REFERERREQUEST_URI などに従って動的に変更できます。

もちろん、Ruby で可能な範囲での実装ですから、WEBrickMongrel を Webサーバとして使っている場合にしか利用できませんが、なかなかに便利な機能です。Apache 2 を使っているのであれば、単純に output filter を利用すれば同様のことは実現できるでしょうか。

ちょっと今は十分に記述する時間がないため、詳細な使い方についてまたあとで書きます。

あと、ときおり commit していたりするものの、目下作業中であることをご了承お願いいたします。