blitz_html/
html_document.rs

1use std::ops::{Deref, DerefMut};
2
3use crate::DocumentHtmlParser;
4
5use blitz_dom::{BaseDocument, DEFAULT_CSS, Document, DocumentConfig};
6
7pub struct HtmlDocument {
8    inner: BaseDocument,
9}
10
11// Implement DocumentLike and required traits for HtmlDocument
12impl Deref for HtmlDocument {
13    type Target = BaseDocument;
14    fn deref(&self) -> &BaseDocument {
15        &self.inner
16    }
17}
18impl DerefMut for HtmlDocument {
19    fn deref_mut(&mut self) -> &mut Self::Target {
20        &mut self.inner
21    }
22}
23impl From<HtmlDocument> for BaseDocument {
24    fn from(doc: HtmlDocument) -> BaseDocument {
25        doc.inner
26    }
27}
28impl Document for HtmlDocument {
29    fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
30        self
31    }
32}
33
34impl HtmlDocument {
35    /// Parse HTML (or XHTML) into an [`HtmlDocument`]
36    pub fn from_html(html: &str, mut config: DocumentConfig) -> Self {
37        if let Some(ss) = &mut config.ua_stylesheets {
38            if !ss.iter().any(|s| s == DEFAULT_CSS) {
39                ss.push(String::from(DEFAULT_CSS));
40            }
41        }
42        let mut doc = BaseDocument::new(config);
43        let mut mutr = doc.mutate();
44        DocumentHtmlParser::parse_into_mutator(&mut mutr, html);
45        drop(mutr);
46        HtmlDocument { inner: doc }
47    }
48
49    /// Convert the [`HtmlDocument`] into it's inner [`BaseDocument`]
50    pub fn into_inner(self) -> BaseDocument {
51        self.into()
52    }
53}