From 1ecdd61fed86122d58d6b844b2278de28c8618c3 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Mon, 10 Apr 2023 13:13:11 -0400 Subject: [PATCH] Do not consume trailing whitespace if the parent exit matcher is matching. --- src/parser/document.rs | 4 ++-- src/parser/footnote_definition.rs | 4 +++- src/parser/greater_block.rs | 5 +++-- src/parser/paragraph.rs | 5 +++-- src/parser/plain_list.rs | 5 +++-- src/parser/util.rs | 15 +++++++++++++++ 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/parser/document.rs b/src/parser/document.rs index cd12174..83a4854 100644 --- a/src/parser/document.rs +++ b/src/parser/document.rs @@ -19,7 +19,7 @@ use crate::parser::parser_context::ChainBehavior; use crate::parser::parser_context::ContextElement; use crate::parser::parser_context::ContextTree; use crate::parser::parser_context::ExitMatcherNode; -use crate::parser::util::maybe_consume_trailing_whitespace; +use crate::parser::util::maybe_consume_trailing_whitespace_if_not_exiting; use super::element::Element; use super::error::Res; @@ -111,7 +111,7 @@ fn section<'r, 's>(context: Context<'r, 's>, input: &'s str) -> Res<&'s str, Sec |(children, _exit_contents)| !children.is_empty(), )(input)?; - let (remaining, _trailing_ws) = maybe_consume_trailing_whitespace(context, remaining)?; + let (remaining, _trailing_ws) = maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok((remaining, Section { source, children })) diff --git a/src/parser/footnote_definition.rs b/src/parser/footnote_definition.rs index 5e53645..bc01939 100644 --- a/src/parser/footnote_definition.rs +++ b/src/parser/footnote_definition.rs @@ -11,6 +11,7 @@ use crate::parser::util::blank_line; use crate::parser::util::exit_matcher_parser; use crate::parser::util::get_consumed; use crate::parser::util::maybe_consume_trailing_whitespace; +use crate::parser::util::maybe_consume_trailing_whitespace_if_not_exiting; use crate::parser::util::start_of_line; use nom::branch::alt; use nom::bytes::complete::tag; @@ -44,7 +45,8 @@ pub fn footnote_definition<'r, 's>( let (remaining, (children, _exit_contents)) = many_till(element_matcher, exit_matcher)(remaining)?; - let (remaining, _trailing_ws) = maybe_consume_trailing_whitespace(context, remaining)?; + let (remaining, _trailing_ws) = + maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( diff --git a/src/parser/greater_block.rs b/src/parser/greater_block.rs index 8e324a7..1524b97 100644 --- a/src/parser/greater_block.rs +++ b/src/parser/greater_block.rs @@ -10,7 +10,7 @@ use crate::parser::parser_context::ExitMatcherNode; use crate::parser::parser_with_context::parser_with_context; use crate::parser::util::exit_matcher_parser; use crate::parser::util::get_consumed; -use crate::parser::util::maybe_consume_trailing_whitespace; +use crate::parser::util::maybe_consume_trailing_whitespace_if_not_exiting; use crate::parser::util::start_of_line; use nom::branch::alt; use nom::bytes::complete::is_not; @@ -57,7 +57,8 @@ pub fn greater_block<'r, 's>( // Not checking if parent exit matcher is causing exit because the greater_block_end matcher asserts we matched a full greater block - let (remaining, _trailing_ws) = maybe_consume_trailing_whitespace(context, remaining)?; + let (remaining, _trailing_ws) = + maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; let parameters = match parameters { Some((_ws, parameters)) => Some(parameters), diff --git a/src/parser/paragraph.rs b/src/parser/paragraph.rs index 4a9a60e..3881fe8 100644 --- a/src/parser/paragraph.rs +++ b/src/parser/paragraph.rs @@ -12,7 +12,7 @@ use crate::parser::parser_context::ContextElement; use crate::parser::parser_context::ExitMatcherNode; use crate::parser::parser_with_context::parser_with_context; use crate::parser::util::exit_matcher_parser; -use crate::parser::util::maybe_consume_trailing_whitespace; +use crate::parser::util::maybe_consume_trailing_whitespace_if_not_exiting; use crate::parser::util::start_of_line; use super::element::non_paragraph_element; @@ -38,7 +38,8 @@ pub fn paragraph<'r, 's>(context: Context<'r, 's>, input: &'s str) -> Res<&'s st // Not checking parent exit matcher because if there are any children matched then we have a valid paragraph. - let (remaining, _trailing_ws) = maybe_consume_trailing_whitespace(context, remaining)?; + let (remaining, _trailing_ws) = + maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); diff --git a/src/parser/plain_list.rs b/src/parser/plain_list.rs index 3564376..cbdc295 100644 --- a/src/parser/plain_list.rs +++ b/src/parser/plain_list.rs @@ -4,7 +4,7 @@ use super::error::Res; use super::greater_element::PlainList; use super::greater_element::PlainListItem; use super::parser_with_context::parser_with_context; -use super::util::maybe_consume_trailing_whitespace; +use super::util::maybe_consume_trailing_whitespace_if_not_exiting; use super::util::non_whitespace_character; use super::Context; use crate::parser::element::element; @@ -51,7 +51,8 @@ pub fn plain_list<'r, 's>(context: Context<'r, 's>, input: &'s str) -> Res<&'s s }; } - let (remaining, _trailing_ws) = maybe_consume_trailing_whitespace(context, remaining)?; + let (remaining, _trailing_ws) = + maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok((remaining, PlainList { source, children })) diff --git a/src/parser/util.rs b/src/parser/util.rs index 51eaf92..cd6a44a 100644 --- a/src/parser/util.rs +++ b/src/parser/util.rs @@ -92,6 +92,21 @@ pub fn element_trailing_whitespace<'r, 's>( alt((eof, recognize(many0(blank_line))))(input) } +#[tracing::instrument(ret, level = "debug")] +pub fn maybe_consume_trailing_whitespace_if_not_exiting<'r, 's>( + context: Context<'r, 's>, + input: &'s str, +) -> Res<&'s str, Option<&'s str>> { + if context.should_consume_trailing_whitespace() && exit_matcher_parser(context, input).is_err() + { + Ok(opt(parser_with_context!(element_trailing_whitespace)( + context, + ))(input)?) + } else { + Ok((input, None)) + } +} + #[tracing::instrument(ret, level = "debug")] pub fn maybe_consume_trailing_whitespace<'r, 's>( context: Context<'r, 's>,