skzephyr/src/class.rs

60 lines
1.7 KiB
Rust

use crate::{modifiers::Modifiers, name::Name, Zephyr};
#[derive(PartialEq, Debug)]
pub(crate) struct Class<'a> {
pub name: Name<'a>,
pub value: Option<&'a str>,
pub modifiers: Modifiers<'a>,
pub pseudo: Option<&'a str>,
/// the original unparsed value
/// needed to generate the css selector
pub original: &'a str,
}
impl<'a> Class<'a> {
pub(crate) fn selector(&self) -> String {
let Class {
modifiers,
pseudo,
original,
..
} = self;
let mut rest = if let Some(mods) = modifiers.get() {
format!(":{mods}")
} else {
"".to_string()
};
if let Some(pseudo) = pseudo {
rest.push_str("::");
rest.push_str(pseudo);
}
format!(".{original}{rest}")
.replace('[', "\\[")
.replace(']', "\\]")
.replace('|', "\\|")
.replace('(', "\\(")
.replace(')', "\\)")
.replace('#', "\\#")
.replace('$', "\\$")
.replace('\'', "\\'")
.replace('*', "\\*")
.replace('%', "\\%")
}
/// TODO return result
pub(crate) fn generate(&self, z: &Zephyr) -> String {
let name = self.name.as_str();
if let Some(val) = self.value {
let selector = self.selector();
format!("{selector} {{ {name}: {val}; }}",)
} else if let Some(v) = z.rules.get(name) {
let selector = self.selector();
format!("{selector} {{ {v} }}",)
} else {
panic!("{name} is not a no-variable rule, and no variables were provided");
}
}
}