sws_scraper/element_ref/
serializable.rs

1use std::io::Error;
2
3use html5ever::serialize::{Serialize, Serializer, TraversalScope};
4use sws_tree::iter::Edge;
5
6use crate::element_ref::ElementRef;
7use crate::node::Node;
8
9impl Serialize for ElementRef {
10    fn serialize<S>(&self, serializer: &mut S, traversal_scope: TraversalScope) -> Result<(), Error>
11    where
12        S: Serializer,
13    {
14        for edge in self.traverse() {
15            match edge {
16                Edge::Open(node) => {
17                    if node == **self && traversal_scope == TraversalScope::ChildrenOnly(None) {
18                        continue;
19                    }
20
21                    node.map_value(|v| match *v {
22                        Node::Doctype(ref doctype) => serializer.write_doctype(doctype.name()),
23                        Node::Comment(ref comment) => serializer.write_comment(comment),
24                        Node::Text(ref text) => serializer.write_text(text),
25                        Node::Element(ref elem) => {
26                            let attrs = elem.attrs.iter().map(|(k, v)| (k, &v[..]));
27                            serializer.start_elem(elem.name.clone(), attrs)
28                        }
29                        _ => Ok(()),
30                    })
31                    .transpose()?;
32                }
33
34                Edge::Close(node) => {
35                    if node == **self && traversal_scope == TraversalScope::ChildrenOnly(None) {
36                        continue;
37                    }
38
39                    node.map_value(|v| {
40                        if let Some(elem) = v.as_element() {
41                            serializer.end_elem(elem.name.clone())
42                        } else {
43                            Ok(())
44                        }
45                    })
46                    .transpose()?;
47                }
48            }
49        }
50
51        Ok(())
52    }
53}