Skip to main content

syllabify_fr/
lib.rs

1// SPDX-License-Identifier: GPL-3.0-or-later
2#![warn(missing_docs)]
3//! # syllabify-fr
4//!
5//! Syllabification française destinée à l'apprentissage de la lecture.
6//! Portage en Rust de [LireCouleur 6](https://lirecouleur.forge.apps.education.fr/),
7//! créé par Marie-Pierre et Luc Brungard (GPL v3).
8//!
9//! ## Usage rapide
10//!
11//! ```
12//! use syllabify_fr::syllables;
13//!
14//! // Mode STD (défaut, comme LC6) : sépare les consonnes doubles
15//! assert_eq!(syllables("famille"), vec!["fa", "mi", "lle"]);
16//! assert_eq!(syllables("parlent"), vec!["par", "lent"]);
17//! assert_eq!(syllables("homme"),   vec!["hom", "me"]);
18//! ```
19
20pub(crate) mod cleaner;
21pub(crate) mod data;
22pub(crate) mod decoder;
23pub(crate) mod homographs;
24pub mod html;
25pub mod liaisons;
26pub(crate) mod parser;
27pub(crate) mod phoneme;
28pub(crate) mod rules;
29
30pub use decoder::{AssembleMode, SyllableMode, TextChunk};
31pub use html::{render_html, render_word_html};
32pub use liaisons::{liaison_amont, liaison_aval, liaison_possible};
33
34/// Syllabifie un mot seul avec les paramètres par défaut
35/// (mode STD comme LireCouleur 6, syllabes écrites).
36///
37/// ```
38/// use syllabify_fr::syllables;
39/// assert_eq!(syllables("chocolat"), vec!["cho", "co", "lat"]);
40/// ```
41pub fn syllables(word: &str) -> Vec<String> {
42    syllables_with(word, false, AssembleMode::Std, SyllableMode::Written)
43}
44
45/// Syllabifie un mot avec contrôle fin des paramètres.
46///
47/// * `novice_reader` — désactive les post-traitements subtils (yod, o ouvert/fermé).
48/// * `assemble_mode` — [`AssembleMode::Std`] (défaut pédagogique LC6) ou
49///   [`AssembleMode::Lc`] (legacy, non aligné LC6 v6).
50/// * `syl_mode` — [`SyllableMode::Written`] ou [`SyllableMode::Oral`].
51pub fn syllables_with(
52    word: &str,
53    novice_reader: bool,
54    assemble_mode: AssembleMode,
55    syl_mode: SyllableMode,
56) -> Vec<String> {
57    let phonemes = decoder::extract_phonemes_word(word, novice_reader, syl_mode);
58    let (sylls, nphons) = decoder::assemble_syllables(&phonemes, assemble_mode, syl_mode);
59    sylls
60        .iter()
61        .map(|syl| {
62            syl.iter()
63                .map(|&i| nphons[i].letters.clone())
64                .collect::<String>()
65        })
66        .collect()
67}
68
69/// Extrait les phonèmes d'un mot : liste de `(code, lettres)`.
70///
71/// ```
72/// use syllabify_fr::phonemes;
73/// let ph = phonemes("chat");
74/// assert_eq!(ph[0], ("s^".to_string(), "ch".to_string()));
75/// ```
76pub fn phonemes(word: &str) -> Vec<(String, String)> {
77    decoder::extract_phonemes_word(word, false, SyllableMode::Written)
78        .into_iter()
79        .map(|p| (p.code, p.letters))
80        .collect()
81}
82
83/// Syllabifie un texte entier en préservant la ponctuation et les espaces.
84///
85/// Les homographes non homophones (ex : *le couvent* vs *elles couvent*)
86/// sont désambiguïsés selon le mot précédent.
87///
88/// ```
89/// use syllabify_fr::{syllabify_text, TextChunk};
90/// let chunks = syllabify_text("le chat dort");
91/// assert!(matches!(&chunks[0], TextChunk::Word(s) if s == &["le"]));
92/// ```
93pub fn syllabify_text(text: &str) -> Vec<TextChunk> {
94    decoder::extract_syllables(text, false, AssembleMode::Std, SyllableMode::Written)
95}