nmd_core/utility/
text_utility.rs

1use regex::Regex;
2
3use super::nmd_unique_identifier::NmdUniqueIdentifier;
4
5
6pub fn normalize_newlines(input: &str) -> String {
7    input.replace("\r\n", "\n").replace("\r", "\n")
8}
9
10pub fn replace(content: &str, replacements: &Vec<(Regex, String)>) -> String {
11    let mut result = String::from(content);
12
13    for (regex, rep) in replacements {
14        result = regex.replace_all(&result, rep).to_string();
15    }
16
17    result
18}
19
20pub fn html_nuid_tag_or_nothing(nuid: Option<&NmdUniqueIdentifier>) -> String {
21    if let Some(nuid) = nuid {
22        return format!(r#" data-nuid="{}""#, nuid);
23      }
24
25      String::new()
26}
27
28pub type Styles = String;
29pub type Classes = String;
30
31/// return styles and classes
32pub fn split_styles_and_classes_with_default(content: &str, default: (Option<Styles>, Option<Classes>)) -> (Option<Styles>, Option<Classes>) {
33    let mut styles = default.0.unwrap_or(Styles::new());
34    let mut classes = default.1.unwrap_or(Styles::new());
35    
36    for item in content.split(";") {
37        let item = item.trim();
38
39        if !item.is_empty() {
40            if item.starts_with(".") {
41        
42                classes.push_str(" ");
43                classes.push_str(&item[1..item.len()]);
44            
45            } else {
46    
47                styles.push_str(" ");
48                styles.push_str(item);
49                styles.push_str(";");
50            }
51        }
52
53    }
54
55    styles = styles.trim().to_string();
56    classes = classes.trim().to_string();
57
58    let mut result: (Option<Styles>, Option<Classes>) = (None, None);
59
60    if !styles.is_empty() {
61        result.0 = Some(styles);
62    }
63
64    if !classes.is_empty() {
65        result.1 = Some(classes);
66    }
67
68    result
69}
70
71pub fn split_styles_and_classes(content: &str) -> (Option<Styles>, Option<Classes>) {
72    self::split_styles_and_classes_with_default(content, (None, None))
73}
74
75
76#[cfg(test)]
77mod test {
78
79    #[test]
80    fn test_split_styles_and_classes() {
81        let content = "\nstyle1:value1;.class1;style2:value2;.class2\n";
82
83        let (styles, classes) = super::split_styles_and_classes(content);
84
85        assert_eq!(styles.unwrap(), "style1:value1; style2:value2;");
86        assert_eq!(classes.unwrap(), "class1 class2");
87
88        let content = "\nstyle1:value1;style2:value2;\n";
89
90        let (styles, classes) = super::split_styles_and_classes(content);
91
92        assert_eq!(styles.unwrap(), "style1:value1; style2:value2;");
93        assert_eq!(classes, None);
94    }
95}