0af54b1142
Using prototype has a large performance impact for the common case of a sparse set of private variable data points. Rather than incurring the overhead of creating and walking the prototype tree for this, performing an extend by copy.
166 lines
4.2 KiB
JavaScript
166 lines
4.2 KiB
JavaScript
/*jshint eqnull: true */
|
|
|
|
module.exports.create = function() {
|
|
|
|
var Handlebars = {};
|
|
|
|
// BEGIN(BROWSER)
|
|
|
|
Handlebars.VERSION = "1.0.0";
|
|
Handlebars.COMPILER_REVISION = 4;
|
|
|
|
Handlebars.REVISION_CHANGES = {
|
|
1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
|
|
2: '== 1.0.0-rc.3',
|
|
3: '== 1.0.0-rc.4',
|
|
4: '>= 1.0.0'
|
|
};
|
|
|
|
Handlebars.helpers = {};
|
|
Handlebars.partials = {};
|
|
|
|
var toString = Object.prototype.toString,
|
|
functionType = '[object Function]',
|
|
objectType = '[object Object]';
|
|
|
|
Handlebars.registerHelper = function(name, fn, inverse) {
|
|
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) {
|
|
if (toString.call(name) === objectType) {
|
|
Handlebars.Utils.extend(this.partials, name);
|
|
} else {
|
|
this.partials[name] = str;
|
|
}
|
|
};
|
|
|
|
Handlebars.registerHelper('helperMissing', function(arg) {
|
|
if(arguments.length === 2) {
|
|
return undefined;
|
|
} else {
|
|
throw new Error("Missing helper: '" + 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(context === true) {
|
|
return fn(this);
|
|
} else if(context === false || context == null) {
|
|
return inverse(this);
|
|
} else if(type === "[object Array]") {
|
|
if(context.length > 0) {
|
|
return Handlebars.helpers.each(context, options);
|
|
} else {
|
|
return inverse(this);
|
|
}
|
|
} else {
|
|
return fn(context);
|
|
}
|
|
});
|
|
|
|
Handlebars.K = function() {};
|
|
|
|
Handlebars.createFrame = function(object) {
|
|
var obj = {};
|
|
Handlebars.Utils.extend(obj, object);
|
|
return obj;
|
|
};
|
|
|
|
Handlebars.logger = {
|
|
DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,
|
|
|
|
methodMap: {0: 'debug', 1: 'info', 2: 'warn', 3: 'error'},
|
|
|
|
// can be overridden in the host environment
|
|
log: function(level, obj) {
|
|
if (Handlebars.logger.level <= level) {
|
|
var method = Handlebars.logger.methodMap[level];
|
|
if (typeof console !== 'undefined' && console[method]) {
|
|
console[method].call(console, obj);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
Handlebars.log = function(level, obj) { Handlebars.logger.log(level, obj); };
|
|
|
|
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 (options.data) {
|
|
data = Handlebars.createFrame(options.data);
|
|
}
|
|
|
|
if(context && typeof context === 'object') {
|
|
if(context instanceof Array){
|
|
for(var j = context.length; i<j; i++) {
|
|
if (data) { data.index = i; }
|
|
ret = ret + fn(context[i], { data: data });
|
|
}
|
|
} else {
|
|
for(var key in context) {
|
|
if(context.hasOwnProperty(key)) {
|
|
if(data) { data.key = key; }
|
|
ret = ret + fn(context[key], {data: data});
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(i === 0){
|
|
ret = inverse(this);
|
|
}
|
|
|
|
return ret;
|
|
});
|
|
|
|
Handlebars.registerHelper('if', function(conditional, options) {
|
|
var type = toString.call(conditional);
|
|
if(type === functionType) { conditional = conditional.call(this); }
|
|
|
|
if(Handlebars.Utils.isEmpty(conditional)) {
|
|
return options.inverse(this);
|
|
} else {
|
|
return options.fn(this);
|
|
}
|
|
});
|
|
|
|
Handlebars.registerHelper('unless', function(conditional, options) {
|
|
return Handlebars.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn});
|
|
});
|
|
|
|
Handlebars.registerHelper('with', function(context, options) {
|
|
var type = toString.call(context);
|
|
if(type === functionType) { context = context.call(this); }
|
|
|
|
if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
|
|
});
|
|
|
|
Handlebars.registerHelper('log', function(context, options) {
|
|
var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
|
|
Handlebars.log(level, context);
|
|
});
|
|
|
|
// END(BROWSER)
|
|
|
|
return Handlebars;
|
|
};
|