#![no_std]
#![doc(html_root_url = "https://docs.rs/textstat/0.1.0")]
#![allow(clippy::cast_precision_loss)]
extern crate alloc;
mod count;
pub use count::{
char_count, letter_count, lexicon_count, polysyllabic_count, sentence_count, syllable_count,
syllables,
};
#[must_use]
pub fn flesch_reading_ease(text: &str) -> f64 {
let (words, sentences, syllables) = base(text);
if words == 0.0 || sentences == 0.0 {
return 0.0;
}
206.835 - 1.015 * (words / sentences) - 84.6 * (syllables / words)
}
#[must_use]
pub fn flesch_kincaid_grade(text: &str) -> f64 {
let (words, sentences, syllables) = base(text);
if words == 0.0 || sentences == 0.0 {
return 0.0;
}
0.39 * (words / sentences) + 11.8 * (syllables / words) - 15.59
}
#[must_use]
pub fn gunning_fog(text: &str) -> f64 {
let (words, sentences, _) = base(text);
if words == 0.0 || sentences == 0.0 {
return 0.0;
}
let complex = polysyllabic_count(text) as f64;
0.4 * ((words / sentences) + 100.0 * (complex / words))
}
#[must_use]
pub fn smog_index(text: &str) -> f64 {
let (_, sentences, _) = base(text);
if sentences == 0.0 {
return 0.0;
}
let poly = polysyllabic_count(text) as f64;
1.0430 * sqrt(poly * (30.0 / sentences)) + 3.1291
}
#[must_use]
pub fn automated_readability_index(text: &str) -> f64 {
let (words, sentences, _) = base(text);
if words == 0.0 || sentences == 0.0 {
return 0.0;
}
let chars = char_count(text) as f64;
4.71 * (chars / words) + 0.5 * (words / sentences) - 21.43
}
#[must_use]
pub fn coleman_liau_index(text: &str) -> f64 {
let (words, sentences, _) = base(text);
if words == 0.0 {
return 0.0;
}
let letters = letter_count(text) as f64;
let letters_per_100 = letters / words * 100.0;
let sentences_per_100 = sentences / words * 100.0;
0.0588 * letters_per_100 - 0.296 * sentences_per_100 - 15.8
}
#[must_use]
pub fn reading_time(text: &str, words_per_minute: f64) -> f64 {
if words_per_minute <= 0.0 {
return 0.0;
}
lexicon_count(text) as f64 / words_per_minute * 60.0
}
fn base(text: &str) -> (f64, f64, f64) {
(
lexicon_count(text) as f64,
sentence_count(text) as f64,
syllable_count(text) as f64,
)
}
fn sqrt(x: f64) -> f64 {
if x.is_nan() || x < 0.0 {
return 0.0;
}
if x == 0.0 || x == f64::INFINITY {
return x;
}
let mut mantissa = x;
let mut exp: i32 = 0;
while mantissa >= 4.0 {
mantissa /= 4.0;
exp += 1;
}
while mantissa < 1.0 {
mantissa *= 4.0;
exp -= 1;
}
let mut guess = 1.5;
let mut iter = 0;
while iter < 12 {
guess = 0.5 * (guess + mantissa / guess);
iter += 1;
}
if exp >= 0 {
for _ in 0..exp {
guess *= 2.0;
}
} else {
for _ in 0..-exp {
guess /= 2.0;
}
}
guess
}