summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpdecker <kpdecker@gmail.com>2015-08-19 06:35:32 -0700
committerkpdecker <kpdecker@gmail.com>2015-08-22 10:59:34 -0700
commit2a4a5447f560723a2c898e0a4d97cd929131bba6 (patch)
tree7f5ae1fa298d7878835ff4d957a8becd7e8207eb
parent1c274088c1ea9969f7a676fd5bebd11698f73116 (diff)
downloadhandlebars.js-2a4a5447f560723a2c898e0a4d97cd929131bba6.zip
handlebars.js-2a4a5447f560723a2c898e0a4d97cd929131bba6.tar.gz
handlebars.js-2a4a5447f560723a2c898e0a4d97cd929131bba6.tar.bz2
Implement decorator environment and registration
-rw-r--r--lib/handlebars/base.js17
-rw-r--r--lib/handlebars/decorators.js5
-rw-r--r--lib/handlebars/runtime.js4
-rw-r--r--spec/blocks.js40
4 files changed, 65 insertions, 1 deletions
diff --git a/lib/handlebars/base.js b/lib/handlebars/base.js
index 41bb98d..e59f5e7 100644
--- a/lib/handlebars/base.js
+++ b/lib/handlebars/base.js
@@ -1,6 +1,7 @@
import {createFrame, extend, toString} from './utils';
import Exception from './exception';
import {registerDefaultHelpers} from './helpers';
+import {registerDefaultDecorators} from './decorators';
import logger from './logger';
export const VERSION = '3.0.1';
@@ -17,11 +18,13 @@ export const REVISION_CHANGES = {
const objectType = '[object Object]';
-export function HandlebarsEnvironment(helpers, partials) {
+export function HandlebarsEnvironment(helpers, partials, decorators) {
this.helpers = helpers || {};
this.partials = partials || {};
+ this.decorators = decorators || {};
registerDefaultHelpers(this);
+ registerDefaultDecorators(this);
}
HandlebarsEnvironment.prototype = {
@@ -54,6 +57,18 @@ HandlebarsEnvironment.prototype = {
},
unregisterPartial: function(name) {
delete this.partials[name];
+ },
+
+ registerDecorator: function(name, fn) {
+ if (toString.call(name) === objectType) {
+ if (fn) { throw new Exception('Arg not supported with multiple decorators'); }
+ extend(this.decorators, name);
+ } else {
+ this.decorators[name] = fn;
+ }
+ },
+ unregisterDecorator: function(name) {
+ delete this.decorators[name];
}
};
diff --git a/lib/handlebars/decorators.js b/lib/handlebars/decorators.js
new file mode 100644
index 0000000..d5caefb
--- /dev/null
+++ b/lib/handlebars/decorators.js
@@ -0,0 +1,5 @@
+import registerInline from './decorators/inline';
+
+export function registerDefaultDecorators(instance) {
+}
+
diff --git a/lib/handlebars/runtime.js b/lib/handlebars/runtime.js
index de42752..2300439 100644
--- a/lib/handlebars/runtime.js
+++ b/lib/handlebars/runtime.js
@@ -153,9 +153,13 @@ export function template(templateSpec, env) {
if (templateSpec.usePartial) {
container.partials = container.merge(options.partials, env.partials);
}
+ if (templateSpec.useDecorators) {
+ container.decorators = container.merge(options.decorators, env.decorators);
+ }
} else {
container.helpers = options.helpers;
container.partials = options.partials;
+ container.decorators = options.decorators;
}
};
diff --git a/spec/blocks.js b/spec/blocks.js
index 71c9045..7622634 100644
--- a/spec/blocks.js
+++ b/spec/blocks.js
@@ -166,4 +166,44 @@ describe('blocks', function() {
shouldCompileTo(string, [hash, undefined, undefined, true], 'Goodbye cruel ');
});
});
+
+ describe('decorators', function() {
+ describe('registration', function() {
+ it('unregisters', function() {
+ handlebarsEnv.decorators = {};
+
+ handlebarsEnv.registerDecorator('foo', function() {
+ return 'fail';
+ });
+
+ equals(!!handlebarsEnv.decorators.foo, true);
+ handlebarsEnv.unregisterDecorator('foo');
+ equals(handlebarsEnv.decorators.foo, undefined);
+ });
+
+ it('allows multiple globals', function() {
+ handlebarsEnv.decorators = {};
+
+ handlebarsEnv.registerDecorator({
+ foo: function() {},
+ bar: function() {}
+ });
+
+ equals(!!handlebarsEnv.decorators.foo, true);
+ equals(!!handlebarsEnv.decorators.bar, true);
+ handlebarsEnv.unregisterDecorator('foo');
+ handlebarsEnv.unregisterDecorator('bar');
+ equals(handlebarsEnv.decorators.foo, undefined);
+ equals(handlebarsEnv.decorators.bar, undefined);
+ });
+ it('fails with multiple and args', function() {
+ shouldThrow(function() {
+ handlebarsEnv.registerDecorator({
+ world: function() { return 'world!'; },
+ testHelper: function() { return 'found it!'; }
+ }, {});
+ }, Error, 'Arg not supported with multiple decorators');
+ });
+ });
+ });
});