diff options
Diffstat (limited to 'server/src/org/jsoup/select/CombiningEvaluator.java')
-rw-r--r-- | server/src/org/jsoup/select/CombiningEvaluator.java | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/server/src/org/jsoup/select/CombiningEvaluator.java b/server/src/org/jsoup/select/CombiningEvaluator.java new file mode 100644 index 0000000000..a31ed2636f --- /dev/null +++ b/server/src/org/jsoup/select/CombiningEvaluator.java @@ -0,0 +1,94 @@ +package org.jsoup.select; + +import org.jsoup.helper.StringUtil; +import org.jsoup.nodes.Element; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * Base combining (and, or) evaluator. + */ +abstract class CombiningEvaluator extends Evaluator { + final List<Evaluator> evaluators; + + CombiningEvaluator() { + super(); + evaluators = new ArrayList<Evaluator>(); + } + + CombiningEvaluator(Collection<Evaluator> evaluators) { + this(); + this.evaluators.addAll(evaluators); + } + + Evaluator rightMostEvaluator() { + return evaluators.size() > 0 ? evaluators.get(evaluators.size() - 1) : null; + } + + void replaceRightMostEvaluator(Evaluator replacement) { + evaluators.set(evaluators.size() - 1, replacement); + } + + static final class And extends CombiningEvaluator { + And(Collection<Evaluator> evaluators) { + super(evaluators); + } + + And(Evaluator... evaluators) { + this(Arrays.asList(evaluators)); + } + + @Override + public boolean matches(Element root, Element node) { + for (Evaluator s : evaluators) { + if (!s.matches(root, node)) + return false; + } + return true; + } + + @Override + public String toString() { + return StringUtil.join(evaluators, " "); + } + } + + static final class Or extends CombiningEvaluator { + /** + * Create a new Or evaluator. The initial evaluators are ANDed together and used as the first clause of the OR. + * @param evaluators initial OR clause (these are wrapped into an AND evaluator). + */ + Or(Collection<Evaluator> evaluators) { + super(); + if (evaluators.size() > 1) + this.evaluators.add(new And(evaluators)); + else // 0 or 1 + this.evaluators.addAll(evaluators); + } + + Or() { + super(); + } + + public void add(Evaluator e) { + evaluators.add(e); + } + + @Override + public boolean matches(Element root, Element node) { + for (Evaluator s : evaluators) { + if (s.matches(root, node)) + return true; + } + return false; + } + + @Override + public String toString() { + return String.format(":or%s", evaluators); + } + } +} |