jpreprocess_core/pronunciation/
mora.rs

1use std::fmt::Display;
2
3use super::{
4    mora_dict::INTO_STR,
5    mora_enum::MoraEnum,
6    phoneme::{mora_to_phoneme, Consonant, Vowel},
7    QUESTION, QUOTATION, TOUTEN,
8};
9
10use serde::{Deserialize, Serialize};
11
12#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
13pub struct Mora {
14    pub mora_enum: MoraEnum,
15    pub is_voiced: bool,
16}
17
18impl Mora {
19    pub fn phonemes(&self) -> (Option<Consonant>, Option<Vowel>) {
20        mora_to_phoneme(self)
21    }
22
23    pub fn convert_to_voiced_sound(&mut self) {
24        self.mora_enum = match self.mora_enum {
25            MoraEnum::Ka => MoraEnum::Ga,
26            MoraEnum::Ki => MoraEnum::Gi,
27            MoraEnum::Ku => MoraEnum::Gu,
28            MoraEnum::Ke => MoraEnum::Ge,
29            MoraEnum::Ko => MoraEnum::Go,
30            MoraEnum::Kya => MoraEnum::Gya,
31            MoraEnum::Kyu => MoraEnum::Gyu,
32            MoraEnum::Kyo => MoraEnum::Gyo,
33            MoraEnum::Kye => MoraEnum::Gye,
34            MoraEnum::Sa => MoraEnum::Za,
35            MoraEnum::Shi => MoraEnum::Ji,
36            MoraEnum::Su => MoraEnum::Zu,
37            MoraEnum::Se => MoraEnum::Ze,
38            MoraEnum::So => MoraEnum::Zo,
39            MoraEnum::Swi => MoraEnum::Zwi,
40            MoraEnum::Sha => MoraEnum::Ja,
41            MoraEnum::Shu => MoraEnum::Ju,
42            MoraEnum::Sho => MoraEnum::Jo,
43            MoraEnum::She => MoraEnum::Je,
44            MoraEnum::Ta => MoraEnum::Da,
45            MoraEnum::Chi => MoraEnum::Di,
46            MoraEnum::Tsu => MoraEnum::Du,
47            MoraEnum::Te => MoraEnum::De,
48            MoraEnum::To => MoraEnum::Do,
49            MoraEnum::Tha => MoraEnum::Dha,
50            MoraEnum::Thi => MoraEnum::Dhi,
51            MoraEnum::Thu => MoraEnum::Dhu,
52            MoraEnum::Twu => MoraEnum::Dwu,
53            MoraEnum::Tho => MoraEnum::Dho,
54            MoraEnum::Ha => MoraEnum::Ba,
55            MoraEnum::Hi => MoraEnum::Bi,
56            MoraEnum::Fu => MoraEnum::Bu,
57            MoraEnum::He => MoraEnum::Be,
58            MoraEnum::Ho => MoraEnum::Bo,
59            MoraEnum::Hya => MoraEnum::Bya,
60            MoraEnum::Hyu => MoraEnum::Byu,
61            MoraEnum::Hye => MoraEnum::Bye,
62            MoraEnum::Hyo => MoraEnum::Byo,
63            others => others,
64        }
65    }
66    pub fn convert_to_semivoiced_sound(&mut self) {
67        self.mora_enum = match self.mora_enum {
68            MoraEnum::Ha => MoraEnum::Pa,
69            MoraEnum::Hi => MoraEnum::Pi,
70            MoraEnum::Fu => MoraEnum::Pu,
71            MoraEnum::He => MoraEnum::Pe,
72            MoraEnum::Ho => MoraEnum::Po,
73            MoraEnum::Hya => MoraEnum::Pya,
74            MoraEnum::Hyu => MoraEnum::Pyu,
75            MoraEnum::Hye => MoraEnum::Pye,
76            MoraEnum::Hyo => MoraEnum::Pyo,
77            others => others,
78        }
79    }
80}
81
82impl Display for Mora {
83    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84        let mora = match self.mora_enum {
85            MoraEnum::Question => QUESTION,
86            MoraEnum::Touten => TOUTEN,
87            mora_enum => INTO_STR.get(&mora_enum).unwrap(),
88        };
89        let suffix = if self.is_voiced { "" } else { QUOTATION };
90        write!(f, "{}{}", mora, suffix)
91    }
92}