Fix style attr minification

This commit is contained in:
Wilson Lin 2021-08-08 00:56:24 +10:00
parent d20d6c6a18
commit 315ed269a7
4 changed files with 22 additions and 8 deletions

View File

@ -66,7 +66,7 @@ const htmlMinifierCfg = {
};
module.exports = {
'@minify-html/js': (_, buffer) => minifyHtml.minify(Buffer.from(buffer), minifyHtmlCfg),
'@minify-html/js': (_, buffer) => minifyHtml.minify(buffer, minifyHtmlCfg),
'html-minifier': content => htmlMinifier.minify(content, htmlMinifierCfg),
'minimize': testJsAndCssMinification
? (content) => new minimize({

View File

@ -5,7 +5,7 @@
},
"dependencies": {
"@types/node": "^14.0.5",
"@wzlin/html-data": "^2020103004.0.1",
"@wzlin/html-data": "^2021080714.0.0",
"prettier": "2.3.2",
"ts-node": "^8.10.1",
"typescript": "^3.7.4",

View File

@ -217,14 +217,26 @@ pub fn minify_attr(
#[cfg(feature = "js-esbuild")]
if name == b"style" && cfg.minify_css {
let mut value_raw_min = Vec::new();
let mut value_raw_wrapped = Vec::with_capacity(value_raw.len() + 3);
// TODO This isn't safe for invalid input e.g. `a}/*`.
value_raw_wrapped.extend_from_slice(b"x{");
value_raw_wrapped.extend_from_slice(&value_raw);
value_raw_wrapped.push(b'}');
let mut value_raw_wrapped_min = Vec::with_capacity(value_raw_wrapped.len());
minify_using_esbuild(
&mut value_raw_min,
&value_raw,
&mut value_raw_wrapped_min,
&value_raw_wrapped,
&MINIFY_CSS_TRANSFORM_OPTIONS.clone(),
None,
);
value_raw = value_raw_min;
// If input was invalid, wrapper syntax may not exist anymore.
if value_raw_wrapped_min.starts_with(b"x{") {
value_raw_wrapped_min.drain(0..2);
};
if value_raw_wrapped_min.ends_with(b"}") {
value_raw_wrapped_min.pop();
};
value_raw = value_raw_wrapped_min;
}
if (value_raw.is_empty() && redundant_if_empty)

View File

@ -603,7 +603,9 @@ fn test_css_minification() {
);
// `style` attributes.
eval_with_css_min(
br#"<div style="div { color: yellow }"></div>"#,
br#"<div style=div{color:#ff0}></div>"#,
br#"<div style="color: yellow;"></div>"#,
br#"<div style=color:#ff0></div>"#,
);
// `style` attributes are removed if fully minified away.
eval_with_css_min(br#"<div style=" /* */ "></div>"#, br#"<div></div>"#);
}