テンプレート解析の古典的な実践について


概要:抜粋したjqueryのテンプレートの部分コードは,解析テンプレートの考え方を整理する.正則的な使い方の習得に重点を置く.
分析コードの内容

(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