askama-minify 0.3.1

A procedural macro for minifying Askama templates at compile time
Documentation
use askama::Template;
use askama_minify::template_minify;

#[template_minify(source = "<div>   {{ value }}   </div>", ext = "html")]
#[derive(Template)]
struct SourceTemplate<'a> {
    value: &'a str,
}

#[template_minify(path = "tests/templates/basic.html")]
#[derive(Template)]
struct FileTemplate<'a> {
    title: &'a str,
}

#[template_minify(path = "from_templates_dir.html")]
#[derive(Template)]
struct TemplatesDirTemplate<'a> {
    name: &'a str,
}

#[template_minify(path = "tests/templates/no_extension", ext = "html")]
#[derive(Template)]
struct ExtOverrideTemplate<'a> {
    value: &'a str,
}

#[template_minify(source = "<div>{{ raw }}</div>", ext = "html", escape = "none")]
#[derive(Template)]
struct EscapeNoneTemplate<'a> {
    raw: &'a str,
}

#[template_minify(source = "line 1\n  {{ value }}\nline 3", ext = "txt")]
#[derive(Template)]
struct TextTemplate<'a> {
    value: &'a str,
}

#[template_minify(
    source = r#"
        <style>
            /* removed */
            .box {
                color: red;
                margin: 0;
            }
        </style>
        <script>
            // removed
            const value = 1;
        </script>
    "#,
    ext = "html"
)]
#[derive(Template)]
struct AssetTemplate;

#[test]
fn renders_minified_inline_source() {
    let rendered = SourceTemplate { value: "ok" }.render().unwrap();
    assert_eq!(rendered, "<div> ok </div>");
}

#[test]
fn renders_minified_template_file() {
    let rendered = FileTemplate { title: "Hello" }.render().unwrap();
    assert_eq!(rendered, "<section> <h1>Hello</h1> </section>");
}

#[test]
fn resolves_paths_from_templates_directory() {
    let rendered = TemplatesDirTemplate { name: "Ada" }.render().unwrap();
    assert_eq!(rendered, "<main> <p>Ada</p> </main>");
}

#[test]
fn supports_extension_override_for_extensionless_files() {
    let rendered = ExtOverrideTemplate { value: "42" }.render().unwrap();
    assert_eq!(rendered, "<p>42</p>");
}

#[test]
fn forwards_askama_template_arguments() {
    let rendered = EscapeNoneTemplate {
        raw: "<strong>trusted</strong>",
    }
    .render()
    .unwrap();

    assert_eq!(rendered, "<div><strong>trusted</strong></div>");
}

#[test]
fn leaves_non_html_templates_unminified() {
    let rendered = TextTemplate { value: "ok" }.render().unwrap();

    assert_eq!(rendered, "line 1\n  ok\nline 3");
}

#[test]
fn minifies_embedded_css_and_javascript() {
    let rendered = AssetTemplate.render().unwrap();

    assert!(rendered.contains("<style>.box{color:red;margin:0}</style>"));
    assert!(rendered.contains("<script>const value=1;</script>"));
    assert!(!rendered.contains("removed"));
}