diff --git a/packages/htmljs/html.js b/packages/htmljs/html.js index 9f4594b2f7..a0078fb8b0 100644 --- a/packages/htmljs/html.js +++ b/packages/htmljs/html.js @@ -186,11 +186,14 @@ HTML.EmitCode = function (value) { this.value = value; }; +HTML.isTagEnsured = function (t) { + return HTML.isKnownElement(t) || HTML.isKnownSVGElement(t); +}; + (function () { for (var i = 0; i < HTML.knownElementNames.length; i++) HTML.ensureTag(HTML.knownElementNames[i]); for (var i = 0; i < HTML.knownSVGElementNames.length; i++) HTML.ensureTag(HTML.knownSVGElementNames[i]); - })(); diff --git a/packages/spacebars/spacebars.js b/packages/spacebars/spacebars.js index b41a1dba97..10d15a801a 100644 --- a/packages/spacebars/spacebars.js +++ b/packages/spacebars/spacebars.js @@ -507,9 +507,10 @@ var optimize = function (tree) { return null; } else if (node instanceof HTML.Tag) { - if (node.tagName === 'TEXTAREA') { + if (node.tagName === 'TEXTAREA' || (! HTML.isKnownElement(node.tagName))) { // optimizing into a TEXTAREA's RCDATA would require being a little - // more clever. + // more clever. foreign elements like SVG can't be stringified for + // innerHTML. return node; } @@ -935,19 +936,20 @@ Spacebars.compile = function (input, options) { }; Spacebars.codeGen = function (parseTree, options) { - var tree = parseTree; - - if (isTemplate) - // optimizing fragments would require being smarter about whether we are - // in a TEXTAREA, say. - tree = optimize(tree); - - tree = replaceSpecials(tree); - // is this a template, rather than a block passed to // a block helper, say var isTemplate = (options && options.isTemplate); + var tree = parseTree; + + if (isTemplate) { + // optimizing fragments would require being smarter about whether we are + // in a TEXTAREA, say. + tree = optimize(tree); + } + + tree = replaceSpecials(tree); + var code = '(function () { var self = this; '; if (isTemplate) { // support `{{> content}}` and `{{> elseContent}}` with diff --git a/packages/spacebars/tojs.js b/packages/spacebars/tojs.js index 34288ef101..d8629a5de0 100644 --- a/packages/spacebars/tojs.js +++ b/packages/spacebars/tojs.js @@ -44,7 +44,7 @@ HTML.Tag.prototype.toJS = function (options) { } var tagSymbol = this.tagName; - if ((this instanceof HTML.Tag) && ! HTML.isKnownElement(tagSymbol)) + if ((this instanceof HTML.Tag) && ! HTML.isTagEnsured(tagSymbol)) tagSymbol = 'HTML.getTag(' + toJSLiteral(tagSymbol) + ')'; else tagSymbol = 'HTML.' + tagSymbol;