From b09a398d2d21b158a3ef638e28e3de9054ea1089 Mon Sep 17 00:00:00 2001 From: RumovZ Date: Tue, 17 Nov 2020 18:38:27 +0100 Subject: [PATCH] Make - escapable Treat unescaped - as before but make it escapable with \ to distinguish the literal from the negator. --- rslib/src/search/parser.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/rslib/src/search/parser.rs b/rslib/src/search/parser.rs index f36577c7d..6937f02ab 100644 --- a/rslib/src/search/parser.rs +++ b/rslib/src/search/parser.rs @@ -442,7 +442,7 @@ fn unescape(txt: &str) -> ParseResult> { Err(ParseError {}) } else if is_parser_escape(txt) { lazy_static! { - static ref RE: Regex = Regex::new(r#"\\[\\":()]"#).unwrap(); + static ref RE: Regex = Regex::new(r#"\\[\\":()-]"#).unwrap(); } Ok(RE.replace_all(&txt, |caps: &Captures| match &caps[0] { r"\\" => r"\\", @@ -450,6 +450,7 @@ fn unescape(txt: &str) -> ParseResult> { r"\:" => ":", r"\(" => "(", r"\)" => ")", + r"\-" => "-", _ => unreachable!(), })) } else { @@ -466,7 +467,7 @@ fn is_invalid_escape(txt: &str) -> bool { (?:^|[^\\]) # not a backslash (?:\\\\)* # even number of backslashes \\ # single backslash - (?:[^\\":*_()]|$) # anything but an escapable char + (?:[^\\":*_()-]|$) # anything but an escapable char "# ) .unwrap(); @@ -484,7 +485,7 @@ fn is_parser_escape(txt: &str) -> bool { (?:^|[^\\]) # not a backslash (?:\\\\)* # even number of backslashes \\ # single backslash - [":()] # parser escape + [":()-] # parser escape "# ) .unwrap(); @@ -570,15 +571,15 @@ mod test { assert_eq!(parse(r#""field:va\"lue""#)?, parse(r#"field:"va\"lue""#)?,); assert_eq!(parse(r#""field:va\"lue""#)?, parse(r#"field:va\"lue"#)?,); - // only \":()*_ are escapable + // only \":()-*_ are escapable assert!(parse(r"\").is_err()); assert!(parse(r"\a").is_err()); assert!(parse(r"\%").is_err()); - // parser unescapes ":() + // parser unescapes ":()- assert_eq!( - parse(r#"\"\:\(\)"#)?, - vec![Search(UnqualifiedText(r#"":()"#.into())),] + parse(r#"\"\:\(\)\-"#)?, + vec![Search(UnqualifiedText(r#"":()-"#.into())),] ); // parser doesn't unescape unescape \*_ @@ -598,6 +599,12 @@ mod test { assert_eq!(parse(r#""field:val:ue""#), parse(r"field:val\:ue")); assert_eq!(parse(r#"field:"val:ue""#), parse(r"field:val\:ue")); + // escaping - is optional if it cannot be mistaken for a negator + assert_eq!(parse("-"), parse(r"\-")); + assert_eq!(parse("A-"), parse(r"A\-")); + assert_eq!(parse(r#""-A""#), parse(r"\-A")); + assert_ne!(parse("-A"), parse(r"\-A")); + // any character should be escapable on the right side of re: assert_eq!( parse(r#""re:\btest\%""#)?,