/** * Iterates through the sub-tree and invokes the given handler for each text node. * * @param textNodeHandler the handler invoked for each text node */ public void visitTexts(Consumer<Node> textNodeHandler) { visit(null, textNodeHandler); }
/** * Iterates through the sub-tree and invokes the given handler for each child node. * * @param nodeHandler the handler invoked for each child element */ public void visitNodes(Consumer<StructuredNode> nodeHandler) { visit(nodeHandler, null); }
/** * Iterates through the sub-tree and invokes the appropriate handler for each child node. * * @param nodeHandler the handler invoked for each element node * @param textNodeHandler the handler invoked for each text node */ public void visit(@Nullable Consumer<StructuredNode> nodeHandler, @Nullable Consumer<Node> textNodeHandler) { if (node.getNodeType() == Node.TEXT_NODE) { if (textNodeHandler != null) { textNodeHandler.accept(node); } } else if (node.getNodeType() == Node.ELEMENT_NODE) { if (nodeHandler != null) { nodeHandler.accept(this); } getChildren().forEach(c -> c.visit(nodeHandler, textNodeHandler)); } }