1use super::StructuredPrinter;
2use super::TagHandler;
3use html5ever::serialize;
4use html5ever::serialize::{SerializeOpts, TraversalScope};
5use markup5ever_rcdom::{Handle, NodeData, SerializableHandle};
6
7#[derive(Default)]
8pub struct DummyHandler;
9
10impl TagHandler for DummyHandler {
11 fn handle(&mut self, _tag: &Handle, _printer: &mut StructuredPrinter) {}
12
13 fn after_handle(&mut self, _printer: &mut StructuredPrinter) {}
14}
15
16#[derive(Default)]
18pub struct IdentityHandler;
19
20impl TagHandler for IdentityHandler {
21 fn handle(&mut self, tag: &Handle, printer: &mut StructuredPrinter) {
22 let mut buffer = vec![];
23
24 let options = SerializeOpts {
25 traversal_scope: TraversalScope::IncludeNode,
26 ..Default::default()
27 };
28 let to_be_serialized = SerializableHandle::from(tag.clone());
29 let result = serialize(&mut buffer, &to_be_serialized, options);
30 if result.is_err() {
31 return;
33 }
34
35 let conv = String::from_utf8(buffer);
36 if conv.is_err() {
37 return;
39 }
40
41 printer.append_str(&conv.unwrap());
42 }
43
44 fn skip_descendants(&self) -> bool {
45 true
46 }
47
48 fn after_handle(&mut self, _printer: &mut StructuredPrinter) {}
49}
50
51#[derive(Default)]
53pub struct HtmlCherryPickHandler {
54 tag_name: String,
55}
56
57impl TagHandler for HtmlCherryPickHandler {
58 fn handle(&mut self, tag: &Handle, printer: &mut StructuredPrinter) {
59 if let NodeData::Element {
60 ref name,
61 ref attrs,
62 ..
63 } = tag.data
64 {
65 let attrs = attrs.borrow();
66 self.tag_name = name.local.to_string();
67
68 printer.append_str(&format!("<{}", self.tag_name));
69 for attr in attrs.iter() {
70 printer.append_str(&format!(" {}=\"{}\"", attr.name.local, attr.value));
71 }
72 printer.append_str(">");
73 }
74 }
75
76 fn skip_descendants(&self) -> bool {
77 false
78 }
79
80 fn after_handle(&mut self, printer: &mut StructuredPrinter) {
81 printer.append_str(&format!("</{}>", self.tag_name));
82 }
83}