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