define(
['jquery', 'underscore'],
function($, _) {
'use strict';
function Template() {
this.initialize.apply(this, arguments);
}
Template.globals = {};
Template.helpers = {};
return function(engine) {
if (_.isFunction(engine)) {
// underscore or other function-like template
Template.registerHelper = function(name, func) {
Template.helpers[name] = func;
};
Template.prototype.initialize = function(template) {
this.engine = engine
this.template = template;
};
Template.prototype.render = function(data, partials) {
if (!_.isEmpty(partials)) {
data.partial = function(k, d) {
var v = partials[k];
if (!v) return '';
if (v instanceof Template) return v.render(d, partials);
return v;
};
}
data = _.extend({}, this.helpers, Template.globals, data);
return this.engine(this.template, data);
};
Template.defaults = {
icon: new Template(''),
button: new Template('
"><%partial("icon",{icon:icon})%><%=content%>
')
};
} else if (_.isObject(engine)) {
if (engine.name == 'mustache.js') {
// Mustache template
Template.registerHelper = function(name, func) {
Template.helpers[name] = function() { return function(text, render) {
return func(render(text));
}};
};
Template.prototype.initialize = function(template) {
this.engine = engine;
this.template = template;
this.engine.parse(template);
};
Template.prototype.render = function(data, partials) {
_.each(partials, function(v, k) {
if (v instanceof Template) partials[k] = v.template;
});
data = _.extend({}, Template.helpers, Template.globals, data);
return this.engine.render(this.template, data, partials);
};
} else if (_.isFunction(engine.compile) &&
_.isFunction(engine.registerHelper)) {
// Handlebars template
Template.registerHelper = function(name, func) {
engine.registerHelper(name, func);
};
Template.prototype.initialize = function(template) {
this.engine = engine;
this.template = this.engine.compile(template);
};
Template.prototype.render = function(data, partials) {
_.each(partials, function(v, k) {
if (v instanceof Template) v = v.template;
this.engine.registerPartial(k, v)
});
data = _.extend({}, Template.globals, data);
return this.template(data);
};
} else {
throw new Error('Unsupported template engine');
}
Template.defaults = {
icon: new Template(''),
button: new Template('{{>icon}}{{content}}
')
};
} else {
throw new Error('Wrong template engine');
}
return Template;
}
});