pub mod analyzer;
pub mod minifier;
pub mod property_optimizer;
pub mod rule_merger;
pub mod selector_optimizer;
pub mod types;
pub struct CSSOptimizer {
analyzer: analyzer::CSSAnalyzer,
rule_merger: rule_merger::RuleMerger,
property_optimizer: property_optimizer::PropertyOptimizer,
selector_optimizer: selector_optimizer::SelectorOptimizer,
minifier: minifier::CSSMinifier,
config: types::OptimizationConfig,
}
impl CSSOptimizer {
pub fn new() -> Self {
Self::with_config(types::OptimizationConfig::default())
}
pub fn with_config(config: types::OptimizationConfig) -> Self {
Self {
analyzer: analyzer::CSSAnalyzer::new(),
rule_merger: rule_merger::RuleMerger::new(),
property_optimizer: property_optimizer::PropertyOptimizer::new(),
selector_optimizer: selector_optimizer::SelectorOptimizer::new(),
minifier: minifier::CSSMinifier::new(),
config,
}
}
pub fn optimize(
&mut self,
css: &str,
) -> Result<types::OptimizationResult, types::OptimizationError> {
let start_time = std::time::Instant::now();
let original_size = css.len();
let analysis = self.analyzer.analyze(css)?;
let mut optimized_css = css.to_string();
let mut metrics = types::OptimizationMetrics::new();
if self.config.merge_rules {
let merge_result = self.rule_merger.merge_rules(&optimized_css)?;
optimized_css = merge_result.optimized_css;
metrics.rules_merged = merge_result.rules_merged;
}
if self.config.optimize_properties {
let property_result = self
.property_optimizer
.optimize_properties(&optimized_css)?;
optimized_css = property_result.optimized_css;
metrics.properties_optimized = property_result.properties_optimized;
metrics.duplicates_removed = property_result.duplicates_removed;
}
if self.config.optimize_selectors {
let selector_result = self.selector_optimizer.optimize_selectors(&optimized_css)?;
optimized_css = selector_result.optimized_css;
metrics.selectors_optimized = selector_result.selectors_optimized;
}
if self.config.minify {
let minified = self.minifier.minify(&optimized_css)?;
optimized_css = minified;
}
let processing_time = start_time.elapsed();
let final_size = optimized_css.len();
let size_reduction = if original_size > 0 {
((original_size - final_size) as f64 / original_size as f64) * 100.0
} else {
0.0
};
metrics.original_size = original_size;
metrics.optimized_size = final_size;
metrics.size_reduction_percentage = size_reduction;
metrics.processing_time = processing_time;
Ok(types::OptimizationResult {
optimized_css,
metrics,
analysis,
})
}
pub fn get_statistics(&self) -> types::OptimizationStatistics {
types::OptimizationStatistics {
total_optimizations: 0, average_size_reduction: 0.0,
processing_time: std::time::Duration::from_secs(0),
}
}
}
pub use types::*;