use super::VowelClassifier;
#[derive(Debug, Clone, Copy, Default)]
pub struct HangulClassifier;
impl HangulClassifier {
pub fn new() -> Self {
Self
}
}
static HANGUL_VOWELS: &[char] = &[
'ㅏ', 'ㅓ', 'ㅗ', 'ㅜ', 'ㅡ', 'ㅣ', 'ㅐ', 'ㅔ', 'ㅑ', 'ㅕ', 'ㅛ', 'ㅠ', 'ㅒ', 'ㅖ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅢ', ];
impl VowelClassifier for HangulClassifier {
fn is_vowel(&self, c: char) -> bool {
let code = c as u32;
match code {
0x314F..=0x3163 => true,
0x1161..=0x1175 => true,
0xA960..=0xA97C => false,
0xD7B0..=0xD7C6 => true,
0xAC00..=0xD7A3 => false,
_ => false,
}
}
fn script_name(&self) -> &'static str {
"Hangul"
}
fn vowels(&self) -> &[char] {
HANGUL_VOWELS
}
fn is_consonant(&self, c: char) -> bool {
let code = c as u32;
match code {
0x3131..=0x314E => true,
0x1100..=0x1112 => true,
0x11A8..=0x11C2 => true,
0xAC00..=0xD7A3 => false,
_ => false,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_vowels() {
let c = HangulClassifier::new();
assert!(c.is_vowel('ㅏ')); assert!(c.is_vowel('ㅓ')); assert!(c.is_vowel('ㅗ')); assert!(c.is_vowel('ㅜ')); assert!(c.is_vowel('ㅡ')); assert!(c.is_vowel('ㅣ')); }
#[test]
fn test_iotized_vowels() {
let c = HangulClassifier::new();
assert!(c.is_vowel('ㅑ')); assert!(c.is_vowel('ㅕ')); assert!(c.is_vowel('ㅛ')); assert!(c.is_vowel('ㅠ')); }
#[test]
fn test_compound_vowels() {
let c = HangulClassifier::new();
assert!(c.is_vowel('ㅘ')); assert!(c.is_vowel('ㅙ')); assert!(c.is_vowel('ㅚ')); assert!(c.is_vowel('ㅝ')); assert!(c.is_vowel('ㅞ')); assert!(c.is_vowel('ㅟ')); assert!(c.is_vowel('ㅢ')); }
#[test]
fn test_consonants() {
let c = HangulClassifier::new();
assert!(!c.is_vowel('ㄱ')); assert!(!c.is_vowel('ㄴ')); assert!(!c.is_vowel('ㄷ')); assert!(!c.is_vowel('ㄹ')); assert!(!c.is_vowel('ㅁ')); assert!(!c.is_vowel('ㅂ')); assert!(!c.is_vowel('ㅅ')); assert!(!c.is_vowel('ㅎ')); }
#[test]
fn test_double_consonants() {
let c = HangulClassifier::new();
assert!(!c.is_vowel('ㄲ')); assert!(!c.is_vowel('ㄸ')); assert!(!c.is_vowel('ㅃ')); assert!(!c.is_vowel('ㅆ')); assert!(!c.is_vowel('ㅉ')); }
#[test]
fn test_syllable_blocks() {
let c = HangulClassifier::new();
assert!(!c.is_vowel('가')); assert!(!c.is_vowel('나')); assert!(!c.is_vowel('한')); assert!(!c.is_vowel('글')); }
}