var _ = require('underscore'); var Backbone = require('backbone'); var Mustache = require('mustache'); var log = require('cdb.log'); /** * template system * usage: var tmpl = new Template({ template: "hi, my name is {{ name }}", type: 'mustache' // undescore by default }); console.log(tmpl.render({name: 'rambo'}))); // prints "hi, my name is rambo" you could pass the compiled tempalte directly: var tmpl = new Template({ compiled: function() { return 'my compiled template'; } }); */ var Template = Backbone.Model.extend({ initialize: function () { this.bind('change', this._invalidate); this._invalidate(); }, url: function () { return this.get('template_url'); }, parse: function (data) { return { 'template': data }; }, _invalidate: function () { this.compiled = null; if (this.get('template_url')) { this.fetch(); } }, compile: function () { var tmplType = this.get('type') || 'underscore'; var fn = Template.compilers[tmplType]; if (fn) { return fn(this.get('template')); } else { log.error("can't get rendered for " + tmplType); } return null; }, /** * renders the template with specified vars */ render: function (vars) { var c = this.compiled = this.compiled || this.get('compiled') || this.compile(); var rendered = c(vars); return rendered; }, asFunction: function () { return _.bind(this.render, this); } }, { compilers: { 'underscore': _.template, 'mustache': typeof (Mustache) === 'undefined' ? null // Replacement for Mustache.compile, which was removed in version 0.8.0 : function compile (template) { Mustache.parse(template); return function (view, partials) { return Mustache.render(template, view, partials); }; } }, compile: function (tmpl, type) { var t = new Template({ template: tmpl, type: type || 'underscore' }); return _.bind(t.render, t); } }); module.exports = Template;