logo
 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()
    }
    /// write css to buffers
    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)
    }
}