1#[cfg(test)]
18mod rules_test;
19
20mod converter;
21mod dict;
22mod tokenizer;
23
24use converter::{EwtsToUnicodeConverter, EwtsToUnicodeConverterMaps};
25use tokenizer::{EwtsToUnicodeTokenMap, EwtsToUnicodeTokenizer};
26
27pub struct EwtsConverter {
29 ewts_to_unicode_tokens_map: EwtsToUnicodeTokenMap,
30 ewts_to_unicode_converter_maps: EwtsToUnicodeConverterMaps,
31}
32
33impl EwtsConverter {
34 pub fn create() -> Self {
36 EwtsConverter {
37 ewts_to_unicode_tokens_map: EwtsToUnicodeTokenMap::create(),
38 ewts_to_unicode_converter_maps: EwtsToUnicodeConverterMaps::create(),
39 }
40 }
41
42 pub fn ewts_to_unicode(&self, src: &str) -> String {
45 let tokens = EwtsToUnicodeTokenizer::tokenize(&self.ewts_to_unicode_tokens_map, src);
46 EwtsToUnicodeConverter::convert(&self.ewts_to_unicode_converter_maps, &tokens, src)
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53
54 static TST_DATA: &[(&str, &str)] = &[
55 (
57 r#"
58rka rga rnga rja rnya rta rda rna rba rma rtsa rdza
59lka lga lnga lca lja lta lda lpa lba lha
60ska sga snga snya sta sda sna spa sba sma stsa
61kwa khwa gwa cwa nywa twa dwa tswa tshwa zhwa zwa
62rwa shwa swa hwa
63kya khya gya pya phya bya mya
64kra khra gra tra thra dra pra phra bra mra shra sra hra
65kla gla bla zla rla sla
66rkya rgya rmya rgwa rtswa
67skya sgya spya sbya smya
68skra sgra snra spra sbra smra
69grwa drwa phywa
70"#,
71 r#"
72རྐ་རྒ་རྔ་རྗ་རྙ་རྟ་རྡ་རྣ་རྦ་རྨ་རྩ་རྫ་
73ལྐ་ལྒ་ལྔ་ལྕ་ལྗ་ལྟ་ལྡ་ལྤ་ལྦ་ལྷ་
74སྐ་སྒ་སྔ་སྙ་སྟ་སྡ་སྣ་སྤ་སྦ་སྨ་སྩ་
75ཀྭ་ཁྭ་གྭ་ཅྭ་ཉྭ་ཏྭ་དྭ་ཙྭ་ཚྭ་ཞྭ་ཟྭ་
76རྭ་ཤྭ་སྭ་ཧྭ་
77ཀྱ་ཁྱ་གྱ་པྱ་ཕྱ་བྱ་མྱ་
78ཀྲ་ཁྲ་གྲ་ཏྲ་ཐྲ་དྲ་པྲ་ཕྲ་བྲ་མྲ་ཤྲ་སྲ་ཧྲ་
79ཀླ་གླ་བླ་ཟླ་རླ་སླ་
80རྐྱ་རྒྱ་རྨྱ་རྒྭ་རྩྭ་
81སྐྱ་སྒྱ་སྤྱ་སྦྱ་སྨྱ་
82སྐྲ་སྒྲ་སྣྲ་སྤྲ་སྦྲ་སྨྲ་
83གྲྭ་དྲྭ་ཕྱྭ་
84"#,
85 ),
86 ("", ""),
88 ("rkw rk+w ", "རཀྭ་རྐྭ་"),
89 ("rgyi", "རྒྱི"),
90 (
91 "oM aHhU~M` badz+ra gu ru pad+ma sid+d+hi hU~M`:",
92 "ཨོཾ་ཨཿཧཱུྂ་བཛྲ་གུ་རུ་པདྨ་སིདྡྷི་ཧཱུྂ༔",
93 ),
94
95 ("sha ai gaang angs ", "ཤ་ཨཻ་གཨང་ཨངས་"),
97 (
98 "@#/_/sangs rgyas chos dang tshogs kyi mchog rnams la/_/byang chub bar du bdag ni skyabs su mchi/_/bdag gyis spyin sogs bgyis pa'i bsod nams kyis/_/'gro la phan phyir sangs rgyas 'grub par shog_!",
99 "༄༅། །སངས་རྒྱས་ཆོས་དང་ཚོགས་ཀྱི་མཆོག་རྣམས་ལ། །བྱང་ཆུབ་བར་དུ་བདག་ནི་སྐྱབས་སུ་མཆི། །བདག་གྱིས་སྤྱིན་སོགས་བགྱིས་པའི་བསོད་ནམས་ཀྱིས། །འགྲོ་ལ་ཕན་ཕྱིར་སངས་རྒྱས་འགྲུབ་པར་ཤོག ༈"
100 ),
101 ];
102
103 #[test]
104 fn ewts_to_unicode_converting_test() {
105 let converter = EwtsConverter::create();
106
107 TST_DATA.iter().for_each(|td| {
108 assert_eq!(converter.ewts_to_unicode(td.0), td.1);
109 });
110 }
111
112 #[test]
113 fn etu_prefixes() {
114 let data = [
115 ("brgyad brjod ", "བརྒྱད་བརྗོད་"),
116 ("g.yon l+ha g.yon ", "གཡོན་ལྷ་གཡོན་"),
117 ("g.yeng gyeng g.yul ", "གཡེང་གྱེང་གཡུལ་"),
118 (
119 "bdag gis ang ga'i rgyal po dang lhan cig g.yul ngor g.yul sprad par bgyi'o/",
120 "བདག་གིས་ཨང་གའི་རྒྱལ་པོ་དང་ལྷན་ཅིག་གཡུལ་ངོར་གཡུལ་སྤྲད་པར་བགྱིའོ།",
121 ),
122 ];
123
124 data.iter().for_each(|td| {
125 let converter = EwtsConverter::create();
126 assert_eq!(converter.ewts_to_unicode(td.0), td.1);
127 });
128 }
129
130 #[test]
131 fn etu_non_tibetan_test() {
132 let data = [
133 ("k [alphabet]_h ", "ཀ་alphabet ཧ་"),
134 ("[u]", "u"),
135 ("_[u]rjes[U]_[\\]_", " uརྗེསU \\ "),
136 ("\\u0f40", "ཀ"),
137 ("\\U00000f40", "ཀ"),
138 ("phyogs \\1\\0 bcu ", "ཕྱོགས་10་བཅུ་"),
139 ("\\u0f", "\\ཨུ༠ཕ༹"),
140 ];
141
142 data.iter().for_each(|td| {
143 let converter = EwtsConverter::create();
144 assert_eq!(converter.ewts_to_unicode(td.0), td.1);
145 });
146 }
147}