Skip to content

Commit

Permalink
Externally expose types to allow analyzing parsed expressions and eas…
Browse files Browse the repository at this point in the history
…e backward compatibility with pre-node version of the library
  • Loading branch information
JLRishe committed Jan 7, 2016
1 parent 9d529f7 commit c96b9e9
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 11 deletions.
24 changes: 24 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -643,4 +643,28 @@ module.exports = {
test.done();
}

,"exposes custom types": function (test) {
assert.ok(xpath.XPath, "xpath.XPath");
assert.ok(xpath.XPathParser, "xpath.XPathParser");
assert.ok(xpath.XPathResult, "xpath.XPathResult");

assert.ok(xpath.Step, "xpath.Step");
assert.ok(xpath.NodeTest, "xpath.NodeTest");
assert.ok(xpath.BarOperation, "xpath.BarOperation");

assert.ok(xpath.NamespaceResolver, "xpath.NamespaceResolver");
assert.ok(xpath.FunctionResolver, "xpath.FunctionResolver");
assert.ok(xpath.VariableResolver, "xpath.VariableResolver");

assert.ok(xpath.Utilities, "xpath.Utilities");

assert.ok(xpath.XPathContext, "xpath.XPathContext");
assert.ok(xpath.XNodeSet, "xpath.XNodeSet");
assert.ok(xpath.XBoolean, "xpath.XBoolean");
assert.ok(xpath.XString, "xpath.XString");
assert.ok(xpath.XNumber, "xpath.XNumber");

test.done();
}

}
46 changes: 35 additions & 11 deletions xpath.js
Original file line number Diff line number Diff line change
Expand Up @@ -2326,17 +2326,13 @@ FunctionCall.prototype.toString = function() {
};

FunctionCall.prototype.evaluate = function(c) {
var fn = this.functionName;
var parts = Utilities.resolveQName(fn, c.namespaceResolver, c.contextNode, false);

if (parts[0] == null) {
throw new Error("Cannot resolve QName " + fn);
}
var f = c.functionResolver.getFunction(parts[1], parts[0]);
if (f == undefined) {
var f = FunctionResolver.getFunctionFromContext(this.functionName, c);

if (!f) {
throw new Error("Unknown function " + fn);
}
var a = [c].concat(this.arguments);

var a = [c].concat(this.arguments);
return f.apply(c.functionResolver.thisArg, a);
};

Expand Down Expand Up @@ -3245,8 +3241,18 @@ FunctionResolver.prototype.addFunction = function(ns, ln, f) {
this.functions["{" + ns + "}" + ln] = f;
};

FunctionResolver.prototype.getFunction = function(ln, ns) {
return this.functions["{" + ns + "}" + ln];
FunctionResolver.getFunctionFromContext = function(qName, context) {
var parts = Utilities.resolveQName(qName, context.namespaceResolver, context.contextNode, false);

if (parts[0] === null) {
throw new Error("Cannot resolve QName " + name);
}

return context.functionResolver.getFunction(parts[1], parts[0]);
};

FunctionResolver.prototype.getFunction = function(localName, namespace) {
return this.functions["{" + namespace + "}" + localName];
};

// NamespaceResolver /////////////////////////////////////////////////////////
Expand Down Expand Up @@ -4527,8 +4533,26 @@ installDOM3XPathSupport(exports, new XPathParser());
exports.parse = parse;
})();

exports.XPath = XPath;
exports.XPathParser = XPathParser;
exports.XPathResult = XPathResult;

exports.Step = Step;
exports.NodeTest = NodeTest;
exports.BarOperation = BarOperation;

exports.NamespaceResolver = NamespaceResolver;
exports.FunctionResolver = FunctionResolver;
exports.VariableResolver = VariableResolver;

exports.Utilities = Utilities;

exports.XPathContext = XPathContext;
exports.XNodeSet = XNodeSet;
exports.XBoolean = XBoolean;
exports.XString = XString;
exports.XNumber = XNumber;

// helper
exports.select = function(e, doc, single) {
return exports.selectWithResolver(e, doc, null, single);
Expand Down

0 comments on commit c96b9e9

Please sign in to comment.