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('⠔')],
'\u{F000}' => &[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('⠦')],
'\u{E000}' => &[decode_unicode('⠠'), decode_unicode('⠤')], '\u{E001}' => &[decode_unicode('⠤'), decode_unicode('⠄')], '\u{E002}' => &[decode_unicode('⠰'), decode_unicode('⠤')], '\u{E003}' => &[decode_unicode('⠤'), decode_unicode('⠆')], '\u{E004}' => &[decode_unicode('⠐'), decode_unicode('⠤')], '\u{E005}' => &[decode_unicode('⠤'), decode_unicode('⠂')], '\u{E006}' => &[decode_unicode('⠈'), decode_unicode('⠤')], '\u{E007}' => &[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('⠤')],
':' => &[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::*;
#[rstest::rstest]
#[case('"')]
#[case('\'')]
#[case('~')]
#[case('…')]
#[case('!')]
#[case('.')]
#[case(',')]
#[case('?')]
#[case(':')]
#[case(';')]
#[case('_')]
#[case('*')]
#[case('(')]
#[case(')')]
#[case('{')]
#[case('}')]
#[case('①')]
#[case('ⓐ')]
#[case('₩')]
pub fn test_is_symbol_char(#[case] ch: char) {
assert!(is_symbol_char(ch));
}
/// `encode_char_symbol_shortcut` — 기호별 점역 점형 매핑.
#[rstest::rstest]
#[case::double_quote('"', vec!['⠦'])]
#[case::single_quote('\'', vec!['⠠', '⠦'])]
#[case::tilde('~', vec!['⠈', '⠔'])]
#[case::horizontal_ellipsis('…', vec!['⠠', '⠠', '⠠'])]
#[case::midline_ellipsis('⋯', vec!['⠠', '⠠', '⠠'])]
#[case::exclamation('!', vec!['⠖'])]
#[case::period('.', vec!['⠲'])]
#[case::comma(',', vec!['⠐'])]
#[case::question('?', vec!['⠦'])]
#[case::colon(':', vec!['⠐', '⠂'])]
#[case::semicolon(';', vec!['⠰', '⠆'])]
#[case::underscore('_', vec!['⠤'])]
#[case::asterisk('*', vec!['⠐', '⠔'])]
#[case::open_paren('(', vec!['⠦', '⠄'])]
#[case::close_paren(')', vec!['⠠', '⠴'])]
pub fn test_encode_char_symbol_shortcut(#[case] ch: char, #[case] expected_unicode: Vec<char>) {
let expected: Vec<u8> = expected_unicode.into_iter().map(decode_unicode).collect();
assert_eq!(
encode_char_symbol_shortcut(ch).unwrap(),
expected.as_slice()
);
}
#[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);
}
}