html2md/
dummy.rs

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