1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use super::*;
mod traits;
#[allow(clippy::derive_hash_xor_eq)]
#[derive(Debug, Clone, Hash)]
pub struct CssInstance {
pub inlinable: bool,
pub selector: String,
pub attribute: BTreeSet<CssAttribute>,
pub addition: String,
}
impl CssInstance {
pub fn new(item: &dyn TailwindInstance, ctx: &TailwindBuilder) -> Self {
let mut selector = item.id();
let attribute = item.attributes(ctx);
let addition = item.additional(ctx);
if ctx.obfuscate {
let mut hasher = Xxh3::new();
attribute.hash(&mut hasher);
addition.hash(&mut hasher);
selector = Self::base64(hasher.finish())
}
Self { inlinable: item.inlineable(), selector, attribute, addition }
}
pub fn get_class(&self) -> String {
self.selector.to_string()
}
pub fn write_css(&self, f: &mut (dyn Write)) -> Result<()> {
for c in self.selector.chars() {
match c {
' ' => write!(f, "_"),
r @ ('.' | '-' | '_') => write!(f, "{}", r),
a if a.is_alphanumeric() => write!(f, "{}", a),
_ => write!(f, "\\{}", c),
}?
}
f.write_char('{')?;
self.write_style(f)?;
f.write_char('}')?;
self.write_addition(f)
}
pub fn write_style(&self, f: &mut (dyn Write)) -> Result<()> {
for item in &self.attribute {
write!(f, "{}", item)?
}
Ok(())
}
pub fn write_addition(&self, f: &mut (dyn Write)) -> Result<()> {
f.write_str(&self.addition)?;
Ok(())
}
pub fn base64(hash: u64) -> String {
encode_config(hash.to_be_bytes(), URL_SAFE_NO_PAD)
}
}