in struts2-jst-plugin/src/main/resources/trimpath-template-1.0.38.js [164:228]
var parse = function(body, tmplName, etc) {
body = cleanWhiteSpace(body);
var funcText = [ "var TrimPath_Template_TEMP = function(_OUT, _CONTEXT, _FLAGS) { with (_CONTEXT) {" ];
var state = { stack: [], line: 1 }; // TODO: Fix line number counting.
var endStmtPrev = -1;
while (endStmtPrev + 1 < body.length) {
var begStmt = endStmtPrev;
// Scan until we find some statement markup.
begStmt = body.indexOf("{", begStmt + 1);
while (begStmt >= 0) {
var endStmt = body.indexOf('}', begStmt + 1);
var stmt = body.substring(begStmt, endStmt);
var blockrx = stmt.match(/^\{(cdata|minify|eval)/); // From B. Bittman, minify/eval/cdata implementation.
if (blockrx) {
var blockType = blockrx[1];
var blockMarkerBeg = begStmt + blockType.length + 1;
var blockMarkerEnd = body.indexOf('}', blockMarkerBeg);
if (blockMarkerEnd >= 0) {
var blockMarker;
if( blockMarkerEnd - blockMarkerBeg <= 0 ) {
blockMarker = "{/" + blockType + "}";
} else {
blockMarker = body.substring(blockMarkerBeg + 1, blockMarkerEnd);
}
var blockEnd = body.indexOf(blockMarker, blockMarkerEnd + 1);
if (blockEnd >= 0) {
emitSectionText(body.substring(endStmtPrev + 1, begStmt), funcText);
var blockText = body.substring(blockMarkerEnd + 1, blockEnd);
if (blockType == 'cdata') {
emitText(blockText, funcText);
} else if (blockType == 'minify') {
emitText(scrubWhiteSpace(blockText), funcText);
} else if (blockType == 'eval') {
if (blockText != null && blockText.length > 0) // From B. Bittman, eval should not execute until process().
funcText.push('_OUT.write( (function() { ' + blockText + ' })() );');
}
begStmt = endStmtPrev = blockEnd + blockMarker.length - 1;
}
}
} else if (body.charAt(begStmt - 1) != '$' && // Not an expression or backslashed,
body.charAt(begStmt - 1) != '\\') { // so check if it is a statement tag.
var offset = (body.charAt(begStmt + 1) == '/' ? 2 : 1); // Close tags offset of 2 skips '/'.
// 10 is larger than maximum statement tag length.
if (body.substring(begStmt + offset, begStmt + 10 + offset).search(TrimPath.parseTemplate_etc.statementTag) == 0)
break; // Found a match.
}
begStmt = body.indexOf("{", begStmt + 1);
}
if (begStmt < 0) // In "a{for}c", begStmt will be 1.
break;
var endStmt = body.indexOf("}", begStmt + 1); // In "a{for}c", endStmt will be 5.
if (endStmt < 0)
break;
emitSectionText(body.substring(endStmtPrev + 1, begStmt), funcText);
emitStatement(body.substring(begStmt, endStmt + 1), state, funcText, tmplName, etc);
endStmtPrev = endStmt;
}
emitSectionText(body.substring(endStmtPrev + 1), funcText);
if (state.stack.length != 0)
throw new etc.ParseError(tmplName, state.line, "unclosed, unmatched statement(s): " + state.stack.join(","));
funcText.push("}}; TrimPath_Template_TEMP");
return funcText.join("");
}