pub mod class_extractor;
pub mod content_scanner;
pub mod rule_filter;
pub mod types;
use types::*;
pub struct CSSPurger {
content_scanner: content_scanner::ContentScanner,
class_extractor: class_extractor::ClassExtractor,
rule_filter: rule_filter::RuleFilter,
config: PurgeConfig,
}
impl CSSPurger {
pub fn new() -> Self {
Self::with_config(PurgeConfig::default())
}
pub fn with_config(config: PurgeConfig) -> Self {
Self {
content_scanner: content_scanner::ContentScanner::new(),
class_extractor: class_extractor::ClassExtractor::new(),
rule_filter: rule_filter::RuleFilter::new(),
config,
}
}
pub fn purge(
&mut self,
css: &str,
content_paths: &[String],
) -> Result<PurgeResult, PurgeError> {
let start_time = std::time::Instant::now();
let used_classes = self.content_scanner.scan_content(content_paths)?;
let css_classes = self.class_extractor.extract_classes(css)?;
let filtered_css = self
.rule_filter
.filter_rules(css, &used_classes, &self.config)?;
let processing_time = start_time.elapsed();
let original_size = css.len();
let purged_size = filtered_css.len();
let size_reduction = if original_size > 0 {
((original_size - purged_size) as f64 / original_size as f64) * 100.0
} else {
0.0
};
Ok(PurgeResult {
purged_css: filtered_css,
used_classes: used_classes.len(),
removed_classes: css_classes.len() - used_classes.len(),
original_size,
purged_size,
size_reduction_percentage: size_reduction,
processing_time,
})
}
pub fn purge_advanced(
&mut self,
css: &str,
content_paths: &[String],
options: &PurgeOptions,
) -> Result<PurgeResult, PurgeError> {
let start_time = std::time::Instant::now();
let used_classes = self
.content_scanner
.scan_content_advanced(content_paths, options)?;
let css_classes = self.class_extractor.extract_classes(css)?;
let filtered_css =
self.rule_filter
.filter_rules_advanced(css, &used_classes, &self.config, options)?;
let processing_time = start_time.elapsed();
let original_size = css.len();
let purged_size = filtered_css.len();
let size_reduction = if original_size > 0 {
((original_size - purged_size) as f64 / original_size as f64) * 100.0
} else {
0.0
};
Ok(PurgeResult {
purged_css: filtered_css,
used_classes: used_classes.len(),
removed_classes: css_classes.len() - used_classes.len(),
original_size,
purged_size,
size_reduction_percentage: size_reduction,
processing_time,
})
}
pub fn get_statistics(&self) -> PurgeStatistics {
PurgeStatistics {
total_purges: 0, average_size_reduction: 0.0,
processing_time: std::time::Duration::from_secs(0),
}
}
}
pub use types::*;