tailwind_rs_postcss/purger/
mod.rs

1//! CSS Purging System
2//! 
3//! This module provides comprehensive CSS purging functionality for removing
4//! unused CSS classes, essential for Tailwind CSS production builds.
5
6pub mod content_scanner;
7pub mod class_extractor;
8pub mod rule_filter;
9pub mod types;
10
11use types::*;
12
13/// Main CSS purger for removing unused CSS classes
14pub struct CSSPurger {
15    content_scanner: content_scanner::ContentScanner,
16    class_extractor: class_extractor::ClassExtractor,
17    rule_filter: rule_filter::RuleFilter,
18    config: PurgeConfig,
19}
20
21impl CSSPurger {
22    /// Create a new CSS purger with default configuration
23    pub fn new() -> Self {
24        Self::with_config(PurgeConfig::default())
25    }
26    
27    /// Create a new CSS purger with custom configuration
28    pub fn with_config(config: PurgeConfig) -> Self {
29        Self {
30            content_scanner: content_scanner::ContentScanner::new(),
31            class_extractor: class_extractor::ClassExtractor::new(),
32            rule_filter: rule_filter::RuleFilter::new(),
33            config,
34        }
35    }
36    
37    /// Purge unused CSS from content
38    pub fn purge(&mut self, css: &str, content_paths: &[String]) -> Result<PurgeResult, PurgeError> {
39        let start_time = std::time::Instant::now();
40        
41        // Step 1: Scan content for used classes
42        let used_classes = self.content_scanner.scan_content(content_paths)?;
43        
44        // Step 2: Extract CSS classes from CSS
45        let css_classes = self.class_extractor.extract_classes(css)?;
46        
47        // Step 3: Filter CSS rules based on used classes
48        let filtered_css = self.rule_filter.filter_rules(css, &used_classes, &self.config)?;
49        
50        let processing_time = start_time.elapsed();
51        let original_size = css.len();
52        let purged_size = filtered_css.len();
53        let size_reduction = if original_size > 0 {
54            ((original_size - purged_size) as f64 / original_size as f64) * 100.0
55        } else {
56            0.0
57        };
58        
59        Ok(PurgeResult {
60            purged_css: filtered_css,
61            used_classes: used_classes.len(),
62            removed_classes: css_classes.len() - used_classes.len(),
63            original_size,
64            purged_size,
65            size_reduction_percentage: size_reduction,
66            processing_time,
67        })
68    }
69    
70    /// Purge with advanced options
71    pub fn purge_advanced(&mut self, css: &str, content_paths: &[String], options: &PurgeOptions) -> Result<PurgeResult, PurgeError> {
72        let start_time = std::time::Instant::now();
73        
74        // Step 1: Scan content for used classes with advanced options
75        let used_classes = self.content_scanner.scan_content_advanced(content_paths, options)?;
76        
77        // Step 2: Extract CSS classes from CSS
78        let css_classes = self.class_extractor.extract_classes(css)?;
79        
80        // Step 3: Filter CSS rules based on used classes with advanced options
81        let filtered_css = self.rule_filter.filter_rules_advanced(css, &used_classes, &self.config, options)?;
82        
83        let processing_time = start_time.elapsed();
84        let original_size = css.len();
85        let purged_size = filtered_css.len();
86        let size_reduction = if original_size > 0 {
87            ((original_size - purged_size) as f64 / original_size as f64) * 100.0
88        } else {
89            0.0
90        };
91        
92        Ok(PurgeResult {
93            purged_css: filtered_css,
94            used_classes: used_classes.len(),
95            removed_classes: css_classes.len() - used_classes.len(),
96            original_size,
97            purged_size,
98            size_reduction_percentage: size_reduction,
99            processing_time,
100        })
101    }
102    
103    /// Get purge statistics
104    pub fn get_statistics(&self) -> PurgeStatistics {
105        PurgeStatistics {
106            total_purges: 0, // Will be updated during purging
107            average_size_reduction: 0.0,
108            processing_time: std::time::Duration::from_secs(0),
109        }
110    }
111}
112
113// Re-export types for convenience
114pub use types::*;