swc_css_compat/compiler/
color_space_separated_parameters.rs1use std::mem::take;
2
3use swc_common::DUMMY_SP;
4use swc_css_ast::{
5 matches_eq_ignore_ascii_case, AbsoluteColorBase, ComponentValue, Delimiter, DelimiterValue,
6};
7
8use crate::compiler::Compiler;
9
10impl Compiler {
11 pub(crate) fn process_color_space_separated_function_notation(
12 &mut self,
13 n: &mut AbsoluteColorBase,
14 ) {
15 if let AbsoluteColorBase::Function(function) = n {
16 if !matches_eq_ignore_ascii_case!(function.name.as_str(), "rgb", "rgba", "hsl", "hsla")
17 {
18 return;
19 }
20
21 if function.value.len() != 3 && function.value.len() != 5 {
22 return;
23 }
24
25 if function.value.iter().any(|n| {
26 n.as_delimiter()
27 .filter(|delimiter| delimiter.value.is_comma())
28 .is_some()
29 }) {
30 return;
31 }
32
33 let new_value: Vec<ComponentValue> = take(&mut function.value)
34 .into_iter()
35 .enumerate()
36 .flat_map(|(idx, node)| {
37 if matches!(idx, 0 | 1) {
38 vec![
39 node,
40 ComponentValue::Delimiter(Box::new(Delimiter {
41 value: DelimiterValue::Comma,
42 span: DUMMY_SP,
43 })),
44 ]
45 } else if node
46 .as_delimiter()
47 .filter(|delimiter| delimiter.value.is_solidus())
48 .is_some()
49 {
50 vec![ComponentValue::Delimiter(Box::new(Delimiter {
51 value: DelimiterValue::Comma,
52 span: DUMMY_SP,
53 }))]
54 } else {
55 vec![node]
56 }
57 })
58 .collect::<Vec<_>>();
59
60 function.value = new_value;
61 }
62 }
63}