1
use crate::unicode::bool_prop_emoji_presentation;
2

            
3
pub fn is_cjk_letter(ch: char) -> bool {
4
    match ch as u32 {
5
        // Hiragana, Katakana
6
        0x3040..=0x30FF => true,
7
        // Katakana Phonetic Extensions
8
        0x31F0..=0x31FF => true,
9
        // CJK Unified Ideographs Extension A
10
        0x3400..=0x4DFF => true,
11
        // CJK Unified Ideographs
12
        0x4E00..=0x9FFF => true,
13
        // Hangul Syllables
14
        0xAC00..=0xD7A3 => true,
15
        // CJK Compatibility Ideographs
16
        0xF900..=0xFAFF => true,
17
        // CJK Unified Ideographs Extension B
18
        0x20000..=0x2A6DF => true,
19
        // CJK Compatibility Ideographs Supplement
20
        0x2F800..=0x2FA1F => true,
21
        _ => false,
22
    }
23
}
24

            
25
pub fn is_upright_char(ch: char) -> bool {
26
    let u = ch as u32;
27
    match u {
28
        _ if is_cjk_letter(ch) => true,
29
        // CJK Symbols and Punctuation
30
        0x3000..=0x303F => {
31
            // but not brackets or wave dashes
32
            match u {
33
                0x3008..=0x3011 => false,
34
                0x3014..=0x301C => false,
35
                0x3030 => false,
36
                _ => true,
37
            }
38
        }
39
        // Vertical Forms
40
        0xFE10..=0xFE1F => true,
41
        // CJK Compatibility Forms
42
        0xFE30..=0xFE4F => true,
43
        // Small Form Variants
44
        0xFE50..=0xFE6F => {
45
            match u {
46
                // but not brackets
47
                0xFE59..=0xFE5E => false,
48
                _ => true,
49
            }
50
        }
51
        // Halfwidth and Fullwidth Forms
52
        0xFF00..=0xFFEF => {
53
            // but not brackets or wave dashes
54
            match u {
55
                0xFF08 | 0xFF09 | 0xFF3B | 0xFF3D | 0xFF5B | 0xFF5D | 0xFF5E | 0xFF5F | 0xFF60
56
                | 0xFF62 | 0xFF63 => false,
57
                _ => true,
58
            }
59
        }
60
        // Emoji
61
        _ if bool_prop_emoji_presentation(ch) => true,
62
        _ => false,
63
    }
64
}