in trimpath/template.js [302:331]
var emitSectionTextLine = function(line, funcText) {
var endMarkPrev = '}';
var endExprPrev = -1;
while (endExprPrev + endMarkPrev.length < line.length) {
var begMark = "${", endMark = "}";
var begExpr = line.indexOf(begMark, endExprPrev + endMarkPrev.length); // In "a${b}c", begExpr == 1
if (begExpr < 0)
break;
if (line.charAt(begExpr + 2) == '%') {
begMark = "${%";
endMark = "%}";
}
var endExpr = line.indexOf(endMark, begExpr + begMark.length); // In "a${b}c", endExpr == 4;
if (endExpr < 0)
break;
emitText(line.substring(endExprPrev + endMarkPrev.length, begExpr), funcText);
// Example: exprs == 'firstName|default:"John Doe"|capitalize'.split('|')
var exprArr = line.substring(begExpr + begMark.length, endExpr).replace(/\|\|/g, "#@@#").split('|');
for (var k in exprArr) {
if (exprArr[k].replace) // IE 5.x fix from Igor Poteryaev.
exprArr[k] = exprArr[k].replace(/#@@#/g, '||');
}
funcText.push('_OUT.write(');
emitExpression(exprArr, exprArr.length - 1, funcText);
funcText.push(');');
endExprPrev = endExpr;
endMarkPrev = endMark;
}
emitText(line.substring(endExprPrev + endMarkPrev.length), funcText);
}