mod chinese;
mod english;
mod japanese;
mod korean;
mod latin;
#[cfg(test)]
mod tests;
pub use chinese::ChineseNormalizer;
pub use english::EnglishNormalizer;
pub use japanese::JapaneseNormalizer;
pub use korean::KoreanNormalizer;
pub use latin::LatinNormalizer;
use crate::{runner::aligner::normalizer::TextNormalizer, types::Lang};
pub fn default_normalizer_for(lang: &Lang) -> Option<Box<dyn TextNormalizer>> {
match lang {
Lang::Zh | Lang::Yue => Some(Box::new(ChineseNormalizer::new())),
Lang::Ja => Some(Box::new(JapaneseNormalizer::new())),
Lang::Ko => Some(Box::new(KoreanNormalizer::new())),
Lang::En
| Lang::Fr
| Lang::De
| Lang::Es
| Lang::It
| Lang::Nl
| Lang::Pt
| Lang::Ca
| Lang::Da
| Lang::Sv
| Lang::Id
| Lang::Eu
| Lang::Gl
| Lang::Hr
| Lang::Sl
| Lang::Sk
| Lang::Hu
| Lang::Fi
| Lang::No
| Lang::Nn
| Lang::Ro
| Lang::Tl
| Lang::Vi
| Lang::Tr
| Lang::Cs
| Lang::Pl
| Lang::Lv => Some(Box::new(LatinNormalizer::new(lang.clone()))),
_ => None,
}
}
#[cfg(test)]
mod default_normalizer_tests {
use super::*;
#[test]
fn english_languages_get_english_normalizer() {
for lang in [Lang::En, Lang::Fr, Lang::De, Lang::Es, Lang::Pt, Lang::Sv] {
let n = default_normalizer_for(&lang);
assert!(n.is_some(), "{lang:?} must resolve to EnglishNormalizer");
assert!(
n.unwrap().use_word_delimiter(),
"Latin-script normalizer must enable | word delimiter for {lang:?}",
);
}
}
#[test]
fn cjk_languages_get_per_character_normalizers() {
for lang in [Lang::Zh, Lang::Yue, Lang::Ja, Lang::Ko] {
let n = default_normalizer_for(&lang);
assert!(n.is_some(), "{lang:?} must resolve to a normalizer");
assert!(
!n.unwrap().use_word_delimiter(),
"CJK normalizer must NOT enable | word delimiter for {lang:?}",
);
}
}
#[test]
fn unsupported_languages_return_none() {
for lang in [Lang::Ar, Lang::Hi, Lang::Ru, Lang::He, Lang::El] {
assert!(
default_normalizer_for(&lang).is_none(),
"{lang:?} must return None — no built-in normalizer yet",
);
}
}
}