Unify isFunction/isArray handling

This commit is contained in:
kpdecker
2013-08-24 22:13:37 -05:00
parent 4c02d3027c
commit 6e6acaac0d
2 changed files with 25 additions and 16 deletions
+22 -14
View File
@@ -20,9 +20,24 @@ Handlebars.helpers = {};
Handlebars.partials = {};
var toString = Object.prototype.toString,
functionType = '[object Function]',
objectType = '[object Object]';
// Sourced from lodash
// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
function isFunction(value) {
return typeof value === 'function';
}
// fallback for older versions of Chrome and Safari
if (isFunction(/x/)) {
isFunction = function(value) {
return typeof value === 'function' && toString.call(value) === '[object Function]';
};
}
function isArray(value) {
return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false;
};
Handlebars.registerHelper = function(name, fn, inverse) {
if (toString.call(name) === objectType) {
if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }
@@ -52,15 +67,13 @@ Handlebars.registerHelper('helperMissing', function(arg) {
Handlebars.registerHelper('blockHelperMissing', function(context, options) {
var inverse = options.inverse || function() {}, fn = options.fn;
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if(context === true) {
return fn(this);
} else if(context === false || context == null) {
return inverse(this);
} else if(type === "[object Array]") {
} else if (isArray(context)) {
if(context.length > 0) {
return Handlebars.helpers.each(context, options);
} else {
@@ -71,8 +84,6 @@ Handlebars.registerHelper('blockHelperMissing', function(context, options) {
}
});
Handlebars.K = function() {};
Handlebars.createFrame = function(object) {
var obj = {};
Handlebars.Utils.extend(obj, object);
@@ -101,15 +112,14 @@ Handlebars.registerHelper('each', function(context, options) {
var fn = options.fn, inverse = options.inverse;
var i = 0, ret = "", data;
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if (options.data) {
data = Handlebars.createFrame(options.data);
}
if(context && typeof context === 'object') {
if(context instanceof Array){
if (isArray(context)) {
for(var j = context.length; i<j; i++) {
if (data) { data.index = i; }
ret = ret + fn(context[i], { data: data });
@@ -133,8 +143,7 @@ Handlebars.registerHelper('each', function(context, options) {
});
Handlebars.registerHelper('if', function(conditional, options) {
var type = toString.call(conditional);
if(type === functionType) { conditional = conditional.call(this); }
if (isFunction(conditional)) { conditional = conditional.call(this); }
if(Handlebars.Utils.isEmpty(conditional)) {
return options.inverse(this);
@@ -148,8 +157,7 @@ Handlebars.registerHelper('unless', function(conditional, options) {
});
Handlebars.registerHelper('with', function(context, options) {
var type = toString.call(context);
if(type === functionType) { context = context.call(this); }
if (isFunction(context)) { context = context.call(this); }
if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
});
+3 -2
View File
@@ -1,6 +1,7 @@
exports.attach = function(Handlebars) {
var toString = Object.prototype.toString;
var toString = Object.prototype.toString,
isArray = Array.isArray;
// BEGIN(BROWSER)
@@ -71,7 +72,7 @@ Handlebars.Utils = {
isEmpty: function(value) {
if (!value && value !== 0) {
return true;
} else if(toString.call(value) === "[object Array]" && value.length === 0) {
} else if (isArray(value) && value.length === 0) {
return true;
} else {
return false;