Safari に RegExp.leftContext, RegExp.rightContext

January 31st, 2007

Safari で Japanize の Wiki をみるとページが空っぽで困る。

Japanize の Wiki はサイボウズラボで独自に開発した、たぶん PlusWiki という名前のシステムで動いている。PlusWiki は Wiki 記法で書かれたページを XMLHttpRequest でとってきて、HTML への変換は JavaScript でやっているらしい。

で、Safari には RegExp.leftContext, RegExp.rightContext が無い。SVN をみると r10818 で実装されているようなので、そのうち直るんだろうけど。

とりあえずは、String.prototype.match を

var originalMatch = String.prototype.match;
String.prototype.match = function (regexp) {
   var result = originalMatch.apply(this, arguments);
   if (! result)
      return null;

   RegExp.leftContext = this.substring(0, result.index);
   RegExp.rightContext = this.substring(result.index + result[0].length, this.length);

   return result;
};

という感じに書き換える pluswiki-safari.user.js というものを書いてしのいだ。

ひっかかるのが、String.prototype.match を書き換えるだけじゃだめで PlusWiki.wikiView(); を呼び出しているところ。ユーザースクリプトってページ上のスクリプトより先に実行されるものだと思っていたんだけど、そうじゃないんだろうか。自分が誤解しているのか、Creammonkey のバグなのかよくわからない。

知っているひとは教えていただければ幸いです。

3 Responses to “Safari に RegExp.leftContext, RegExp.rightContext”

  1. kazuho Says:

    Sarafi で動いてないのはわかっていたけどめんどくさくて放置プレイ中でした。

    なるほど。こういうふうに String.prototype.match をパッチすれば綺麗ですね。修正したいと思います。

    > ユーザースクリプトってページ上のスクリプトより先に実行されるものだと思っていたんだけど、そうじゃないんだろうか。

    script タグの中身はユーザースクリプトより先に実行されますよね? 今回のケースはそういうことだと思います。

  2. trickstar_os Says:

    微妙なソース(Greasemonkeyの話な上にOperaの見解)ですが、こちらが参考になるかと。 http://jp.opera.com/support/tutorials/userjs/examples/#greasemonkey

  3. カトウ Says:

    お二人ともありがとうございます。Creammonkey のバグではないようで安心しました。

    こういう類のユーザースクリプトは結局ローカルパッチなので、upstream にとりこまれるならそれに越したことは無いです。ありがとうございます。