sws_scraper/element_ref/
serializable.rs1use 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}