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}