slugrs 0.3.4

A fast, locale-aware slugify library for Rust
Documentation
/// Supported locales for special-case transliterations.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Locale {
    /// German
    De,
    /// Turkish
    Tr,
    /// Arabic
    Ar,
}

impl Locale {
    /// Apply language-specific character replacements.
    pub fn apply(self, input: &str) -> String {
        match self {
            Locale::De => apply_de(input),
            Locale::Tr => apply_tr(input),
            Locale::Ar => apply_ar(input),
        }
    }
}

fn apply_de(input: &str) -> String {
    input
        .replace('ä', "ae")
        .replace('ö', "oe")
        .replace('ü', "ue")
        .replace('ß', "ss")
        .replace('Ä', "Ae")
        .replace('Ö', "Oe")
        .replace('Ü', "Ue")
}

fn apply_tr(input: &str) -> String {
    input
        .replace('ı', "i")
        .replace('İ', "I")
        .replace('ğ', "g")
        .replace('Ğ', "G")
        .replace('ş', "s")
        .replace('Ş', "S")
        .replace('ç', "c")
        .replace('Ç', "C")
        .replace('ö', "o")
        .replace('Ö', "O")
        .replace('ü', "u")
        .replace('Ü', "U")
}

fn apply_ar(input: &str) -> String {
    let mut out = String::with_capacity(input.len());
    for ch in input.chars() {
        match ch {
            'ا' => out.push('a'),
            'أ' => out.push('a'),
            'إ' => out.push_str("ii"),
            'آ' => out.push_str("aa"),
            'ب' => out.push('b'),
            'ت' => out.push('t'),
            'ث' => out.push_str("th"),
            'ج' => out.push('j'),
            'ح' => out.push_str("ha"),
            'خ' => out.push_str("kh"),
            'د' => out.push('d'),
            'ذ' => out.push_str("dh"),
            'ر' => out.push('r'),
            'ز' => out.push('z'),
            'س' => out.push('s'),
            'ش' => out.push_str("shi"),
            'ص' => out.push('s'),
            'ض' => out.push('d'),
            'ط' => out.push('t'),
            'ظ' => out.push('z'),
            'ع' => out.push_str("ea"),
            'غ' => out.push_str("gha"),
            'ف' => out.push('f'),
            'ق' => out.push('q'),
            'ك' => out.push('k'),
            'ل' => out.push('l'),
            'م' => out.push_str("mu"),
            'ن' => out.push('n'),
            'ه' => out.push('h'),
            'و' => out.push('w'),
            'ي' => out.push_str("iy"),
            'ى' => out.push_str("aa"),
            'ؤ' => out.push('u'),
            'ئ' => out.push('y'),
            'ء' => {} // hamza -> drop
            'ة' => out.push_str("at"),
            'ـ' => {} // tatweel -> drop
            // Harakat/diacritics: drop
            '\u{064B}' | '\u{064C}' | '\u{064D}' | '\u{064E}' | '\u{064F}' | '\u{0650}'
            | '\u{0651}' | '\u{0652}' => {}
            _ => out.push(ch),
        }
    }
    out
}