Convert children to nested functions. Reuse identifiers by closure where possible.

This commit is contained in:
kpdecker
2011-07-31 16:17:39 -05:00
parent 77a20a3a9f
commit d044ada7aa
2 changed files with 53 additions and 82 deletions
+10 -30
View File
@@ -3,66 +3,46 @@ var Handlebars = require("./base");
// BEGIN(BROWSER)
Handlebars.VM = {
template: function(templateSpec) {
// Setup all children
for (var i = 0, len = templateSpec.children.length; i < len; i++) {
templateSpec.children[i] = Handlebars.VM.template(templateSpec.children[i]);
}
// Just add water
var container = {
escapeExpression: Handlebars.Utils.escapeExpression,
invokePartial: Handlebars.VM.invokePartial,
programs: [],
program: function(i, helpers, partials, data) {
program: function(i, fn, data) {
var programWrapper = this.programs[i];
if(data) {
return Handlebars.VM.program(this.children[i], helpers, partials, data);
return Handlebars.VM.program(fn, data);
} else if(programWrapper) {
return programWrapper;
} else {
programWrapper = this.programs[i] = Handlebars.VM.program(this.children[i], helpers, partials);
programWrapper = this.programs[i] = Handlebars.VM.program(fn);
return programWrapper;
}
},
programWithDepth: Handlebars.VM.programWithDepth,
noop: Handlebars.VM.noop
};
container.render = templateSpec.fn;
container.children = templateSpec.children;
return function(context, options, $depth) {
return function(context, options) {
options = options || {};
var args = [Handlebars, context, options.helpers, options.partials, options.data];
var depth = Array.prototype.slice.call(arguments, 2);
args = args.concat(depth);
return container.render.apply(container, args);
return templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);
};
},
programWithDepth: function(fn, helpers, partials, data, $depth) {
var args = Array.prototype.slice.call(arguments, 4);
programWithDepth: function(fn, data, $depth) {
var args = Array.prototype.slice.call(arguments, 2);
return function(context, options) {
options = options || {};
options = {
helpers: options.helpers || helpers,
partials: options.partials || partials,
data: options.data || data
};
return fn.apply(this, [context, options].concat(args));
return fn.apply(this, [context, options.data || data].concat(args));
};
},
program: function(fn, helpers, partials, data) {
program: function(fn, data) {
return function(context, options) {
options = options || {};
return fn(context, {
helpers: options.helpers || helpers,
partials: options.partials || partials,
data: options.data || data
});
return fn(context, options.data || data);
};
},
noop: function() { return ""; },