summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/content/abbreviations.js50
-rw-r--r--common/content/commandline.js14
-rw-r--r--common/content/mow.js11
-rw-r--r--common/modules/dom.jsm10
-rw-r--r--common/modules/util.jsm57
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>&#x0d;{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>&#x0d;{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);