pub(crate) fn clean_for_tts(text: &str) -> String {
let mut s = text.to_string();
s = s
.lines()
.filter(|line| {
let trimmed = line.trim();
!trimmed.starts_with("```")
})
.collect::<Vec<_>>()
.join("\n");
s = s.replace('`', "");
s = s.replace("**", "");
s = s.replace("__", "");
s = s.replace('*', "");
s = s
.lines()
.map(|line| line.trim_start_matches('#').trim_start())
.collect::<Vec<_>>()
.join("\n");
let mut result = String::with_capacity(s.len());
let mut chars = s.chars().peekable();
while let Some(ch) = chars.next() {
if ch == '[' {
let mut link_text = String::new();
let mut found_close = false;
for c in chars.by_ref() {
if c == ']' {
found_close = true;
break;
}
link_text.push(c);
}
if found_close && chars.peek() == Some(&'(') {
chars.next(); for c in chars.by_ref() {
if c == ')' {
break;
}
}
result.push_str(&link_text);
} else {
result.push_str(&link_text);
}
} else {
result.push(ch);
}
}
s = result;
s = s
.lines()
.map(|line| {
let trimmed = line.trim_start();
if let Some(rest) = trimmed.strip_prefix("- ") {
rest.trim()
} else if let Some(rest) = trimmed.strip_prefix("• ") {
rest.trim()
} else {
trimmed
}
})
.filter(|line| !line.is_empty())
.collect::<Vec<_>>()
.join(". ");
let mut prev_punct = false;
let mut cleaned = String::with_capacity(s.len());
for ch in s.chars() {
if ch == '!' || ch == '?' {
if !prev_punct {
cleaned.push(ch);
}
prev_punct = true;
} else {
prev_punct = false;
cleaned.push(ch);
}
}
s = cleaned;
while s.contains("...") {
s = s.replace("...", ".");
}
while s.contains("..") {
s = s.replace("..", ".");
}
s.split_whitespace()
.collect::<Vec<_>>()
.join(" ")
.trim()
.to_string()
}