2006年10月21日 18:00 [Edit]

javascript - Interpolatorで変数展開

Perlにはqq($variable)、 Rubyには#{ expression }、Pyhonはさておき、JavaScriptには存在しないのはなぜ?

というわけで、こさえてみました。


ここをクリックでinterpolateします。

  • タイトルは document.title.
  • URIは location.href
  • これは 駄目
  • これはOK encodeURIComponent('小飼弾')
  • これもOK document.getElementsByTagName('body')
  • これもOK: (function(){ var a = []; for(var p in document) a.push(p); return a.join(", "); })()

見ての通り、ちょっと強力すぎるかも。 でも、変数(variable)、というより式(expression)を囲う引用符が自由自在に選べますし、 Geek向けの強力なテンプレートエンジンよりもデザイナーさんとかにとって使いやすいかも。

ソースはこちら。

function Interpolator(open, close){
    this.quotemeta = function(str){
      return str.replace(/[^0-9A-Za-z_]/g, function(m){
            return '\\' + m;
      });
    };
    this.regexp = new RegExp(
        this.quotemeta(open) + '((?:\n|.)+?)' + this.quotemeta(close), 
    'img'); // i is for cases like '<tag> - </tag>'
    this.interpolate = function(str){
        return str.replace(this.regexp, function(m0, m1){
            var result = '';
            try{
                result = eval(m1);
            }catch(e){
                result = '[' + m1 + ':' + e + ']';
            }
            return result;
        });
    };
    this.fill = this.interpolate;
}

使うときは

var itp = new Interpolator('<code>', '</code>');
var elem = document.getElementByName('interpolate');
elem.innerHTML = itp.fill(elem.innerHTML)

とします。

これがeval()を使っていて毒が強すぎというのであれば、代わりにjsonとかを突っ込んでそれだけ展開するというものも、これを元にすれば比較的簡単に書けるでしょう。

Enjoy!

['Javascripter', 'the', 'Dan'].reverse().join(' ');


この記事へのトラックバックURL

この記事へのトラックバック
早い話、PerlにおけるquotemetaがあればOK、と。 文字列から正規表現を生成するときのメモ - IT戦記という感じで、バックスラッシュをいっぱい書かなければいけないので
javascript - String.prototype.quotemeta() があればいいんじゃね?【404 Blog Not Found】at 2008年05月30日 17:21