summaryrefslogtreecommitdiffstats
path: root/lib/handlebars/base.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/handlebars/base.js')
-rw-r--r--lib/handlebars/base.js179
1 files changed, 6 insertions, 173 deletions
diff --git a/lib/handlebars/base.js b/lib/handlebars/base.js
index 756fb77..cc3d2fa 100644
--- a/lib/handlebars/base.js
+++ b/lib/handlebars/base.js
@@ -1,5 +1,6 @@
-import * as Utils from './utils';
+import {createFrame, extend, toString} from './utils';
import Exception from './exception';
+import {registerDefaultHelpers} from './helpers';
export const VERSION = '3.0.1';
export const COMPILER_REVISION = 6;
@@ -13,10 +14,7 @@ export const REVISION_CHANGES = {
6: '>= 2.0.0-beta.1'
};
-const isArray = Utils.isArray,
- isFunction = Utils.isFunction,
- toString = Utils.toString,
- objectType = '[object Object]';
+const objectType = '[object Object]';
export function HandlebarsEnvironment(helpers, partials) {
this.helpers = helpers || {};
@@ -34,7 +32,7 @@ HandlebarsEnvironment.prototype = {
registerHelper: function(name, fn) {
if (toString.call(name) === objectType) {
if (fn) { throw new Exception('Arg not supported with multiple helpers'); }
- Utils.extend(this.helpers, name);
+ extend(this.helpers, name);
} else {
this.helpers[name] = fn;
}
@@ -45,7 +43,7 @@ HandlebarsEnvironment.prototype = {
registerPartial: function(name, partial) {
if (toString.call(name) === objectType) {
- Utils.extend(this.partials, name);
+ extend(this.partials, name);
} else {
if (typeof partial === 'undefined') {
throw new Exception('Attempting to register a partial as undefined');
@@ -58,167 +56,6 @@ HandlebarsEnvironment.prototype = {
}
};
-function registerDefaultHelpers(instance) {
- instance.registerHelper('helperMissing', function(/* [args, ]options */) {
- if (arguments.length === 1) {
- // A missing field in a {{foo}} construct.
- return undefined;
- } else {
- // Someone is actually trying to call something, blow up.
- throw new Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"');
- }
- });
-
- instance.registerHelper('blockHelperMissing', function(context, options) {
- let inverse = options.inverse,
- fn = options.fn;
-
- if (context === true) {
- return fn(this);
- } else if (context === false || context == null) {
- return inverse(this);
- } else if (isArray(context)) {
- if (context.length > 0) {
- if (options.ids) {
- options.ids = [options.name];
- }
-
- return instance.helpers.each(context, options);
- } else {
- return inverse(this);
- }
- } else {
- if (options.data && options.ids) {
- let data = createFrame(options.data);
- data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);
- options = {data: data};
- }
-
- return fn(context, options);
- }
- });
-
- instance.registerHelper('each', function(context, options) {
- if (!options) {
- throw new Exception('Must pass iterator to #each');
- }
-
- let fn = options.fn,
- inverse = options.inverse,
- i = 0,
- ret = '',
- data,
- contextPath;
-
- if (options.data && options.ids) {
- contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
- }
-
- if (isFunction(context)) { context = context.call(this); }
-
- if (options.data) {
- data = createFrame(options.data);
- }
-
- function execIteration(field, index, last) {
- if (data) {
- data.key = field;
- data.index = index;
- data.first = index === 0;
- data.last = !!last;
-
- if (contextPath) {
- data.contextPath = contextPath + field;
- }
- }
-
- ret = ret + fn(context[field], {
- data: data,
- blockParams: Utils.blockParams([context[field], field], [contextPath + field, null])
- });
- }
-
- if (context && typeof context === 'object') {
- if (isArray(context)) {
- for (let j = context.length; i < j; i++) {
- execIteration(i, i, i === context.length - 1);
- }
- } else {
- let priorKey;
-
- for (let key in context) {
- if (context.hasOwnProperty(key)) {
- // We're running the iterations one step out of sync so we can detect
- // the last iteration without have to scan the object twice and create
- // an itermediate keys array.
- if (priorKey !== undefined) {
- execIteration(priorKey, i - 1);
- }
- priorKey = key;
- i++;
- }
- }
- if (priorKey) {
- execIteration(priorKey, i - 1, true);
- }
- }
- }
-
- if (i === 0) {
- ret = inverse(this);
- }
-
- return ret;
- });
-
- instance.registerHelper('if', function(conditional, options) {
- if (isFunction(conditional)) { conditional = conditional.call(this); }
-
- // Default behavior is to render the positive path if the value is truthy and not empty.
- // The `includeZero` option may be set to treat the condtional as purely not empty based on the
- // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
- if ((!options.hash.includeZero && !conditional) || Utils.isEmpty(conditional)) {
- return options.inverse(this);
- } else {
- return options.fn(this);
- }
- });
-
- instance.registerHelper('unless', function(conditional, options) {
- return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash});
- });
-
- instance.registerHelper('with', function(context, options) {
- if (isFunction(context)) { context = context.call(this); }
-
- let fn = options.fn;
-
- if (!Utils.isEmpty(context)) {
- let data = options.data;
- if (options.data && options.ids) {
- data = createFrame(options.data);
- data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);
- }
-
- return fn(context, {
- data: data,
- blockParams: Utils.blockParams([context], [data && data.contextPath])
- });
- } else {
- return options.inverse(this);
- }
- });
-
- instance.registerHelper('log', function(message, options) {
- let level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
- instance.log(level, message);
- });
-
- instance.registerHelper('lookup', function(obj, field) {
- return obj && obj[field];
- });
-}
-
export let logger = {
methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },
@@ -240,8 +77,4 @@ export let logger = {
export let log = logger.log;
-export function createFrame(object) {
- let frame = Utils.extend({}, object);
- frame._parent = object;
- return frame;
-}
+export {createFrame};