Home / Class/ PreProcessor Class — tailwindcss Architecture

PreProcessor Class — tailwindcss Architecture

Architecture documentation for the PreProcessor class in pre_processor.rs from the tailwindcss codebase.

Entity Profile

Dependency Diagram

graph TD
  e1768bee_1354_a08a_9601_96218360264b["PreProcessor"]
  c9eebb75_dc3f_0649_0b9f_ee56e4ee9c1c["pre_processor.rs"]
  e1768bee_1354_a08a_9601_96218360264b -->|defined in| c9eebb75_dc3f_0649_0b9f_ee56e4ee9c1c

Relationship Graph

Source Code

crates/oxide/src/extractor/pre_processors/pre_processor.rs lines 1–162

pub trait PreProcessor: Sized + Default {
    fn process(&self, content: &[u8]) -> Vec<u8>;

    #[cfg(test)]
    fn test(input: &str, expected: &str) {
        use pretty_assertions::assert_eq;

        let input = input.as_bytes();
        let expected = expected.as_bytes();

        let processor = Self::default();

        let actual = processor.process(input);

        // Convert to strings for better error messages.
        let input = String::from_utf8_lossy(input);
        let actual = String::from_utf8_lossy(&actual);
        let expected = String::from_utf8_lossy(expected);

        // The input and output should have the exact same length.
        assert_eq!(input.len(), actual.len());
        assert_eq!(actual.len(), expected.len());

        assert_eq!(actual, expected);
    }

    #[cfg(test)]
    fn test_extract_exact(input: &str, expected: Vec<&str>) {
        use crate::extractor::{Extracted, Extractor};

        let input = input.as_bytes();

        let processor = Self::default();
        let transformed = processor.process(input);

        let extracted = Extractor::new(&transformed).extract();

        // Extract all candidates and css variables.
        let candidates = extracted
            .iter()
            .filter_map(|x| match x {
                Extracted::Candidate(bytes) => std::str::from_utf8(bytes).ok(),
                Extracted::CssVariable(bytes) => std::str::from_utf8(bytes).ok(),
            })
            .collect::<Vec<_>>();

        if candidates != expected {
            dbg!(&candidates, &expected);
            panic!("Extracted candidates do not match expected candidates");
        }
    }

    #[cfg(test)]
    fn test_extract_contains(input: &str, expected: Vec<&str>) {
        use crate::extractor::{Extracted, Extractor};

        let input = input.as_bytes();

        let processor = Self::default();
        let transformed = processor.process(input);

        let extracted = Extractor::new(&transformed).extract();

        // Extract all candidates and css variables.
        let candidates = extracted
            .iter()
            .filter_map(|x| match x {
                Extracted::Candidate(bytes) => std::str::from_utf8(bytes).ok(),
                Extracted::CssVariable(bytes) => std::str::from_utf8(bytes).ok(),
            })
            .collect::<Vec<_>>();

        // Ensure all items are present in the candidates.
        let mut missing = vec![];
        for item in &expected {
            if !candidates.contains(item) {
                missing.push(item);
            }
        }

        if !missing.is_empty() {

Frequently Asked Questions

What is the PreProcessor class?
PreProcessor is a class in the tailwindcss codebase, defined in crates/oxide/src/extractor/pre_processors/pre_processor.rs.
Where is PreProcessor defined?
PreProcessor is defined in crates/oxide/src/extractor/pre_processors/pre_processor.rs at line 1.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free