diff --git a/js-assembler/runtime-src/baselib-boxes.js b/js-assembler/runtime-src/baselib-boxes.js index 7605149..e73e09f 100644 --- a/js-assembler/runtime-src/baselib-boxes.js +++ b/js-assembler/runtime-src/baselib-boxes.js @@ -46,7 +46,7 @@ params.put(this, true); var parent = document.createElement("span"); parent.appendChild(document.createTextNode('#&')); - parent.appendChild(baselib.format.toDomNode(this.val, params)); + parent.appendChild(params.recur(this.val)); return parent; }; diff --git a/js-assembler/runtime-src/baselib-format.js b/js-assembler/runtime-src/baselib-format.js index de49eb6..950471e 100644 --- a/js-assembler/runtime-src/baselib-format.js +++ b/js-assembler/runtime-src/baselib-format.js @@ -221,11 +221,11 @@ ToDomNodeParameters.prototype.incrementDepth = function() { return new ToDomNodeParameters({ mode : this.mode, depth: this.depth + 1, - objectCounter: objectCounter }); + objectCounter: this.objectCounter }); }; - // getMode: -> (U "print" "display" "write") + // getMode: -> (U "print" "display" "write" "constructor") ToDomNodeParameters.prototype.getMode = function() { if (this.mode) { return this.mode; @@ -336,9 +336,7 @@ }; - // toDomNode: scheme-value -> dom-node - var toDomNode = function(x, params) { - var node; + var coerseToParams = function(params) { if (params === 'write') { params = new ToDomNodeParameters({'mode' : 'write'}); } else if (params === 'print') { @@ -350,6 +348,14 @@ } else { params = params || new ToDomNodeParameters({'mode' : 'display'}); } + return params; + }; + + + // toDomNode: scheme-value -> dom-node + var toDomNode = function(x, params) { + var node; + params = coerseToParams(params); if (baselib.numbers.isSchemeNumber(x)) { node = numberToDomNode(x, params); @@ -379,7 +385,7 @@ if (x === null) { node = document.createElement("span"); - node.appendChild(document.createTextNode("null")); + node.appendChild(document.createTextNode("#")); $(node).addClass("null"); return node; } @@ -387,18 +393,10 @@ if (x === undefined) { node = document.createElement("span"); node.appendChild(document.createTextNode("#")); + $(node).addClass("undefined"); return node; } - - if (typeof(x) === 'object') { - if (params.containsKey(x)) { - node = document.createElement("span"); - node.appendChild(document.createTextNode("#" + params.get(x))); - return node; - } - } - if (baselib.functions.isProcedure(x)) { node = document.createElement("span"); node.appendChild(document.createTextNode('#')); @@ -406,31 +404,36 @@ return node; } - if (typeof(x) !== 'object' && typeof(x) !== 'function') { + if (typeof(x) !== 'object') { node = document.createElement("span"); node.appendChild(document.createTextNode(x.toString())); return node; } + // Otherwise, we know the value is an object. + if (params.containsKey(x)) { + node = document.createElement("span"); + node.appendChild(document.createTextNode("#" + params.get(x))); + return node; + } var returnVal; if (x.nodeType) { - returnVal = x; + returnVal = x; } else if (x.toDomNode) { - returnVal = x.toDomNode(params); + returnVal = x.toDomNode(params); } else if (params.getMode() === 'write' && x.toWrittenString) { node = document.createElement("span"); node.appendChild(document.createTextNode(x.toWrittenString(params))); - returnVal = node; + returnVal = node; } else if (params.getMode() === 'display' && x.toDisplayedString) { node = document.createElement("span"); node.appendChild(document.createTextNode(x.toDisplayedString(params))); - returnVal = node; + returnVal = node; } else { node = document.createElement("span"); node.appendChild(document.createTextNode(x.toString())); - returnVal = node; + returnVal = node; } - params.remove(x); return returnVal; }; diff --git a/js-assembler/runtime-src/baselib-lists.js b/js-assembler/runtime-src/baselib-lists.js index 4df1e7e..1dee31f 100644 --- a/js-assembler/runtime-src/baselib-lists.js +++ b/js-assembler/runtime-src/baselib-lists.js @@ -30,6 +30,24 @@ Empty.prototype.toDisplayedString = function (cache) { return "empty"; }; Empty.prototype.toString = function (cache) { return "()"; }; + Empty.prototype.toDomNode = function(params) { + if (params.getMode() === "display") { + return $("").text("()").get(0); + } else if (params.getMode() === "write") { + return $("").text("()").get(0); + } else if (params.getMode() === "print") { + if (params.getDepth() === 0) { + return $("").text("'()").get(0); + } else { + return $("").text("()").get(0); + } + } else if (params.getMode() === "constructor") { + return $("").text("(list)").get(0); + } else { + return $("").text("()").get(0); + } + }; + // Empty.append: (listof X) -> (listof X) Empty.prototype.append = function (b) { @@ -131,25 +149,25 @@ - Cons.prototype.toDomNode = function (cache) { - cache.put(this, true); + Cons.prototype.toDomNode = function (params) { + params.put(this, true); var node = document.createElement("span"); node.appendChild(document.createTextNode("(")); var p = this; while (p instanceof Cons) { - node.appendChild(baselib.format.toDomNode(p.first, cache)); + node.appendChild(params.recur(p.first)); p = p.rest; if (p !== EMPTY) { node.appendChild(document.createTextNode(" ")); } - if (typeof (p) === 'object' && cache.containsKey(p)) { + if (typeof (p) === 'object' && params.containsKey(p)) { break; } } if (p !== EMPTY) { node.appendChild(document.createTextNode(".")); node.appendChild(document.createTextNode(" ")); - node.appendChild(baselib.format.toDomNode(p, cache)); + node.appendChild(params.recur(p)); } node.appendChild(document.createTextNode(")")); diff --git a/js-assembler/runtime-src/baselib-structs.js b/js-assembler/runtime-src/baselib-structs.js index d3d3a5e..ec138a2 100644 --- a/js-assembler/runtime-src/baselib-structs.js +++ b/js-assembler/runtime-src/baselib-structs.js @@ -38,7 +38,7 @@ $(node).append(document.createTextNode(this._constructorName)); for(i = 0; i < this._fields.length; i++) { $(node).append(document.createTextNode(" ")); - $(node).append(baselib.format.toDomNode(this._fields[i], params)); + $(node).append(params.recur(this._fields[i])); } $(node).append(document.createTextNode(")")); return node; diff --git a/js-assembler/runtime-src/baselib-vectors.js b/js-assembler/runtime-src/baselib-vectors.js index 315471d..dd09c18 100644 --- a/js-assembler/runtime-src/baselib-vectors.js +++ b/js-assembler/runtime-src/baselib-vectors.js @@ -82,12 +82,12 @@ return "#(" + texts.join(" ") + ")"; }; - Vector.prototype.toDomNode = function (cache) { + Vector.prototype.toDomNode = function (params) { var node = document.createElement("span"), i; - cache.put(this, true); + params.put(this, true); node.appendChild(document.createTextNode("#(")); for (i = 0; i < this.length(); i++) { - node.appendChild(baselib.format.toDomNode(this.ref(i), cache)); + node.appendChild(params.recur(this.ref(i))); if (i !== this.length() - 1) { node.appendChild(document.createTextNode(" ")); } diff --git a/js-assembler/runtime-src/runtime.js b/js-assembler/runtime-src/runtime.js index 4047f89..0464715 100644 --- a/js-assembler/runtime-src/runtime.js +++ b/js-assembler/runtime-src/runtime.js @@ -225,7 +225,7 @@ this.params = { // print-as-expression: boolean - 'print-as-expression' : true, + 'print-as-expression' : false, // print-mode: (one-of "write" "print" "constructor") 'print-mode' : 'write', diff --git a/resource/specialize/js-impl.js b/resource/specialize/js-impl.js index d237469..3fe23a9 100644 --- a/resource/specialize/js-impl.js +++ b/resource/specialize/js-impl.js @@ -46,7 +46,7 @@ var injectImageMethods = function(r, img) { installHackToSupportAnimatedGifs(r); ctx.drawImage(r.animationHackImg, x, y); }; - r.toDomNode = function() { + r.toDomNode = function(params) { return img.cloneNode(true); }; }; diff --git a/world/kernel.js b/world/kernel.js index 21abc92..5d4f48b 100644 --- a/world/kernel.js +++ b/world/kernel.js @@ -95,7 +95,7 @@ WorldConfigOption.prototype.configure = function(config) { }; -WorldConfigOption.prototype.toDomNode = function(cache) { +WorldConfigOption.prototype.toDomNode = function(params) { var span = document.createElement('span'); span.appendChild(document.createTextNode("(" + this.name + " ...)")); return span; @@ -311,7 +311,7 @@ ToDraw.prototype.toRawHandler = function(MACHINE, toplevelNode) { v.render(ctx, 0, 0); success([toplevelNode, reusableCanvasNode]); } else { - success([toplevelNode, rawJsworld.node_to_tree(plt.baselib.format.toDomNode(v))]); + success([toplevelNode, rawJsworld.node_to_tree(plt.baselib.format.toDomNode(v, MACHINE.params['print-mode']))]); } }); }; @@ -346,7 +346,8 @@ DefaultDrawingOutput.prototype.toRawHandler = function(MACHINE, toplevelNode) { var that = this; var worldFunction = function(world, success) { success([toplevelNode, - rawJsworld.node_to_tree(plt.baselib.format.toDomNode(world))]); + rawJsworld.node_to_tree(plt.baselib.format.toDomNode(world, + MACHINE.params['print-mode']))]); //k(rawJsworld.node_to_tree(plt.baselib.format.toDomNode(world))); }; var cssFunction = function(w, success) { success([]); }