use super::*;
use crate::Base62;
mod traits;
#[derive(Debug, Clone, Default, Ord, PartialOrd, Eq, PartialEq)]
pub(crate) struct CssBundle {
mode: CssInlineMode,
non_inlined_classes: BTreeSet<String>,
attribute: CssAttributes,
addition: BTreeSet<String>,
}
impl CssBundle {
pub fn add_trace(&mut self, item: &CssInstance) {
self.non_inlined_classes.insert(item.get_class());
}
pub fn add_inline(&mut self, item: CssInstance) {
self.attribute += item.attribute;
self.addition.insert(item.addition);
}
pub fn obfuscate(css: &Self) -> String {
let mut hasher = Xxh3::new();
css.attribute.hash(&mut hasher);
css.addition.hash(&mut hasher);
hasher.finish().base62()
}
pub fn as_traced(&self) -> String {
self.non_inlined_classes.iter().join(" ")
}
pub fn as_inlined(&self) -> (String, String) {
(self.as_traced(), self.attribute.to_string())
}
pub fn as_scope(&self) -> (String, String) {
let id = Self::obfuscate(self);
(self.as_traced(), id)
}
pub fn as_dataset(&self) -> (String, String) {
let id = Self::obfuscate(self);
(self.as_traced(), id)
}
pub fn set_mode(&mut self, mode: CssInlineMode) {
self.mode = mode
}
pub fn write_css(&self, f: &mut (dyn Write)) -> Result<()> {
let id = Self::obfuscate(self);
match self.mode {
CssInlineMode::None => unreachable!(),
CssInlineMode::Inline => return Ok(()),
CssInlineMode::Scoped => write!(f, ".{}", id)?,
CssInlineMode::DataKey => write!(f, "[data-tw-{}]", id)?,
CssInlineMode::DataValue => write!(f, "[data-tw=\"{}\"]", id)?,
}
f.write_char('{')?;
write!(f, "{}", self.attribute)?;
f.write_char('}')?;
for item in &self.addition {
write!(f, "{}", item)?;
}
Ok(())
}
}
#[derive(Debug, Clone)]
pub struct Inlined {
pub class: String,
pub style: String,
}