use phf::phf_map;
use crate::unicode::decode_unicode;
static SHORTCUT_MAP: phf::Map<char, &'static [u8]> = phf_map! {
'\u{2460}' => &[decode_unicode('⠼'), decode_unicode('⠂')], '\u{2461}' => &[decode_unicode('⠼'), decode_unicode('⠆')], '\u{2462}' => &[decode_unicode('⠼'), decode_unicode('⠒')], '\u{2463}' => &[decode_unicode('⠼'), decode_unicode('⠲')], '\u{2464}' => &[decode_unicode('⠼'), decode_unicode('⠢')], '\u{2465}' => &[decode_unicode('⠼'), decode_unicode('⠖')], '\u{2466}' => &[decode_unicode('⠼'), decode_unicode('⠶')], '\u{2467}' => &[decode_unicode('⠼'), decode_unicode('⠦')], '\u{2468}' => &[decode_unicode('⠼'), decode_unicode('⠔')], '\u{2469}' => &[decode_unicode('⠼'), decode_unicode('⠴')], '+' => &[decode_unicode('⠢')], '/' => &[decode_unicode('⠸'), decode_unicode('⠌')], '\u{2212}' => &[decode_unicode('⠔')], '\u{00D7}' => &[decode_unicode('⠡')], '\u{00F7}' => &[decode_unicode('⠌'), decode_unicode('⠌')], '=' => &[decode_unicode('⠒'), decode_unicode('⠒')], '>' => &[decode_unicode('⠢'), decode_unicode('⠢')], '<' => &[decode_unicode('⠔'), decode_unicode('⠔')], '\u{2260}' => &[decode_unicode('⠨'), decode_unicode('⠒'), decode_unicode('⠒')], '\u{2265}' => &[decode_unicode('⠲'), decode_unicode('⠲')], '\u{2267}' => &[decode_unicode('⠲'), decode_unicode('⠲')], '\u{2264}' => &[decode_unicode('⠖'), decode_unicode('⠖')], '\u{2266}' => &[decode_unicode('⠖'), decode_unicode('⠖')], '\u{2252}' => &[decode_unicode('⠐'), decode_unicode('⠒'), decode_unicode('⠒')], '\u{2236}' => &[decode_unicode('⠐'), decode_unicode('⠂')], '\u{2192}' => &[decode_unicode('⠒'), decode_unicode('⠕')], '\u{2190}' => &[decode_unicode('⠪'), decode_unicode('⠒')], '\u{2194}' => &[decode_unicode('⠪'), decode_unicode('⠒'), decode_unicode('⠕')], '\u{2191}' => &[decode_unicode('⠰'), decode_unicode('⠒'), decode_unicode('⠕')], '\u{2193}' => &[decode_unicode('⠘'), decode_unicode('⠒'), decode_unicode('⠕')], '\u{21D2}' => &[decode_unicode('⠒'), decode_unicode('⠒'), decode_unicode('⠕')], '\u{21D4}' => &[decode_unicode('⠪'), decode_unicode('⠒'), decode_unicode('⠒'), decode_unicode('⠕')], '\u{21C4}' => &[decode_unicode('⠪'), decode_unicode('⠶'), decode_unicode('⠕')], '\u{2032}' => &[decode_unicode('⠤')], '\u{2033}' => &[decode_unicode('⠤'), decode_unicode('⠤')], '\u{2034}' => &[decode_unicode('⠤'), decode_unicode('⠤'), decode_unicode('⠤')], '\u{00B2}' => &[decode_unicode('⠘'), decode_unicode('⠼'), decode_unicode('⠃')], '\u{00B3}' => &[decode_unicode('⠘'), decode_unicode('⠼'), decode_unicode('⠉')], '\u{2074}' => &[decode_unicode('⠘'), decode_unicode('⠼'), decode_unicode('⠙')], '\u{2075}' => &[decode_unicode('⠘'), decode_unicode('⠼'), decode_unicode('⠑')], '\u{2077}' => &[decode_unicode('⠘'), decode_unicode('⠼'), decode_unicode('⠛')], '\u{2079}' => &[decode_unicode('⠘'), decode_unicode('⠼'), decode_unicode('⠊')], '\u{00B9}' => &[decode_unicode('⠘'), decode_unicode('⠼'), decode_unicode('⠁')], '\u{2070}' => &[decode_unicode('⠘'), decode_unicode('⠼'), decode_unicode('⠚')], '\u{1D4F}' => &[decode_unicode('⠘'), decode_unicode('⠅')], '\u{1D50}' => &[decode_unicode('⠘'), decode_unicode('⠍')], '\u{02E3}' => &[decode_unicode('⠘'), decode_unicode('⠭')], '\u{207D}' => &[decode_unicode('⠘'), decode_unicode('⠦')], '\u{207E}' => &[decode_unicode('⠴')], '\u{207F}' => &[decode_unicode('⠘'), decode_unicode('⠝')], '\u{207B}' => &[decode_unicode('⠘'), decode_unicode('⠔')], '\u{207A}' => &[decode_unicode('⠘'), decode_unicode('⠢')], '\u{2080}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠚')], '\u{2081}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠁')], '\u{2082}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠃')], '\u{2083}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠉')], '\u{2084}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠙')], '\u{2085}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠑')], '\u{2086}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠋')], '\u{2087}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠛')], '\u{2088}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠓')], '\u{2089}' => &[decode_unicode('⠰'), decode_unicode('⠼'), decode_unicode('⠊')], '\u{208D}' => &[decode_unicode('⠰'), decode_unicode('⠦')], '\u{208E}' => &[decode_unicode('⠴')], '\u{2090}' => &[decode_unicode('⠰'), decode_unicode('⠁')], '\u{2098}' => &[decode_unicode('⠰'), decode_unicode('⠍')], '\u{2093}' => &[decode_unicode('⠰'), decode_unicode('⠭')], '\u{2099}' => &[decode_unicode('⠰'), decode_unicode('⠝')], '\u{208A}' => &[decode_unicode('⠰'), decode_unicode('⠢')], '\u{2044}' => &[decode_unicode('⠌')], '\u{2500}' => &[decode_unicode('⠌')], '\u{2E29}' => &[decode_unicode('⠄')], '_' => &[decode_unicode('⠠'), decode_unicode('⠤')], '\u{0332}' => &[decode_unicode('⠠'), decode_unicode('⠤')], '|' => &[decode_unicode('⠳')], '\u{00AC}' => &[decode_unicode('⠈'), decode_unicode('⠔')], '\u{00B0}' => &[decode_unicode('⠴'), decode_unicode('⠙')], '\u{00B1}' => &[decode_unicode('⠢'), decode_unicode('⠔')], '\u{00B7}' => &[decode_unicode('⠐')], '…' => &[decode_unicode('⠠'), decode_unicode('⠠'), decode_unicode('⠠')], '⋯' => &[decode_unicode('⠠'), decode_unicode('⠠'), decode_unicode('⠠')], '\u{221A}' => &[decode_unicode('⠜')], '\u{2224}' => &[decode_unicode('⠨'), decode_unicode('⠳')], '\u{2220}' => &[decode_unicode('⠹')], '\u{22A5}' => &[decode_unicode('⠴'), decode_unicode('⠄')], '\u{2225}' => &[decode_unicode('⠰'), decode_unicode('⠆')], '\u{2AFD}' => &[decode_unicode('⠰'), decode_unicode('⠆')], '\u{223D}' => &[decode_unicode('⠠'), decode_unicode('⠄')], '\u{2261}' => &[decode_unicode('⠶'), decode_unicode('⠶')], '\u{221E}' => &[decode_unicode('⠿')], '\u{222B}' => &[decode_unicode('⠮')], '\u{222E}' => &[decode_unicode('⠾')], '\u{222C}' => &[decode_unicode('⠮'), decode_unicode('⠮')], '\u{2207}' => &[decode_unicode('⠸'), decode_unicode('⠩')], '\u{2202}' => &[decode_unicode('⠫')], '\u{2208}' => &[decode_unicode('⠖')], '\u{220B}' => &[decode_unicode('⠲')], '\u{2209}' => &[decode_unicode('⠨'), decode_unicode('⠖')], '\u{220C}' => &[decode_unicode('⠨'), decode_unicode('⠲')], '\u{2282}' => &[decode_unicode('⠖'), decode_unicode('⠂')], '\u{2283}' => &[decode_unicode('⠐'), decode_unicode('⠲')], '\u{2284}' => &[decode_unicode('⠨'), decode_unicode('⠖'), decode_unicode('⠂')], '\u{2285}' => &[decode_unicode('⠨'), decode_unicode('⠐'), decode_unicode('⠲')], '\u{2205}' => &[decode_unicode('⠨'), decode_unicode('⠋')], '\u{222A}' => &[decode_unicode('⠬')], '\u{2229}' => &[decode_unicode('⠩')], '\u{2200}' => &[decode_unicode('⠨'), decode_unicode('⠄')], '\u{2203}' => &[decode_unicode('⠨'), decode_unicode('⠢')], '\u{2204}' => &[decode_unicode('⠨'), decode_unicode('⠨'), decode_unicode('⠢')], '\u{2227}' => &[decode_unicode('⠹')], '\u{2228}' => &[decode_unicode('⠼')], '\u{22BB}' => &[decode_unicode('⠼'), decode_unicode('⠤')], '\u{2234}' => &[decode_unicode('⠠'), decode_unicode('⠡')], '\u{2235}' => &[decode_unicode('⠈'), decode_unicode('⠌')], '\u{2248}' => &[decode_unicode('⠈'), decode_unicode('⠔'), decode_unicode('⠈'), decode_unicode('⠔')], '\u{224A}' => &[decode_unicode('⠈'), decode_unicode('⠔'), decode_unicode('⠈'), decode_unicode('⠔'), decode_unicode('⠒')], '\u{2243}' => &[decode_unicode('⠈'), decode_unicode('⠔'), decode_unicode('⠒')], '\u{2245}' => &[decode_unicode('⠈'), decode_unicode('⠔'), decode_unicode('⠒'), decode_unicode('⠒')], '\u{2241}' => &[decode_unicode('⠨'), decode_unicode('⠈'), decode_unicode('⠔')], '\u{226E}' => &[decode_unicode('⠨'), decode_unicode('⠔'), decode_unicode('⠔')], '\u{226F}' => &[decode_unicode('⠨'), decode_unicode('⠢'), decode_unicode('⠢')], '\u{2270}' => &[decode_unicode('⠨'), decode_unicode('⠖'), decode_unicode('⠖')], '\u{2271}' => &[decode_unicode('⠨'), decode_unicode('⠲'), decode_unicode('⠲')], '\u{25B7}' => &[decode_unicode('⠸'), decode_unicode('⠜')], '\u{25C1}' => &[decode_unicode('⠸'), decode_unicode('⠣')], '\u{25A1}' => &[decode_unicode('⠸'), decode_unicode('⠶')], '\u{25B3}' => &[decode_unicode('⠸'), decode_unicode('⠬')], '\u{25B1}' => &[decode_unicode('⠸'), decode_unicode('⠌'), decode_unicode('⠌')], '\u{23E2}' => &[decode_unicode('⠸'), decode_unicode('⠌'), decode_unicode('⠡')], '\u{2302}' => &[decode_unicode('⠸'), decode_unicode('⠪'), decode_unicode('⠅')], '\u{2394}' => &[decode_unicode('⠸'), decode_unicode('⠪'), decode_unicode('⠕')], '\u{29BE}' => &[decode_unicode('⠸'), decode_unicode('⠴'), decode_unicode('⠴')], '\u{03A3}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠎')], '\u{2295}' => &[decode_unicode('⠸'), decode_unicode('⠢')], '\u{2296}' => &[decode_unicode('⠸'), decode_unicode('⠔')], '\u{2297}' => &[decode_unicode('⠸'), decode_unicode('⠡')], '\u{2217}' => &[decode_unicode('⠸'), decode_unicode('⠣')], '\u{2218}' => &[decode_unicode('⠸'), decode_unicode('⠴')], '\u{03B1}' => &[decode_unicode('⠨'), decode_unicode('⠁')], '\u{03B2}' => &[decode_unicode('⠨'), decode_unicode('⠃')], '\u{03B3}' => &[decode_unicode('⠨'), decode_unicode('⠛')], '\u{03B4}' => &[decode_unicode('⠨'), decode_unicode('⠙')], '\u{03B5}' => &[decode_unicode('⠨'), decode_unicode('⠑')], '\u{03B6}' => &[decode_unicode('⠨'), decode_unicode('⠵')], '\u{03B7}' => &[decode_unicode('⠨'), decode_unicode('⠱')], '\u{03B8}' => &[decode_unicode('⠨'), decode_unicode('⠹')], '\u{03B9}' => &[decode_unicode('⠨'), decode_unicode('⠊')], '\u{03BA}' => &[decode_unicode('⠨'), decode_unicode('⠅')], '\u{03BB}' => &[decode_unicode('⠨'), decode_unicode('⠇')], '\u{03BC}' => &[decode_unicode('⠨'), decode_unicode('⠍')], '\u{03BD}' => &[decode_unicode('⠨'), decode_unicode('⠝')], '\u{03BE}' => &[decode_unicode('⠨'), decode_unicode('⠭')], '\u{03BF}' => &[decode_unicode('⠨'), decode_unicode('⠕')], '\u{03C0}' => &[decode_unicode('⠨'), decode_unicode('⠏')], '\u{03C1}' => &[decode_unicode('⠨'), decode_unicode('⠗')], '\u{03C3}' => &[decode_unicode('⠨'), decode_unicode('⠎')], '\u{03C4}' => &[decode_unicode('⠨'), decode_unicode('⠞')], '\u{03C5}' => &[decode_unicode('⠨'), decode_unicode('⠥')], '\u{03C6}' => &[decode_unicode('⠨'), decode_unicode('⠋')], '\u{03C7}' => &[decode_unicode('⠨'), decode_unicode('⠯')], '\u{03C8}' => &[decode_unicode('⠨'), decode_unicode('⠽')], '\u{03C9}' => &[decode_unicode('⠨'), decode_unicode('⠺')], '\u{0391}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠁')], '\u{0392}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠃')], '\u{0393}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠛')], '\u{0395}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠑')], '\u{0396}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠵')], '\u{0397}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠱')], '\u{0398}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠹')], '\u{0399}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠊')], '\u{039A}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠅')], '\u{039B}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠇')], '\u{039C}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠍')], '\u{039D}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠝')], '\u{039E}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠭')], '\u{039F}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠕')], '\u{03A0}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠏')], '\u{03A1}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠗')], '\u{03A4}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠞')], '\u{03A5}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠥')], '\u{03A6}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠋')], '\u{03A7}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠯')], '\u{03A8}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠽')], '\u{03A9}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠺')], '\u{0394}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠙')], '\u{2196}' => &[decode_unicode('⠪'), decode_unicode('⠢')], '\u{2197}' => &[decode_unicode('⠔'), decode_unicode('⠕')], '\u{2198}' => &[decode_unicode('⠢'), decode_unicode('⠕')], '\u{2199}' => &[decode_unicode('⠪'), decode_unicode('⠔')], '\u{21CF}' => &[decode_unicode('⠨'), decode_unicode('⠒'), decode_unicode('⠒'), decode_unicode('⠕')], '\u{2135}' => &[decode_unicode('⠗'), decode_unicode('⠋')], '\u{2206}' => &[decode_unicode('⠸'), decode_unicode('⠬')], '\u{2219}' => &[decode_unicode('⠸'), decode_unicode('⠲')], '\u{FF03}' => &[decode_unicode('⠸'), decode_unicode('⠹')], '\u{1D9C}' => &[decode_unicode('⠘'), decode_unicode('⠉')], '\u{0302}' => &[decode_unicode('⠈'), decode_unicode('⠈'), decode_unicode('⠢')], '\u{0304}' => &[decode_unicode('⠈'), decode_unicode('⠉')], '\u{0305}' => &[decode_unicode('⠈'), decode_unicode('⠉')], '\u{2016}' => &[decode_unicode('⠳'), decode_unicode('⠳')], '\u{2322}' => &[decode_unicode('⠈'), decode_unicode('⠪')], '\u{0303}' => &[decode_unicode('⠈'), decode_unicode('⠈'), decode_unicode('⠔')], '\u{0307}' => &[decode_unicode('⠈')], '\u{0308}' => &[decode_unicode('⠈'), decode_unicode('⠲'), decode_unicode('⠲')], '\u{0309}' => &[decode_unicode('⠈'), decode_unicode('⠈'), decode_unicode('⠔')], '\u{030A}' => &[decode_unicode('⠈'), decode_unicode('⠈'), decode_unicode('⠔')], '\u{211B}' => &[decode_unicode('⠠'), decode_unicode('⠗')], '~' => &[decode_unicode('⠈'), decode_unicode('⠔')], '\u{0338}' => &[decode_unicode('⠨')], '\u{203E}' => &[decode_unicode('⠈'), decode_unicode('⠉')], '\u{20E1}' => &[decode_unicode('⠪'), decode_unicode('⠒'), decode_unicode('⠕')], '\u{20D7}' => &[decode_unicode('⠒'), decode_unicode('⠕')], '\u{22A2}' => &[decode_unicode('⠸'), decode_unicode('⠒')], '\u{22A3}' => &[decode_unicode('⠈'), decode_unicode('⠸'), decode_unicode('⠒')], '\u{22A8}' => &[decode_unicode('⠘'), decode_unicode('⠸'), decode_unicode('⠒')], '\u{2AE4}' => &[decode_unicode('⠨'), decode_unicode('⠸'), decode_unicode('⠒')], '\u{2272}' => &[decode_unicode('⠔'), decode_unicode('⠔'), decode_unicode('⠈'), decode_unicode('⠔')], '\u{227A}' => &[decode_unicode('⠔'), decode_unicode('⠔')], '\u{21CC}' => &[decode_unicode('⠪'), decode_unicode('⠶'), decode_unicode('⠕')], '\u{00AF}' => &[decode_unicode('⠈'), decode_unicode('⠉')], '\u{2211}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠎')], '\u{220F}' => &[decode_unicode('⠠'), decode_unicode('⠨'), decode_unicode('⠏')], };
pub fn encode_char_math_symbol_shortcut(text: char) -> Result<&'static [u8], String> {
if let Some(code) = SHORTCUT_MAP.get(&text) {
Ok(code)
} else {
Err("Invalid math symbol character".to_string())
}
}
pub fn is_math_symbol_char(text: char) -> bool {
SHORTCUT_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('√')]
fn is_math_symbol_char_recognizes_math_chars(#[case] ch: char) {
assert!(is_math_symbol_char(ch));
}
#[test]
fn is_math_symbol_char_rejects_ascii_letter() {
assert!(!is_math_symbol_char('a'));
}
#[rstest::rstest]
#[case('²', &['⠘', '⠼', '⠃'][..])]
#[case('≥', &['⠲', '⠲'][..])]
#[case('≤', &['⠖', '⠖'][..])]
fn encode_char_math_symbol_shortcut_table(
#[case] input: char,
#[case] expected_chars: &[char],
) {
let expected: Vec<u8> = expected_chars.iter().copied().map(decode_unicode).collect();
assert_eq!(
encode_char_math_symbol_shortcut(input).unwrap(),
expected.as_slice()
);
}
}