1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-28 00:12:27 +01:00

Add a basic XPath generator.

This commit is contained in:
Kris Maglione
2011-08-07 14:36:22 -04:00
parent 16394c75a5
commit fc09e4828f

View File

@@ -748,14 +748,53 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
}
},
{
resolver: function lookupNamespaceURI(prefix) ({
xul: XUL.uri,
xhtml: XHTML.uri,
xhtml2: "http://www.w3.org/2002/06/xhtml2",
dactyl: NS.uri
}[prefix] || null)
resolver: function lookupNamespaceURI(prefix) (util.namespaces[prefix] || null)
}),
/**
* Generates an XPath expression for the given element.
*
* @param {Element} elem The element for which to generate an XPath.
* @returns {string}
*/
generateXPath: function generateXPath(elem) {
function quote(val) "'" + val.replace(/[\\']/g, "\\$&") + "'";
let res = [];
let doc = elem.ownerDocument;
for (;; elem = elem.parentNode) {
if (!(elem instanceof Ci.nsIDOMElement))
res.push("");
else if (elem.id)
res.push("id(" + quote(elem.id) + ")");
else {
let name = elem.localName;
if (elem.namespaceURI && (elem.namespaceURI != XHTML || doc.xmlVersion))
if (elem.namespaceURI in this.namespaceNames)
name = this.namespaceNames[elem.namespaceURI] + ":" + name;
else
name = "*:" + name + "[namespace-uri()=" + quote(elem.namespaceURI) + "]";
res.push(name + "[" + (1 + iter(this.evaluateXPath("./" + name, elem.parentNode)).indexOf(elem)) + "]");
continue;
}
break;
}
return res.reverse().join("/");
},
namespaces: {
xul: XUL.uri,
html: XHTML.uri,
xhtml: XHTML.uri,
xhtml2: "http://www.w3.org/2002/06/xhtml2",
dactyl: NS.uri
},
namespaceNames: Class.memoize(function ()
iter(this.namespaces).map(function ([k, v]) [v, k]).toObject()),
extend: function extend(dest) {
Array.slice(arguments, 1).filter(util.identity).forEach(function (src) {
for (let [k, v] in Iterator(src)) {
@@ -1131,7 +1170,7 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
return String(object);
function namespaced(node) {
var ns = NAMESPACES[node.namespaceURI] || /^(?:(.*?):)?/.exec(node.name)[0];
var ns = util.namespaceNames[node.namespaceURI] || /^(?:(.*?):)?/.exec(node.name)[0];
if (!ns)
return node.localName;
if (color)
@@ -1140,11 +1179,6 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
}
if (object instanceof Ci.nsIDOMElement) {
const NAMESPACES = array.toObject([
[NS, "dactyl"],
[XHTML, "html"],
[XUL, "xul"]
]);
let elem = object;
if (elem.nodeType == elem.TEXT_NODE)
return elem.data;