1pub fn name_fix(text: &str) -> String {
2 let mut result = String::with_capacity(text.len());
3
4 let mut last_was_underscore = false;
5 for c in text.chars() {
6 if c.is_ascii() {
8 if c.is_whitespace()
10 || c == ','
11 || c == '-'
12 || c == '"'
13 || c == '\''
14 || c == '#'
15 || c == '!'
16 || c == '('
17 || c == ')'
18 || c == '['
19 || c == ']'
20 || c == '='
21 || c == '+'
22 || c == '<'
23 || c == '>'
24 || c == '@'
25 || c == '$'
26 || c == '%'
27 || c == '^'
28 || c == '&'
29 || c == '*'
30 {
31 if !last_was_underscore {
33 result.push('_');
34 last_was_underscore = true;
35 }
36 } else {
37 result.push(c);
39 last_was_underscore = false;
40 }
41 }
42 }
44
45 return result.to_lowercase();
47}
48
49pub fn path_fix(text: &str) -> String {
50 if text.ends_with('/') {
52 return text.to_string();
53 }
54
55 match text.rfind('/') {
57 Some(pos) => {
58 let path = &text[..=pos];
60 let filename = &text[pos + 1..];
61
62 return format!("{}{}", path, name_fix(filename));
64 }
65 None => {
66 return name_fix(text);
68 }
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75
76 #[test]
77 fn test_name_fix() {
78 assert_eq!(name_fix("Hello World"), "hello_world");
80 assert_eq!(name_fix("File-Name.txt"), "file_name.txt");
81 assert_eq!(name_fix("Test!@#$%^&*()"), "test_");
82 assert_eq!(name_fix("Space, Tab\t, Comma,"), "space_tab_comma_");
83 assert_eq!(name_fix("Quotes\"'"), "quotes_");
84 assert_eq!(name_fix("Brackets[]<>"), "brackets_");
85 assert_eq!(name_fix("Operators=+-"), "operators_");
86
87 assert_eq!(name_fix("Café"), "caf");
89 assert_eq!(name_fix("Résumé"), "rsum");
90 assert_eq!(name_fix("Über"), "ber");
91
92 assert_eq!(name_fix("UPPERCASE"), "uppercase");
94 assert_eq!(name_fix("MixedCase"), "mixedcase");
95 }
96
97 #[test]
98 fn test_path_fix() {
99 assert_eq!(path_fix("/path/to/directory/"), "/path/to/directory/");
101
102 assert_eq!(path_fix("filename.txt"), "filename.txt");
104 assert_eq!(path_fix("UPPER-file.md"), "upper_file.md");
105
106 assert_eq!(path_fix("/path/to/File Name.txt"), "/path/to/file_name.txt");
108 assert_eq!(
109 path_fix("./relative/path/to/DOCUMENT-123.pdf"),
110 "./relative/path/to/document_123.pdf"
111 );
112 assert_eq!(
113 path_fix("/absolute/path/to/Résumé.doc"),
114 "/absolute/path/to/rsum.doc"
115 );
116
117 assert_eq!(
119 path_fix("/path/with/[special]<chars>.txt"),
120 "/path/with/_special_chars_.txt"
121 );
122 }
123}