tailwind_css_fixes/modules/typography/font/
mod.rs

1use super::*;
2
3pub(crate) mod font_family;
4pub(crate) mod font_size;
5pub(crate) mod font_smoothing;
6pub(crate) mod font_style;
7pub(crate) mod font_variant_numeric;
8pub(crate) mod font_weight;
9
10pub fn font_adaptor(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
11    let out = match pattern {
12        // https://tailwindcss.com/docs/float
13        ["thin"] => TailwindFontWeight::THIN.boxed(),
14        ["extralight"] => TailwindFontWeight::EXTRA_LIGHT.boxed(),
15        ["light"] => TailwindFontWeight::LIGHT.boxed(),
16        ["normal"] => TailwindFontWeight::NORMAL.boxed(),
17        ["medium"] => TailwindFontWeight::MEDIUM.boxed(),
18        ["semibold"] => TailwindFontWeight::SEMI_BOLD.boxed(),
19        ["bold"] => TailwindFontWeight::BOLD.boxed(),
20        ["extrabold"] => TailwindFontWeight::EXTRA_BOLD.boxed(),
21        ["black"] => TailwindFontWeight::BLACK.boxed(),
22        // Extended syntax for font-size: font-{size}    (usually it's text-{size})
23        ["size"] => TailwindFontSize::parse(pattern, arbitrary)?.boxed(),
24        ["size", n] => {
25            let a = TailwindArbitrary::from(*n);
26            TailwindFontSize::parse(pattern, &a)?.boxed()
27        },
28        // Extended syntax for font-family: font-family-{family}    (usually it's font-{family})
29        ["family", rest @ ..] => {
30            if rest.is_empty() && arbitrary.is_some() {
31                return Ok(TailwindFontFamily::from(arbitrary.get_properties()).boxed())
32            }
33            TailwindFontFamily::from(rest.join("-")).boxed()
34        },
35        // Try parse as font weight if pattern has one segment
36        // - will fail if segment is not an int
37        [n] => {
38            let a = TailwindArbitrary::from(*n);
39            maybe_weight(&a)?
40        },
41        // Try parse as font family if pattern has 1+ segments
42        [_, _rest @ ..] => {
43            TailwindFontFamily::from(pattern.join("-")).boxed()
44        },
45        // If no pattern, try parse the arbitrary:
46        // 1) try parse as font weight, 
47        // 2) if fails, try parse as font family
48        [] => {
49            maybe_weight(arbitrary)
50               .or_else(|_| Ok::<Box<dyn TailwindInstance>, TailwindError>(
51                    TailwindFontFamily::from(arbitrary.get_properties()).boxed()
52                ))?
53        }
54    };
55    Ok(out)
56}
57
58fn maybe_weight(arbitrary: &TailwindArbitrary) -> Result<Box<dyn TailwindInstance>> {
59    let w = arbitrary.as_integer()?;
60    Ok(TailwindFontWeight::new(w).boxed())
61}