summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorwycats <wycats@gmail.com>2010-12-12 13:33:17 -0800
committerwycats <wycats@gmail.com>2010-12-12 13:33:17 -0800
commitec948c7382603b88a6e80ab949120cca2b64fb5f (patch)
tree9da2b52a3edebe7c2552653c488cc996302baf9f /lib
parent57e72c9fd270401a36c9ad7aeb305896841404e5 (diff)
downloadhandlebars.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')
-rw-r--r--lib/handlebars.js66
-rw-r--r--lib/handlebars/compiler.js71
-rw-r--r--lib/handlebars/runtime.js41
3 files changed, 93 insertions, 85 deletions
diff --git a/lib/handlebars.js b/lib/handlebars.js
index df16cae..b6cbbc2 100644
--- a/lib/handlebars.js
+++ b/lib/handlebars.js
@@ -1,77 +1,15 @@
-var Handlebars = {};
+var Handlebars = require("handlebars/compiler").Handlebars;
Handlebars.AST = require("handlebars/ast").AST;
Handlebars.HandlebarsLexer = require("handlebars/handlebars_lexer").Lexer;
Handlebars.PrintVisitor = require("handlebars/printer").PrintVisitor;
-var handlebars = require("handlebars/parser").parser;
Handlebars.Runtime = require("handlebars/runtime").Runtime;
+Handlebars.Context = require("Handlebars/runtime").Context;
Handlebars.Utils = require("handlebars/utils").Utils;
Handlebars.SafeString = require("handlebars/utils").SafeString;
Handlebars.Exception = require("handlebars/utils").Exception;
// BEGIN(BROWSER)
-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 runtime = new Handlebars.Runtime(context, helpers, partials);
- 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) {
- 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)
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;
diff --git a/lib/handlebars/runtime.js b/lib/handlebars/runtime.js
index e091b99..d78f0d8 100644
--- a/lib/handlebars/runtime.js
+++ b/lib/handlebars/runtime.js
@@ -13,6 +13,7 @@ Handlebars.Runtime = require("handlebars/runtime").Runtime;
Handlebars.Utils = require("handlebars/utils").Utils;
Handlebars.SafeString = require("handlebars/utils").SafeString;
Handlebars.Exception = require("handlebars/utils").Exception;
+Handlebars.parse = require("handlebars/compiler").Handlebars.parse;
// BEGIN(BROWSER)
// A Context wraps data, and makes it possible to extract a
@@ -54,6 +55,8 @@ Handlebars.Context.prototype = {
context.data = context.data[parts[i]];
}
+ if(context.data !== undefined) { return context; }
+
if(parts.length === 1 && context.data === undefined) {
context.data = context.helpers[parts[0]];
}
@@ -70,15 +73,11 @@ Handlebars.proxy = function(obj) {
return new Proxy();
};
-Handlebars.Runtime = function(context, helpers, partials, stack) {
+Handlebars.Runtime = function(context, stack) {
this.stack = stack || [];
this.buffer = "";
- if(context && context.isContext) {
- this.context = context.clone();
- } else {
- this.context = new Handlebars.Context(context, helpers, partials)
- }
+ this.context = context;
};
Handlebars.Runtime.prototype = {
@@ -137,19 +136,19 @@ Handlebars.Runtime.prototype = {
},
block: function(block) {
- var mustache = block.mustache,
- id = mustache.id;
+ var mustache = block.mustache, data;
- var idObj = this.ID(mustache.id),
+ var id = mustache.id,
+ idObj = this.ID(mustache.id),
data = idObj.data;
var result;
- if(toString.call(data) !== "[object Function]") {
+ if(typeof data === "function") {
+ params = this.evaluateParams(mustache.params);
+ } else {
params = [data];
data = this.context.helpers.blockHelperMissing;
- } else {
- params = this.evaluateParams(mustache.params);
}
params.push(this.wrapProgram(block.program));
@@ -159,7 +158,7 @@ Handlebars.Runtime.prototype = {
if(block.program.inverse) {
params.pop();
params.push(this.wrapProgram(block.program.inverse));
- result = data.not.apply(this.wrapContext(), params);
+ result = data.not ? data.not.apply(this.wrapContext(), params) : "";
this.buffer = this.buffer + result;
}
},
@@ -187,7 +186,7 @@ Handlebars.Runtime.prototype = {
} else {
context = this.context;
}
- var runtime = new Handlebars.Runtime(context, null, null, this.stack.slice(0));
+ var runtime = new Handlebars.Runtime(context, this.stack);
this.buffer = this.buffer + runtime.program(program);
},
@@ -260,16 +259,15 @@ Handlebars.Runtime.prototype = {
},
wrapProgram: function(program) {
- var runtime = this,
- stack = this.stack.slice(0),
- helpers = this.context.helpers,
- partials = this.context.partials;
-
- stack.push(this.context);
+ var currentContext = this.context;
+ var stack = this.stack.slice(0);
return function(context) {
if(context && context.isWrappedContext) { context = context.__data__; }
- var runtime = new Handlebars.Runtime(context, helpers, partials, stack);
+
+ stack.push(currentContext);
+ var newContext = new Handlebars.Context(context, currentContext.helpers, currentContext.partials);
+ var runtime = new Handlebars.Runtime(newContext, stack);
runtime.program(program);
return runtime.buffer;
};
@@ -279,3 +277,4 @@ Handlebars.Runtime.prototype = {
// END(BROWSER)
exports.Runtime = Handlebars.Runtime;
+exports.Context = Handlebars.Context;