blog.ishinao.net

293月/05

WikiParserをアップデート (18:19)

主な変更点としては、

  • プラグインとして、従来の関数型プラグインに加え、プラグインクラスに対応。
  • プラグインクラスでは、同一プラグイン内でのデータの保持、イベントコールバックによるパーサーからの呼び出し、に対応。要は、footnote(注釈)プラグインみたいなことができるようにした
  • パースしている元テキストへのアクセス手段を用意。それに伴いフィルタに対応。フィルタ(プラグインのイベントコールバックの実装と同様)を利用することで、パース処理実行時の元テキストへの加工処理が可能になる。要は、tdview.phpとtdiary_categoryプラグインみたいに、カテゴリ記法に対して前処理でリンクを張ったりできるようにした。
  • いくつかのバグをフィックス。

一応現状の基本仕様でフィックスさせつつ、細かいメソッド名とかをもうちょいいじる予定。プラグイン連携のためのメソッドもいくつか追加するかも。

このエントリーを含むはてなブックマークはてなブックマーク - WikiParserをアップデート (18:19) Share on Tumblr このエントリをつぶやくこのWebページのtweets
Filed under: 日記 No Comments
293月/05

JavaScriptでpreg_replace_callback (17:16)

WikiParserをJavaScriptに移植してみようかと思ったら、preg_replace_callback相当の正規表現(Perlで言うと/eg)が見あたらない。っつーか、ないんだよね?

しょうがないんで、こんな感じで動かしてみたんだけど、なんとも不格好な感じ。もうちょいいい書き方ないかなー。

function replace(str)
{
str = str.replace(/(123)/g, "' + callback('$1') + '");
str = str.replace(/'/g, "\\'");
str = str.replace(/\\' \+ callback\(\\'(.+?)\\'\) \+ \\'/g, "' + callback('$1') + '");
str = eval("'" + str + "'");
return str;
}
function callback(str)
{
str = eval(str) + 100;
return str;
}
test = "sdga123lkjdgas1234fasdfas";
alert(test);
result = replace(test);
alert(result);

ちなみにテンポラリの式をわざと対象のstrに含まされると誤動作するけど、大して危険性もないだろうということで放置。

正解は

malaさんからきれいな解答を教えてもらいました

function replace(str)
{
str = str.replace(/123/g, callback);
return str;
}
function callback(str)
{
str = eval(str) + 100;
return str;
}
test = "sdga123lkjdgas1234fasdfas";
alert(test);
result = replace(test);
alert(result);

これでOK。replaceの第2パラメータに関数を渡すと、その関数のパラメータとして、lastMatch(というかマッチした全体)、$1、$2、……が渡されて呼ばれる模様。で、その関数の戻り値として置換結果文字列を返してやればいい。

str = str.replace(/(123)/g, callback($1));

とか

str = str.replace(/(123)/g, callback(RegExp.$1));

なんて表現は試してみたんだけどなー。

ちなみに後者の表現だと、RegExp.$1はここの/123/gではなく、その前に評価された正規表現の結果の$1を受け取っちゃうんで、微妙に惜しい結果になった。

このエントリーを含むはてなブックマークはてなブックマーク - JavaScriptでpreg_replace_callback (17:16) Share on Tumblr このエントリをつぶやくこのWebページのtweets
Filed under: 日記 No Comments