diff --git a/crates/swc_html_minifier/src/lib.rs b/crates/swc_html_minifier/src/lib.rs index 71090146c537..634e7fa0e98c 100644 --- a/crates/swc_html_minifier/src/lib.rs +++ b/crates/swc_html_minifier/src/lib.rs @@ -1827,32 +1827,29 @@ impl Minifier<'_> { let result = child_will_be_retained(&mut child, &mut new_children, children); - if result { - if self.options.remove_empty_metadata_elements - && self.is_empty_metadata_element(&child) - { - let need_continue = { - let next_element = if let Some(Child::Element(element)) = children.get(0) { - Some(element) - } else if let Some(Child::Element(element)) = children.get(1) { - Some(element) - } else { - None - }; + if self.options.remove_empty_metadata_elements { + if let Some(last_child @ Child::Element(_)) = new_children.last() { + if self.is_empty_metadata_element(last_child) { + new_children.pop(); - if let Some(element) = next_element { - self.options.merge_metadata_elements - && !self.allow_elements_to_merge(Some(&child), element) - } else { - true - } - }; + if let Child::Text(text) = &mut child { + if let Some(Child::Text(prev_text)) = new_children.last_mut() { + let mut new_data = + String::with_capacity(prev_text.data.len() + text.data.len()); - if need_continue { - continue; + new_data.push_str(&prev_text.data); + new_data.push_str(&text.data); + + text.data = new_data.into(); + + new_children.pop(); + } + } } } + } + if result { new_children.push(child); } } diff --git a/crates/swc_html_minifier/tests/fixture/element/script-group/input.html b/crates/swc_html_minifier/tests/fixture/element/script-group/input.html index 381b08d2c8ba..1b9a6d7be4d5 100644 --- a/crates/swc_html_minifier/tests/fixture/element/script-group/input.html +++ b/crates/swc_html_minifier/tests/fixture/element/script-group/input.html @@ -215,5 +215,13 @@ var a = "test";console.log(a);console.log(a);console.log(a); +
breaker
+ + + +
breaker
+ + + \ No newline at end of file diff --git a/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html b/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html index cc09c528dec4..61f332ee80bc 100644 --- a/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/element/script-group/output.min.html @@ -90,4 +90,12 @@
breaker
- \ No newline at end of file + + +
breaker
+ + + +
breaker
+ + \ No newline at end of file diff --git a/crates/swc_html_minifier/tests/fixture/element/style-group/input.html b/crates/swc_html_minifier/tests/fixture/element/style-group/input.html index 5ba9e6bb42d3..064860aaec11 100644 --- a/crates/swc_html_minifier/tests/fixture/element/style-group/input.html +++ b/crates/swc_html_minifier/tests/fixture/element/style-group/input.html @@ -90,5 +90,41 @@

Text

test
+
EMPTY breaker
+ + +
breaker
+ + + + +
breaker style tags
+ + + + + + + + + + + +
breaker style tags
+ + + +
breaker
+ + +
breaker
+ + +
breaker
+ +test +
breaker
+test + \ No newline at end of file diff --git a/crates/swc_html_minifier/tests/fixture/element/style-group/output.min.html b/crates/swc_html_minifier/tests/fixture/element/style-group/output.min.html index b231222997e0..fdcc6068cb76 100644 --- a/crates/swc_html_minifier/tests/fixture/element/style-group/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/element/style-group/output.min.html @@ -3,8 +3,7 @@
test
-
test
- +
test
test
test
@@ -20,4 +19,20 @@
test
test
- \ No newline at end of file + +
EMPTY breaker
+
breaker
+ +
breaker style tags
+ +
breaker style tags
+ + + +
breaker
+
breaker
+
breaker
+ +test +
breaker
+test \ No newline at end of file