nmd_core/utility/
text_utility.rs1use 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
31pub 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}