Refactor XML visitor to visit on entry/exit (#26)

master
Sameer Puri 4 years ago committed by GitHub
parent 21358c663a
commit 002a65657c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -102,7 +102,7 @@ impl<'a, 'input: 'a> ConversionVisitor<'a, PreprocessTurtle> {
}
impl<'a, T: Turtle> visit::XmlVisitor for ConversionVisitor<'a, T> {
fn visit(&mut self, node: Node) {
fn visit_enter(&mut self, node: Node) {
if node.tag_name().name() == CLIP_PATH_TAG_NAME {
warn!("Clip paths are not supported: {:?}", node);
}
@ -217,26 +217,12 @@ impl<'a, T: Turtle> visit::XmlVisitor for ConversionVisitor<'a, T> {
}
}
if node.first_element_child().is_some() {
self.name_stack.push(node_name(&node));
} else {
// Pop transform since this is the only element that has it
self.terrarium.pop_transform();
let mut parent = Some(node);
while let Some(p) = parent {
if p.next_sibling_element().is_some()
|| p.is_root()
|| p.tag_name().name() == SVG_TAG_NAME
{
break;
}
// Pop the parent transform since this is the last child
self.terrarium.pop_transform();
self.name_stack.pop();
parent = p.parent_element();
}
}
self.name_stack.push(node_name(&node));
}
fn visit_exit(&mut self, _node: Node) {
self.terrarium.pop_transform();
self.name_stack.pop();
}
}

@ -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…
Cancel
Save