yekdast 0.2.0

A utility library for normalizing and cleaning up Persian (Farsi) text.
Documentation
# Yekdast (یکدست)  yekdast-rs

[![Crates.io](https://img.shields.io/crates/v/yekdast.svg)](https://crates.io/crates/yekdast)


یک کتابخانه سریع، قابل تنظیم و مدرن به زبان Rust برای **یکسان‌سازی و پیش‌پردازش متن فارسی**.

`Yekdast` ابزاری قدرتمند برای تمیز کردن داده‌های متنی فارسی است که آن‌ها را برای مراحل بعدی مانند جستجو، تحلیل یا نمایش در برنامه‌ها آماده می‌کند.

---
### ## چرا Yekdast؟

* **🚀 فوق‌سریع و بدون سربار (Zero-Cost):** در نسخه ۰.۲.۰ تمام `HashMap`ها حذف شده و از ساختارهای `match` و `[char; 10]` برای پردازش استفاده شده که سرعت اجرای پردازش‌ها را به شکل خیره‌کننده‌ای افزایش داده است.
* **🔧 کاملاً قابل تنظیم:** شما می‌توانید دیکشنری‌های دلخواه خود را برای مدیریت کلمات مرکب، اصلاح کلمات محاوره‌ای و قوانین جایگزینی سفارشی ارائه دهید.
* **🧠 هوشمند:** قابلیت مدیریت هوشمند نیم‌فاصله (ZWNJ) برای پیشوندها، پسوندها و کلمات مرکب.
* **🛡️ امن:** بخش‌های حساس متن مانند URL، ایمیل، کد و تگ‌های HTML به صورت خودکار محافظت می‌شوند.
* **✨ جامع:** مجموعه‌ای کامل از قابلیت‌ها شامل یکسان‌سازی حروف، ارقام، علائم نگارشی و فاصله‌ها.
* **🦀 مدرن (Rust 1.80+):** با استفاده از ویژگی‌های مدرن و بومی Rust (مانند `std::sync::LazyLock`)، وابستگی‌های غیرضروری حذف شده است.

---
### ## نصب

برای استفاده از `Yekdast` در پروژه خود، کافی است خط زیر را به فایل `Cargo.toml` اضافه کنید:
```toml
[dependencies]
yekdast = "0.2.0" 
```
**توجه:** این کتابخانه به نسخه Rust 1.80 یا بالاتر نیاز دارد.

---
### ## شروع سریع

استفاده از کتابخانه با تنظیمات پیش‌فرض بسیار ساده است.

```rust
use yekdast::{normalize_text, NormalizeOptions};

fn main() {
    let messy_text = "سلام, من يك برنامه نويس هستم و در كتاب خانه كار مي كنم.";
    
    // استفاده از تنظیمات پیش‌فرض
    let options = NormalizeOptions::default();
    
    let clean_text = normalize_text(messy_text, &options);
    
    println!("متن اصلی: {}", messy_text);
    println!("متن اصلاح شده: {}", clean_text);
    // خروجی: متن اصلاح شده: سلام، من یک برنامه نویس هستم و در کتاب خانه کار می کنم.
}
```

---
### ## استفاده پیشرفته و گزینه‌ها

قدرت واقعی `Yekdast` در قابلیت تنظیم آن است. شما می‌توانید تمام جنبه‌های نرمال‌سازی را کنترل کنید.

```rust
use yekdast::{normalize_text, NormalizeOptions, DigitPolicy};
use std::collections::HashMap;

fn main() {
    let text = "من توی خونه شماره 123 کار میکنم و علاقه مند به برنامه نویسی هستم. میباشد.";

    // ۱. دیکشنری کلمات محاوره‌ای به رسمی
    let mut slang_map = HashMap::new();
    slang_map.insert("توی".to_string(), "در".to_string());
    slang_map.insert("خونه".to_string(), "خانه".to_string());

    // ۲. لیست کلمات مرکب برای اعمال نیم‌فاصله
    let zwnj_words = vec![
        "علاقه مند".to_string(),
        "کار میکنم".to_string(), // این یک مثال است، معمولاً برای افعال استفاده نمی‌شود
    ];

    // ۳. قوانین جایگزینی سفارشی
    let custom_rules = vec![
        ("میباشد.".to_string(), "است.".to_string()),
    ];

    // ۴. ساختن تنظیمات نهایی
    let options = NormalizeOptions {
        digits: DigitPolicy::Fa, // تبدیل اعداد به فارسی
        slang_map,
        zwnj_compound_words: zwnj_words,
        custom_rules,
        ..Default::default()
    };
    
    let clean_text = normalize_text(text, &options);

    println!("{}", clean_text);
    // خروجی: من در خانه شماره ۱۲۳ کار‌می‌کنم و علاقه‌مند به برنامه نویسی هستم. است.
}
```

### ## لیست کامل قابلیت‌ها
- [x] یکسان‌سازی حروف عربی (ي, ك) به فارسی (ی, ک)
- [x] نرمال‌سازی و تبدیل ارقام (فارسی، عربی، لاتین)
- [x] اصلاح علائم نگارشی (کاما، نقطه ویرگول، علامت سوال)
- [x] مدیریت هوشمند نیم‌فاصله (ZWNJ) برای پیشوندها (`می/نمی`)، پسوندها (`ها/تر/ترین`) و کلمات مرکب سفارشی
- [x] قابلیت تعریف دیکشنری سفارشی برای تبدیل کلمات محاوره‌ای به رسمی
- [x] قابلیت تعریف قوانین جایگزینی سفارشی
- [x] پاک‌سازی فاصله‌گذاری‌های اضافه
- [x] نرمال‌سازی کاراکترهای خط جدید (Newlines)
- [x] حذف اعراب و کشیدگی (تطویل)
- [x] محافظت خودکار از URL, ایمیل, کد و تگ‌های HTML
- [x] پشتیبانی از فرمت‌های مختلف نرمال‌سازی یونیکد (NFC, NFKC)

---
### ## مشارکت

مشارکت در این پروژه مورد استقبال قرار می‌گیرد. لطفاً برای گزارش باگ یا ارائه پیشنهاد، یک Issue جدید باز کنید یا یک Pull Request ارسال نمایید.

---
### ## مجوز

این پروژه تحت مجوز MIT منتشر شده است.



![Repo Badge](https://visitor-badge.laobi.icu/badge?page_id=null-err0r.yekdast)