SimilarRunVisitor.java
package pro.verron.officestamper.preset.preprocessors.similarrun;
import org.docx4j.utils.TraversalUtilVisitor;
import org.docx4j.wml.R;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/// A visitor implementation for traversing and identifying runs with similar styling in a DOCX document. This class
/// extends [TraversalUtilVisitor] to process Run elements ([R]) and group consecutive runs that share the same
/// formatting properties together.
public class SimilarRunVisitor
extends TraversalUtilVisitor<R> {
private final List<List<R>> similarStyleRuns = new ArrayList<>();
/// Retrieves the list of grouped runs that have similar styling. Each inner list contains consecutive runs that
/// share the same formatting properties.
///
/// @return A list of lists, where each inner list contains runs with similar styling.
public List<List<R>> getSimilarStyleRuns() {
return similarStyleRuns;
}
@Override
public void apply(R element, Object parent, List<Object> siblings) {
var rPr = element.getRPr();
var currentIndex = siblings.indexOf(element);
var similarRuns = siblings.stream()
.skip(currentIndex)
.takeWhile(o -> o instanceof R run && Objects.equals(run.getRPr(), rPr))
.map(R.class::cast)
.toList();
if (similarRuns.size() > 1) similarStyleRuns.add(similarRuns);
}
}