chewing 0.12.0

The Chewing (酷音) intelligent Zhuyin input method.
Documentation
macro_rules! symbol_map {
    ($($k:expr => $v:expr),* $(,)?) => {{
        [$(($k, $v),)*]
    }};
}

static SPECIAL_SYMBOLS: [(char, char); 29] = symbol_map! {
    '[' => '', ']' => '', '{' => '', '}' => '',
    '\'' => '', '<' => '', ':' => '', '\"' => '',
    '>' => '', '~' => '', '!' => '', '@' => '',
    '#' => '', '$' => '', '%' => '', '^' => '︿',
    '&' => '', '*' => '', '(' => '', ')' => '',
    '_' => '', '+' => '', '=' => '', '\\' => '',
    '|' => '', '?' => '', ',' => '', '.' => '',
    ';' => '',
};

static FULL_WIDTH_SYMBOLS: [(char, char); 75] = symbol_map! {
    '0' => '', '1' => '', '2' => '', '3' => '',
    '4' => '', '5' => '', '6' => '', '7' => '',
    '8' => '', '9' => '', 'a' => '', 'b' => '',
    'c' => '', 'd' => '', 'e' => '', 'f' => '',
    'g' => '', 'h' => '', 'i' => '', 'j' => '',
    'k' => '', 'l' => '', 'm' => '', 'n' => '',
    'o' => '', 'p' => '', 'q' => '', 'r' => '',
    's' => '', 't' => '', 'u' => '', 'v' => '',
    'w' => '', 'x' => '', 'y' => '', 'z' => '',
    'A' => '', 'B' => '', 'C' => '', 'D' => '',
    'E' => '', 'F' => '', 'G' => '', 'H' => '',
    'I' => '', 'J' => '', 'K' => '', 'L' => '',
    'M' => '', 'N' => '', 'O' => '', 'P' => '',
    'Q' => '', 'R' => '', 'S' => '', 'T' => '',
    'U' => '', 'V' => '', 'W' => '', 'X' => '',
    'Y' => '', 'Z' => '', ' ' => ' ', '\"' => '',
    '\'' => '', '/' => '', '<' => '', '>' => '',
    '`' => '', '[' => '', ']' =>'', '{' => '',
    '}' => '', '+' => '', '-' => '',
};

pub(crate) fn special_symbol_input(key: char) -> Option<char> {
    SPECIAL_SYMBOLS
        .iter()
        .find(|item| item.0 == key)
        .map(|item| item.1)
}

pub(crate) fn full_width_symbol_input(key: char) -> Option<char> {
    FULL_WIDTH_SYMBOLS
        .iter()
        .find(|item| item.0 == key)
        .map(|item| item.1)
        .or_else(|| special_symbol_input(key))
}