Initial commit
This commit is contained in:
		
						commit
						4c36af1d50
					
				
					 3 changed files with 96 additions and 0 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					/target
 | 
				
			||||||
 | 
					/Cargo.lock
 | 
				
			||||||
							
								
								
									
										8
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
					[package]
 | 
				
			||||||
 | 
					name = "schmfy"
 | 
				
			||||||
 | 
					version = "0.1.0"
 | 
				
			||||||
 | 
					edition = "2021"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[dependencies]
 | 
				
			||||||
							
								
								
									
										86
									
								
								src/lib.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/lib.rs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,86 @@
 | 
				
			||||||
 | 
					// Schmfies any String
 | 
				
			||||||
 | 
					pub fn schmfy(source: String) -> String {
 | 
				
			||||||
 | 
					    if source.starts_with("schm") {
 | 
				
			||||||
 | 
					        return source;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // if source is subsite (e.g. news/fsr), schmfy all parts separately
 | 
				
			||||||
 | 
					    if source.contains('/') {
 | 
				
			||||||
 | 
					        return source
 | 
				
			||||||
 | 
					            .split('/')
 | 
				
			||||||
 | 
					            .map(|s| schmfy(String::from(s)))
 | 
				
			||||||
 | 
					            .collect::<Vec<String>>()
 | 
				
			||||||
 | 
					            .join("/");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if source.is_empty() {
 | 
				
			||||||
 | 
					        return source;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // schmfy first char if word is no longer than 3
 | 
				
			||||||
 | 
					    if source.len() <= 3 {
 | 
				
			||||||
 | 
					        let (prefix, suffix) = source.split_at(1);
 | 
				
			||||||
 | 
					        let c = prefix.chars().next().unwrap_or('-');
 | 
				
			||||||
 | 
					        return schmfy_char(c) + suffix;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Normal words - replace prefix before first vocal
 | 
				
			||||||
 | 
					    // with "schm"
 | 
				
			||||||
 | 
					    let vok_pos = source
 | 
				
			||||||
 | 
					        .chars()
 | 
				
			||||||
 | 
					        .position(|c| "aeiouäöü".contains(c))
 | 
				
			||||||
 | 
					        .unwrap_or(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let (_, suffix) = source.split_at(vok_pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    String::from("schm") + suffix
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Schmfies single char
 | 
				
			||||||
 | 
					fn schmfy_char(c: char) -> String {
 | 
				
			||||||
 | 
					    let mut ret = String::from("schm");
 | 
				
			||||||
 | 
					    match c {
 | 
				
			||||||
 | 
					        'a' | 'e' | 'i' | 'o' | 'u' | 'ä' | 'ö' | 'ü' => {
 | 
				
			||||||
 | 
					            ret.push(c);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        'b' | 'c' | 'd' | 'g' | 'p' | 't' | 'w' => ret.push('e'),
 | 
				
			||||||
 | 
					        'f' | 'l' | 'm' | 'n' | 'r' | 's' => {
 | 
				
			||||||
 | 
					            ret.push('e');
 | 
				
			||||||
 | 
					            ret.push(c)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        'h' | 'k' => ret.push('a'),
 | 
				
			||||||
 | 
					        'j' => {
 | 
				
			||||||
 | 
					            ret.push('o');
 | 
				
			||||||
 | 
					            ret.push('t')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        'q' => ret.push('u'),
 | 
				
			||||||
 | 
					        'v' => {
 | 
				
			||||||
 | 
					            ret.push('a');
 | 
				
			||||||
 | 
					            ret.push('u')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        'x' => {
 | 
				
			||||||
 | 
					            ret.push('i');
 | 
				
			||||||
 | 
					            ret.push('x')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        'y' => ret.push(c),
 | 
				
			||||||
 | 
					        'z' => {
 | 
				
			||||||
 | 
					            ret.push('e');
 | 
				
			||||||
 | 
					            ret.push('t')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        _ => ret.push(c),
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(test)]
 | 
				
			||||||
 | 
					mod tests {
 | 
				
			||||||
 | 
					    use super::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[test]
 | 
				
			||||||
 | 
					    fn it_works() {
 | 
				
			||||||
 | 
					        let schmfied = schmfy(String::from("test"));
 | 
				
			||||||
 | 
					        assert_eq!(schmfied, "schmest");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in a new issue