From b5f0521b56d0883b00bc5941ba91eafbc1766865 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Thu, 31 Aug 2023 15:44:44 -0400 Subject: [PATCH] Only consume trailing whitespace when not exiting for all objects. --- src/parser/angle_link.rs | 3 +++ src/parser/citation.rs | 6 ++++-- src/parser/entity.rs | 6 ++++-- src/parser/export_snippet.rs | 3 +++ src/parser/footnote_reference.rs | 13 ++++++++----- src/parser/inline_babel_call.rs | 6 ++++-- src/parser/inline_source_block.rs | 6 ++++-- src/parser/latex_fragment.rs | 5 +++-- src/parser/radio_link.rs | 4 +++- src/parser/regular_link.rs | 9 ++++++--- src/parser/statistics_cookie.rs | 12 +++++++----- src/parser/subscript_and_superscript.rs | 9 ++++++--- src/parser/target.rs | 6 ++++-- src/parser/text_markup.rs | 7 +++++-- src/parser/timestamp.rs | 23 +++++++++++++++-------- 15 files changed, 79 insertions(+), 39 deletions(-) diff --git a/src/parser/angle_link.rs b/src/parser/angle_link.rs index ea10fbd..423e17a 100644 --- a/src/parser/angle_link.rs +++ b/src/parser/angle_link.rs @@ -5,6 +5,7 @@ use nom::combinator::recognize; use nom::multi::many_till; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::Res; use crate::parser::exiting::ExitClass; @@ -26,6 +27,8 @@ pub fn angle_link<'r, 's>( let (remaining, _separator) = tag(":")(remaining)?; let (remaining, path) = path_angle(context, remaining)?; let (remaining, _) = tag(">")(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/citation.rs b/src/parser/citation.rs index 13acca0..9aa229b 100644 --- a/src/parser/citation.rs +++ b/src/parser/citation.rs @@ -2,7 +2,7 @@ use nom::branch::alt; use nom::bytes::complete::tag; use nom::bytes::complete::tag_no_case; use nom::character::complete::anychar; -use nom::character::complete::space0; + use nom::combinator::opt; use nom::combinator::recognize; use nom::combinator::verify; @@ -14,6 +14,7 @@ use nom::sequence::tuple; use super::citation_reference::must_balance_bracket; use super::org_source::BracketDepth; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::CustomError; use crate::error::Res; @@ -48,7 +49,8 @@ pub fn citation<'r, 's>( parser_with_context!(global_suffix)(context), ))))(remaining)?; let (remaining, _) = tag("]")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/entity.rs b/src/parser/entity.rs index 7621e59..330a4d3 100644 --- a/src/parser/entity.rs +++ b/src/parser/entity.rs @@ -2,12 +2,13 @@ use nom::branch::alt; use nom::bytes::complete::tag; use nom::bytes::complete::tag_no_case; use nom::character::complete::satisfy; -use nom::character::complete::space0; + use nom::combinator::eof; use nom::combinator::peek; use nom::combinator::recognize; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::CustomError; use crate::error::MyError; @@ -440,7 +441,8 @@ pub fn entity<'r, 's>( let (remaining, _) = tag("\\")(input)?; let (remaining, entity_name) = name(context, remaining)?; let (remaining, _) = alt((tag("{}"), peek(recognize(entity_end))))(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( diff --git a/src/parser/export_snippet.rs b/src/parser/export_snippet.rs index 9351929..85ef51b 100644 --- a/src/parser/export_snippet.rs +++ b/src/parser/export_snippet.rs @@ -8,6 +8,7 @@ use nom::multi::many_till; use nom::sequence::tuple; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::Res; use crate::parser::exiting::ExitClass; @@ -35,6 +36,8 @@ pub fn export_snippet<'r, 's>( parser_with_context!(contents)(&parser_context), )))(remaining)?; let (remaining, _) = tag("@@")(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/footnote_reference.rs b/src/parser/footnote_reference.rs index 2de9a12..d82f514 100644 --- a/src/parser/footnote_reference.rs +++ b/src/parser/footnote_reference.rs @@ -1,13 +1,13 @@ use nom::branch::alt; use nom::bytes::complete::tag; use nom::bytes::complete::tag_no_case; -use nom::character::complete::space0; use nom::combinator::verify; use nom::multi::many_till; use super::org_source::BracketDepth; use super::org_source::OrgSource; use super::parser_context::ContextElement; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::CustomError; use crate::error::MyError; @@ -54,7 +54,8 @@ fn anonymous_footnote<'r, 's>( )(remaining)?; let (remaining, _) = tag("]")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, @@ -89,7 +90,8 @@ fn inline_footnote<'r, 's>( )(remaining)?; let (remaining, _) = tag("]")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, @@ -103,13 +105,14 @@ fn inline_footnote<'r, 's>( #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] fn footnote_reference_only<'r, 's>( - _context: Context<'r, 's>, + context: Context<'r, 's>, input: OrgSource<'s>, ) -> Res, FootnoteReference<'s>> { let (remaining, _) = tag_no_case("[fn:")(input)?; let (remaining, label_contents) = label(remaining)?; let (remaining, _) = tag("]")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/inline_babel_call.rs b/src/parser/inline_babel_call.rs index 1f17b96..9985757 100644 --- a/src/parser/inline_babel_call.rs +++ b/src/parser/inline_babel_call.rs @@ -4,7 +4,7 @@ use nom::bytes::complete::tag_no_case; use nom::character::complete::anychar; use nom::character::complete::line_ending; use nom::character::complete::one_of; -use nom::character::complete::space0; + use nom::combinator::opt; use nom::combinator::recognize; use nom::combinator::verify; @@ -12,6 +12,7 @@ use nom::multi::many_till; use super::org_source::BracketDepth; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::CustomError; use crate::error::MyError; @@ -34,7 +35,8 @@ pub fn inline_babel_call<'r, 's>( let (remaining, _header1) = opt(parser_with_context!(header)(context))(remaining)?; let (remaining, _argument) = argument(context, remaining)?; let (remaining, _header2) = opt(parser_with_context!(header)(context))(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/inline_source_block.rs b/src/parser/inline_source_block.rs index bde53ee..b642339 100644 --- a/src/parser/inline_source_block.rs +++ b/src/parser/inline_source_block.rs @@ -4,7 +4,7 @@ use nom::bytes::complete::tag_no_case; use nom::character::complete::anychar; use nom::character::complete::line_ending; use nom::character::complete::one_of; -use nom::character::complete::space0; + use nom::combinator::opt; use nom::combinator::recognize; use nom::combinator::verify; @@ -14,6 +14,7 @@ use tracing::span; use super::org_source::BracketDepth; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::CustomError; use crate::error::MyError; @@ -35,7 +36,8 @@ pub fn inline_source_block<'r, 's>( let (remaining, _) = lang(context, remaining)?; let (remaining, _header1) = opt(parser_with_context!(header)(context))(remaining)?; let (remaining, _body) = body(context, remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/latex_fragment.rs b/src/parser/latex_fragment.rs index e5b008a..4be6a0e 100644 --- a/src/parser/latex_fragment.rs +++ b/src/parser/latex_fragment.rs @@ -5,7 +5,6 @@ use nom::character::complete::anychar; use nom::character::complete::line_ending; use nom::character::complete::none_of; use nom::character::complete::one_of; -use nom::character::complete::space0; use nom::combinator::peek; use nom::combinator::recognize; use nom::combinator::verify; @@ -14,6 +13,7 @@ use nom::multi::many_till; use nom::sequence::tuple; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::CustomError; use crate::error::MyError; @@ -36,7 +36,8 @@ pub fn latex_fragment<'r, 's>( parser_with_context!(dollar_char_fragment)(context), parser_with_context!(bordered_dollar_fragment)(context), ))(input)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/radio_link.rs b/src/parser/radio_link.rs index 6e121dd..bbe8f07 100644 --- a/src/parser/radio_link.rs +++ b/src/parser/radio_link.rs @@ -6,6 +6,7 @@ use nom::combinator::verify; use nom::multi::many_till; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use super::Object; use crate::error::CustomError; @@ -104,7 +105,8 @@ pub fn radio_target<'r, 's>( )(remaining)?; let (remaining, _closing) = tag(">>>")(remaining)?; - let (remaining, _trailing_whitespace) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/regular_link.rs b/src/parser/regular_link.rs index 5f9e6da..4bc2795 100644 --- a/src/parser/regular_link.rs +++ b/src/parser/regular_link.rs @@ -3,13 +3,14 @@ use nom::bytes::complete::escaped; use nom::bytes::complete::tag; use nom::bytes::complete::take_till1; use nom::character::complete::one_of; -use nom::character::complete::space0; + use nom::combinator::verify; use nom::multi::many_till; use super::org_source::OrgSource; use super::parser_with_context::parser_with_context; use super::util::get_consumed; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use super::Object; use super::RegularLink; @@ -39,7 +40,8 @@ pub fn regular_link_without_description<'r, 's>( let (remaining, _opening_bracket) = tag("[[")(input)?; let (remaining, _path) = pathreg(context, remaining)?; let (remaining, _closing_bracket) = tag("]]")(remaining)?; - let (remaining, _trailing_whitespace) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, @@ -59,7 +61,8 @@ pub fn regular_link_with_description<'r, 's>( let (remaining, _closing_bracket) = tag("][")(remaining)?; let (remaining, _description) = description(context, remaining)?; let (remaining, _closing_bracket) = tag("]]")(remaining)?; - let (remaining, _trailing_whitespace) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/statistics_cookie.rs b/src/parser/statistics_cookie.rs index 0f96a71..cae0de3 100644 --- a/src/parser/statistics_cookie.rs +++ b/src/parser/statistics_cookie.rs @@ -1,10 +1,10 @@ use nom::branch::alt; use nom::bytes::complete::tag; -use nom::character::complete::space0; use nom::combinator::recognize; use nom::sequence::tuple; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::Res; use crate::parser::parser_with_context::parser_with_context; @@ -23,12 +23,13 @@ pub fn statistics_cookie<'r, 's>( #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] pub fn percent_statistics_cookie<'r, 's>( - _context: Context<'r, 's>, + context: Context<'r, 's>, input: OrgSource<'s>, ) -> Res, StatisticsCookie<'s>> { let (remaining, source) = recognize(tuple((tag("["), nom::character::complete::u64, tag("%]"))))(input)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; Ok(( remaining, StatisticsCookie { @@ -39,7 +40,7 @@ pub fn percent_statistics_cookie<'r, 's>( #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] pub fn fraction_statistics_cookie<'r, 's>( - _context: Context<'r, 's>, + context: Context<'r, 's>, input: OrgSource<'s>, ) -> Res, StatisticsCookie<'s>> { let (remaining, source) = recognize(tuple(( @@ -49,7 +50,8 @@ pub fn fraction_statistics_cookie<'r, 's>( nom::character::complete::u64, tag("]"), )))(input)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; Ok(( remaining, StatisticsCookie { diff --git a/src/parser/subscript_and_superscript.rs b/src/parser/subscript_and_superscript.rs index 52d518a..4b3ac12 100644 --- a/src/parser/subscript_and_superscript.rs +++ b/src/parser/subscript_and_superscript.rs @@ -2,7 +2,7 @@ use nom::branch::alt; use nom::bytes::complete::tag; use nom::character::complete::anychar; use nom::character::complete::one_of; -use nom::character::complete::space0; + use nom::combinator::map; use nom::combinator::not; use nom::combinator::opt; @@ -13,6 +13,7 @@ use nom::multi::many_till; use super::org_source::BracketDepth; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use super::Object; use crate::error::CustomError; @@ -37,7 +38,8 @@ pub fn subscript<'r, 's>( let (remaining, _) = tag("_")(input)?; pre(context, input)?; let (remaining, _body) = script_body(context, remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, @@ -56,7 +58,8 @@ pub fn superscript<'r, 's>( let (remaining, _) = tag("^")(input)?; pre(context, input)?; let (remaining, _body) = script_body(context, remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( remaining, diff --git a/src/parser/target.rs b/src/parser/target.rs index e50ea74..5d199f6 100644 --- a/src/parser/target.rs +++ b/src/parser/target.rs @@ -1,13 +1,14 @@ use nom::bytes::complete::tag; use nom::character::complete::anychar; use nom::character::complete::one_of; -use nom::character::complete::space0; + use nom::combinator::peek; use nom::combinator::recognize; use nom::combinator::verify; use nom::multi::many_till; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::CustomError; use crate::error::MyError; @@ -49,7 +50,8 @@ pub fn target<'r, 's>( )))); } let (remaining, _) = tag(">>")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( diff --git a/src/parser/text_markup.rs b/src/parser/text_markup.rs index a16de62..8ad438c 100644 --- a/src/parser/text_markup.rs +++ b/src/parser/text_markup.rs @@ -17,6 +17,7 @@ use tracing::span; use super::org_source::OrgSource; use super::radio_link::RematchObject; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::CustomError; use crate::error::MyError; @@ -204,7 +205,8 @@ fn _text_markup_object<'r, 's, 'x>( } let (remaining, _close) = text_markup_end_specialized(context, remaining)?; - let (remaining, _trailing_whitespace) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; Ok((remaining, children)) } @@ -254,7 +256,8 @@ fn _text_markup_string<'r, 's, 'x>( } let (remaining, _close) = text_markup_end_specialized(context, remaining)?; - let (remaining, _trailing_whitespace) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; Ok((remaining, contents)) } diff --git a/src/parser/timestamp.rs b/src/parser/timestamp.rs index 2814716..55a6be1 100644 --- a/src/parser/timestamp.rs +++ b/src/parser/timestamp.rs @@ -3,7 +3,6 @@ use nom::bytes::complete::tag; use nom::character::complete::anychar; use nom::character::complete::digit1; use nom::character::complete::one_of; -use nom::character::complete::space0; use nom::character::complete::space1; use nom::combinator::opt; use nom::combinator::recognize; @@ -12,6 +11,7 @@ use nom::multi::many_till; use nom::sequence::tuple; use super::org_source::OrgSource; +use super::util::maybe_consume_object_trailing_whitespace_if_not_exiting; use super::Context; use crate::error::Res; use crate::parser::exiting::ExitClass; @@ -49,7 +49,8 @@ fn diary_timestamp<'r, 's>( let (remaining, _) = tag("<%%(")(input)?; let (remaining, _body) = sexp(context, remaining)?; let (remaining, _) = tag(")>")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( @@ -112,7 +113,8 @@ fn active_timestamp<'r, 's>( )))(remaining)?; let (remaining, _) = tag(">")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( @@ -145,7 +147,8 @@ fn inactive_timestamp<'r, 's>( )))(remaining)?; let (remaining, _) = tag("]")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( @@ -166,7 +169,8 @@ fn active_date_range_timestamp<'r, 's>( let (remaining, _separator) = tag("--")(remaining)?; let (remaining, _second_timestamp) = active_timestamp(context, remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( @@ -206,7 +210,8 @@ fn active_time_range_timestamp<'r, 's>( )))(remaining)?; let (remaining, _) = tag(">")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( @@ -227,7 +232,8 @@ fn inactive_date_range_timestamp<'r, 's>( let (remaining, _separator) = tag("--")(remaining)?; let (remaining, _second_timestamp) = inactive_timestamp(context, remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok(( @@ -267,7 +273,8 @@ fn inactive_time_range_timestamp<'r, 's>( )))(remaining)?; let (remaining, _) = tag("]")(remaining)?; - let (remaining, _) = space0(remaining)?; + let (remaining, _trailing_whitespace) = + maybe_consume_object_trailing_whitespace_if_not_exiting(context, remaining)?; let source = get_consumed(input, remaining); Ok((