diff options
Diffstat (limited to 'src/parser.rs')
| -rw-r--r-- | src/parser.rs | 114 | 
1 files changed, 113 insertions, 1 deletions
| diff --git a/src/parser.rs b/src/parser.rs index d82cdaf..37d69df 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -219,7 +219,10 @@ where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>,  { -    satisfy(|c| c != '<') +    or( +        satisfy(|c| c != '<' && c != '\\'), +        action_escape() +    )          .map(|c|              KeyboardKeyWithModifiers::new(                  KeyboardKey::Character(Character::new(c)), @@ -228,6 +231,17 @@ where          )  } +fn action_escape<I>() -> impl Parser<Input = I, Output = char> +where +    I: Stream<Item = char>, +    I::Error: ParseError<I::Item, I::Range, I::Position>, +{ +    choice!( +        try(string("\\\\")).map(|_| '\\'), +        try(string("\\<")).map(|_| '<') +    ) +} +  fn special_key<I>() -> impl Parser<Input = I, Output = KeyboardKeyWithModifiers>  where      I: Stream<Item = char>, @@ -594,10 +608,108 @@ mod tests {      #[test]      fn action_parses_map_with_backslash_escape() { +        let text = "type\\\\onebslash"; + +        let expected = Action::Map(vec![ +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('t')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('y')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('p')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('e')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('\\')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('o')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('n')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('e')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('b')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('s')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('l')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('a')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('s')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('h')), +                None, +            ), +        ]); +        let result = action_map().easy_parse(text).map(|t| t.0); + +        assert_eq!(result, Ok(expected));      }      #[test]      fn action_parses_map_with_less_than_escape() { +        let text = "type\\<lt"; + +        let expected = Action::Map(vec![ +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('t')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('y')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('p')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('e')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('<')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('l')), +                None, +            ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::Character(Character::new('t')), +                None, +            ), +        ]); +        let result = action_map().easy_parse(text).map(|t| t.0); + +        assert_eq!(result, Ok(expected));      }      #[test] | 
