braillify 2.0.0

Rust 기반 크로스플랫폼 한국어 점역 라이브러리
Documentation
use phf::phf_map;

use crate::unicode::decode_unicode;

static SHORTCUT_MAP: phf::Map<char, &'static [u8]> = phf_map! {
    '"' => &[decode_unicode('')],
    // '"' => &[decode_unicode('⠴')],
    '\'' => &[decode_unicode(''), decode_unicode('')],
    // '\'' => &[decode_unicode('⠴'), decode_unicode('⠄')],
    '~' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode(''), decode_unicode('')],
    '!' => &[decode_unicode('')],
    '.' => &[decode_unicode('')],
    ',' => &[decode_unicode('')],
    '?' => &[decode_unicode('')],
    '' => &[decode_unicode('')],
    '' => &[decode_unicode('')],
    ':' => &[decode_unicode(''), decode_unicode('')],
    ';' => &[decode_unicode(''), decode_unicode('')],
    '_' => &[decode_unicode('')],
    '*' => &[decode_unicode(''), decode_unicode('')],
    '(' => &[decode_unicode(''), decode_unicode('')],
    ')' => &[decode_unicode(''), decode_unicode('')],
    '{' => &[decode_unicode(''), decode_unicode('')],
    '}' => &[decode_unicode(''), decode_unicode('')],
    '[' => &[decode_unicode(''), decode_unicode('')],
    ']' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '·' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '/' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '-' => &[decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''),decode_unicode(''), decode_unicode('')],
    // '×' => &[decode_unicode('⠸'),decode_unicode('⠭'), decode_unicode('⠇')],
    '' => &[decode_unicode(''),decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''),decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''),decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''),decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''),decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''),decode_unicode('')],
    'ː' => &[decode_unicode(''), decode_unicode('')],
    '' => &[decode_unicode(''), decode_unicode('')],
};

static ENGLISH_SYMBOL_MAP: phf::Map<char, &'static [u8]> = phf_map! {
    '(' => &[decode_unicode(''), decode_unicode('')],
    ')' => &[decode_unicode(''), decode_unicode('')],
    ',' => &[decode_unicode('')],
    '-' => &[decode_unicode('')],
};

pub fn encode_char_symbol_shortcut(text: char) -> Result<&'static [u8], String> {
    if let Some(code) = SHORTCUT_MAP.get(&text) {
        Ok(code)
    } else {
        Err("Invalid symbol character".to_string())
    }
}

pub fn is_symbol_char(text: char) -> bool {
    SHORTCUT_MAP.contains_key(&text)
        || crate::rules::korean::rule_64::is_enclosed_symbol(text)
        || crate::rules::korean::rule_65::is_currency_symbol(text)
        || crate::rules::korean::rule_23::is_historical_letter_symbol(text)
        || crate::rules::korean::rule_25::is_rule_25_symbol(text)
        || crate::rules::korean::rule_31::is_greek_letter(text)
        || crate::rules::korean::rule_68::is_rule_68_symbol(text)
        || crate::rules::korean::rule_69::is_rule_69_symbol(text)
        || crate::rules::korean::rule_70::is_arrow_symbol(text)
        || crate::rules::korean::rule_71::is_rule_71_symbol(text)
        || crate::rules::korean::rule_72::is_rule_72_symbol(text)
}

pub fn encode_english_char_symbol_shortcut(text: char) -> Option<&'static [u8]> {
    ENGLISH_SYMBOL_MAP.get(&text).copied()
}

pub fn is_english_symbol_char(text: char) -> bool {
    ENGLISH_SYMBOL_MAP.contains_key(&text)
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    pub fn test_is_symbol_char() {
        assert!(is_symbol_char('"'));
        assert!(is_symbol_char('\''));
        assert!(is_symbol_char('~'));
        assert!(is_symbol_char(''));
        assert!(is_symbol_char('!'));
        assert!(is_symbol_char('.'));
        assert!(is_symbol_char(','));
        assert!(is_symbol_char('?'));
        assert!(is_symbol_char(':'));
        assert!(is_symbol_char(';'));
        assert!(is_symbol_char('_'));
        assert!(is_symbol_char('*'));
        assert!(is_symbol_char('('));
        assert!(is_symbol_char(')'));
        assert!(is_symbol_char('{'));
        assert!(is_symbol_char('}'));
        assert!(is_symbol_char(''));
        assert!(is_symbol_char(''));
        assert!(is_symbol_char(''));
    }

    #[test]
    pub fn test_encode_char_symbol_shortcut() {
        assert_eq!(
            encode_char_symbol_shortcut('"').unwrap(),
            &[decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut('\'').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut('~').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut('').unwrap(),
            &[
                decode_unicode(''),
                decode_unicode(''),
                decode_unicode('')
            ]
        );
        assert_eq!(
            encode_char_symbol_shortcut('').unwrap(),
            &[
                decode_unicode(''),
                decode_unicode(''),
                decode_unicode('')
            ]
        );
        assert_eq!(
            encode_char_symbol_shortcut('!').unwrap(),
            &[decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut('.').unwrap(),
            &[decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut(',').unwrap(),
            &[decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut('?').unwrap(),
            &[decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut(':').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut(';').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut('_').unwrap(),
            &[decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut('*').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut('(').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
        assert_eq!(
            encode_char_symbol_shortcut(')').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
    }

    #[test]
    fn test_encode_english_char_symbol_shortcut_variants() {
        assert_eq!(
            encode_english_char_symbol_shortcut('(').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
        assert_eq!(
            encode_english_char_symbol_shortcut(')').unwrap(),
            &[decode_unicode(''), decode_unicode('')]
        );
        assert_eq!(encode_english_char_symbol_shortcut('?'), None);
    }
}