in trimpath/template.js [85:106]
prefixFunc : function(stmtParts, state, tmplName, etc) {
if (stmtParts[2] != "in")
throw new etc.ParseError(tmplName, state.line, "bad for loop statement: " + stmtParts.join(' '));
var iterVar = stmtParts[1];
var listVar = "__LIST__" + iterVar;
return [ "var ", listVar, " = ", stmtParts[3], ";",
// Fix from Ross Shaull for hash looping, make sure that we have an array of loop lengths to treat like a stack.
"var __LENGTH_STACK__;",
"if (typeof(__LENGTH_STACK__) == 'undefined' || !__LENGTH_STACK__.length) __LENGTH_STACK__ = new Array();",
"__LENGTH_STACK__[__LENGTH_STACK__.length] = 0;", // Push a new for-loop onto the stack of loop lengths.
"if ((", listVar, ") != null) { ",
"var ", iterVar, "_ct = 0;", // iterVar_ct variable, added by B. Bittman
"for (var ", iterVar, "_index in ", listVar, ") { ",
iterVar, "_ct++;",
"if (typeof(", listVar, "[", iterVar, "_index]) == 'function') {continue;}", // IE 5.x fix from Igor Poteryaev.
"__LENGTH_STACK__[__LENGTH_STACK__.length - 1]++;",
"var ", iterVar, " = ", listVar, "[", iterVar, "_index];" ].join("");
} },
"forelse" : { delta: 0, prefix: "} } if (__LENGTH_STACK__[__LENGTH_STACK__.length - 1] == 0) { if (", suffix: ") {", paramDefault: "true" },
"/for" : { delta: -1, prefix: "} }; delete __LENGTH_STACK__[__LENGTH_STACK__.length - 1];" }, // Remove the just-finished for-loop from the stack of loop lengths.
"var" : { delta: 0, prefix: "var ", suffix: ";" },
"macro" : { delta: 1,