2006年10月21日 18:00 [Edit]
javascript - Interpolatorで変数展開
ここをクリックで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(' ');
Posted by dankogai at 18:00│Comments(0)│TrackBack(1)
この記事へのトラックバックURL
この記事へのトラックバック
早い話、PerlにおけるquotemetaがあればOK、と。
文字列から正規表現を生成するときのメモ - IT戦記という感じで、バックスラッシュをいっぱい書かなければいけないので
javascript - String.prototype.quotemeta() があればいいんじゃね?【404 Blog Not Found】at 2008年05月30日 17:21