encre_css/utils/
spacing.rs1use std::borrow::Cow;
3
4pub fn is_matching_builtin_spacing(value: &str) -> bool {
10 value == "px"
11 || value.parse::<f64>().is_ok()
12 || value
13 .split_once('/')
14 .is_some_and(|(a, b)| a.parse::<usize>().is_ok() && b.parse::<usize>().is_ok())
15}
16
17pub fn get(value: &str, is_negative: bool) -> Option<Cow<'_, str>> {
23 if value == "px" {
24 if is_negative {
25 Some(Cow::from("-1px"))
26 } else {
27 Some(Cow::from("1px"))
28 }
29 } else if value == "0" {
30 Some(Cow::from("0px"))
31 } else if let Some((a, b)) = value.split_once('/') {
32 let a = a.parse::<usize>().ok()?;
34 let b = b.parse::<usize>().ok()?;
35
36 #[allow(clippy::cast_precision_loss)]
37 if is_negative {
38 Some(Cow::from(format!(
39 "{}%",
40 (1_000_000. * 100. * (-(a as f64) / b as f64)).round() / 1_000_000.
41 )))
42 } else {
43 Some(Cow::from(format!(
44 "{}%",
45 (1_000_000. * 100. * (a as f64 / b as f64)).round() / 1_000_000.
46 )))
47 }
48 } else {
49 let value = if is_negative {
51 -value.parse::<f64>().ok()? / 4.
52 } else {
53 value.parse::<f64>().ok()? / 4.
54 };
55
56 Some(Cow::from(format!("{value}rem")))
57 }
58}