テンプレート解析の古典的な実践について
2839 ワード
概要:抜粋したjqueryのテンプレートの部分コードは,解析テンプレートの考え方を整理する.正則的な使い方の習得に重点を置く.
分析コードの内容
解析後のコード:
解析セクション
したがって、2つの使い方があります.1つは、前啓後からp.push('1つは区切り文字',$1,'
文例出典:JavaScript Micro-Templating
分析コードの内容
(function(){
var cache = {};
var tag_start='<!--';
var tag_end='-->';
this.tmpl = function tmpl(str, data){
var strTemp = str.replace(/[\r\t
]/g, " ")
.split(tag_start).join("\t")
.replace(new RegExp("((^|"+tag_end+")[^\\t]*)'", "g"), "$1\r")
.replace(new RegExp("\\t=(.*?)"+tag_end, "g"), "',$1,'")
.split("\t").join("');")
.split(tag_end).join("p.push('")
.split("\r").join("\\'");
var fn = !/\W/.test(str) ? cache[str] = cache[str] ||
tmpl(document.getElementById(str).innerHTML) :
new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" +
"with(obj){p.push('" + strTemp + "');}return p.join('');");
if (data)
{document.getElementById(str).innerHTML=fn( data )
}
else
{return fn;
}
};
})();
Name:''
var data={users:[{name:'name1'},
{name:'name2'}
]
};
tmpl("tpl", data);
解析後のコード:
(function anonymous(obj) {
var p = []
, print = function() {
p.push.apply(p, arguments);
};
with (obj) {
p.push('
');
for (i = 0; i < users.length; ++i) {
p.push(' Name:\'', users[i].name, ' \'
');
}
p.push(' ');
}
return p.join('');
}
)
解析セクション
//
str.replace(/[\r\t
]/g, " ") // , , ,
.split(")[^\\t]*)'", "g"), "$1\r") // \t ( )+' --> +\t ( )+' , ,$1\r $1 () , ' \r
.replace(new RegExp("\\t=(.*?)-->", "g"), "',$1,'") // \t , ',$1,' () users[i].name ', ,'
.split("\t").join("');") // \t ").join("p.push('") // --> p.push(');
.split("\r").join("\\'"); // ' ', '
//
// p.push('
Name:'' // ' \' ',users[i].name,'
// p.push('
したがって、2つの使い方があります.1つは、前啓後からp.push('1つは区切り文字',$1,'
文例出典:JavaScript Micro-Templating