rustyle_css/
scope.rs

1use sha2::{Digest, Sha256};
2
3/// Generates a unique class name based on CSS content hash
4pub fn generate_class_name(css: &str) -> String {
5    let mut hasher = Sha256::new();
6    hasher.update(css.as_bytes());
7    let hash = hasher.finalize();
8    let hash_str = format!("{:x}", hash);
9    format!("rustyle-{}", &hash_str[..8])
10}
11
12/// Scopes CSS selectors by prefixing with a unique class name
13pub fn scope_css(css: &str, scope_class: &str) -> String {
14    // Simple scoping: prefix all class selectors with the scope
15    // This is a basic implementation - can be enhanced with proper CSS parsing
16    css.lines()
17        .map(|line| {
18            if line.trim().starts_with('.') {
19                format!("{}.{}", scope_class, line.trim_start_matches('.'))
20            } else {
21                line.to_string()
22            }
23        })
24        .collect::<Vec<_>>()
25        .join("\n")
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_generate_class_name() {
34        let name1 = generate_class_name("test css");
35        let name2 = generate_class_name("test css");
36        let name3 = generate_class_name("different css");
37
38        assert_eq!(name1, name2);
39        assert_ne!(name1, name3);
40        assert!(name1.starts_with("rustyle-"));
41    }
42}