not-tailwind 0.2.0

A tool for shortening css classes
Documentation
use std::string::FromUtf8Error;

use lol_html::{element, HtmlRewriter, Settings};

use crate::visit_selectors::ClassVisitor;

pub fn check_html(
    document: &str,
    msv: &ClassVisitor,
) -> Result<String, FromUtf8Error> {
    let mut output = vec![];
    let mut rewriter = HtmlRewriter::new(
        Settings {
            element_content_handlers: vec![element!("[class]", |el| {
                for cl in ["class", ":class"] {
                    let classes = el.get_attribute(cl).unwrap_or_default();
                    let mut in_expr = false;
                    let classes = classes.split(' ');
                    let classes = classes
                        .into_iter()
                        .map(|c| {
                            if c.ends_with("{{") {
                                in_expr = true;
                            } else if c.ends_with("}}") {
                                in_expr = false
                            }
                            let single = c.contains('\'');
                            let double = c.contains('"');
                            if in_expr && !single && !double {
                                return c.to_string();
                            }
                            let c2 = c.replace("\"", "").replace("'", "");
                            if let Some(class) = msv.get(&c2) {
                                return c.replace(&c2, &class);
                            }
                            c.to_string()
                        })
                        .collect::<Vec<String>>()
                        .join(" ");

                    if classes != "" {
                        let _r = el.set_attribute(cl, &classes);
                        el.remove_attribute("hx-lsp");
                    }
                }

                Ok(())
            })],
            ..Settings::default()
        },
        |c: &[u8]| output.extend_from_slice(c),
    );
    let _ = rewriter.write(document.as_bytes());
    let _ = rewriter.end();
    String::from_utf8(output)
}