-
Notifications
You must be signed in to change notification settings - Fork 95
/
serializable.rs
52 lines (45 loc) · 1.63 KB
/
serializable.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use std::io::Error;
use ego_tree::{iter::Edge, NodeRef};
use html5ever::serialize::{Serializer, TraversalScope};
use crate::Node;
/// Serialize an HTML node using html5ever serializer.
pub(crate) fn serialize<S: Serializer>(
self_node: NodeRef<Node>,
serializer: &mut S,
traversal_scope: TraversalScope,
) -> Result<(), Error> {
for edge in self_node.traverse() {
match edge {
Edge::Open(node) => {
if node == self_node && traversal_scope == TraversalScope::ChildrenOnly(None) {
continue;
}
match *node.value() {
Node::Doctype(ref doctype) => {
serializer.write_doctype(doctype.name())?;
}
Node::Comment(ref comment) => {
serializer.write_comment(comment)?;
}
Node::Text(ref text) => {
serializer.write_text(text)?;
}
Node::Element(ref elem) => {
let attrs = elem.attrs.iter().map(|(k, v)| (k, &v[..]));
serializer.start_elem(elem.name.clone(), attrs)?;
}
_ => (),
}
}
Edge::Close(node) => {
if node == self_node && traversal_scope == TraversalScope::ChildrenOnly(None) {
continue;
}
if let Some(elem) = node.value().as_element() {
serializer.end_elem(elem.name.clone())?;
}
}
}
}
Ok(())
}