おべんきょうメモ

ResourceSynchronizerとPHP,影舞とを連携させようとして調べたこと、思い出したことをごちゃごちゃメモします。あんまり余人の参考にはならないかもしれません。

JavaScript

置換

seds/re/sub/gにあたる置換は、str.replace(/re/g,'sub')
HTMLエスケープを実装するときにこれずっと気づかなくて、どうしてエスケープされないんだろ?><と思った。

JSONP

JSONPてのはクロスドメイン制限を越えるためにあって、普通callbackといったパラメータで戻り関数名を指定できるようなAPIになっている。
jQuery1.2以上だと、jQuery.ajax()でデータタイプを'jsonp'にすると、勝手にパラメータにcallback=?をつけてくれる。

jQueryにおけるJSONPエラー

jQueryでクロスドメインJSONPのエラーはjQuery.ajax()errorパラメータでは拾えない。
エラー関数を登録できるようになっているんだけど、多分これもクロスドメイン制限のために駄目。会社で検索したから今手元にリンクがないけど、先人の苦労を参考にして解決した。
FireFoxなら$(window).error(func);でwindowオブジェクトのエラーハンドラを仕込む。
IEの場合これは使えないらしく、window.setTimeout(func,millisec)タイムアウトをセットしておいて、ajax通信時にそれをクリアするような方法をとる。

影舞

ERB

JSPのようなテンプレートエンジン。影舞もこれを使っている。以前、影舞でインラインで画像が出るようにしたりといったプチ改造はこれの.rhtmlに手を入れた。ちなみにSAStrutsJSPファンクションはRails経由でERB::Utilを祖先にもつのだと思う。

レンダラ

FoldingRenderer
共有フォルダへのリンクのために、UNCを影舞に埋め込もうとしたら、最初、文字列が途中で折りかえされてしまう現象が発生した。これは影舞が、aタグで囲まれてない文字列を一定文字でfoldしてくれているためだとわかった。しかし、UNCやらFQCNを勝手にポキポキ折られては都合が悪いので、ちょっとずるをすることにした。

影舞はちょっとした拡張ならscriptというところにプラグインみたいな感じで簡単に置けるんだけど、その仕様はundocumentedなので、挙動を調べるのに苦労する。

細かく動作を追った結果、どうもlib/kagemai/cgi/htmlhelper.rb:628付近にあるTextElementType#html_valueの中のrenderer配列が問題とわかった。
ユーザ定義レンダラは、行の折り返しレンダラ(Folding)の後に評価されてしまう。これでは困るので、ユーザ定義スクリプト内で、概略、以下のように再定義した。

module Kagemai
  TextElementType::html_value(element, index_item = false, host = false)
  renderers = [UrlRenderer.new, CvsUncRenderer.new, BtsLinkRenderer.new(host), Folding.new ]
  以下略

CvsUncRendererというのが自前レンダラである。これで、UrlRendererより後、Foldingより前に自前レンダラが処理され、無事希望の動作をするようになった。

余談だけど、Rubyだとこんな感じで、定義済みのクラスのメソッドのオーバーライドだけでなく、再定義や追加が後付できるのは便利だ。JAVAだとAOPということになって、aopallianceパッケージ系や、以前千葉先生が紹介されていたGluonJを使う必要がある。