sansaccent 0.1.0

Convertit les chaînes françaises en slugs URL-friendly en supprimant accents et caractères spéciaux
Documentation
# sansaccent

Petit utilitaire pour la normalisation de texte français en URLs conviviales (slugs).

## Description

**sansaccent** est un utilitaire spécialement conçu pour le français qui normalise l'accentuation et les caractères spéciaux, en remplaçant les espaces par des tirets. Cette bibliothèque est particulièrement utile pour :

- Générer des URLs SEO-friendly à partir de titres français
- Créer des identifiants de fichiers sans caractères problématiques
- Normaliser des chaînes de caractères pour des systèmes qui ne supportent pas les accents

## Fonctionnalités

✅ **Suppression des accents et caractères diacritiques**  
✅ **Conversion en minuscules**  
✅ **Gestion des ligatures françaises** (œ → oe, æ → ae)  
✅ **Remplacement des caractères spéciaux sémantiques** (€ → euro, & → et, @ → at, % → pourcent)  
✅ **Normalisation des espaces multiples**  
✅ **Suppression des guillemets typographiques**
✅ **Support Unicode complet**  
✅ **Trait Slugify** pour `&str`, `String` et `Cow<'_, str>`  
✅ **Intégration Serde optionnelle** (feature `serde`) pour sérialiser/désérialiser des slugs  

## Installation

Ajoutez `sansaccent` à votre `Cargo.toml` :

```toml
[dependencies]
sansaccent = "1.0.0"
```

Ou utilisez cargo pour l'installer :

```bash
cargo add sansaccent
```

Activer l'intégration Serde (optionnelle):

```toml
[dependencies]
sansaccent = { version = "1.0.0", features = ["serde"] }
```

## Usage

### Exemple basique

```rust
use sansaccent::slugify;

fn main() {
    println!("{}", slugify("Café de l'été")); 
    // Affiche: "cafe-de-l-ete"
    
    println!("{}", slugify("Un cœur en hiver")); 
    // Affiche: "un-coeur-en-hiver"
    
    println!("{}", slugify("L'æther & l'€uro")); 
    // Affiche: "l-aether-et-l-euro-uro"
}
```

### Exemple avec le trait Slugify

```rust
use sansaccent::Slugify;

fn main() {
    let s = String::from("Café de l'été");
    println!("{}", s.slugify()); // "cafe-de-l-ete"
}
```

### Exemple avec Serde (feature `serde`)

```rust
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Post {
    // Le slug sera normalisé à la sérialisation et à la désérialisation
    #[serde(with = "sansaccent::serde")]
    slug: String,
}
```

### Cas d'usage avancés

```rust
use sansaccent::slugify;

// Texte avec caractères spéciaux
assert_eq!(slugify("Prix: 10€"), "prix-10-euro");
assert_eq!(slugify("Tom & Jerry"), "tom-et-jerry");
assert_eq!(slugify("contact@example.com"), "contact-at-example-com");
assert_eq!(slugify("50% de réduction"), "50-pourcent-de-reduction");

// Guillemets et caractères typographiques
assert_eq!(slugify("«guillemets français»"), "guillemets-francais");
assert_eq!(slugify("'apostrophes'"), "apostrophes");

// Gestion des espaces multiples
assert_eq!(slugify("trop   d'espaces     entre les mots"), "trop-d-espaces-entre-les-mots");

// Suppression des séparateurs en début/fin
assert_eq!(slugify("--test--"), "test");
assert_eq!(slugify("   test   "), "test");
```

## API

### `slugify(input: &str) -> String`

Convertit une chaîne de caractères en slug URL-friendly.

**Paramètres :**
- `input: &str` - La chaîne à convertir

**Retour :**
- `String` - La chaîne normalisée

**Exemple :**
```rust
let result = slugify("Un très beau café ☕");
assert_eq!(result, "un-tres-beau-cafe");
```

## Tests

Pour exécuter la suite de tests complète :

```bash
cargo test
```

Pour exécuter les tests avec sortie détaillée :

```bash
cargo test -- --nocapture
```

Pour exécuter un test spécifique :

```bash
cargo test test_ligatures
```

### Couverture des tests

La bibliothèque inclut plus de 19 tests couvrant :

- ✅ Fonctionnalité de base
- ✅ Gestion des accents et emphasis
- ✅ Normalisation des espaces
- ✅ Ligatures françaises (œ, æ)
- ✅ Caractères spéciaux sémantiques
- ✅ Guillemets typographiques
- ✅ Cas limites (chaînes vides, espaces uniquement)
- ✅ Caractères Unicode et emojis
- ✅ Performance avec de longues chaînes
- ✅ Exemples de documentation

## Licence

MIT OR Apache-2.0

## Contribution

Les contributions sont les bienvenues ! N'hésitez pas à :

1. Fork le projet
2. Créer une branche pour votre fonctionnalité (`git checkout -b feature/AmazingFeature`)
3. Commit vos changements (`git commit -m 'Add some AmazingFeature'`)
4. Push vers la branche (`git push origin feature/AmazingFeature`)
5. Ouvrir une Pull Request

## Support

Pour signaler un bug ou demander une fonctionnalité, veuillez ouvrir une issue sur le dépôt du projet.