mirror of
https://github.com/ankitects/anki.git
synced 2025-09-23 16:26:40 -04:00
Make - escapable
Treat unescaped - as before but make it escapable with \ to distinguish the literal from the negator.
This commit is contained in:
parent
91873d68eb
commit
b09a398d2d
1 changed files with 14 additions and 7 deletions
|
@ -442,7 +442,7 @@ fn unescape(txt: &str) -> ParseResult<Cow<str>> {
|
|||
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<Cow<str>> {
|
|||
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\%""#)?,
|
||||
|
|
Loading…
Reference in a new issue