gunning_fog/
lib.rs

1extern crate regex;
2
3use regex::Regex;
4
5pub fn gunning_fog_index(text: &str) -> f64 {
6    let sentence_count = count_sentences(text);
7    let word_count = count_words(text);
8    let complex_word_count = count_complex_words(text);
9
10    if sentence_count == 0 || word_count == 0 {
11        return 0.0;
12    }
13
14    let average_sentence_length = word_count as f64 / sentence_count as f64;
15    let percentage_complex_words = complex_word_count as f64 / word_count as f64 * 100.0;
16
17    0.4 * (average_sentence_length + percentage_complex_words)
18}
19
20fn count_sentences(text: &str) -> usize {
21    let re = Regex::new(r"[.!?]").unwrap();
22    re.find_iter(text).count()
23}
24
25fn count_words(text: &str) -> usize {
26    let re = Regex::new(r"\b\w+\b").unwrap();
27    re.find_iter(text).count()
28}
29
30fn count_complex_words(text: &str) -> usize {
31    let re = Regex::new(r"\b\w{3,}\b").unwrap();
32    re.find_iter(text).filter(|word| syllable_count(word.as_str()) >= 3).count()
33}
34
35fn syllable_count(word: &str) -> usize {
36    let vowels = Regex::new(r"[aeiouy]+").unwrap();
37    let mut count = vowels.find_iter(word).count();
38
39    if word.ends_with('e') {
40        count -= 1;
41    }
42
43    count.max(1)
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn test_gunning_fog_index() {
52        let text = "The quick brown fox jumps over the lazy dog.";
53        let index = gunning_fog_index(text);
54        assert!(index == 3.6);
55    }
56
57    #[test]
58    fn test_syllable_count() {
59        assert_eq!(syllable_count("complex"), 2);
60        assert_eq!(syllable_count("words"), 1);
61        assert_eq!(syllable_count("syllable"), 2);
62        assert_eq!(syllable_count("test"), 1);
63    }
64}