diff options
author | kpdecker <kpdecker@gmail.com> | 2015-08-19 06:35:32 -0700 |
---|---|---|
committer | kpdecker <kpdecker@gmail.com> | 2015-08-22 10:59:34 -0700 |
commit | 2a4a5447f560723a2c898e0a4d97cd929131bba6 (patch) | |
tree | 7f5ae1fa298d7878835ff4d957a8becd7e8207eb | |
parent | 1c274088c1ea9969f7a676fd5bebd11698f73116 (diff) | |
download | handlebars.js-2a4a5447f560723a2c898e0a4d97cd929131bba6.zip handlebars.js-2a4a5447f560723a2c898e0a4d97cd929131bba6.tar.gz handlebars.js-2a4a5447f560723a2c898e0a4d97cd929131bba6.tar.bz2 |
Implement decorator environment and registration
-rw-r--r-- | lib/handlebars/base.js | 17 | ||||
-rw-r--r-- | lib/handlebars/decorators.js | 5 | ||||
-rw-r--r-- | lib/handlebars/runtime.js | 4 | ||||
-rw-r--r-- | spec/blocks.js | 40 |
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'); + }); + }); + }); }); |