css_knife/
visit_class.rs

1use std::string::FromUtf8Error;
2
3use lol_html::{self, element, HtmlRewriter, Settings};
4
5use crate::visit_selectors::ClassVisitor;
6
7pub fn check_html(
8    document: &str,
9    msv: &ClassVisitor,
10) -> Result<String, FromUtf8Error> {
11    let mut output = vec![];
12    let mut rewriter = HtmlRewriter::new(
13        Settings {
14            element_content_handlers: vec![element!("[class]", |el| {
15                let classes = el.get_attribute("class").unwrap();
16                let classes = classes.split(' ');
17                let classes = classes
18                    .into_iter()
19                    .map(|c| {
20                        if let Some(class) = msv.get(c) {
21                            return class;
22                        }
23                        c.to_string()
24                    })
25                    .collect::<Vec<String>>()
26                    .join(" ");
27                let _r = el.set_attribute("class", &classes);
28
29                Ok(())
30            })],
31            ..Settings::default()
32        },
33        |c: &[u8]| output.extend_from_slice(c),
34    );
35    let _ = rewriter.write(document.as_bytes());
36    let _ = rewriter.end();
37    String::from_utf8(output)
38}