Refactor XML visitor to visit on entry/exit (#26)
parent
21358c663a
commit
002a65657c
@ -1,22 +1,29 @@
|
||||
use roxmltree::{Document, Node};
|
||||
|
||||
pub trait XmlVisitor {
|
||||
fn visit(&mut self, node: Node);
|
||||
fn visit_enter(&mut self, node: Node);
|
||||
fn visit_exit(&mut self, node: Node);
|
||||
}
|
||||
|
||||
pub fn is_valid_node(node: &Node) -> bool {
|
||||
return node.is_element() && !node.attribute("style").unwrap_or_default().contains("display:none");
|
||||
pub fn is_valid_node(node: Node) -> bool {
|
||||
return node.is_element()
|
||||
&& !node
|
||||
.attribute("style")
|
||||
.unwrap_or_default()
|
||||
.contains("display:none");
|
||||
}
|
||||
|
||||
pub fn depth_first_visit(doc: &Document, visitor: &mut impl XmlVisitor) {
|
||||
let mut stack = doc
|
||||
.root()
|
||||
.children()
|
||||
.rev()
|
||||
.filter(|x| is_valid_node(x))
|
||||
.collect::<Vec<_>>();
|
||||
while let Some(node) = stack.pop() {
|
||||
visitor.visit(node);
|
||||
stack.extend(node.children().rev().filter(|x| is_valid_node(x)));
|
||||
fn visit_node(node: Node, visitor: &mut impl XmlVisitor) {
|
||||
if !is_valid_node(node) {
|
||||
return;
|
||||
}
|
||||
visitor.visit_enter(node);
|
||||
node.children().for_each(|child| visit_node(child, visitor));
|
||||
visitor.visit_exit(node);
|
||||
}
|
||||
|
||||
doc.root()
|
||||
.children()
|
||||
.for_each(|child| visit_node(child, visitor));
|
||||
}
|
||||
|
Loading…
Reference in new issue