# 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.