bim 0.1.0

A content-first static site generator for blogs, digital gardens, and knowledge bases
Documentation
use whatlang::{detect, Lang};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TextDirection {
    #[default]
    Ltr,
    Rtl,
}

impl TextDirection {
    pub fn as_str(&self) -> &'static str {
        match self {
            TextDirection::Ltr => "ltr",
            TextDirection::Rtl => "rtl",
        }
    }
}

pub fn detect_language(content: &str) -> (String, TextDirection) {
    if let Some(info) = detect(content) {
        let lang_code = lang_to_code(info.lang());
        let direction = if is_rtl_language(info.lang()) {
            TextDirection::Rtl
        } else {
            TextDirection::Ltr
        };
        (lang_code.to_string(), direction)
    } else {
        ("en".to_string(), TextDirection::Ltr)
    }
}

fn lang_to_code(lang: Lang) -> &'static str {
    match lang {
        Lang::Ara => "ar",
        Lang::Ben => "bn",
        Lang::Cmn => "zh",
        Lang::Deu => "de",
        Lang::Eng => "en",
        Lang::Fra => "fr",
        Lang::Hin => "hi",
        Lang::Ita => "it",
        Lang::Jpn => "ja",
        Lang::Kor => "ko",
        Lang::Por => "pt",
        Lang::Rus => "ru",
        Lang::Spa => "es",
        Lang::Tur => "tr",
        Lang::Heb => "he",
        Lang::Pes => "fa",
        Lang::Urd => "ur",
        _ => "en",
    }
}

fn is_rtl_language(lang: Lang) -> bool {
    matches!(lang, Lang::Ara | Lang::Heb | Lang::Pes | Lang::Urd)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_detect_english() {
        let (lang, dir) = detect_language("This is a simple English text for testing.");
        assert_eq!(lang, "en");
        assert_eq!(dir, TextDirection::Ltr);
    }

    #[test]
    fn test_detect_arabic() {
        let (lang, dir) = detect_language("هذا نص عربي للاختبار والتحقق من اللغة");
        assert_eq!(lang, "ar");
        assert_eq!(dir, TextDirection::Rtl);
    }
}