Skip to content

Commit 6f8e794

Browse files
committed
Add regex and once_cell dependencies; enhance CSS processing with regex support
1 parent ca1eccb commit 6f8e794

File tree

6 files changed

+99
-10
lines changed

6 files changed

+99
-10
lines changed

.changeset/shiny-ways-try.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@devup-ui/wasm": patch
3+
---
4+
5+
Support $ var with anywhere

Cargo.lock

Lines changed: 41 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

libs/css/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ edition = "2021"
77
once_cell = "1.20.2"
88
serial_test = "3.2.0"
99
serde = { version = "1.0.217", features = ["derive"] }
10+
regex = "1.11.1"

libs/css/src/lib.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::StyleSelector::{Dual, Postfix, Prefix};
22
use once_cell::sync::Lazy;
3+
use regex::Regex;
34
use serde::{Deserialize, Serialize};
45
use std::collections::{HashMap, HashSet};
56
use std::fmt;
@@ -278,6 +279,7 @@ pub fn sort_to_long(property: &str) -> String {
278279
.unwrap_or_else(|| property.to_string())
279280
}
280281

282+
static F_SPACE_RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"\s*,\s*").unwrap());
281283
pub fn sheet_to_classname(
282284
property: &str,
283285
level: u8,
@@ -286,10 +288,10 @@ pub fn sheet_to_classname(
286288
) -> String {
287289
let key = format!(
288290
"{}-{}-{}-{}",
289-
property,
291+
property.trim(),
290292
level,
291-
value.unwrap_or(""),
292-
selector.unwrap_or("")
293+
F_SPACE_RE.replace_all(value.unwrap_or(""), ",").trim(),
294+
selector.unwrap_or("").trim()
293295
);
294296
let mut map = GLOBAL_CLASS_MAP.lock().unwrap();
295297
map.get(&key).map(|v| format!("d{}", v)).unwrap_or_else(|| {
@@ -355,6 +357,30 @@ mod tests {
355357
sheet_to_classname("background", 1, Some("hover"), None),
356358
"d3"
357359
);
360+
361+
reset_class_map();
362+
assert_eq!(sheet_to_classname("background", 0, None, None), "d0");
363+
assert_eq!(sheet_to_classname("background", 0, None, None), "d0");
364+
assert_eq!(sheet_to_classname("background", 0, Some("red"), None), "d1");
365+
assert_eq!(sheet_to_classname("background", 0, Some("red"), None), "d1");
366+
assert_eq!(
367+
sheet_to_classname(" background ", 0, Some(" red "), None),
368+
"d1"
369+
);
370+
371+
assert_eq!(
372+
sheet_to_classname("background", 0, Some("rgba(255, 0, 0, 0.5)"), None),
373+
"d2"
374+
);
375+
assert_eq!(
376+
sheet_to_classname("background", 0, Some("rgba(255,0,0,0.5)"), None),
377+
"d2"
378+
);
379+
380+
{
381+
let map = GLOBAL_CLASS_MAP.lock().unwrap();
382+
assert_eq!(map.get("background-0-rgba(255,0,0,0.5)-"), Some(&2));
383+
}
358384
}
359385

360386
#[test]

libs/sheet/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ edition = "2021"
66
[dependencies]
77
css = { path = "../css" }
88
serde = { version = "1.0.217", features = ["derive"] }
9+
regex = "1.11.1"
10+
once_cell = "1.20.2"
911

1012
[dev-dependencies]
1113
insta = "1.42.1"

libs/sheet/src/lib.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ pub mod theme;
22

33
use crate::theme::Theme;
44
use css::{convert_property, merge_selector, PropertyType, StyleSelector};
5+
use once_cell::sync::Lazy;
6+
use regex::Regex;
57
use serde::de::Error;
68
use serde::{Deserialize, Deserializer, Serialize};
79
use std::cmp::Ordering::{Equal, Greater, Less};
8-
use std::collections::{BTreeMap, HashSet};
10+
use std::collections::{BTreeMap, HashMap, HashSet};
911

1012
trait ExtractStyle {
1113
fn extract(&self) -> String;
@@ -45,12 +47,14 @@ impl ExtractStyle for StyleSheetProperty {
4547
}
4648
}
4749

48-
fn convert_theme_variable_value(value: &String) -> String {
49-
if let Some(value) = value.strip_prefix("$") {
50-
format!("var(--{})", value)
51-
} else {
52-
value.to_string()
53-
}
50+
static VAR_RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"\$\w+").unwrap());
51+
52+
fn convert_theme_variable_value(value: &str) -> String {
53+
VAR_RE
54+
.replace_all(value, |caps: &regex::Captures| {
55+
format!("var(--{})", &caps[0][1..])
56+
})
57+
.to_string()
5458
}
5559

5660
#[derive(Debug, Hash, Eq, PartialEq, Deserialize, Serialize)]
@@ -198,6 +202,16 @@ mod tests {
198202
convert_theme_variable_value(&"$var".to_string()),
199203
"var(--var)"
200204
);
205+
206+
assert_eq!(
207+
convert_theme_variable_value(&"$var $var".to_string()),
208+
"var(--var) var(--var)"
209+
);
210+
211+
assert_eq!(
212+
convert_theme_variable_value(&"1px solid $red".to_string()),
213+
"1px solid var(--red)"
214+
);
201215
}
202216

203217
#[test]

0 commit comments

Comments
 (0)