summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpdecker <kpdecker@gmail.com>2013-04-07 18:04:51 -0500
committerkpdecker <kpdecker@gmail.com>2013-04-07 18:04:51 -0500
commit4429ffa9f37620afb211d15480545bd12b54bba5 (patch)
treeec09adc97c997bcb5b974aaeceaa4b674f147a8d
parent73f2016a6a5e7ce11077e44ec3288e0dac2df7c9 (diff)
downloadhandlebars.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.js29
-rw-r--r--dist/handlebars.runtime.js29
-rw-r--r--lib/handlebars/base.js21
-rw-r--r--lib/handlebars/utils.js8
-rw-r--r--spec/qunit_spec.js32
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}}";