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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use std::{collections::BTreeSet, fmt::Debug};
use crate::{systems::instruction::TailwindInstruction, *};
mod methods;
mod setter;
#[derive(Debug)]
pub struct TailwindBuilder {
pub obfuscate: bool,
pub objects: BTreeSet<CssInstance>,
pub preflight: PreflightSystem,
pub palettes: PaletteSystem,
pub screens: BreakPointSystem,
pub fonts: FontSystem,
}
impl TailwindBuilder {
#[inline]
#[track_caller]
pub fn inline(&mut self, style: &str, mode: InlineMode) -> Result<CssBundle> {
let parsed = parse_tailwind(style)?;
let mut out = CssBundle::default();
for item in parsed {
let i = CssInstance::new(&*item.get_instance()?, self);
match i.inlinable {
true => out.insert(i.clone()),
false => self.objects.insert(i),
};
}
out.set_inline(mode);
Ok(out)
}
#[inline]
#[track_caller]
pub fn trace(&mut self, style: &str) -> Result<CssBundle> {
let parsed = parse_tailwind(style)?;
let mut out = CssBundle::default();
for item in parsed {
let i = CssInstance::new(&*item.get_instance()?, self);
out.insert(i.clone());
self.objects.insert(i);
}
Ok(out)
}
pub fn bundle(&self) -> Result<String> {
let mut out = String::with_capacity(1024 * 10);
if !self.preflight.disable {
out.push_str(&self.preflight.to_string());
}
for item in &self.objects {
item.write_css(&mut out)?;
}
Ok(out)
}
}
fn parse_tailwind(input: &str) -> Result<Vec<TailwindInstruction>> {
let styles = tailwind_ast::parse_tailwind(input)?;
Ok(styles.into_iter().map(TailwindInstruction::from).collect())
}