html2md/
dummy.rs

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/// Handler that completely copies tag to printer as HTML with all descendants
19#[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            // couldn't serialize the tag
34            return;
35        }
36
37        let conv = String::from_utf8(buffer);
38        if conv.is_err() {
39            // Is non UTF-8 string possible in html5ever?
40            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/// Handler that copies just one tag and doesn't skip descendants
54#[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}