1pub use crate::unicode_block::{UnicodeBlock, UnicodeBlockMethod};
6
7pub fn is_bidi_control(c: char) -> bool {
8    matches!(c, '\u{202A}'..='\u{202E}' | '\u{2066}'..='\u{2069}' | '\u{200E}' | '\u{200F}' | '\u{061C}')
9}
10
11pub fn unicode_plane(codepoint: char) -> u32 {
12    (codepoint as u32) >> 16
13}
14
15pub fn is_cjk(codepoint: char) -> bool {
16    if let Some(
17        UnicodeBlock::CJKRadicalsSupplement |
18        UnicodeBlock::KangxiRadicals |
19        UnicodeBlock::IdeographicDescriptionCharacters |
20        UnicodeBlock::CJKSymbolsandPunctuation |
21        UnicodeBlock::Hiragana |
22        UnicodeBlock::Katakana |
23        UnicodeBlock::Bopomofo |
24        UnicodeBlock::HangulCompatibilityJamo |
25        UnicodeBlock::Kanbun |
26        UnicodeBlock::BopomofoExtended |
27        UnicodeBlock::CJKStrokes |
28        UnicodeBlock::KatakanaPhoneticExtensions |
29        UnicodeBlock::EnclosedCJKLettersandMonths |
30        UnicodeBlock::CJKCompatibility |
31        UnicodeBlock::CJKUnifiedIdeographsExtensionA |
32        UnicodeBlock::YijingHexagramSymbols |
33        UnicodeBlock::CJKUnifiedIdeographs |
34        UnicodeBlock::CJKCompatibilityIdeographs |
35        UnicodeBlock::CJKCompatibilityForms |
36        UnicodeBlock::HalfwidthandFullwidthForms,
37    ) = codepoint.block()
38    {
39        return true;
40    }
41
42    unicode_plane(codepoint) == 2 || unicode_plane(codepoint) == 3
45}
46
47#[cfg(test)]
48mod test {
49    use super::*;
50
51    #[test]
52    fn test_is_cjk() {
53        assert_eq!(is_cjk('〇'), true);
55        assert_eq!(is_cjk('㐀'), true);
56        assert_eq!(is_cjk('あ'), true);
57        assert_eq!(is_cjk('ア'), true);
58        assert_eq!(is_cjk('㆒'), true);
59        assert_eq!(is_cjk('ㆣ'), true);
60        assert_eq!(is_cjk('龥'), true);
61        assert_eq!(is_cjk('𰾑'), true);
62        assert_eq!(is_cjk('𰻝'), true);
63
64        assert_eq!(is_cjk('a'), false);
66        assert_eq!(is_cjk('🙂'), false);
67        assert_eq!(is_cjk('©'), false);
68    }
69}