Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions bench/runners/minify-html/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,8 @@ edition = "2018"
minify-html = { path = "../../../minify-html" }
serde = { version = "1.0.104", features = ["derive"] }
serde_json = "1.0.44"

[features]
default = ["lightningcss", "minify-js"]
lightningcss = ["minify-html/lightningcss"]
minify-js = ["minify-html/minify-js"]
10 changes: 8 additions & 2 deletions bench/runners/minify-html/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,14 @@ fn main() {
let mut cfg = Cfg::new();
cfg.enable_possibly_noncompliant();
if !html_only {
cfg.minify_css = true;
cfg.minify_js = true;
#[cfg(feature = "lightningcss")]
{
cfg.minify_css = true;
}
#[cfg(feature = "minify-js")]
{
cfg.minify_js = true;
}
};

for t in fs::read_dir(input_dir).unwrap().map(|d| d.unwrap()) {
Expand Down
9 changes: 7 additions & 2 deletions minify-html/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,13 @@ maintenance = { status = "actively-developed" }
[dependencies]
ahash = "0.8"
aho-corasick = "0.7"
lightningcss = "1.0.0-alpha.65"
lightningcss = { version = "1.0.0-alpha.65", optional = true }
memchr = "2"
minify-html-common = { version = "0.0.2", path = "../minify-html-common" }
minify-js = "0.6"
minify-js = { version = "0.6", optional = true }
once_cell = "1.19.0"

[features]
default = ["lightningcss", "minify-js"]
lightningcss = ["dep:lightningcss"]
minify-js = ["dep:minify-js"]
2 changes: 2 additions & 0 deletions minify-html/src/cfg/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ pub struct Cfg {
pub keep_input_type_text_attr: bool,
/// Keep SSI comments.
pub keep_ssi_comments: bool,
#[cfg(feature = "lightningcss")]
/// Minify CSS in `<style>` tags and `style` attributes using [https://github.com/parcel-bundler/lightningcss](lightningcss).
pub minify_css: bool,
/// Minify DOCTYPEs. Minified DOCTYPEs may not be spec compliant, but will still be parsed correctly by almost all browsers.
pub minify_doctype: bool,
#[cfg(feature = "minify-js")]
/// Minify JavaScript in `<script>` tags using [minify-js](https://github.com/wilsonzlin/minify-js).
pub minify_js: bool,
/// When `{{`, `{#`, or `{%` are seen in content, all source code until the subsequent matching closing `}}`, `#}`, or `%}` respectively gets piped through untouched.
Expand Down
10 changes: 4 additions & 6 deletions minify-html/src/minify/attr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@ use crate::entity::encode::encode_entities;
use crate::Cfg;
use aho_corasick::AhoCorasickBuilder;
use aho_corasick::MatchKind;
use lightningcss::stylesheet::MinifyOptions;
use lightningcss::stylesheet::ParserOptions;
use lightningcss::stylesheet::PrinterOptions;
use lightningcss::stylesheet::StyleAttribute;
#[cfg(feature = "lightningcss")]
use lightningcss::stylesheet::{MinifyOptions, ParserOptions, PrinterOptions, StyleAttribute};
use minify_html_common::gen::attrs::ATTRS;
use minify_html_common::gen::codepoints::DIGIT;
use minify_html_common::pattern::Replacer;
Expand All @@ -16,7 +14,6 @@ use minify_html_common::whitespace::left_trim;
use minify_html_common::whitespace::remove_all_whitespace;
use minify_html_common::whitespace::right_trim;
use once_cell::sync::Lazy;
use std::str::from_utf8;

fn build_double_quoted_replacer() -> Replacer {
let mut patterns = Vec::<Vec<u8>>::new();
Expand Down Expand Up @@ -405,9 +402,10 @@ pub fn minify_attr(
};
};

#[cfg(feature = "lightningcss")]
if name == b"style" && cfg.minify_css {
let result = match StyleAttribute::parse(
from_utf8(&value_raw).expect("`style` attribute value contains non-UTF-8"),
std::str::from_utf8(&value_raw).expect("`style` attribute value contains non-UTF-8"),
ParserOptions::default(),
) {
Ok(mut sty) => {
Expand Down
8 changes: 7 additions & 1 deletion minify-html/src/minify/content.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
use super::rcdata::minify_rcdata;
use crate::ast::NodeData;
#[cfg(any(feature = "lightningcss", feature = "minify-js"))]
use crate::ast::ScriptOrStyleLang;
use crate::cfg::Cfg;
use crate::entity::encode::encode_entities;
use crate::minify::bang::minify_bang;
use crate::minify::comment::minify_comment;
#[cfg(feature = "lightningcss")]
use crate::minify::css::minify_css;
use crate::minify::doctype::minify_doctype;
use crate::minify::element::minify_element;
use crate::minify::instruction::minify_instruction;
#[cfg(feature = "minify-js")]
use crate::minify::js::minify_js;
use aho_corasick::AhoCorasickBuilder;
use aho_corasick::MatchKind;
Expand Down Expand Up @@ -155,10 +158,13 @@ pub fn minify_content(
NodeData::RcdataContent { typ, text } => minify_rcdata(cfg, out, typ, &text),
NodeData::ScriptOrStyleContent { code, lang: _ } if code.is_empty() => {}
NodeData::ScriptOrStyleContent { code, lang } => match lang {
#[cfg(feature = "lightningcss")]
ScriptOrStyleLang::CSS => minify_css(cfg, out, &code),
ScriptOrStyleLang::Data => out.extend_from_slice(&code),
#[cfg(feature = "minify-js")]
ScriptOrStyleLang::JS => minify_js(cfg, minify_js::TopLevelMode::Global, out, &code),
#[cfg(feature = "minify-js")]
ScriptOrStyleLang::JSModule => minify_js(cfg, minify_js::TopLevelMode::Module, out, &code),
_ => out.extend_from_slice(&code),
},
NodeData::Text { value } => {
let min = encode_entities(&value, false, !cfg.allow_optimal_entities);
Expand Down
2 changes: 2 additions & 0 deletions minify-html/src/minify/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ pub mod attr;
pub mod bang;
pub mod comment;
pub mod content;
#[cfg(feature = "lightningcss")]
pub mod css;
pub mod doctype;
pub mod element;
pub mod instruction;
#[cfg(feature = "minify-js")]
pub mod js;
pub mod rcdata;
#[cfg(test)]
Expand Down
8 changes: 8 additions & 0 deletions minify-html/src/tests/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use crate::cfg::Cfg;
use crate::minify;
#[cfg(feature = "lightningcss")]
use minify_html_common::tests::create_common_css_test_data;
#[cfg(feature = "minify-js")]
use minify_html_common::tests::create_common_js_test_data;
use minify_html_common::tests::create_common_noncompliant_test_data;
use minify_html_common::tests::create_common_test_data;
Expand All @@ -17,12 +19,14 @@ pub fn eval_with_noncompliant(src: &'static [u8], expected: &'static [u8]) {
eval_with_cfg(src, expected, &cfg)
}

#[cfg(feature = "minify-js")]
pub fn eval_with_js_min(src: &'static [u8], expected: &'static [u8]) -> () {
let mut cfg = Cfg::new();
cfg.minify_js = true;
eval_with_cfg(src, expected, &cfg);
}

#[cfg(feature = "lightningcss")]
pub fn eval_with_css_min(src: &'static [u8], expected: &'static [u8]) -> () {
let mut cfg = Cfg::new();
cfg.minify_css = true;
Expand Down Expand Up @@ -50,9 +54,11 @@ fn test_common() {
for (a, b) in create_common_noncompliant_test_data() {
eval_with_noncompliant(a, b);
}
#[cfg(feature = "lightningcss")]
for (a, b) in create_common_css_test_data() {
eval_with_css_min(a, b);
}
#[cfg(feature = "minify-js")]
for (a, b) in create_common_js_test_data() {
eval_with_js_min(a, b);
}
Expand All @@ -76,6 +82,7 @@ fn test_keep_input_type_text_attr() {

#[test]
fn test_preserve_template_brace_syntax() {
#[cfg(feature = "minify-js")]
eval_with_js_min(
b"<p> {{ hello world! %} {%}{#} echo ' </p><P><script> let x = 1; //' }} </p>",
b"<p>{{ hello world! %} {%}{#} echo '<p><script>let x=1",
Expand Down Expand Up @@ -223,6 +230,7 @@ fn test_viewport_attr_minification() {
);
}

#[cfg(feature = "lightningcss")]
#[test]
fn test_style_attr_minification() {
eval_with_css_min(
Expand Down