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