public NodeList<Element> select(String selector, Node ctx) {
if (nativePseudo.test(selector)) {
// move gQuery filters at the end to improve performance, and deal with issue #220
MatchResult r;
while ((r = nativePseudo.exec(selector)) != null) {
selector = r.getGroup(1) + ":" + r.getGroup(3);
if (!r.getGroup(3).equals(r.getGroup(2))) {
selector += ":" + r.getGroup(2);
}
selector += r.getGroup(4);
}
}
if (gQueryPseudo.test(selector)) {
JsNodeArray res = JsNodeArray.create();
for (String s : selector.trim().split("\\s*,\\s*")) {
NodeList<Element> nodes;
MatchResult a = gQueryPseudo.exec(s);
if (a != null) {
String select = a.getGroup(1).isEmpty() ? "*" : a.getGroup(1);
String pseudo = a.getGroup(2);
Predicate pred = filters.get(pseudo.toLowerCase());
if (pred != null) {
nodes = filter(select(select, ctx), pred);
} else if (nativePseudo.test(pseudo)) {
nodes = select(select, ctx);