diff options
author | kpdecker <kpdecker@gmail.com> | 2013-04-07 18:04:51 -0500 |
---|---|---|
committer | kpdecker <kpdecker@gmail.com> | 2013-04-07 18:04:51 -0500 |
commit | 4429ffa9f37620afb211d15480545bd12b54bba5 (patch) | |
tree | ec09adc97c997bcb5b974aaeceaa4b674f147a8d | |
parent | 73f2016a6a5e7ce11077e44ec3288e0dac2df7c9 (diff) | |
download | handlebars.js-4429ffa9f37620afb211d15480545bd12b54bba5.zip handlebars.js-4429ffa9f37620afb211d15480545bd12b54bba5.tar.gz handlebars.js-4429ffa9f37620afb211d15480545bd12b54bba5.tar.bz2 |
Allow multiple partial and helper registration
Fixes #369
-rw-r--r-- | dist/handlebars.js | 29 | ||||
-rw-r--r-- | dist/handlebars.runtime.js | 29 | ||||
-rw-r--r-- | lib/handlebars/base.js | 21 | ||||
-rw-r--r-- | lib/handlebars/utils.js | 8 | ||||
-rw-r--r-- | spec/qunit_spec.js | 32 |
5 files changed, 104 insertions, 15 deletions
diff --git a/dist/handlebars.js b/dist/handlebars.js index 50172b7..828bbee 100644 --- a/dist/handlebars.js +++ b/dist/handlebars.js @@ -41,13 +41,26 @@ Handlebars.REVISION_CHANGES = { Handlebars.helpers = {}; Handlebars.partials = {}; +var toString = Object.prototype.toString, + functionType = '[object Function]', + objectType = '[object Object]'; + Handlebars.registerHelper = function(name, fn, inverse) { - if(inverse) { fn.not = inverse; } - this.helpers[name] = fn; + if (toString.call(name) === objectType) { + if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); } + Handlebars.Utils.extend(this.helpers, name); + } else { + if (inverse) { fn.not = inverse; } + this.helpers[name] = fn; + } }; Handlebars.registerPartial = function(name, str) { - this.partials[name] = str; + if (toString.call(name) === objectType) { + Handlebars.Utils.extend(this.partials, name); + } else { + this.partials[name] = str; + } }; Handlebars.registerHelper('helperMissing', function(arg) { @@ -58,8 +71,6 @@ Handlebars.registerHelper('helperMissing', function(arg) { } }); -var toString = Object.prototype.toString, functionType = "[object Function]"; - Handlebars.registerHelper('blockHelperMissing', function(context, options) { var inverse = options.inverse || function() {}, fn = options.fn; @@ -818,6 +829,14 @@ var escapeChar = function(chr) { }; Handlebars.Utils = { + extend: function(obj, value) { + for(var key in value) { + if(value.hasOwnProperty(key)) { + obj[key] = value[key]; + } + } + }, + escapeExpression: function(string) { // don't escape SafeStrings, since they're already safe if (string instanceof Handlebars.SafeString) { diff --git a/dist/handlebars.runtime.js b/dist/handlebars.runtime.js index 00c0b2f..b6ba8a5 100644 --- a/dist/handlebars.runtime.js +++ b/dist/handlebars.runtime.js @@ -41,13 +41,26 @@ Handlebars.REVISION_CHANGES = { Handlebars.helpers = {}; Handlebars.partials = {}; +var toString = Object.prototype.toString, + functionType = '[object Function]', + objectType = '[object Object]'; + Handlebars.registerHelper = function(name, fn, inverse) { - if(inverse) { fn.not = inverse; } - this.helpers[name] = fn; + if (toString.call(name) === objectType) { + if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); } + Handlebars.Utils.extend(this.helpers, name); + } else { + if (inverse) { fn.not = inverse; } + this.helpers[name] = fn; + } }; Handlebars.registerPartial = function(name, str) { - this.partials[name] = str; + if (toString.call(name) === objectType) { + Handlebars.Utils.extend(this.partials, name); + } else { + this.partials[name] = str; + } }; Handlebars.registerHelper('helperMissing', function(arg) { @@ -58,8 +71,6 @@ Handlebars.registerHelper('helperMissing', function(arg) { } }); -var toString = Object.prototype.toString, functionType = "[object Function]"; - Handlebars.registerHelper('blockHelperMissing', function(context, options) { var inverse = options.inverse || function() {}, fn = options.fn; @@ -204,6 +215,14 @@ var escapeChar = function(chr) { }; Handlebars.Utils = { + extend: function(obj, value) { + for(var key in value) { + if(value.hasOwnProperty(key)) { + obj[key] = value[key]; + } + } + }, + escapeExpression: function(string) { // don't escape SafeStrings, since they're already safe if (string instanceof Handlebars.SafeString) { diff --git a/lib/handlebars/base.js b/lib/handlebars/base.js index e6dbc1e..5e7ea0e 100644 --- a/lib/handlebars/base.js +++ b/lib/handlebars/base.js @@ -18,13 +18,26 @@ Handlebars.REVISION_CHANGES = { Handlebars.helpers = {}; Handlebars.partials = {}; +var toString = Object.prototype.toString, + functionType = '[object Function]', + objectType = '[object Object]'; + Handlebars.registerHelper = function(name, fn, inverse) { - if(inverse) { fn.not = inverse; } - this.helpers[name] = fn; + if (toString.call(name) === objectType) { + if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); } + Handlebars.Utils.extend(this.helpers, name); + } else { + if (inverse) { fn.not = inverse; } + this.helpers[name] = fn; + } }; Handlebars.registerPartial = function(name, str) { - this.partials[name] = str; + if (toString.call(name) === objectType) { + Handlebars.Utils.extend(this.partials, name); + } else { + this.partials[name] = str; + } }; Handlebars.registerHelper('helperMissing', function(arg) { @@ -35,8 +48,6 @@ Handlebars.registerHelper('helperMissing', function(arg) { } }); -var toString = Object.prototype.toString, functionType = "[object Function]"; - Handlebars.registerHelper('blockHelperMissing', function(context, options) { var inverse = options.inverse || function() {}, fn = options.fn; diff --git a/lib/handlebars/utils.js b/lib/handlebars/utils.js index 7d9da17..dffc477 100644 --- a/lib/handlebars/utils.js +++ b/lib/handlebars/utils.js @@ -39,6 +39,14 @@ var escapeChar = function(chr) { }; Handlebars.Utils = { + extend: function(obj, value) { + for(var key in value) { + if(value.hasOwnProperty(key)) { + obj[key] = value[key]; + } + } + }, + escapeExpression: function(string) { // don't escape SafeStrings, since they're already safe if (string instanceof Handlebars.SafeString) { diff --git a/spec/qunit_spec.js b/spec/qunit_spec.js index fefb8ec..1fb45a5 100644 --- a/spec/qunit_spec.js +++ b/spec/qunit_spec.js @@ -492,6 +492,27 @@ test("the helpers hash is available is nested contexts", function() { "helpers hash is available in nested contexts."); }); +test("Multiple global helper registration", function() { + var helpers = Handlebars.helpers; + try { + Handlebars.helpers = {}; + Handlebars.registerHelper({ + 'if': helpers['if'], + world: function() { return "world!"; }, + test_helper: function() { return 'found it!'; } + }); + + shouldCompileTo( + "{{test_helper}} {{#if cruel}}Goodbye {{cruel}} {{world}}!{{/if}}", + [{cruel: "cruel"}], + "found it! Goodbye cruel world!!"); + } finally { + if (helpers) { + Handlebars.helpers = helpers; + } + } +}); + suite("partials"); test("basic partials", function() { @@ -556,6 +577,17 @@ test("Partials with slash paths", function() { shouldCompileToWithPartials(string, [hash, {}, {'shared/dude':dude}], true, "Dudes: Jeepers", "Partials can use literal paths"); }); +test("Multiple partial registration", function() { + Handlebars.registerPartial({ + 'shared/dude': '{{name}}', + global_test: '{{another_dude}}' + }); + + var string = "Dudes: {{> shared/dude}} {{> global_test}}"; + var hash = {name:"Jeepers", another_dude:"Creepers"}; + shouldCompileToWithPartials(string, [hash], true, "Dudes: Jeepers Creepers", "Partials can use globals or passed"); +}); + test("Partials with integer path", function() { var string = "Dudes: {{> 404}}"; var dude = "{{name}}"; |