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