Do not match keyword name if a longer keyword name would match.

This commit is contained in:
Tom Alexander 2023-10-15 15:55:19 -04:00
parent e7c3c7aab6
commit f5dcacc79d
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
1 changed files with 16 additions and 9 deletions

View File

@ -9,6 +9,7 @@ use nom::character::complete::one_of;
use nom::character::complete::space0;
use nom::combinator::consumed;
use nom::combinator::eof;
use nom::combinator::map;
use nom::combinator::not;
use nom::combinator::peek;
use nom::combinator::recognize;
@ -22,7 +23,6 @@ use super::org_source::OrgSource;
use super::util::get_consumed;
use super::util::maybe_consume_trailing_whitespace_if_not_exiting;
use crate::context::parser_with_context;
use crate::context::Matcher;
use crate::context::RefContext;
use crate::error::CustomError;
use crate::error::MyError;
@ -152,12 +152,7 @@ fn affiliated_key<'b, 'g, 'r, 's>(
input: OrgSource<'s>,
) -> Res<OrgSource<'s>, OrgSource<'s>> {
alt((
recognize(tuple((
parser_with_context!(dual_affiliated_key)(context),
tag("["),
optval,
tag("]"),
))),
parser_with_context!(dual_affiliated_key)(context),
parser_with_context!(plain_affiliated_key)(context),
export_keyword,
))(input)
@ -169,7 +164,13 @@ fn plain_affiliated_key<'b, 'g, 'r, 's>(
input: OrgSource<'s>,
) -> Res<OrgSource<'s>, OrgSource<'s>> {
for keyword in context.get_global_settings().element_affiliated_keywords {
let result = tag_no_case::<_, _, CustomError<_>>(*keyword)(input);
let result = map(
tuple((
tag_no_case::<_, _, CustomError<_>>(*keyword),
peek(tag(":")),
)),
|(key, _)| key,
)(input);
match result {
Ok((remaining, ent)) => {
return Ok((remaining, ent));
@ -189,7 +190,13 @@ fn dual_affiliated_key<'b, 'g, 'r, 's>(
input: OrgSource<'s>,
) -> Res<OrgSource<'s>, OrgSource<'s>> {
for keyword in context.get_global_settings().element_dual_keywords {
let result = tag_no_case::<_, _, CustomError<_>>(*keyword)(input);
let result = recognize(tuple((
tag_no_case::<_, _, CustomError<_>>(*keyword),
tag("["),
optval,
tag("]"),
peek(tag(":")),
)))(input);
match result {
Ok((remaining, ent)) => {
return Ok((remaining, ent));