allsorts_subset_browser/scripts/
mod.rs

1pub mod arabic;
2pub mod indic;
3pub mod khmer;
4mod syllable;
5pub mod syriac;
6pub mod thai_lao;
7
8use crate::gsub::{GlyphOrigin, RawGlyph};
9use crate::scripts::syllable::SyllableChar;
10use crate::tag;
11use crate::unicode::mcc::sort_by_modified_combining_class;
12
13#[derive(std::cmp::PartialEq)]
14pub enum ScriptType {
15    Arabic,
16    Default,
17    Indic,
18    Khmer,
19    Syriac,
20    ThaiLao,
21}
22
23impl From<u32> for ScriptType {
24    fn from(script_tag: u32) -> Self {
25        match script_tag {
26            tag::ARAB => ScriptType::Arabic,
27            tag::LATN => ScriptType::Default,
28            tag::CYRL => ScriptType::Default,
29            tag::GREK => ScriptType::Default,
30            tag::DEVA => ScriptType::Indic,
31            tag::BENG => ScriptType::Indic,
32            tag::GURU => ScriptType::Indic,
33            tag::GUJR => ScriptType::Indic,
34            tag::ORYA => ScriptType::Indic,
35            tag::TAML => ScriptType::Indic,
36            tag::TELU => ScriptType::Indic,
37            tag::KNDA => ScriptType::Indic,
38            tag::MLYM => ScriptType::Indic,
39            tag::SINH => ScriptType::Indic,
40            tag::KHMR => ScriptType::Khmer,
41            tag::SYRC => ScriptType::Syriac,
42            tag::THAI => ScriptType::ThaiLao,
43            tag::LAO => ScriptType::ThaiLao,
44            _ => ScriptType::Default,
45        }
46    }
47}
48
49impl SyllableChar for RawGlyph<()> {
50    fn char(&self) -> char {
51        match self.glyph_origin {
52            GlyphOrigin::Char(ch) => ch,
53            GlyphOrigin::Direct => panic!("unexpected glyph origin"),
54        }
55    }
56}
57
58pub fn preprocess_text(cs: &mut Vec<char>, script_tag: u32) {
59    match ScriptType::from(script_tag) {
60        ScriptType::Arabic => arabic::reorder_marks(cs),
61        ScriptType::Default => sort_by_modified_combining_class(cs),
62        ScriptType::Indic => indic::preprocess_indic(cs, script_tag),
63        ScriptType::Khmer => khmer::preprocess_khmer(cs),
64        ScriptType::Syriac => sort_by_modified_combining_class(cs),
65        ScriptType::ThaiLao => thai_lao::reorder_marks(cs),
66    }
67}