diff options
author | wycats <wycats@gmail.com> | 2010-12-12 13:33:17 -0800 |
---|---|---|
committer | wycats <wycats@gmail.com> | 2010-12-12 13:33:17 -0800 |
commit | ec948c7382603b88a6e80ab949120cca2b64fb5f (patch) | |
tree | 9da2b52a3edebe7c2552653c488cc996302baf9f /lib/handlebars/compiler.js | |
parent | 57e72c9fd270401a36c9ad7aeb305896841404e5 (diff) | |
download | handlebars.js-ec948c7382603b88a6e80ab949120cca2b64fb5f.zip handlebars.js-ec948c7382603b88a6e80ab949120cca2b64fb5f.tar.gz handlebars.js-ec948c7382603b88a6e80ab949120cca2b64fb5f.tar.bz2 |
Small restructuring. Have I mentioned how much I hate having to write modules that work in both CommonJS and the browser?
Diffstat (limited to 'lib/handlebars/compiler.js')
-rw-r--r-- | lib/handlebars/compiler.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lib/handlebars/compiler.js b/lib/handlebars/compiler.js new file mode 100644 index 0000000..33e1fdf --- /dev/null +++ b/lib/handlebars/compiler.js @@ -0,0 +1,71 @@ +var handlebars = require("handlebars/parser").parser; + +// BEGIN(BROWSER) +Handlebars = {}; + +Handlebars.Parser = handlebars; + +Handlebars.parse = function(string) { + Handlebars.Parser.yy = Handlebars.AST; + Handlebars.Parser.lexer = new Handlebars.HandlebarsLexer(); + return Handlebars.Parser.parse(string); +}; + +Handlebars.print = function(ast) { + return new Handlebars.PrintVisitor().accept(ast); +}; + +Handlebars.compile = function(string) { + var ast = Handlebars.parse(string); + + return function(context, helpers, partials) { + var helpers, partials; + + if(!helpers) { + helpers = Handlebars.helpers; + } + + if(!partials) { + partials = Handlebars.partials; + } + + var internalContext = new Handlebars.Context(context, helpers, partials); + var runtime = new Handlebars.Runtime(internalContext); + runtime.accept(ast); + return runtime.buffer; + }; +}; + +Handlebars.helpers = {}; +Handlebars.partials = {}; + +Handlebars.registerHelper = function(name, fn, inverse) { + if(inverse) { fn.not = inverse; } + this.helpers[name] = fn; +}; + +Handlebars.registerPartial = function(name, str) { + this.partials[name] = str; +}; + +Handlebars.registerHelper('blockHelperMissing', function(context, fn) { + var ret = ""; + + if(context === true) { + return fn(this); + } else if(context === false || context == null) { + return ""; + } else if(Object.prototype.toString.call(context) === "[object Array]") { + for(var i=0, j=context.length; i<j; i++) { + ret = ret + fn(context[i]); + } + return ret; + } else { + return fn(context); + } +}, function(context, fn) { + return fn(context) +}); +// END(BROWSER) + +exports.Handlebars = Handlebars; |