summaryrefslogtreecommitdiffstats
path: root/lib/handlebars/runtime.js
diff options
context:
space:
mode:
authorkpdecker <kpdecker@gmail.com>2014-01-19 17:32:25 -0600
committerkpdecker <kpdecker@gmail.com>2014-02-06 23:05:45 -0800
commit2812fe27758e38dbefad8b02c61ffb19aabf2410 (patch)
tree3d8acaf8d9cf3fdcf1e5f78b4e737bb5a19f0dd2 /lib/handlebars/runtime.js
parent8f07bbabeabaed5d8100261b952c9de07fad7a8c (diff)
downloadhandlebars.js-2812fe27758e38dbefad8b02c61ffb19aabf2410.zip
handlebars.js-2812fe27758e38dbefad8b02c61ffb19aabf2410.tar.gz
handlebars.js-2812fe27758e38dbefad8b02c61ffb19aabf2410.tar.bz2
Convert template spec to object literal
This allows for metadata to be associated with the template and a simplification of the template init logic.
Diffstat (limited to 'lib/handlebars/runtime.js')
-rw-r--r--lib/handlebars/runtime.js62
1 files changed, 37 insertions, 25 deletions
diff --git a/lib/handlebars/runtime.js b/lib/handlebars/runtime.js
index 6014691..e65db6e 100644
--- a/lib/handlebars/runtime.js
+++ b/lib/handlebars/runtime.js
@@ -29,6 +29,8 @@ export function template(templateSpec, env) {
// Note: Using env.VM references rather than local var references throughout this section to allow
// for external users to override these as psuedo-supported APIs.
+ env.VM.checkRevision(templateSpec.compiler);
+
var invokePartialWrapper = function(partial, name, context, hash, helpers, partials, data) {
if (hash) {
context = Utils.extend({}, context, hash);
@@ -50,16 +52,24 @@ export function template(templateSpec, env) {
var container = {
escapeExpression: Utils.escapeExpression,
invokePartial: invokePartialWrapper,
+
+ fn: function(i) {
+ return templateSpec[i];
+ },
+
programs: [],
- program: function(i, fn, data) {
- var programWrapper = this.programs[i];
+ program: function(i, data) {
+ var programWrapper = this.programs[i],
+ fn = this.fn(i);
if(data) {
- programWrapper = program(i, fn, data);
+ programWrapper = program(this, i, fn, data);
} else if (!programWrapper) {
- programWrapper = this.programs[i] = program(i, fn);
+ programWrapper = this.programs[i] = program(this, i, fn);
}
return programWrapper;
},
+ programWithDepth: env.VM.programWithDepth,
+
initData: function(context, data) {
if (!data || !('root' in data)) {
data = data ? createFrame(data) : {};
@@ -76,54 +86,56 @@ export function template(templateSpec, env) {
return ret;
},
- programWithDepth: env.VM.programWithDepth,
+
noop: env.VM.noop,
- compilerInfo: null
+ compilerInfo: templateSpec.compiler
};
return function(context, options) {
options = options || {};
var namespace = options.partial ? options : env,
helpers,
- partials;
+ partials,
+ data = options.data;
if (!options.partial) {
- helpers = options.helpers;
- partials = options.partials;
- }
- var result = templateSpec.call(
- container,
- namespace, context,
- helpers,
- partials,
- options.data);
+ helpers = container.helpers = container.merge(options.helpers, namespace.helpers);
- if (!options.partial) {
- env.VM.checkRevision(container.compilerInfo);
+ if (templateSpec.usePartial) {
+ partials = container.partials = container.merge(options.partials, namespace.partials);
+ }
+ if (templateSpec.useData) {
+ data = container.initData(context, data);
+ }
+ } else {
+ helpers = container.helpers = options.helpers;
+ partials = container.partials = options.partials;
}
-
- return result;
+ return templateSpec.main.call(container, context, helpers, partials, data);
};
}
-export function programWithDepth(i, fn, data /*, $depth */) {
- var args = Array.prototype.slice.call(arguments, 3);
+export function programWithDepth(i, data /*, $depth */) {
+ /*jshint -W040 */
+ var args = Array.prototype.slice.call(arguments, 2),
+ container = this,
+ fn = container.fn(i);
var prog = function(context, options) {
options = options || {};
- return fn.apply(this, [context, options.data || data].concat(args));
+ return fn.apply(container, [context, container.helpers, container.partials, options.data || data].concat(args));
};
prog.program = i;
prog.depth = args.length;
return prog;
}
-export function program(i, fn, data) {
+export function program(container, i, fn, data) {
var prog = function(context, options) {
options = options || {};
- return fn(context, options.data || data);
+ return fn.call(container, context, container.helpers, container.partials, options.data || data);
};
prog.program = i;
prog.depth = 0;