diff options
-rw-r--r-- | Rakefile | 4 | ||||
-rw-r--r-- | lib/handlebars.js | 19 | ||||
-rw-r--r-- | lib/handlebars/ast.js | 5 | ||||
-rw-r--r-- | lib/handlebars/runtime.js | 2 | ||||
-rw-r--r-- | lib/handlebars/utils.js | 76 | ||||
-rw-r--r-- | spec/qunit_spec.js | 6 | ||||
-rw-r--r-- | spec/spec_helper.rb | 7 |
7 files changed, 64 insertions, 55 deletions
@@ -20,11 +20,11 @@ def remove_exports(string) match ? match[1] : string end -minimal_deps = %w(parser compiler ast jison_ext handlebars_lexer runtime utils).map do |file| +minimal_deps = %w(parser compiler ast jison_ext handlebars_lexer runtime utils vm).map do |file| "lib/handlebars/#{file}.js" end -debug_deps = %w(parser compiler ast jison_ext handlebars_lexer printer runtime utils).map do |file| +debug_deps = %w(parser compiler ast jison_ext handlebars_lexer printer runtime utils vm).map do |file| "lib/handlebars/#{file}.js" end diff --git a/lib/handlebars.js b/lib/handlebars.js index b6cbbc2..0b86740 100644 --- a/lib/handlebars.js +++ b/lib/handlebars.js @@ -1,13 +1,16 @@ 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; -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; +Handlebars.AST = require("handlebars/ast").AST; +Handlebars.HandlebarsLexer = require("handlebars/handlebars_lexer").Lexer; +Handlebars.PrintVisitor = require("handlebars/printer").PrintVisitor; +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; +Handlebars.Compiler = require("handlebars/vm").Compiler; +Handlebars.JavaScriptCompiler = require("handlebars/vm").JavaScriptCompiler; +Handlebars.VM = require("handlebars/vm").VM; // BEGIN(BROWSER) diff --git a/lib/handlebars/ast.js b/lib/handlebars/ast.js index 932e52c..f42e47c 100644 --- a/lib/handlebars/ast.js +++ b/lib/handlebars/ast.js @@ -64,8 +64,9 @@ Handlebars.Exception = require("handlebars/utils").Exception; else { dig.push(part); } } - this.parts = dig; - this.depth = depth; + this.parts = dig; + this.depth = depth; + this.isSimple = (dig.length === 1) && (depth === 0) }; Handlebars.AST.StringNode = function(string) { diff --git a/lib/handlebars/runtime.js b/lib/handlebars/runtime.js index d78f0d8..07e9485 100644 --- a/lib/handlebars/runtime.js +++ b/lib/handlebars/runtime.js @@ -104,7 +104,7 @@ Handlebars.Runtime.prototype = { mustache: function(mustache) { var idObj = this.ID(mustache.id); - var params = mustache.params; + var params = mustache.params.slice(0); var buf; for(var i=0, l=params.length; i<l; i++) { diff --git a/lib/handlebars/utils.js b/lib/handlebars/utils.js index a600d6b..bc816d5 100644 --- a/lib/handlebars/utils.js +++ b/lib/handlebars/utils.js @@ -13,47 +13,47 @@ Handlebars.SafeString.prototype.toString = function() { return this.string.toString(); }; -Handlebars.Utils = { - escapeExpression: function(string) { - // don't escape SafeStrings, since they're already safe - if (string instanceof Handlebars.SafeString) { - return string.toString(); - } - else if (string === null) { - string = ""; - } +(function() { + var escape = { + "<": "<", + ">": ">", + }; + + var badChars = /&(?!\w+;)|[<>]/g; + var possible = /[&<>]/ + + var escapeChar = function(chr) { + return escape[chr] || "&" + }; - return string.toString().replace(/&(?!\w+;)|["\\<>]/g, function(str) { - switch(str) { - case "&": - return "&"; - case '"': - return "\""; - case "\\": - return "\\\\"; - case "<": - return "<"; - case ">": - return ">"; - default: - return str; + Handlebars.Utils = { + escapeExpression: function(string) { + // don't escape SafeStrings, since they're already safe + if (string instanceof Handlebars.SafeString) { + return string.toString(); + } else if (string === null) { + string = ""; + } + + if(!possible.test(string)) { return string; } + return string.replace(badChars, escapeChar); + }, + + isEmpty: function(value) { + if (typeof value === "undefined") { + return true; + } else if (value === null) { + return true; + } else if (value === false) { + return true; + } else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) { + return true; + } else { + return false; } - }); - }, - isEmpty: function(value) { - if (typeof value === "undefined") { - return true; - } else if (value === null) { - return true; - } else if (value === false) { - return true; - } else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) { - return true; - } else { - return false; } - } -}; + }; +})(); // END(BROWSER) exports.Utils = Handlebars.Utils; diff --git a/spec/qunit_spec.js b/spec/qunit_spec.js index 5ccc457..146747b 100644 --- a/spec/qunit_spec.js +++ b/spec/qunit_spec.js @@ -7,7 +7,7 @@ Handlebars.registerHelper('helperMissing', function(helper, context) { }); var shouldCompileTo = function(string, hash, expected, message) { - var template = Handlebars.compile(string); + var template = Handlebars.VM.compile(string); if(Object.prototype.toString.call(hash) === "[object Array]") { if(hash[1]) { for(var prop in Handlebars.helpers) { @@ -80,7 +80,7 @@ test("escaping expressions", function() { shouldCompileTo("{{{awesome}}}", {awesome: "&\"\\<>"}, '&\"\\<>', "expressions with 3 handlebars aren't escaped"); - shouldCompileTo("{{awesome}}", {awesome: "&\"\\<>"}, '&\"\\\\<>', + shouldCompileTo("{{awesome}}", {awesome: "&\"\\<>"}, '&\"\\<>', "by default expressions should be escaped"); shouldCompileTo("{{&awesome}}", {awesome: "&\"\\<>"}, '&\"\\<>', @@ -452,7 +452,7 @@ test("block multi-params work", function() { var string = 'Message: {{#goodbye cruel world}}{{greeting}} {{adj}} {{noun}}{{/goodbye}}'; var hash = {cruel: "cruel", world: "world"} var fallback = {goodbye: function(cruel, world, fn) { - return fn({greeting: "Goodbye", adj: "cruel", noun: "world"}); + return fn({greeting: "Goodbye", adj: cruel, noun: world}); }} shouldCompileTo(string, [hash, fallback], "Message: Goodbye cruel world", "block helpers with multiple params"); }) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 5394cb0..289912c 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -54,10 +54,14 @@ module Handlebars context["exports"] = nil context["p"] = proc do |val| - p val + p val if ENV["DEBUG_JS"] end context["puts"] = proc do |val| + puts val if ENV["DEBUG_JS"] + end + + context["puts_node"] = proc do |val| puts context["Handlebars"]["PrintVisitor"].new.accept(val) puts end @@ -76,6 +80,7 @@ module Handlebars Handlebars::Spec.js_load('lib/handlebars/printer.js') Handlebars::Spec.js_load('lib/handlebars/runtime.js') Handlebars::Spec.js_load('lib/handlebars/utils.js') + Handlebars::Spec.js_load('lib/Handlebars/vm.js') Handlebars::Spec.js_load('lib/handlebars.js') end end |