From d89da793920b2fcb6712d192fc77df0aaafd63ba Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 14 Dec 2022 23:31:35 +0300 Subject: [PATCH] PDAfeat(css/minifier): compress alpha in HEX --- .../swc_css_minifier/src/compressor/color.rs | 25 ++++++++++++++++++- .../tests/fixture/compress-color/input.css | 9 ++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/crates/swc_css_minifier/src/compressor/color.rs b/crates/swc_css_minifier/src/compressor/color.rs index aadc62b846dc..96f2ebce2cca 100644 --- a/crates/swc_css_minifier/src/compressor/color.rs +++ b/crates/swc_css_minifier/src/compressor/color.rs @@ -1,4 +1,4 @@ -use swc_atoms::js_word; +use swc_atoms::{js_word, JsWord}; use swc_common::DUMMY_SP; use swc_css_ast::*; use swc_css_utils::NAMED_COLORS; @@ -9,6 +9,27 @@ use super::{ }; use crate::compressor::alpha_value::compress_alpha_value; +fn compress_alpha_in_hex(value: &JsWord) -> Option<&str> { + let length = value.len(); + + if length == 3 || length == 6 { + return None; + } + + let chars = value.as_bytes(); + + if length == 8 + && (chars[6] == b'f' || chars[6] == b'F') + && (chars[7] == b'f' || chars[7] == b'F') + { + return Some(&value[0..6]); + } else if length == 4 && chars[3] == b'f' || chars[3] == b'F' { + return Some(&value[0..3]); + } + + None +} + fn get_short_hex(v: u32) -> u32 { ((v & 0x0ff00000) >> 12) | ((v & 0x00000ff0) >> 4) } @@ -422,6 +443,8 @@ impl Compressor { raw: None, }, )); + } else if let Some(new_value) = compress_alpha_in_hex(value) { + *value = new_value.into(); } } Color::AbsoluteColorBase(AbsoluteColorBase::Function(Function { diff --git a/crates/swc_css_minifier/tests/fixture/compress-color/input.css b/crates/swc_css_minifier/tests/fixture/compress-color/input.css index 5e507a888cf8..fb19e8e604ac 100644 --- a/crates/swc_css_minifier/tests/fixture/compress-color/input.css +++ b/crates/swc_css_minifier/tests/fixture/compress-color/input.css @@ -428,4 +428,11 @@ .color { color: #ff0000; color: #FF0000; -} \ No newline at end of file +} + +.alpha { + color: #ffff; + color: #ffffffff; + color: #123f; + color: #123abcff; +}