diff options
-rw-r--r-- | common/content/abbreviations.js | 50 | ||||
-rw-r--r-- | common/content/commandline.js | 14 | ||||
-rw-r--r-- | common/content/mow.js | 11 | ||||
-rw-r--r-- | common/modules/dom.jsm | 10 | ||||
-rw-r--r-- | common/modules/util.jsm | 57 |
5 files changed, 105 insertions, 37 deletions
diff --git a/common/content/abbreviations.js b/common/content/abbreviations.js index e007bbd0..806fb932 100644 --- a/common/content/abbreviations.js +++ b/common/content/abbreviations.js @@ -262,33 +262,29 @@ var Abbreviations = Module("abbreviations", { function abbrevs(hive) hive.merged.filter(function (abbr) (abbr.inModes(modes) && abbr.lhs.indexOf(lhs) == 0)); - let list = <table> - <tr highlight="Title"> - <td/> - <td style="padding-right: 1em;">{_("title.Mode")}</td> - <td style="padding-right: 1em;">{_("title.Abbrev")}</td> - <td style="padding-right: 1em;">{_("title.Replacement")}</td> - </tr> - <col style="min-width: 6em; padding-right: 1em;"/> - { - template.map(hives, function (hive) let (i = 0) - <tr style="height: .5ex;"/> + - template.map(abbrevs(hive), function (abbrev) - <tr> - <td highlight="Title">{!i++ ? hive.name : ""}</td> - <td>{abbrev.modeChar}</td> - <td>{abbrev.lhs}</td> - <td>{abbrev.rhs}</td> - </tr>) + - <tr style="height: .5ex;"/>) - } - </table>; - - // TODO: Move this to an ItemList to show this automatically - if (list.*.length() === list.text().length() + 2) - dactyl.echomsg(_("abbreviation.none")); - else - commandline.commandOutput(list); + let list = ["table", {}, + ["tr", { highlight: "Title" }, + ["td"], + ["td", { style: "padding-right: 1em;" }, _("title.Mode")], + ["td", { style: "padding-right: 1em;" }, _("title.Abbrev")], + ["td", { style: "padding-right: 1em;" }, _("title.Replacement")]], + ["col", { style: "min-width: 6em; padding-right: 1em;" }], + hives.map(function (hive) let (i = 0) [ + ["tr", { style: "height: .5ex;" }], + abbrevs(hive).map(function (abbrev) + ["tr", {}, + ["td", { highlight: "Title" }, !i++ ? String(hive.name) : ""], + ["td", {}, abbrev.modeChar], + ["td", {}, abbrev.lhs], + ["td", {}, abbrev.rhs]]), + ["tr", { style: "height: .5ex;" }]])]; + + // FIXME? + // // TODO: Move this to an ItemList to show this automatically + // if (list.*.length() === list.text().length() + 2) + // dactyl.echomsg(_("abbreviation.none")); + // else + commandline.commandOutput(list); } }, { diff --git a/common/content/commandline.js b/common/content/commandline.js index 5e2b9bae..24c834bb 100644 --- a/common/content/commandline.js +++ b/common/content/commandline.js @@ -665,10 +665,14 @@ var CommandLine = Module("commandline", { */ commandOutput: function commandOutput(xml) { XML.ignoreWhitespace = XML.prettyPrinting = false; - if (this.command) - this.echo(<><div xmlns={XHTML}>:{this.command}</div>
{xml}</>, this.HIGHLIGHT_NORMAL, this.FORCE_MULTILINE); - else + if (!this.command) this.echo(xml, this.HIGHLIGHT_NORMAL, this.FORCE_MULTILINE); + else if (isXML(xml)) + this.echo(<><div xmlns={XHTML}>:{this.command}</div>
{xml}</>, + this.HIGHLIGHT_NORMAL, this.FORCE_MULTILINE); + else + this.echo([["div", { xmlns: "html" }, ":" + this.command], "\n", xml], + this.HIGHLIGHT_NORMAL, this.FORCE_MULTILINE); this.command = null; }, @@ -699,7 +703,7 @@ var CommandLine = Module("commandline", { let field = this.widgets.active.message.inputField; if (field.value && !forceSingle && field.editor.rootElement.scrollWidth > field.scrollWidth) { this.widgets.message = null; - mow.echo(<span highlight="Message">{str}</span>, highlightGroup, true); + mow.echo(["span", { highlight: "Message" }, str], highlightGroup, true); } }, @@ -737,7 +741,7 @@ var CommandLine = Module("commandline", { highlightGroup = highlightGroup || this.HL_NORMAL; if (flags & this.APPEND_TO_MESSAGES) { - let message = isObject(data) ? data : { message: data }; + let message = isObject(data) && !DOM.isJSONXML(data) ? data : { message: data }; // Make sure the memoized message property is an instance property. message.message; diff --git a/common/content/mow.js b/common/content/mow.js index 36d271c9..0aade542 100644 --- a/common/content/mow.js +++ b/common/content/mow.js @@ -112,7 +112,7 @@ var MOW = Module("mow", { highlightGroup = "CommandOutput " + (highlightGroup || ""); - if (isObject(data) && !isinstance(data, _)) { + if (isObject(data) && !isinstance(data, _) && !DOM.isJSONXML(data)) { this.lastOutput = null; var output = DOM(["div", { style: "white-space: nowrap", highlight: highlightGroup }], @@ -127,9 +127,16 @@ var MOW = Module("mow", { } this.messages.push(data); } + else if (DOM.isJSONXML(data) || isString(data)) { + let style = isString(data) ? "pre-wrap" : "nowrap"; + this.lastOutput = ["div", { style: "white-space: " + style, highlight: highlightGroup }, + data]; + + var output = DOM(this.lastOutput, this.document); + } else { let style = isString(data) ? "pre-wrap" : "nowrap"; - this.lastOutput = <div style={"white-space: " + style} highlight={highlightGroup}>{data}</div>; + this.lastOutput = <div style="white-space: nowrap" highlight={highlightGroup}>{data}</div>; var output = DOM(this.lastOutput, this.document); } diff --git a/common/modules/dom.jsm b/common/modules/dom.jsm index 54545b70..b5837e54 100644 --- a/common/modules/dom.jsm +++ b/common/modules/dom.jsm @@ -10,6 +10,7 @@ defineModule("dom", { }); lazyRequire("highlight", ["highlight"]); +lazyRequire("messages", ["_"]); lazyRequire("template", ["template"]); var XBL = Namespace("xbl", "http://www.mozilla.org/xbl"); @@ -1383,7 +1384,7 @@ var DOM = Class("DOM", { ? function (elem, dir) services.dactyl.getScrollable(elem) & (dir ? services.dactyl["DIRECTION_" + dir.toUpperCase()] : ~0) : function (elem, dir) true), - isJSONXML: function isJSONXML(val) isArray(val) && isString(val[0]) || isObject(val) && "toDOM" in val, + isJSONXML: function isJSONXML(val) isArray(val) && (isString(val[0]) || isArray(val[0])) || isObject(val) && "toDOM" in val, DOMString: function (val) ({ toDOM: function toDOM(doc) doc.createTextNode(val) @@ -1555,7 +1556,11 @@ var DOM = Class("DOM", { function tag(args, namespaces) { let _namespaces = namespaces; + if (isinstance(args, ["String", _])) + return doc.createTextNode(args); + let [name, attr] = args; + attr = attr || {}; if (Array.isArray(name) || args.length == 0) { var frag = doc.createDocumentFragment(); @@ -1607,8 +1612,7 @@ var DOM = Class("DOM", { elem.setAttribute(key, val); } args.forEach(function(e) { - elem.appendChild(typeof e == "object" ? tag(e, namespaces) : - e instanceof Node ? e : doc.createTextNode(e)); + elem.appendChild(e instanceof Ci.nsIDOMNode ? e : tag(e, namespaces)); }); if ("highlight" in attr) diff --git a/common/modules/util.jsm b/common/modules/util.jsm index 28dd6869..288c30c4 100644 --- a/common/modules/util.jsm +++ b/common/modules/util.jsm @@ -1024,6 +1024,63 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]), return color ? <div style="white-space: pre-wrap;">{string}</div> : [s for each (s in string)].join(""); }, + prettifyJSON: function prettifyJSON(data, indent) { + const INDENT = indent || " "; + + function rec(data, level, seen) { + if (isObject(data)) { + if (~seen.indexOf(data)) + throw Error("Recursive object passed"); + seen = seen.concat([data]); + } + + let prefix = level + INDENT; + + if (data === undefined) + data = null; + + if (~["boolean", "number"].indexOf(typeof data) || data === null) + res.push(String(data)); + else if (isinstance(data, ["String", _])) + res.push(String.quote(data)); + else if (isArray(data)) { + if (data.length == 0) + res.push("[]"); + else { + res.push("[\n") + for (let [i, val] in Iterator(data)) { + if (i) + res.push(",\n"); + res.push(prefix) + rec(val, prefix, seen); + } + res.push("\n", level, "]"); + } + } + else if (isObject(data)) { + res.push("{\n") + + let i = 0; + for (let [key, val] in Iterator(data)) { + if (i++) + res.push(",\n"); + res.push(prefix, String.quote(key), ": ") + rec(val, prefix, seen); + } + if (i > 0) + res.push("\n", level, "}") + else + res[res.length - 1] = "{}"; + } + else + throw Error("Invalid JSON object"); + } + + let res = []; + rec(data, "", []); + return res.join(""); + }, + observers: { "dactyl-cleanup-modules": function (subject, reason) { defineModule.loadLog.push("dactyl: util: observe: dactyl-cleanup-modules " + reason); |