📄 template.js
字号:
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("");
}
var emitStatement = function(stmtStr, state, funcText, tmplName, etc) {
var parts = stmtStr.slice(1, -1).split(' ');
var stmt = etc.statementDef[parts[0]]; // Here, parts[0] == for/if/else/...
if (stmt == null) { // Not a real statement.
emitSectionText(stmtStr, funcText);
return;
}
if (stmt.delta < 0) {
if (state.stack.length <= 0)
throw new etc.ParseError(tmplName, state.line, "close tag does not match any previous statement: " + stmtStr);
state.stack.pop();
}
if (stmt.delta > 0)
state.stack.push(stmtStr);
if (stmt.paramMin != null &&
stmt.paramMin >= parts.length)
throw new etc.ParseError(tmplName, state.line, "statement needs more parameters: " + stmtStr);
if (stmt.prefixFunc != null)
funcText.push(stmt.prefixFunc(parts, state, tmplName, etc));
else
funcText.push(stmt.prefix);
if (stmt.suffix != null) {
if (parts.length <= 1) {
if (stmt.paramDefault != null)
funcText.push(stmt.paramDefault);
} else {
for (var i = 1; i < parts.length; i++) {
if (i > 1)
funcText.push(' ');
funcText.push(parts[i]);
}
}
funcText.push(stmt.suffix);
}
}
var emitSectionText = function(text, funcText) {
if (text.length <= 0)
return;
var nlPrefix = 0; // Index to first non-newline in prefix.
var nlSuffix = text.length - 1; // Index to first non-space/tab in suffix.
while (nlPrefix < text.length && (text.charAt(nlPrefix) == '\n'))
nlPrefix++;
while (nlSuffix >= 0 && (text.charAt(nlSuffix) == ' ' || text.charAt(nlSuffix) == '\t'))
nlSuffix--;
if (nlSuffix < nlPrefix)
nlSuffix = nlPrefix;
if (nlPrefix > 0) {
funcText.push('if (_FLAGS.keepWhitespace == true) _OUT.write("');
var s = text.substring(0, nlPrefix).replace('\n', '\\n'); // A macro IE fix from BJessen.
if (s.charAt(s.length - 1) == '\n')
s = s.substring(0, s.length - 1);
funcText.push(s);
funcText.push('");');
}
var lines = text.substring(nlPrefix, nlSuffix + 1).split('\n');
for (var i = 0; i < lines.length; i++) {
emitSectionTextLine(lines[i], funcText);
if (i < lines.length - 1)
funcText.push('_OUT.write("\\n");\n');
}
if (nlSuffix + 1 < text.length) {
funcText.push('if (_FLAGS.keepWhitespace == true) _OUT.write("');
var s = text.substring(nlSuffix + 1).replace('\n', '\\n');
if (s.charAt(s.length - 1) == '\n')
s = s.substring(0, s.length - 1);
funcText.push(s);
funcText.push('");');
}
}
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);
}
var emitText = function(text, funcText) {
if (text == null ||
text.length <= 0)
return;
text = text.replace(/\\/g, '\\\\');
text = text.replace(/\n/g, '\\n');
text = text.replace(/"/g, '\\"');
funcText.push('_OUT.write("');
funcText.push(text);
funcText.push('");');
}
var emitExpression = function(exprArr, index, funcText) {
// Ex: foo|a:x|b:y1,y2|c:z1,z2 is emitted as c(b(a(foo,x),y1,y2),z1,z2)
var expr = exprArr[index]; // Ex: exprArr == [firstName,capitalize,default:"John Doe"]
if (index <= 0) { // Ex: expr == 'default:"John Doe"'
funcText.push(expr);
return;
}
var parts = expr.split(':');
funcText.push('_MODIFIERS["');
funcText.push(parts[0]); // The parts[0] is a modifier function name, like capitalize.
funcText.push('"](');
emitExpression(exprArr, index - 1, funcText);
if (parts.length > 1) {
funcText.push(',');
funcText.push(parts[1]);
}
funcText.push(')');
}
var cleanWhiteSpace = function(result) {
result = result.replace(/\t/g, " ");
result = result.replace(/\r\n/g, "\n");
result = result.replace(/\r/g, "\n");
result = result.replace(/^(\s*\S*(\s+\S+)*)\s*$/, '$1'); // Right trim by Igor Poteryaev.
return result;
}
var scrubWhiteSpace = function(result) {
result = result.replace(/^\s+/g, "");
result = result.replace(/\s+$/g, "");
result = result.replace(/\s+/g, " ");
result = result.replace(/^(\s*\S*(\s+\S+)*)\s*$/, '$1'); // Right trim by Igor Poteryaev.
return result;
}
// The DOM helper functions depend on DOM/DHTML, so they only work in a browser.
// However, these are not considered core to the engine.
//
TrimPath.parseDOMTemplate = function(elementId, optDocument, optEtc) {
if (optDocument == null)
optDocument = document;
var element = optDocument.getElementById(elementId);
var content = element.value; // Like textarea.value.
if (content == null)
content = element.innerHTML; // Like textarea.innerHTML.
content = content.replace(/</g, "<").replace(/>/g, ">");
return TrimPath.parseTemplate(content, elementId, optEtc);
}
TrimPath.processDOMTemplate = function(elementId, context, optFlags, optDocument, optEtc) {
return TrimPath.parseDOMTemplate(elementId, optDocument, optEtc).process(context, optFlags);
}
}) ();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -