This commit is contained in:
annieversary 2022-07-06 14:50:40 +01:00
parent 5ad1f8b90d
commit a999690413
4 changed files with 63 additions and 47 deletions

View File

@ -4,6 +4,8 @@ use crate::Zephyr;
pub(crate) struct Class<'a> { pub(crate) struct Class<'a> {
pub name: &'a str, pub name: &'a str,
pub value: Option<&'a str>, pub value: Option<&'a str>,
/// if true, no replacements will be done on `value`
pub value_literal: bool,
pub modifiers: Vec<&'a str>, pub modifiers: Vec<&'a str>,
pub pseudo: Option<&'a str>, pub pseudo: Option<&'a str>,
/// the original unparsed value /// the original unparsed value
@ -61,16 +63,24 @@ impl<'a> Class<'a> {
let selector = self.selector(z); let selector = self.selector(z);
if let Some(val) = self.value { if let Some(val) = self.value {
let val = z.values.get(val).map(AsRef::as_ref).unwrap_or(val); let val = if self.value_literal {
val.to_string()
} else {
z.values
.get(val)
.map(AsRef::as_ref)
.unwrap_or(val)
.replace('_', " ")
};
if let Some(fun) = z.specials.get(name) { if let Some(fun) = z.specials.get(name) {
let v = fun(val); let v = fun(&val);
Ok(format!("{selector}{{{v}}}",)) Ok(format!("{selector}{{{v}}}",))
} else { } else {
Ok(format!("{selector} {{ {name}: {val}; }}",)) Ok(format!("{selector}{{{name}:{val};}}"))
} }
} else if let Some(v) = z.rules.get(name) { } else if let Some(v) = z.rules.get(name) {
Ok(format!("{selector} {{ {v} }}",)) Ok(format!("{selector}{{{v}}}"))
} else { } else {
Err("{name} is not a no-variable rule, and no variables were provided") Err("{name} is not a no-variable rule, and no variables were provided")
} }

View File

@ -73,32 +73,23 @@ pub(crate) fn default_pseudos() -> HashMap<String, String> {
.collect() .collect()
} }
macro_rules! special {
($name:literal, $val:ident, $string:literal) => {
($name, {
fn fun<'a>($val: &'a str) -> String {
format!($string)
}
Box::new(fun) as SpecialRule
})
};
}
pub(crate) fn default_specials() -> HashMap<String, SpecialRule> { pub(crate) fn default_specials() -> HashMap<String, SpecialRule> {
vec![ vec![
("mx", { special!("mx", val, "margin-left:{val};margin-right:{val};"),
fn fun<'a>(val: &'a str) -> String { special!("my", val, "margin-top:{val};margin-bottom:{val};"),
format!("margin-left: {val}; margin-right: {val};") special!("px", val, "padding-left:{val};padding-right:{val};"),
} special!("py", val, "padding-top:{val};padding-bottom:{val};"),
Box::new(fun) as SpecialRule
}),
("my", {
fn fun<'a>(val: &'a str) -> String {
format!("margin-top: {val}; margin-bottom: {val};")
}
Box::new(fun) as SpecialRule
}),
("px", {
fn fun<'a>(val: &'a str) -> String {
format!("padding-left: {val}; padding-right: {val};")
}
Box::new(fun) as SpecialRule
}),
("py", {
fn fun<'a>(val: &'a str) -> String {
format!("padding-top: {val}; padding-bottom: {val};")
}
Box::new(fun) as SpecialRule
}),
// TODO // TODO
] ]
.into_iter() .into_iter()

View File

@ -107,6 +107,7 @@ mod tests {
modifiers: vec![].into(), modifiers: vec![].into(),
pseudo: None, pseudo: None,
original: "m[1rem]", original: "m[1rem]",
value_literal: false,
}; };
let css = class.generate(&z).unwrap(); let css = class.generate(&z).unwrap();
assert_eq!(css, r#".m\[1rem\]{margin:1rem;}"#); assert_eq!(css, r#".m\[1rem\]{margin:1rem;}"#);
@ -117,6 +118,7 @@ mod tests {
modifiers: vec!["focus"].into(), modifiers: vec!["focus"].into(),
pseudo: None, pseudo: None,
original: "m[1rem]focus", original: "m[1rem]focus",
value_literal: false,
}; };
let css = class.generate(&z).unwrap(); let css = class.generate(&z).unwrap();
assert_eq!(css, r#".m\[1rem\]focus:focus{margin:1rem;}"#); assert_eq!(css, r#".m\[1rem\]focus:focus{margin:1rem;}"#);
@ -127,6 +129,7 @@ mod tests {
modifiers: vec!["focus", "hover", "odd"].into(), modifiers: vec!["focus", "hover", "odd"].into(),
pseudo: None, pseudo: None,
original: "m[1rem]focus,hover,odd", original: "m[1rem]focus,hover,odd",
value_literal: false,
}; };
let css = class.generate(&z).unwrap(); let css = class.generate(&z).unwrap();
assert_eq!( assert_eq!(
@ -140,10 +143,7 @@ mod tests {
let z = Zephyr::new(); let z = Zephyr::new();
let classes = z.generate_classes(["flex-row"]); let classes = z.generate_classes(["flex-row"]);
assert_eq!( assert_eq!(classes, r#".flex-row{display:flex;flex-direction:row;}"#);
classes,
r#".flex-row { display: flex; flex-direction: row; }"#
);
let classes = z.generate_classes(["m[3rem]hover,focus$placeholder"]); let classes = z.generate_classes(["m[3rem]hover,focus$placeholder"]);
assert_eq!( assert_eq!(
@ -184,4 +184,15 @@ mod tests {
r#".mx\[1rem\]{margin-left:1rem;margin-right:1rem;}"# r#".mx\[1rem\]{margin-left:1rem;margin-right:1rem;}"#
); );
} }
#[test]
fn generate_with_spaces_works() {
let z = Zephyr::new();
let classes = z.generate_classes(["border[1px_solid_black]"]);
assert_eq!(
classes,
r#".border\[1px_solid_black\]{border:1px solid black;}"#
);
}
} }

View File

@ -20,6 +20,7 @@ pub(crate) fn parse_class<'a>(original: &'a str) -> Option<Class<'a>> {
modifiers: mods.into(), modifiers: mods.into(),
pseudo, pseudo,
original, original,
value_literal: false,
}); });
} }
@ -37,6 +38,7 @@ pub(crate) fn parse_class<'a>(original: &'a str) -> Option<Class<'a>> {
modifiers: mods.into(), modifiers: mods.into(),
pseudo, pseudo,
original, original,
value_literal: false,
}); });
} }
_ => { _ => {
@ -46,6 +48,7 @@ pub(crate) fn parse_class<'a>(original: &'a str) -> Option<Class<'a>> {
modifiers: vec![].into(), modifiers: vec![].into(),
pseudo, pseudo,
original, original,
value_literal: false,
}); });
} }
} }
@ -70,7 +73,8 @@ mod tests {
value, value,
modifiers: modifiers.into(), modifiers: modifiers.into(),
pseudo, pseudo,
original: class original: class,
value_literal: false,
}) })
); );
} }