60 lines
1.7 KiB
Rust
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");
|
|
}
|
|
}
|
|
}
|