jpreprocess_core/pronunciation/
mora.rs1use 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}