com.itextpdf.styledxmlparser.jsoup.select.CombiningEvaluator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of styled-xml-parser Show documentation
Show all versions of styled-xml-parser Show documentation
Styled XML parser is used by iText modules to parse HTML and XML
/*
This file is part of the iText (R) project.
Copyright (c) 1998-2023 Apryse Group NV
Authors: Apryse Software.
This program is offered under a commercial and under the AGPL license.
For commercial licensing, contact us at https://itextpdf.com/sales. For AGPL licensing, see below.
AGPL licensing:
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package com.itextpdf.styledxmlparser.jsoup.select;
import com.itextpdf.styledxmlparser.jsoup.internal.StringUtil;
import com.itextpdf.styledxmlparser.jsoup.nodes.Element;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/**
* Base combining (and, or) evaluator.
*/
abstract class CombiningEvaluator extends Evaluator {
final ArrayList evaluators;
int num = 0;
CombiningEvaluator() {
super();
evaluators = new ArrayList<>();
}
CombiningEvaluator(Collection evaluators) {
this();
this.evaluators.addAll(evaluators);
updateNumEvaluators();
}
Evaluator rightMostEvaluator() {
return num > 0 ? evaluators.get(num - 1) : null;
}
void replaceRightMostEvaluator(Evaluator replacement) {
evaluators.set(num - 1, replacement);
}
void updateNumEvaluators() {
// used so we don't need to bash on size() for every match test
num = evaluators.size();
}
static final class And extends CombiningEvaluator {
And(Collection evaluators) {
super(evaluators);
}
And(Evaluator... evaluators) {
this(Arrays.asList(evaluators));
}
@Override
public boolean matches(Element root, Element node) {
for (int i = num - 1; i >= 0; i--) {
// process backwards so that :matchText is evaled earlier, to catch parent query.
Evaluator s = evaluators.get(i);
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 evaluators) {
super();
if (num > 1)
this.evaluators.add(new And(evaluators));
else // 0 or 1
this.evaluators.addAll(evaluators);
updateNumEvaluators();
}
Or(Evaluator... evaluators) { this(Arrays.asList(evaluators)); }
Or() {
super();
}
public void add(Evaluator e) {
evaluators.add(e);
updateNumEvaluators();
}
@Override
public boolean matches(Element root, Element node) {
for (int i = 0; i < num; i++) {
Evaluator s = evaluators.get(i);
if (s.matches(root, node))
return true;
}
return false;
}
@Override
public String toString() {
return StringUtil.join(evaluators, ", ");
}
}
}