ewts/
lib.rs

1//!
2//! Converter from EWTS (Extended Wylie Transliteration Scheme) to Tibetan Unicode symbols
3//!
4//! # Examples
5//! ```
6//! use ewts::{EwtsConverter};
7//!
8//! let converter = EwtsConverter::create();
9//! let ewts_str = "oM aHhU~M` badz+ra gu ru pad+ma sid+d+hi hU~M`:";
10//!
11//! let tib_unicode_str = converter.ewts_to_unicode(ewts_str);
12//!
13//! assert_eq!(tib_unicode_str, "ཨོཾ་ཨཿཧཱུྂ་བཛྲ་གུ་རུ་པདྨ་སིདྡྷི་ཧཱུྂ༔");
14//! ```
15//!
16
17#[cfg(test)]
18mod rules_test;
19
20mod converter;
21mod dict;
22mod tokenizer;
23
24use converter::{EwtsToUnicodeConverter, EwtsToUnicodeConverterMaps};
25use tokenizer::{EwtsToUnicodeTokenMap, EwtsToUnicodeTokenizer};
26
27/// Main and only one exported value. Stores inner symbol's maps and functions
28pub struct EwtsConverter {
29    ewts_to_unicode_tokens_map: EwtsToUnicodeTokenMap,
30    ewts_to_unicode_converter_maps: EwtsToUnicodeConverterMaps,
31}
32
33impl EwtsConverter {
34    /// Creates one
35    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    /// Converts ewts symbols to Tibetan unicode.
43    /// e.g. "ka " -> "ཀ་"; "sgrol " -> "སྒྲོལ་"
44    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        // Standart Tibetan Stacks
56        (
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        // 
87        ("", ""),
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        //("va fi &ung","བ༹་ཕི༹་྅ུང" ),
96        ("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}