UNPKG

smarty4js

Version:

A JavaScript Template Engine Most Like Smarty

144 lines (130 loc) 4.9 kB
/** * @file conditions render(include if, else, elseif, else if) * @author johnson [zoumiaojiang@gmail.com] */ var utils = require('../utils'); module.exports = function (Renderer) { utils.mixin(Renderer.prototype, { /** * render if stmts * (this method include adapta ast nodes to real if, else, elseif) * @param {Object} node ast node * @param {number} flag is tag in string?(2: true, 0: false) * @return {string} render result */ _getIf: function (node, flag) { var me = this; var expr = node.expr; var block = node.block; var ci = 0; var elseifindex = []; var elseindex = 0; var ifProcess = []; // real relations of if-else stmts var ret = ''; block.forEach(function (b, index) { if (b.type === 'ELSEIF') { elseifindex.push(index); } else if (b.type === 'ELSE') { elseindex = index; } }); if (elseifindex.length > 0) { for (var i = 0, l = elseifindex.length; i <= l; i++) { if (ci === 0) { ifProcess.push({ type: 'IF', expr: expr, block: block.slice(ci, elseifindex[i]) }); ci = elseifindex[i]; } else { ifProcess.push({ type: 'ELSEIF', expr: block[ci].expr, block: block[ci].block.concat( block.slice( ci + 1, elseifindex[i] || elseindex || block.length ) ) }); ci = elseifindex[i]; } } } else { ifProcess.push({ type: 'IF', expr: expr, block: block.slice(0, elseindex || block.length) }); } if (elseindex) { ifProcess.push({ type: 'ELSE', block: block[elseindex].block.concat(block.slice(elseindex + 1)) }); } ifProcess.forEach(function (nod) { var type = nod.type; var tmps = ''; switch (type) { case 'IF': ret += me._getIfReal(nod, flag); break; case 'ELSEIF': tmps = me._getElseIf(nod, flag); ret = flag ? ret.replace('__ELSE__', tmps) : (ret + tmps); break; case 'ELSE': tmps = me._getElse(nod, flag); ret = flag ? ret.replace('__ELSE__', tmps) : (ret + tmps); break; default: break; } }); return ret.replace('__ELSE__', '""'); }, /** * real render of if_stmt * @param {Object} node ast node * @param {number} flag is tag in string?(2: true, 0: false) * @return {string} render result */ _getIfReal: function (node, flag) { var me = this; var expr = me._getExpr(node.expr); return flag ? '(' + expr + '?(' + me._init(node.block, flag) + '):__ELSE__)' : '\nif(' + expr + '){' + me._init(node.block) + '}'; }, /** * real render of else_stmt * @param {Object} node ast node * @param {number} flag is tag in string?(2: true, 0: false) * @return {string} render result */ _getElseIf: function (node, flag) { var me = this; var expr = me._getExpr(node.expr); return flag ? '(' + expr + '?(' + me._init(node.block, flag) + '):__ELSE__)' : '\nelse if(' + expr + '){' + me._init(node.block) + '}'; }, /** * real render of elseif_stmt * @param {Object} node ast node * @param {number} flag is tag in string?(2: true, 0: false) * @return {string} render result */ _getElse: function (node, flag) { var me = this; return flag ? '(' + me._init(node.block, flag) + ')' : '\nelse{' + me._init(node.block) + '}'; } }); };