diff options
author | kpdecker <kpdecker@gmail.com> | 2014-01-19 17:32:25 -0600 |
---|---|---|
committer | kpdecker <kpdecker@gmail.com> | 2014-02-06 23:05:45 -0800 |
commit | 2812fe27758e38dbefad8b02c61ffb19aabf2410 (patch) | |
tree | 3d8acaf8d9cf3fdcf1e5f78b4e737bb5a19f0dd2 /lib/handlebars/runtime.js | |
parent | 8f07bbabeabaed5d8100261b952c9de07fad7a8c (diff) | |
download | handlebars.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.js | 62 |
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; |