rtl_isolate_fix 0.1.0

Plain-text RTL/LTR technical-token isolation using Unicode bidi isolates (LRI/PDI), with URL/email exclusions.
Documentation
use rtl_isolate_fix::{decorate_rtl_plain_text, FixConfig, LRI, PDI};

#[test]
fn wraps_csharp_in_rtl_sentence() {
    let cfg = FixConfig::default();
    let input = "زبان C# را دوست دارم.";
    let out = decorate_rtl_plain_text(input, &cfg);
    let expected = format!("زبان {lri}C#{pdi} را دوست دارم.", lri = LRI, pdi = PDI);
    assert_eq!(out, expected);
}

#[test]
fn keeps_sentence_punct_outside_isolate() {
    let cfg = FixConfig::default();
    let input = "زبان C#. عالیه";
    let out = decorate_rtl_plain_text(input, &cfg);
    let expected = format!("زبان {lri}C#{pdi}. عالیه", lri = LRI, pdi = PDI);
    assert_eq!(out, expected);
}

#[test]
fn does_not_wrap_urls() {
    let cfg = FixConfig::default();
    let input = "این لینک https://example.com خوب است.";
    let out = decorate_rtl_plain_text(input, &cfg);
    assert!(out.contains("https://example.com"));
    assert!(!out.contains(&format!("{lri}https://", lri = LRI)));
}

#[test]
fn does_not_wrap_emails() {
    let cfg = FixConfig::default();
    let input = "ایمیل test.user+1@example.com را چک کن.";
    let out = decorate_rtl_plain_text(input, &cfg);
    assert!(out.contains("test.user+1@example.com"));
    assert!(!out.contains(&format!("{lri}test.user", lri = LRI)));
}

#[test]
fn idempotent_when_already_isolated() {
    let cfg = FixConfig::default();
    let input = format!("زبان {lri}C#{pdi} را دوست دارم.", lri = LRI, pdi = PDI);
    let out = decorate_rtl_plain_text(&input, &cfg);
    assert_eq!(out, input);
}