swc_css_compat/compiler/
color_space_separated_parameters.rs

1use 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}