Fix comparing key and mark prefix/suffix as optional.

This commit is contained in:
Tom Alexander 2023-10-09 15:41:21 -04:00
parent f6155ecf93
commit 8a0f9d4540
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
3 changed files with 40 additions and 20 deletions

View File

@ -14,7 +14,6 @@ use crate::types::AstNode;
#[derive(Debug)]
pub(crate) enum EmacsField<'s> {
Required(&'s str),
#[allow(dead_code)]
Optional(&'s str),
}

View File

@ -3492,13 +3492,21 @@ fn compare_citation<'b, 's>(
compare_property_quoted_string
),
(
EmacsField::Required(":prefix"),
|r| Some(r.prefix.iter()),
EmacsField::Optional(":prefix"),
|r| if r.prefix.is_empty() {
None
} else {
Some(r.prefix.iter())
},
compare_property_list_of_ast_nodes
),
(
EmacsField::Required(":suffix"),
|r| Some(r.suffix.iter()),
EmacsField::Optional(":suffix"),
|r| if r.suffix.is_empty() {
None
} else {
Some(r.suffix.iter())
},
compare_property_list_of_ast_nodes
)
) {
@ -3544,13 +3552,21 @@ fn compare_citation_reference<'b, 's>(
compare_property_quoted_string
),
(
EmacsField::Required(":prefix"),
|r| Some(r.prefix.iter()),
EmacsField::Optional(":prefix"),
|r| if r.prefix.is_empty() {
None
} else {
Some(r.prefix.iter())
},
compare_property_list_of_ast_nodes
),
(
EmacsField::Required(":suffix"),
|r| Some(r.suffix.iter()),
EmacsField::Optional(":suffix"),
|r| if r.suffix.is_empty() {
None
} else {
Some(r.suffix.iter())
},
compare_property_list_of_ast_nodes
)
) {

View File

@ -1,6 +1,7 @@
use nom::branch::alt;
use nom::bytes::complete::tag;
use nom::character::complete::anychar;
use nom::combinator::map;
use nom::combinator::not;
use nom::combinator::opt;
use nom::combinator::recognize;
@ -56,18 +57,22 @@ pub(crate) fn citation_reference_key<'b, 'g, 'r, 's>(
context: RefContext<'b, 'g, 'r, 's>,
input: OrgSource<'s>,
) -> Res<OrgSource<'s>, OrgSource<'s>> {
let (remaining, source) = recognize(tuple((
tag("@"),
many1(verify(
preceded(
not(parser_with_context!(exit_matcher_parser)(context)),
anychar,
),
|c| {
WORD_CONSTITUENT_CHARACTERS.contains(*c) || "-.:?~`'/*@+|(){}<>&_^$#%~".contains(*c)
},
let (remaining, source) = map(
tuple((
tag("@"),
recognize(many1(verify(
preceded(
not(parser_with_context!(exit_matcher_parser)(context)),
anychar,
),
|c| {
WORD_CONSTITUENT_CHARACTERS.contains(*c)
|| "-.:?~`'/*@+|(){}<>&_^$#%~".contains(*c)
},
))),
)),
)))(input)?;
|(_, key)| key,
)(input)?;
Ok((remaining, source))
}