From b85ae3ccc64c977263f3dee4f206a49489e2fb4e Mon Sep 17 00:00:00 2001 From: David Greenspan Date: Mon, 28 Oct 2013 20:15:03 -0700 Subject: [PATCH] EmitCode --- packages/ui/render2.js | 45 +++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/packages/ui/render2.js b/packages/ui/render2.js index b997948fbf..bd9319d415 100644 --- a/packages/ui/render2.js +++ b/packages/ui/render2.js @@ -56,6 +56,8 @@ UI.Tag.defineTag = function (name) { UI.Tag.CharRef = makeTagFunc('CharRef'); // e.g. `Comment("foo")` UI.Tag.Comment = makeTagFunc('Comment'); +// e.g. `EmitCode("foo()")` +UI.Tag.EmitCode = makeTagFunc('EmitCode'); _.each(allElementNames, UI.Tag.defineTag); @@ -80,6 +82,8 @@ var materialize = function (node, parentNode, beforeNode) { parentNode.insertBefore(document.createTextNode(node.attrs.str), beforeNode); } else if (node.tagName === 'Comment') { parentNode.insertBefore(document.createComment(sanitizeComment(node[0]))); + } else if (node.tagName === 'EmitCode') { + throw new Error("EmitCode node can only be processed by toCode"); } else { var elem = document.createElement(node.tagName); if (node.attrs) { @@ -100,6 +104,9 @@ var materialize = function (node, parentNode, beforeNode) { } } else if (typeof node === 'string') { parentNode.insertBefore(document.createTextNode(node), beforeNode); + } else if (typeof node === 'function') { + // XXX make this reactive... + materialize(node(), parentNode, beforeNode); } else if (node == null) { // null or undefined. // do nothing. @@ -178,6 +185,8 @@ var toHTML = function (node) { result += node.attrs.html; } else if (node.tagName === 'Comment') { result += ''; + } else if (node.tagName === 'EmitCode') { + throw new Error("EmitCode node can only be processed by toCode"); } else { // XXX handle void elements, like BR result += '<' + properCaseTagName(node.tagName); @@ -200,6 +209,8 @@ var toHTML = function (node) { } } else if (typeof node === 'string') { result += node.replace(/&/g, '&').replace(/