From d64431bd64a47d6944c4ad0f83267aee3d5b9991 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Mon, 4 Jul 2011 18:03:10 -0400 Subject: [PATCH] moving string formatting to separate module --- js-assembler/get-runtime.rkt | 3 +- js-assembler/runtime-src/baselib_format.js | 422 ++++++++++++++++++++ js-assembler/runtime-src/baselib_structs.js | 6 +- js-assembler/runtime-src/helpers.js | 396 ------------------ js-assembler/runtime-src/runtime.js | 22 +- js-assembler/runtime-src/types.js | 9 +- 6 files changed, 441 insertions(+), 417 deletions(-) create mode 100644 js-assembler/runtime-src/baselib_format.js diff --git a/js-assembler/get-runtime.rkt b/js-assembler/get-runtime.rkt index 158c47a..0c307b5 100644 --- a/js-assembler/get-runtime.rkt +++ b/js-assembler/get-runtime.rkt @@ -42,6 +42,7 @@ (define-runtime-path baselib_arity.js "runtime-src/baselib_arity.js") (define-runtime-path baselib_inspectors.js "runtime-src/baselib_inspectors.js") (define-runtime-path baselib_exceptions.js "runtime-src/baselib_exceptions.js") +(define-runtime-path baselib_format.js "runtime-src/baselib_format.js") (define-runtime-path jshashtable.js "runtime-src/jshashtable-2.1_src.js") @@ -72,13 +73,13 @@ baselib.js baselib_unionfind.js baselib_hash.js + baselib_format.js baselib_symbol.js baselib_structs.js baselib_arity.js baselib_inspectors.js baselib_exceptions.js - link.js helpers.js diff --git a/js-assembler/runtime-src/baselib_format.js b/js-assembler/runtime-src/baselib_format.js new file mode 100644 index 0000000..8c1f419 --- /dev/null +++ b/js-assembler/runtime-src/baselib_format.js @@ -0,0 +1,422 @@ +// Formatting library. +// Produces string and DOM representations of values. +// +(function(baselib) { + var exports = {}; + baselib.format = exports; + + + + // format: string [X ...] string -> string + // String formatting. + var format = function(formatStr, args, functionName) { + var throwFormatError = function() { + functionName = functionName || 'format'; + var matches = formatStr.match(new RegExp('~[sSaA]', 'g')); + var expectedNumberOfArgs = (matches === null ? 0 : matches.length); + var errorStrBuffer = [functionName + ': format string requires ' + expectedNumberOfArgs + + ' arguments, given ' + args.length + '; arguments were:', + toWrittenString(formatStr)]; + for (var i = 0; i < args.length; i++) { + errorStrBuffer.push( toWrittenString(args[i]) ); + } + + throw new Error(errorStrBuffer.join(' ')); + } + + var pattern = new RegExp("~[sSaAnevE%~]", "g"); + var buffer = args.slice(0); + var onTemplate = function(s) { + if (s === "~~") { + return "~"; + } else if (s === '~n' || s === '~%') { + return "\n"; + } else if (s === '~s' || s === "~S") { + if (buffer.length === 0) { + throwFormatError(); + } + return toWrittenString(buffer.shift()); + } else if (s === '~e' || s === "~E") { + // FIXME: we don't yet have support for the error-print + // handler, and currently treat ~e just like ~s. + if (buffer.length === 0) { + throwFormatError(); + } + return toWrittenString(buffer.shift()); + } + else if (s === '~v') { + if (buffer.length === 0) { + throwFormatError(); + } + // fprintf must do something more interesting here by + // printing the dom representation directly... + return toWrittenString(buffer.shift()); + } else if (s === '~a' || s === "~A") { + if (buffer.length === 0) { + throwFormatError(); + } + return toDisplayedString(buffer.shift()); + } else { + throw new Error(functionName + + ': string.replace matched invalid regexp'); + } + } + var result = formatStr.replace(pattern, onTemplate); + if (buffer.length > 0) { + throwFormatError(); + } + return result; + }; + + + // toWrittenString: Any Hashtable -> String + var toWrittenString = function(x, cache) { + if (! cache) { + cache = plt.baselib.hash.makeLowLevelEqHash(); + } + if (x === null) { + return "null"; + } + if (x === true) { return "true"; } + if (x === false) { return "false"; } + if (typeof(x) === 'object') { + if (cache.containsKey(x)) { + return "..."; + } + } + if (x == undefined) { + return "#"; + } + if (typeof(x) == 'string') { + return escapeString(x.toString()); + } + if (typeof(x) != 'object' && typeof(x) != 'function') { + return x.toString(); + } + + var returnVal; + if (typeof(x.toWrittenString) !== 'undefined') { + returnVal = x.toWrittenString(cache); + } else if (typeof(x.toDisplayedString) !== 'undefined') { + returnVal = x.toDisplayedString(cache); + } else { + returnVal = x.toString(); + } + cache.remove(x); + return returnVal; + }; + + + + // toDisplayedString: Any Hashtable -> String + var toDisplayedString = function(x, cache) { + if (! cache) { + cache = plt.baselib.hash.makeLowLevelEqHash(); + } + if (x === null) { + return "null"; + } + if (x === true) { return "true"; } + if (x === false) { return "false"; } + if (typeof(x) === 'object') { + if (cache.containsKey(x)) { + return "..."; + } + } + if (x == undefined || x == null) { + return "#"; + } + if (typeof(x) == 'string') { + return x; + } + if (typeof(x) != 'object' && typeof(x) != 'function') { + return x.toString(); + } + + var returnVal; + if (typeof(x.toDisplayedString) !== 'undefined') { + returnVal = x.toDisplayedString(cache); + } else if (typeof(x.toWrittenString) !== 'undefined') { + returnVal = x.toWrittenString(cache); + } else { + returnVal = x.toString(); + } + cache.remove(x); + return returnVal; + }; + + + + + + + var ToDomNodeParameters = function(params) { + if (! params) { params = {}; } + this.cache = plt.baselib.hash.makeLowLevelEqHash(); + for (var k in params) { + if (params.hasOwnProperty(k)) { + this[k] = params[k]; + } + } + this.objectCounter = 0; + }; + + // getMode: -> (U "print" "display" "write") + ToDomNodeParameters.prototype.getMode = function() { + if (this.mode) { + return this.mode; + } + return 'print'; + }; + + ToDomNodeParameters.prototype.containsKey = function(x) { + return this.cache.containsKey(x); + }; + + ToDomNodeParameters.prototype.get = function(x) { + return this.cache.get(x); + }; + + ToDomNodeParameters.prototype.remove = function(x) { + return this.cache.remove(x); + }; + + ToDomNodeParameters.prototype.put = function(x) { + this.objectCounter++; + return this.cache.put(x, this.objectCounter); + }; + + + // toDomNode: scheme-value -> dom-node + var toDomNode = function(x, params) { + if (params === 'write') { + params = new ToDomNodeParameters({'mode' : 'write'}); + } else if (params === 'print') { + params = new ToDomNodeParameters({'mode' : 'print'}); + } else if (params === 'display') { + params = new ToDomNodeParameters({'mode' : 'display'}); + } else { + params = params || new ToDomNodeParameters({'mode' : 'display'}); + } + + if (jsnums.isSchemeNumber(x)) { + var node = numberToDomNode(x, params); + $(node).addClass("number"); + return node; + } + + if (x === null) { + var node = document.createElement("span"); + node.appendChild(document.createTextNode("null")); + $(node).addClass("null"); + return node; + } + + if (x === true) { + var node = document.createElement("span"); + node.appendChild(document.createTextNode("true")); + $(node).addClass("boolean"); + return node; + } + + if (x === false) { + var node = document.createElement("span"); + node.appendChild(document.createTextNode("false")); + $(node).addClass("boolean"); + return node; + } + + if (typeof(x) == 'object') { + if (params.containsKey(x)) { + var node = document.createElement("span"); + node.appendChild(document.createTextNode("#" + params.get(x))); + return node; + } + } + if (x === undefined || x == null) { + var node = document.createElement("span"); + node.appendChild(document.createTextNode("#")); + return node; + } + + if (typeof(x) == 'string') { + var wrapper = document.createElement("span"); + wrapper.style["white-space"] = "pre"; + var node; + if (params.getMode() === 'write' || params.getMode() === 'print') { + node = document.createTextNode(toWrittenString(x)); + } else { + node = document.createTextNode(toDisplayedString(x)); + } + wrapper.appendChild(node); + $(wrapper).addClass("string"); + return wrapper; + } + + if (typeof(x) != 'object' && typeof(x) != 'function') { + var node = document.createElement("span"); + node.appendChild(document.createTextNode(x.toString())); + $(node).addClass("procedure"); + return node; + } + + var returnVal; + if (x.nodeType) { + returnVal = x; + } else if (typeof(x.toDomNode) !== 'undefined') { + returnVal = x.toDomNode(params); + } else if (params.getMode() === 'write' && + typeof(x.toWrittenString) !== 'undefined') { + var node = document.createElement("span"); + node.appendChild(document.createTextNode(x.toWrittenString(params))); + returnVal = node; + } else if (params.getMode() === 'display' && + typeof(x.toDisplayedString) !== 'undefined') { + var node = document.createElement("span"); + node.appendChild(document.createTextNode(x.toDisplayedString(params))); + returnVal = node; + } else { + var node = document.createElement("span"); + node.appendChild(document.createTextNode(x.toString())); + returnVal = node; + } + params.remove(x); + return returnVal; + }; + + + + // numberToDomNode: jsnum -> dom + // Given a jsnum, produces a dom-node representation. + var numberToDomNode = function(n, params) { + var node; + if (jsnums.isExact(n)) { + if (jsnums.isInteger(n)) { + node = document.createElement("span"); + node.appendChild(document.createTextNode(n.toString())); + return node; + } else if (jsnums.isRational(n)) { + return rationalToDomNode(n); + } else if (jsnums.isComplex(n)) { + node = document.createElement("span"); + node.appendChild(document.createTextNode(n.toString())); + return node; + } else { + node = document.createElement("span"); + node.appendChild(document.createTextNode(n.toString())); + return node; + } + } else { + node = document.createElement("span"); + node.appendChild(document.createTextNode(n.toString())); + return node; + } + }; + + // rationalToDomNode: rational -> dom-node + var rationalToDomNode = function(n) { + var repeatingDecimalNode = document.createElement("span"); + var chunks = jsnums.toRepeatingDecimal(jsnums.numerator(n), + jsnums.denominator(n), + {limit: 25}); + repeatingDecimalNode.appendChild(document.createTextNode(chunks[0] + '.')) + repeatingDecimalNode.appendChild(document.createTextNode(chunks[1])); + if (chunks[2] === '...') { + repeatingDecimalNode.appendChild( + document.createTextNode(chunks[2])); + } else if (chunks[2] !== '0') { + var overlineSpan = document.createElement("span"); + overlineSpan.style.textDecoration = 'overline'; + overlineSpan.appendChild(document.createTextNode(chunks[2])); + repeatingDecimalNode.appendChild(overlineSpan); + } + + + var fractionalNode = document.createElement("span"); + var numeratorNode = document.createElement("sup"); + numeratorNode.appendChild(document.createTextNode(String(jsnums.numerator(n)))); + var denominatorNode = document.createElement("sub"); + denominatorNode.appendChild(document.createTextNode(String(jsnums.denominator(n)))); + fractionalNode.appendChild(numeratorNode); + fractionalNode.appendChild(document.createTextNode("/")); + fractionalNode.appendChild(denominatorNode); + + + var numberNode = document.createElement("span"); + numberNode.appendChild(repeatingDecimalNode); + numberNode.appendChild(fractionalNode); + fractionalNode.style['display'] = 'none'; + + var showingRepeating = true; + + numberNode.onclick = function(e) { + showingRepeating = !showingRepeating; + repeatingDecimalNode.style['display'] = + (showingRepeating ? 'inline' : 'none') + fractionalNode.style['display'] = + (!showingRepeating ? 'inline' : 'none') + }; + numberNode.style['cursor'] = 'pointer'; + return numberNode; + } + + + + + + + var escapeString = function(s) { + return '"' + replaceUnprintableStringChars(s) + '"'; + }; + + var replaceUnprintableStringChars = function(s) { + var ret = []; + for (var i = 0; i < s.length; i++) { + var val = s.charCodeAt(i); + switch(val) { + case 7: ret.push('\\a'); break; + case 8: ret.push('\\b'); break; + case 9: ret.push('\\t'); break; + case 10: ret.push('\\n'); break; + case 11: ret.push('\\v'); break; + case 12: ret.push('\\f'); break; + case 13: ret.push('\\r'); break; + case 34: ret.push('\\"'); break; + case 92: ret.push('\\\\'); break; + default: if (val >= 32 && val <= 126) { + ret.push( s.charAt(i) ); + } + else { + var numStr = val.toString(16).toUpperCase(); + while (numStr.length < 4) { + numStr = '0' + numStr; + } + ret.push('\\u' + numStr); + } + break; + } + } + return ret.join(''); + }; + + + + + + + + + + + ////////////////////////////////////////////////////////////////////// + + + exports.ToDomNodeParameters = ToDomNodeParameters; + + exports.format = format; + exports.toWrittenString = toWrittenString; + exports.toDisplayedString = toDisplayedString; + exports.toDomNode = toDomNode; + + exports.escapeString = escapeString; +})(this['plt'].baselib); \ No newline at end of file diff --git a/js-assembler/runtime-src/baselib_structs.js b/js-assembler/runtime-src/baselib_structs.js index 6c43add..a918798 100644 --- a/js-assembler/runtime-src/baselib_structs.js +++ b/js-assembler/runtime-src/baselib_structs.js @@ -153,14 +153,14 @@ buffer.push(this._constructorName); for(var i = 0; i < this._fields.length; i++) { buffer.push(" "); - buffer.push(plt.helpers.toWrittenString(this._fields[i], cache)); + buffer.push(plt.baselib.format.toWrittenString(this._fields[i], cache)); } buffer.push(")"); return buffer.join(""); }; Struct.prototype.toDisplayedString = function(cache) { - return plt.helpers.toWrittenString(this, cache); + return plt.baselib.format.toWrittenString(this, cache); }; Struct.prototype.toDomNode = function(params) { @@ -170,7 +170,7 @@ $(node).append(document.createTextNode(this._constructorName)); for(var i = 0; i < this._fields.length; i++) { $(node).append(document.createTextNode(" ")); - $(node).append(plt.helpers.toDomNode(this._fields[i], params)); + $(node).append(plt.baselib.format.toDomNode(this._fields[i], params)); } $(node).append(document.createTextNode(")")); return node; diff --git a/js-assembler/runtime-src/helpers.js b/js-assembler/runtime-src/helpers.js index a4834cf..04fdc2c 100644 --- a/js-assembler/runtime-src/helpers.js +++ b/js-assembler/runtime-src/helpers.js @@ -34,68 +34,6 @@ if (! this['plt']) { this['plt'] = {}; } - // format: string [X ...] string -> string - // String formatting. - var format = function(formatStr, args, functionName) { - var throwFormatError = function() { - functionName = functionName || 'format'; - var matches = formatStr.match(new RegExp('~[sSaA]', 'g')); - var expectedNumberOfArgs = (matches === null ? 0 : matches.length); - var errorStrBuffer = [functionName + ': format string requires ' + expectedNumberOfArgs - + ' arguments, given ' + args.length + '; arguments were:', - toWrittenString(formatStr)]; - for (var i = 0; i < args.length; i++) { - errorStrBuffer.push( toWrittenString(args[i]) ); - } - - throw new Error(errorStrBuffer.join(' ')); - } - - var pattern = new RegExp("~[sSaAnevE%~]", "g"); - var buffer = args.slice(0); - var onTemplate = function(s) { - if (s === "~~") { - return "~"; - } else if (s === '~n' || s === '~%') { - return "\n"; - } else if (s === '~s' || s === "~S") { - if (buffer.length === 0) { - throwFormatError(); - } - return toWrittenString(buffer.shift()); - } else if (s === '~e' || s === "~E") { - // FIXME: we don't yet have support for the error-print - // handler, and currently treat ~e just like ~s. - if (buffer.length === 0) { - throwFormatError(); - } - return toWrittenString(buffer.shift()); - } - else if (s === '~v') { - if (buffer.length === 0) { - throwFormatError(); - } - // fprintf must do something more interesting here by - // printing the dom representation directly... - return toWrittenString(buffer.shift()); - } else if (s === '~a' || s === "~A") { - if (buffer.length === 0) { - throwFormatError(); - } - return toDisplayedString(buffer.shift()); - } else { - throw new Error(functionName + - ': string.replace matched invalid regexp'); - } - } - var result = formatStr.replace(pattern, onTemplate); - if (buffer.length > 0) { - throwFormatError(); - } - return result; - }; - - // forEachK: CPS( array CPS(array -> void) (error -> void) -> void ) @@ -507,334 +445,6 @@ if (! this['plt']) { this['plt'] = {}; } - // toWrittenString: Any Hashtable -> String - var toWrittenString = function(x, cache) { - if (! cache) { - cache = plt.baselib.hash.makeLowLevelEqHash(); - } - if (x === null) { - return "null"; - } - if (x === true) { return "true"; } - if (x === false) { return "false"; } - if (typeof(x) === 'object') { - if (cache.containsKey(x)) { - return "..."; - } - } - if (x == undefined) { - return "#"; - } - if (typeof(x) == 'string') { - return escapeString(x.toString()); - } - if (typeof(x) != 'object' && typeof(x) != 'function') { - return x.toString(); - } - - var returnVal; - if (typeof(x.toWrittenString) !== 'undefined') { - returnVal = x.toWrittenString(cache); - } else if (typeof(x.toDisplayedString) !== 'undefined') { - returnVal = x.toDisplayedString(cache); - } else { - returnVal = x.toString(); - } - cache.remove(x); - return returnVal; - }; - - - - // toDisplayedString: Any Hashtable -> String - var toDisplayedString = function(x, cache) { - if (! cache) { - cache = plt.baselib.hash.makeLowLevelEqHash(); - } - if (x === null) { - return "null"; - } - if (x === true) { return "true"; } - if (x === false) { return "false"; } - if (typeof(x) === 'object') { - if (cache.containsKey(x)) { - return "..."; - } - } - if (x == undefined || x == null) { - return "#"; - } - if (typeof(x) == 'string') { - return x; - } - if (typeof(x) != 'object' && typeof(x) != 'function') { - return x.toString(); - } - - var returnVal; - if (typeof(x.toDisplayedString) !== 'undefined') { - returnVal = x.toDisplayedString(cache); - } else if (typeof(x.toWrittenString) !== 'undefined') { - returnVal = x.toWrittenString(cache); - } else { - returnVal = x.toString(); - } - cache.remove(x); - return returnVal; - }; - - - - - var ToDomNodeParameters = function(params) { - if (! params) { params = {}; } - this.cache = plt.baselib.hash.makeLowLevelEqHash(); - for (var k in params) { - if (params.hasOwnProperty(k)) { - this[k] = params[k]; - } - } - this.objectCounter = 0; - }; - - // getMode: -> (U "print" "display" "write") - ToDomNodeParameters.prototype.getMode = function() { - if (this.mode) { - return this.mode; - } - return 'print'; - }; - - ToDomNodeParameters.prototype.containsKey = function(x) { - return this.cache.containsKey(x); - }; - - ToDomNodeParameters.prototype.get = function(x) { - return this.cache.get(x); - }; - - ToDomNodeParameters.prototype.remove = function(x) { - return this.cache.remove(x); - }; - - ToDomNodeParameters.prototype.put = function(x) { - this.objectCounter++; - return this.cache.put(x, this.objectCounter); - }; - - - // toDomNode: scheme-value -> dom-node - var toDomNode = function(x, params) { - if (params === 'write') { - params = new ToDomNodeParameters({'mode' : 'write'}); - } else if (params === 'print') { - params = new ToDomNodeParameters({'mode' : 'print'}); - } else if (params === 'display') { - params = new ToDomNodeParameters({'mode' : 'display'}); - } else { - params = params || new ToDomNodeParameters({'mode' : 'display'}); - } - - if (jsnums.isSchemeNumber(x)) { - var node = numberToDomNode(x, params); - $(node).addClass("number"); - return node; - } - - if (x === null) { - var node = document.createElement("span"); - node.appendChild(document.createTextNode("null")); - $(node).addClass("null"); - return node; - } - - if (x === true) { - var node = document.createElement("span"); - node.appendChild(document.createTextNode("true")); - $(node).addClass("boolean"); - return node; - } - - if (x === false) { - var node = document.createElement("span"); - node.appendChild(document.createTextNode("false")); - $(node).addClass("boolean"); - return node; - } - - if (typeof(x) == 'object') { - if (params.containsKey(x)) { - var node = document.createElement("span"); - node.appendChild(document.createTextNode("#" + params.get(x))); - return node; - } - } - if (x === undefined || x == null) { - var node = document.createElement("span"); - node.appendChild(document.createTextNode("#")); - return node; - } - - if (typeof(x) == 'string') { - var wrapper = document.createElement("span"); - wrapper.style["white-space"] = "pre"; - var node; - if (params.getMode() === 'write' || params.getMode() === 'print') { - node = document.createTextNode(toWrittenString(x)); - } else { - node = document.createTextNode(toDisplayedString(x)); - } - wrapper.appendChild(node); - $(wrapper).addClass("string"); - return wrapper; - } - - if (typeof(x) != 'object' && typeof(x) != 'function') { - var node = document.createElement("span"); - node.appendChild(document.createTextNode(x.toString())); - $(node).addClass("procedure"); - return node; - } - - var returnVal; - if (x.nodeType) { - returnVal = x; - } else if (typeof(x.toDomNode) !== 'undefined') { - returnVal = x.toDomNode(params); - } else if (params.getMode() === 'write' && - typeof(x.toWrittenString) !== 'undefined') { - var node = document.createElement("span"); - node.appendChild(document.createTextNode(x.toWrittenString(params))); - returnVal = node; - } else if (params.getMode() === 'display' && - typeof(x.toDisplayedString) !== 'undefined') { - var node = document.createElement("span"); - node.appendChild(document.createTextNode(x.toDisplayedString(params))); - returnVal = node; - } else { - var node = document.createElement("span"); - node.appendChild(document.createTextNode(x.toString())); - returnVal = node; - } - params.remove(x); - return returnVal; - }; - - - - // numberToDomNode: jsnum -> dom - // Given a jsnum, produces a dom-node representation. - var numberToDomNode = function(n, params) { - var node; - if (jsnums.isExact(n)) { - if (jsnums.isInteger(n)) { - node = document.createElement("span"); - node.appendChild(document.createTextNode(n.toString())); - return node; - } else if (jsnums.isRational(n)) { - return rationalToDomNode(n); - } else if (jsnums.isComplex(n)) { - node = document.createElement("span"); - node.appendChild(document.createTextNode(n.toString())); - return node; - } else { - node = document.createElement("span"); - node.appendChild(document.createTextNode(n.toString())); - return node; - } - } else { - node = document.createElement("span"); - node.appendChild(document.createTextNode(n.toString())); - return node; - } - }; - - // rationalToDomNode: rational -> dom-node - var rationalToDomNode = function(n) { - var repeatingDecimalNode = document.createElement("span"); - var chunks = jsnums.toRepeatingDecimal(jsnums.numerator(n), - jsnums.denominator(n), - {limit: 25}); - repeatingDecimalNode.appendChild(document.createTextNode(chunks[0] + '.')) - repeatingDecimalNode.appendChild(document.createTextNode(chunks[1])); - if (chunks[2] === '...') { - repeatingDecimalNode.appendChild( - document.createTextNode(chunks[2])); - } else if (chunks[2] !== '0') { - var overlineSpan = document.createElement("span"); - overlineSpan.style.textDecoration = 'overline'; - overlineSpan.appendChild(document.createTextNode(chunks[2])); - repeatingDecimalNode.appendChild(overlineSpan); - } - - - var fractionalNode = document.createElement("span"); - var numeratorNode = document.createElement("sup"); - numeratorNode.appendChild(document.createTextNode(String(jsnums.numerator(n)))); - var denominatorNode = document.createElement("sub"); - denominatorNode.appendChild(document.createTextNode(String(jsnums.denominator(n)))); - fractionalNode.appendChild(numeratorNode); - fractionalNode.appendChild(document.createTextNode("/")); - fractionalNode.appendChild(denominatorNode); - - - var numberNode = document.createElement("span"); - numberNode.appendChild(repeatingDecimalNode); - numberNode.appendChild(fractionalNode); - fractionalNode.style['display'] = 'none'; - - var showingRepeating = true; - - numberNode.onclick = function(e) { - showingRepeating = !showingRepeating; - repeatingDecimalNode.style['display'] = - (showingRepeating ? 'inline' : 'none') - fractionalNode.style['display'] = - (!showingRepeating ? 'inline' : 'none') - }; - numberNode.style['cursor'] = 'pointer'; - return numberNode; - } - - - - - - - var escapeString = function(s) { - return '"' + replaceUnprintableStringChars(s) + '"'; - }; - - var replaceUnprintableStringChars = function(s) { - var ret = []; - for (var i = 0; i < s.length; i++) { - var val = s.charCodeAt(i); - switch(val) { - case 7: ret.push('\\a'); break; - case 8: ret.push('\\b'); break; - case 9: ret.push('\\t'); break; - case 10: ret.push('\\n'); break; - case 11: ret.push('\\v'); break; - case 12: ret.push('\\f'); break; - case 13: ret.push('\\r'); break; - case 34: ret.push('\\"'); break; - case 92: ret.push('\\\\'); break; - default: if (val >= 32 && val <= 126) { - ret.push( s.charAt(i) ); - } - else { - var numStr = val.toString(16).toUpperCase(); - while (numStr.length < 4) { - numStr = '0' + numStr; - } - ret.push('\\u' + numStr); - } - break; - } - } - return ret.join(''); - }; - @@ -862,7 +472,6 @@ if (! this['plt']) { this['plt'] = {}; } //////////////////////////////////////////////// - helpers.format = format; helpers.forEachK = forEachK; helpers.reportError = reportError; helpers.raise = raise; @@ -895,13 +504,8 @@ if (! this['plt']) { this['plt'] = {}; } helpers.makeLowLevelEqHash = plt.baselib.hash.makeLowLevelEqHash; helpers.heir = heir; - helpers.escapeString = escapeString; - helpers.toWrittenString = toWrittenString; - helpers.toDisplayedString = toDisplayedString; - helpers.toDomNode = toDomNode; - helpers.ToDomNodeParameters = ToDomNodeParameters; helpers.clone = clone; diff --git a/js-assembler/runtime-src/runtime.js b/js-assembler/runtime-src/runtime.js index 525d6ce..3f3504a 100644 --- a/js-assembler/runtime-src/runtime.js +++ b/js-assembler/runtime-src/runtime.js @@ -42,9 +42,9 @@ if(this['plt'] === undefined) { this['plt'] = {}; } var makePair = types.pair; var heir = helpers.heir; - var toDomNode = helpers.toDomNode; - var toWrittenString = helpers.toWrittenString; - var toDisplayedString = helpers.toDisplayedString; + var toDomNode = plt.baselib.format.toDomNode; + var toWrittenString = plt.baselib.format.toWrittenString; + var toDisplayedString = plt.baselib.format.toDisplayedString; var makeBox = types.box; @@ -436,7 +436,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; } raise(MACHINE, new Error(callerName + ": expected " + expectedTypeName + " as argument " + (argumentOffset + 1) - + " but received " + helpers.toWrittenString(actualValue))); + + " but received " + toWrittenString(actualValue))); }; var raiseContextExpectedValuesError = function(MACHINE, expected) { @@ -454,17 +454,17 @@ if(this['plt'] === undefined) { this['plt'] = {}; } var raiseOperatorApplicationError = function(MACHINE, operator) { raise(MACHINE, - new Error("not a procedure: " + helpers.toWrittenString(operator))); + new Error("not a procedure: " + toWrittenString(operator))); }; var raiseOperatorIsNotClosure = function(MACHINE, operator) { raise(MACHINE, - new Error("not a closure: " + helpers.toWrittenString(operator))); + new Error("not a closure: " + toWrittenString(operator))); }; var raiseOperatorIsNotPrimitiveProcedure = function(MACHINE, operator) { raise(MACHINE, - new Error("not a primitive procedure: " + helpers.toWrittenString(operator))); + new Error("not a primitive procedure: " + toWrittenString(operator))); }; @@ -683,7 +683,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; } args.push(MACHINE.env[MACHINE.env.length - 1 - i]); } formatString = args.shift(); - return helpers.format(formatString, args, 'format'); + return plt.baselib.format.format(formatString, args, 'format'); }); @@ -703,7 +703,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; } args.push(MACHINE.env[MACHINE.env.length - 1 - i]); } formatString = args.shift(); - var result = helpers.format(formatString, args, 'format'); + var result = plt.baselib.format.format(formatString, args, 'format'); var outputPort = MACHINE.params.currentOutputPort; outputPort.writeDomNode(MACHINE, toDomNode(result, 'display')); return VOID; @@ -731,7 +731,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; } args.push(MACHINE.env[MACHINE.env.length - 1 - i]); } formatString = args.shift(); - var result = helpers.format(formatString, args, 'format'); + var result = plt.baselib.format.format(formatString, args, 'format'); var outputPort = MACHINE.env[MACHINE.env.length-1]; outputPort.writeDomNode(MACHINE, toDomNode(result, 'display')); return VOID; @@ -2047,7 +2047,7 @@ if(this['plt'] === undefined) { this['plt'] = {}; } args.push(MACHINE.env[MACHINE.env.length - 1 - i]); } formatString = args.shift(); - return helpers.format(formatString, args, 'format'); + return plt.baselib.format.format(formatString, args, 'format'); }); diff --git a/js-assembler/runtime-src/types.js b/js-assembler/runtime-src/types.js index 9e3d79c..7ec6e18 100644 --- a/js-assembler/runtime-src/types.js +++ b/js-assembler/runtime-src/types.js @@ -27,17 +27,14 @@ if (! this['plt']) { this['plt'] = {}; } makeLowLevelEqHash = helpers.makeLowLevelEqHash; - var toWrittenString = helpers.toWrittenString; - var toDisplayedString = helpers.toDisplayedString; - var toDomNode = helpers.toDomNode; + var toWrittenString = plt.baselib.format.toWrittenString; + var toDisplayedString = plt.baselib.format.toDisplayedString; + var toDomNode = plt.baselib.format.toDomNode; scope.link.ready('helpers', function() { helpers = scope['helpers']; getEqHashCode = helpers.getEqHashCode; makeLowLevelEqHash = helpers.makeLowLevelEqHash; - toWrittenString = helpers.toWrittenString; - toDisplayedString = helpers.toDisplayedString; - toDomNode = helpers.toDomNode; });