mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2026-01-06 01:14:10 +01:00
Add cheap HTML prettifier.
This commit is contained in:
@@ -763,9 +763,8 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
||||
.replace(/^ {12}|[ \t]+$/gm, "")
|
||||
.replace(/^\s*\n|\n\s*$/g, "") + "\n";
|
||||
},
|
||||
_generateHelp: function generateHelp(obj, extraHelp, str, specOnly) {
|
||||
// E4X-FIXME
|
||||
|
||||
_generateHelp: function generateHelp(obj, extraHelp, str, specOnly) {
|
||||
let link, tag, spec;
|
||||
link = tag = spec = util.identity;
|
||||
let args = null;
|
||||
@@ -803,21 +802,23 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
||||
args = { value: "", values: [] };
|
||||
}
|
||||
|
||||
let br = "\n\
|
||||
";
|
||||
|
||||
let res = [
|
||||
["dt", {}, link(obj.helpTag || tag(obj.name), obj.name)], " ",
|
||||
["dt", {}, link(obj.helpTag || tag(obj.name), obj.name)],
|
||||
["dd", {},
|
||||
template_.linkifyHelp(obj.description ? obj.description.replace(/\.$/, "") : "", true)]];
|
||||
if (specOnly)
|
||||
return res;
|
||||
|
||||
let description = ["description", {},
|
||||
obj.description ? ["p", {}, template_.linkifyHelp(obj.description.replace(/\.?$/, "."), true)] : "",
|
||||
extraHelp ? extraHelp : "",
|
||||
!(extraHelp || obj.description) ? ["p", {}, /*L*/ "Sorry, no help available."] : ""]
|
||||
|
||||
res.push(
|
||||
["item", {},
|
||||
["tags", {}, template_.map(obj.names.slice().reverse(),
|
||||
tag,
|
||||
" ")],
|
||||
" ").join("")],
|
||||
["spec", {},
|
||||
let (name = (obj.specs || obj.names)[0])
|
||||
spec(template_.highlightRegexp(tag(name),
|
||||
@@ -826,19 +827,14 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
||||
name)],
|
||||
!obj.type ? "" : [
|
||||
["type", {}, obj.type],
|
||||
["default", {}, obj.stringDefaultValue],
|
||||
["description", {},
|
||||
obj.description ? /*br*/ ["p", {}, template_.linkifyHelp(obj.description.replace(/\.?$/, "."), true)] : "",
|
||||
extraHelp ? /*br*/ extraHelp : "",
|
||||
!(extraHelp || obj.description) ? /*br*/ ["p", {}, /*L*/ "Sorry, no help available."] : ""]]]);
|
||||
["default", {}, obj.stringDefaultValue]],
|
||||
description]);
|
||||
|
||||
function add(ary) {
|
||||
res.item.description.* += br +
|
||||
let (br = br + " ")
|
||||
["dl", {}, /*br*/ template_.map(ary,
|
||||
function ([a, b]) [["dt", {}, a], " ",
|
||||
["dd", {}, b]],
|
||||
br)]
|
||||
description.push(
|
||||
["dl", {}, template_.map(ary,
|
||||
function ([a, b]) [["dt", {}, a], " ",
|
||||
["dd", {}, b]])]);
|
||||
}
|
||||
|
||||
if (obj.completer && false)
|
||||
@@ -856,11 +852,7 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
||||
")"]]
|
||||
]));
|
||||
|
||||
util.dump(util.prettifyJSON(res, null, true));
|
||||
return DOM.toXML(res)
|
||||
.replace(' xmlns="' + NS + '"', "", "g")
|
||||
.replace(/^ {12}|[ \t]+$/gm, "")
|
||||
.replace(/^\s*\n|\n\s*$/g, "") + "\n";
|
||||
return DOM.toPrettyXML(res, true, null, { "": String(NS) });
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -1588,6 +1588,9 @@ var DOM = Class("DOM", {
|
||||
attr = attr || {};
|
||||
|
||||
function parseNamespace(name) {
|
||||
if (name == "xmlns")
|
||||
return ["xmlns", ""];
|
||||
|
||||
var m = /^(?:(.*):)?(.*)$/.exec(name);
|
||||
return [namespaces[m[1]], m[2]];
|
||||
}
|
||||
@@ -1604,7 +1607,7 @@ var DOM = Class("DOM", {
|
||||
var args = Array.slice(args, 2);
|
||||
var vals = parseNamespace(name);
|
||||
var elem = doc.createElementNS(vals[0] || namespaces[""],
|
||||
vals[1]);
|
||||
name);
|
||||
|
||||
for (var key in attr)
|
||||
if (!/^xmlns(?:$|:)/.test(key)) {
|
||||
@@ -1613,12 +1616,12 @@ var DOM = Class("DOM", {
|
||||
nodes[val] = elem;
|
||||
|
||||
vals = parseNamespace(key);
|
||||
if (typeof val == "function")
|
||||
if (vals[0] == "xmlns" || key == "highlight")
|
||||
;
|
||||
else if (typeof val == "function")
|
||||
elem.addEventListener(key.replace(/^on/, ""), val, false);
|
||||
else if (vals[0])
|
||||
elem.setAttributeNS(vals[0], key, val);
|
||||
else if (key != "highlight")
|
||||
elem.setAttribute(key, val);
|
||||
else
|
||||
elem.setAttributeNS(vals[0] || "", key, val);
|
||||
}
|
||||
args.forEach(function(e) {
|
||||
elem.appendChild(tag(e, namespaces));
|
||||
@@ -1640,6 +1643,7 @@ var DOM = Class("DOM", {
|
||||
"": "http://www.w3.org/1999/xhtml",
|
||||
dactyl: String(NS),
|
||||
html: "http://www.w3.org/1999/xhtml",
|
||||
xmlns: "xmlns",
|
||||
xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
}
|
||||
}),
|
||||
@@ -1652,7 +1656,161 @@ var DOM = Class("DOM", {
|
||||
.serializeToString(node);
|
||||
},
|
||||
|
||||
toPrettyXML: function toPrettyXML(xml, asXML, indent, namespaces) {
|
||||
const INDENT = indent || " ";
|
||||
|
||||
const EMPTY = Set("area base basefont br col frame hr img input isindex link meta param"
|
||||
.split(" "));
|
||||
|
||||
function namespaced(namespaces, namespace, localName) {
|
||||
for (let [k, v] in Iterator(namespaces))
|
||||
if (v == namespace)
|
||||
return (k ? k + ":" + localName : localName);
|
||||
|
||||
throw Error("No such namespace");
|
||||
}
|
||||
|
||||
function isFragment(args) !isString(args[0]) || args.length == 0 || args[0] === "";
|
||||
|
||||
function hasString(args) {
|
||||
return args.some(function (a) isString(a) || isFragment(a) && hasString(a))
|
||||
}
|
||||
|
||||
function isStrings(args) {
|
||||
if (!isArray(args))
|
||||
return util.dump("ARGS: " + {}.toString.call(args) + " " + args), false;
|
||||
return args.every(function (a) isinstance(a, ["String", DOM.DOMString]) || isFragment(a) && isStrings(a))
|
||||
}
|
||||
|
||||
function tag(args, namespaces, indent) {
|
||||
let _namespaces = namespaces;
|
||||
|
||||
if (args == "")
|
||||
return "";
|
||||
|
||||
if (isinstance(args, ["String", "Number", _, DOM.DOMString]))
|
||||
return indent +
|
||||
DOM.escapeHTML(String(args), true);
|
||||
|
||||
if (isXML(args))
|
||||
return indent +
|
||||
args.toXMLString()
|
||||
.replace(/^/m, indent);
|
||||
|
||||
if (isObject(args) && "toDOM" in args)
|
||||
return indent +
|
||||
services.XMLSerializer()
|
||||
.serializeToString(args.toDOM(services.XMLDocument()))
|
||||
.replace(/^/m, indent);
|
||||
|
||||
if (args instanceof Ci.nsIDOMNode)
|
||||
return indent +
|
||||
services.XMLSerializer()
|
||||
.serializeToString(args)
|
||||
.replace(/^/m, indent);
|
||||
|
||||
let [name, attr] = args;
|
||||
|
||||
if (isFragment(args)) {
|
||||
let res = [];
|
||||
let join = isArray(args) && isStrings(args) ? "" : "\n";
|
||||
Array.forEach(args, function (arg) {
|
||||
if (!isArray(arg[0]))
|
||||
arg = [arg];
|
||||
|
||||
let contents = [];
|
||||
arg.forEach(function (arg) {
|
||||
let string = tag(arg, namespaces, indent);
|
||||
if (string)
|
||||
contents.push(string);
|
||||
});
|
||||
if (contents.length)
|
||||
res.push(contents.join("\n"), join)
|
||||
});
|
||||
if (res[res.length - 1] == join)
|
||||
res.pop();
|
||||
return res.join("");
|
||||
}
|
||||
|
||||
attr = attr || {};
|
||||
|
||||
function parseNamespace(name) {
|
||||
var m = /^(?:(.*):)?(.*)$/.exec(name);
|
||||
return [namespaces[m[1]], m[2]];
|
||||
}
|
||||
|
||||
// FIXME: Surely we can do better.
|
||||
let skipAttr = {};
|
||||
for (var key in attr) {
|
||||
if (/^xmlns(?:$|:)/.test(key)) {
|
||||
if (_namespaces === namespaces)
|
||||
namespaces = update({}, namespaces);
|
||||
|
||||
let ns = namespaces[attr[key]] || attr[key];
|
||||
if (ns == namespaces[key.substr(6)])
|
||||
skipAttr[key] = true;
|
||||
|
||||
attr[key] = namespaces[key.substr(6)] = ns;
|
||||
}}
|
||||
|
||||
var args = Array.slice(args, 2);
|
||||
var vals = parseNamespace(name);
|
||||
|
||||
let res = [indent, "<", name];
|
||||
|
||||
for (let [key, val] in Iterator(attr)) {
|
||||
if (Set.has(skipAttr, key))
|
||||
continue;
|
||||
|
||||
let vals = parseNamespace(key);
|
||||
if (typeof val == "function") {
|
||||
key = key.replace(/^(?:on)?/, "on");
|
||||
val = val.toSource() + "(event)";
|
||||
}
|
||||
|
||||
if (key != "highlight" || vals[0] == String(NS))
|
||||
res.push(" ", key, '="', DOM.escapeHTML(val), '"');
|
||||
else
|
||||
res.push(" ", namespaced(namespaces, String(NS), "highlight"),
|
||||
'="', DOM.escapeHTML(val), '"');
|
||||
}
|
||||
|
||||
if ((vals[0] || namespaces[""]) == String(XHTML) && Set.has(EMPTY, vals[1])
|
||||
|| asXML && !args.length)
|
||||
res.push("/>");
|
||||
else {
|
||||
res.push(">");
|
||||
|
||||
if (isStrings(args))
|
||||
res.push(args.map(function (e) tag(e, namespaces, "")).join(""),
|
||||
"</", name, ">");
|
||||
else {
|
||||
let contents = [];
|
||||
args.forEach(function(e) {
|
||||
let string = tag(e, namespaces, indent + INDENT);
|
||||
if (string)
|
||||
contents.push(string);
|
||||
});
|
||||
|
||||
res.push("\n", contents.join("\n"), "\n", indent, "</", name, ">");
|
||||
}
|
||||
}
|
||||
|
||||
return res.join("");
|
||||
}
|
||||
|
||||
if (namespaces)
|
||||
namespaces = update({}, DOM.fromJSON.namespaces, namespaces);
|
||||
else
|
||||
namespaces = DOM.fromJSON.namespaces;
|
||||
|
||||
return tag(xml, namespaces, "")
|
||||
},
|
||||
|
||||
parseNamespace: function parseNamespace(name) {
|
||||
if (name == "xmlns")
|
||||
return ["xmlns", ""];
|
||||
|
||||
var m = /^(?:(.*):)?(.*)$/.exec(name);
|
||||
return [DOM.fromJSON.namespaces[m[1]], m[2]];
|
||||
},
|
||||
|
||||
@@ -315,7 +315,7 @@ var Help = Module("Help", {
|
||||
if (isinstance(node, [Ci.nsIDOMHTMLBaseElement]))
|
||||
return;
|
||||
|
||||
data.push("<"); data.push(node.localName);
|
||||
data.push("<", node.localName);
|
||||
if (node instanceof Ci.nsIDOMHTMLHtmlElement)
|
||||
data.push(" xmlns=" + XHTML.uri.quote(),
|
||||
" xmlns:dactyl=" + NS.uri.quote());
|
||||
|
||||
@@ -279,12 +279,12 @@ var Overlay = Module("Overlay", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReferen
|
||||
name = attr, val = attrs[attr];
|
||||
|
||||
savedAttrs.push([elem, ns, name, getAttr(elem, ns, name), val]);
|
||||
if (name === "highlight")
|
||||
if (ns == "xmlns")
|
||||
;
|
||||
else if (name === "highlight")
|
||||
highlight.highlightNode(elem, val);
|
||||
else if (ns)
|
||||
elem.setAttributeNS(ns, name, val);
|
||||
else
|
||||
elem.setAttribute(name, val);
|
||||
elem.setAttributeNS(ns || "", name, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user