var str = render (tpl, obj);
// to cut the comments tpl = tpl.replace ( /\{#[^]*?#\}/g, '' );
var deeps = function (obj, val) { var hs = val.split('.'); var len = hs.length; var deep; var num = 0; for (var i = 0; i < len; i++) { var el = hs[i]; if (deep) { if (deep[el]) { deep = deep[el]; num++; } } else { if (obj[el]) { deep = obj[el]; num++; } } } if (num == len) { return deep; } else { return undefined; } };
// : // , , , // , , var ptn = /\{\%\s*[a-zA-Z0-9._/:-]+?\s*\%\}/g; // var parts = tpl.split (ptn); // var matches = tpl.match (ptn);
// var blocks = []; // var curnt = []; if( matches ){ // .. .. null var len = matches.length; for ( var i = 0; i < len; i++ ) { // {% %}, trim var str = matches[i].replace (/^\{\%\s*|\s*\%\}$/g, ''); if (str === '/') { // finalise block // ... } else { // make block // ... } // ...
// var cln = curnt.length; if (cln == 0) { // .. , blocks.push ( struct ); // , curnt.push ( struct ); } else { // nested curnt[cln - 1].nest.push ( struct ); // "" curnt var last = curnt[cln - 1].nest.length - 1; curnt.push ( curnt[cln - 1].nest [ last ] ); }
var struct = { // obj cnt: deeps( obj, str ), // nest: [], // be4e: parts[ i + 1 ], // str -- , // cnt -- -, af3e: { cnt: null, str: '' } };
if (str === '/') { // curnt // // curnt [cln - 1].af3e = { cnt: ( curnt [ cln - 2 ] ? curnt [ cln - 2 ].cnt : obj ), str: parts[ i + 1 ] }; curnt.pop();
// var stars = [ [ parts[0], obj ] ]; parseBlocks( blocks, stars );
var parseBlocks = function ( blocks, stars ) { var len = blocks.length; for (var i = 0; i < len; i++) { var block = blocks [i]; // obj if (block.cnt) { var current = block.cnt; // switch ( Object.prototype.toString.call( current ) ) { // case '[object Array]': var len1 = current.length; for ( var k = 0; k < len1; k++ ) { // stars stars.push ( [ block.be4e, current[k] ] ); // parseBlocks( block.nest, stars ); } break; // case '[object Object]': for (var k in current) { if (current.hasOwnProperty(k)) { // stars stars.push ( [ block.be4e, current[k] ] ); // parseBlocks( block.nest, stars ); } } break; // , default: stars.push ( [ block.be4e, current ] ); parseBlocks( block.nest, stars ); } // stars , stars.push ( [ block.af3e.str, block.af3e.cnt ] ); } } };
var pstr = []; var len = stars.length; for ( var i = 0; i < len; i++ ) { pstr.push( parseStar ( stars[i][0], stars[i][1] ) ); } // : return pstr.join ('');
var parseStar = function ( part, current ) { var str = ''; // var ptn = /\{\{\s*.+?\s*\}\}/g; var parts = part.split (ptn); var matches = part.match (ptn); // str += parts[0]; if (matches) { var len = matches.length; for (var i = 0; i < len; i++) { // var match = matches [i]; // trim var el = match.replace(/^\{\{\s*|\s*\}\}$/g, ''); var strel = ''; // var deep = deeps( current, el ); // , deep && ( strel += deep ); str += strel; } if (len > 0) { str += parts[ len ]; } } return str; }
Source: https://habr.com/ru/post/201684/
All Articles