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