allsorts_subset_browser/scripts/
mod.rs1pub 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}