2024-03-26 01:04:21 +01:00
|
|
|
// other implementations like calculating text_distance on all titles took too much time
|
|
|
|
|
// we keep it now as simple as possible and less memory intensive.
|
2024-11-04 18:46:56 +01:00
|
|
|
pub fn get_title_group(text: &str) -> String {
|
2024-03-26 01:04:21 +01:00
|
|
|
let alphabetic_only: String = text.chars().map(|c| if c.is_alphanumeric() { c } else { ' ' }).collect();
|
|
|
|
|
let parts = alphabetic_only.split_whitespace();
|
2024-05-10 10:13:50 +02:00
|
|
|
let mut combination = String::new();
|
|
|
|
|
for p in parts {
|
|
|
|
|
combination = format!("{combination} {p}").trim().to_string();
|
2024-03-26 01:04:21 +01:00
|
|
|
if combination.len() > 2 {
|
|
|
|
|
return combination;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
text.to_string()
|
|
|
|
|
}
|
2024-09-18 19:50:38 +02:00
|
|
|
|
2024-11-04 18:46:56 +01:00
|
|
|
pub trait Capitalize {
|
2024-09-18 19:50:38 +02:00
|
|
|
fn capitalize(&self) -> String;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Implement the Capitalize trait for &str
|
|
|
|
|
impl Capitalize for &str {
|
|
|
|
|
fn capitalize(&self) -> String {
|
|
|
|
|
let mut chars = self.chars();
|
2024-11-04 18:46:56 +01:00
|
|
|
chars.next().map_or_else(String::new, |first_char| first_char.to_uppercase().collect::<String>() + chars.as_str())
|
2024-09-18 19:50:38 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Implement the trait for String as well
|
|
|
|
|
impl Capitalize for String {
|
|
|
|
|
fn capitalize(&self) -> String {
|
|
|
|
|
self.as_str().capitalize() // Reuse the &str implementation
|
|
|
|
|
}
|
2025-02-14 17:51:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn get_trimmed_string(value: &Option<String>) -> Option<String> {
|
|
|
|
|
if let Some(v) = value {
|
|
|
|
|
let trimmed = v.trim();
|
|
|
|
|
if !trimmed.is_empty() {
|
|
|
|
|
return Some(trimmed.to_string());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
None
|
2024-09-18 19:50:38 +02:00
|
|
|
}
|