Skip to content

Commit cf525c0

Browse files
committed
Refactor selector
1 parent cfe87ed commit cf525c0

26 files changed

+1064
-310
lines changed

libs/css/src/constant.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,15 @@ pub(super) static INNER_TRIM_RE: Lazy<Regex> =
128128
Lazy::new(|| Regex::new(r"\(\s*([^)]*?)\s*\)").unwrap());
129129

130130
pub(super) static RM_MINUS_ZERO_RE: Lazy<Regex> = Lazy::new(|| {
131-
Regex::new(r"-0(px|em|rem|vh|vw|%|dvh|dvw|vmax|vmin|mm|cm|in|pt|pc|lh|ic|\)|,)").unwrap()
131+
Regex::new(r"-0(px|em|rem|vh|vw|%|dvh|dvw|vmax|vmin|mm|cm|in|pt|pc|lh|ic|deg|\)|,)").unwrap()
132132
});
133133

134134
pub(super) static NUM_TRIM_RE: Lazy<Regex> = Lazy::new(|| {
135-
Regex::new(r"(\d(px|em|rem|vh|vw|%|dvh|dvw|vmax|vmin|mm|cm|in|pt|pc|lh|ic)?)\s+(\d)").unwrap()
135+
Regex::new(r"(\d(px|em|rem|vh|vw|%|dvh|dvw|vmax|vmin|mm|cm|in|pt|pc|lh|ic|deg)?)\s+(\d)")
136+
.unwrap()
136137
});
137138
pub(super) static ZERO_RE: Lazy<Regex> = Lazy::new(|| {
138-
Regex::new(r"(\b|,|\(|^|\s)-?0(px|em|rem|vh|vw|%|dvh|dvw|vmax|vmin|mm|cm|in|pt|pc|lh|ic)")
139+
Regex::new(r"(\b|,|\(|^|\s)-?0(px|em|rem|vh|vw|%|dvh|dvw|vmax|vmin|mm|cm|in|pt|pc|lh|ic|deg)")
139140
.unwrap()
140141
});
141142

libs/css/src/optimize_value.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,17 @@ mod tests {
221221
#[case("max(10px, calc(0", "max(10px,calc(0%))")]
222222
#[case("max(10px, any(0", "max(10px,any(0))")]
223223
#[case("10px, any(0))", "(10px,any(0))")]
224+
#[case("scale(0deg, 0deg)", "scale(0,0)")]
225+
#[case(
226+
"scaleX(0deg) scaleY(0deg) scaleZ(0deg)",
227+
"scaleX(0) scaleY(0) scaleZ(0)"
228+
)]
229+
#[case("scaleX(0deg)", "scaleX(0)")]
230+
#[case("scaleY(0deg)", "scaleY(0)")]
231+
#[case("scaleZ(0deg)", "scaleZ(0)")]
232+
#[case("translate(0px) scale(0deg)", "translate(0) scale(0)")]
233+
#[case("translate(-0px) scale(-0deg)", "translate(0) scale(0)")]
234+
#[case("translate(-10px) scale(-10deg)", "translate(-10px) scale(-10deg)")]
224235
fn test_optimize_value(#[case] input: &str, #[case] expected: &str) {
225236
assert_eq!(optimize_value(input), expected);
226237
}

libs/css/src/style_selector.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ impl Ord for StyleSelector {
9393

9494
impl From<&str> for StyleSelector {
9595
fn from(value: &str) -> Self {
96+
let value = value
97+
.trim()
98+
.split_whitespace()
99+
.collect::<Vec<_>>()
100+
.join(" ")
101+
.replace(", ", ",");
96102
if value.contains("&") {
97103
StyleSelector::Selector(value.to_string())
98104
} else if let Some(s) = value.strip_prefix("group") {
@@ -116,7 +122,7 @@ impl From<&str> for StyleSelector {
116122
selector: None,
117123
}
118124
} else {
119-
let post = to_kebab_case(value);
125+
let post = to_kebab_case(&value);
120126

121127
StyleSelector::Selector(format!(
122128
"&{}{}",
@@ -129,7 +135,11 @@ impl From<&str> for StyleSelector {
129135

130136
impl From<[&str; 2]> for StyleSelector {
131137
fn from(value: [&str; 2]) -> Self {
132-
let post = to_kebab_case(value[1]);
138+
let post = if value[1].contains("&:") {
139+
to_kebab_case(value[1].split(":").last().unwrap())
140+
} else {
141+
to_kebab_case(value[1])
142+
};
133143
StyleSelector::Selector(format!(
134144
"{}{}{}",
135145
StyleSelector::from(value[0]),

libs/extractor/src/extractor/extract_style_from_expression.rs

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -173,22 +173,63 @@ pub fn extract_style_from_expression<'a>(
173173
let mut props = vec![];
174174
for p in obj.properties.iter_mut() {
175175
if let ObjectPropertyKind::ObjectProperty(o) = p {
176-
let name = o.key.name().unwrap().to_string();
176+
let key_name = o.key.name().unwrap().to_string();
177+
let name = key_name.trim();
178+
let mut part_of_selector = vec![];
179+
180+
let mut level = 0;
181+
let mut last_idx = 0;
182+
for (idx, c) in name.chars().enumerate() {
183+
if c == '(' {
184+
level += 1;
185+
}
186+
if c == ')' {
187+
level -= 1;
188+
}
189+
if c == ',' && level == 0 {
190+
part_of_selector.push(&name[last_idx..idx]);
191+
last_idx = idx + 1;
192+
}
193+
if idx == name.len() - 1 {
194+
part_of_selector.push(&name[last_idx..]);
195+
}
196+
}
197+
198+
let sel = part_of_selector
199+
.iter()
200+
.map(|name| {
201+
let name = name.trim();
202+
if let Some(selector) = selector {
203+
if name.starts_with("_theme") {
204+
StyleSelector::from([
205+
name.replace("_theme", "theme").as_str(),
206+
&selector.to_string(),
207+
])
208+
.to_string()
209+
} else {
210+
if name.contains("&") {
211+
name.to_string().replace("&", &selector.to_string())
212+
} else {
213+
StyleSelector::from([
214+
selector.to_string().replace("_", "").as_str(),
215+
&name.replace("_", ""),
216+
])
217+
.to_string()
218+
}
219+
}
220+
} else {
221+
StyleSelector::from(name.replace("_", "").as_str()).to_string()
222+
}
223+
})
224+
.collect::<Vec<_>>()
225+
.join(",");
177226
props.extend(
178227
extract_style_from_expression(
179228
ast_builder,
180229
None,
181230
&mut o.value,
182231
level,
183-
&Some(
184-
if let Some(selector) = selector {
185-
name.replace("&", &selector.to_string())
186-
} else {
187-
name
188-
}
189-
.as_str()
190-
.into(),
191-
),
232+
&Some(StyleSelector::Selector(sel)),
192233
)
193234
.styles,
194235
);

0 commit comments

Comments
 (0)