From b2383d9f93e947e8d07ffc278678d0ec9cfd9c82 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Thu, 31 Aug 2023 18:46:31 -0400 Subject: [PATCH] Fix footnote definition performance. We were re-parsing each footnote definition in the footnote definition exit matcher which causes their contents to get re-parsed. This compounds with long lists of footnote definitions. --- src/parser/citation.rs | 1 - src/parser/entity.rs | 1 - src/parser/footnote_definition.rs | 21 ++++++++------------- src/parser/inline_babel_call.rs | 1 - src/parser/inline_source_block.rs | 1 - src/parser/regular_link.rs | 1 - src/parser/subscript_and_superscript.rs | 1 - src/parser/target.rs | 1 - 8 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/parser/citation.rs b/src/parser/citation.rs index 9aa229b1..c06813be 100644 --- a/src/parser/citation.rs +++ b/src/parser/citation.rs @@ -2,7 +2,6 @@ use nom::branch::alt; use nom::bytes::complete::tag; use nom::bytes::complete::tag_no_case; use nom::character::complete::anychar; - use nom::combinator::opt; use nom::combinator::recognize; use nom::combinator::verify; diff --git a/src/parser/entity.rs b/src/parser/entity.rs index 330a4d32..4683e1ce 100644 --- a/src/parser/entity.rs +++ b/src/parser/entity.rs @@ -2,7 +2,6 @@ use nom::branch::alt; use nom::bytes::complete::tag; use nom::bytes::complete::tag_no_case; use nom::character::complete::satisfy; - use nom::combinator::eof; use nom::combinator::peek; use nom::combinator::recognize; diff --git a/src/parser/footnote_definition.rs b/src/parser/footnote_definition.rs index 6b643144..310620da 100644 --- a/src/parser/footnote_definition.rs +++ b/src/parser/footnote_definition.rs @@ -80,21 +80,10 @@ fn footnote_definition_end<'r, 's>( context: Context<'r, 's>, input: OrgSource<'s>, ) -> Res, OrgSource<'s>> { - let allow_nesting_context = - context.with_additional_node(ContextElement::Context("allow nesting footnotes")); - let footnote_definition_matcher = parser_with_context!(footnote_definition)( - if immediate_in_section(context, "footnote definition") { - &allow_nesting_context - } else { - context - }, - ); - let maybe_consume_trailing_whitespace_matcher = - parser_with_context!(maybe_consume_trailing_whitespace)(context); let (remaining, source) = alt(( recognize(tuple(( - maybe_consume_trailing_whitespace_matcher, - footnote_definition_matcher, + parser_with_context!(maybe_consume_trailing_whitespace)(context), + detect_footnote_definition, ))), recognize(tuple(( start_of_line, @@ -107,6 +96,12 @@ fn footnote_definition_end<'r, 's>( Ok((remaining, source)) } +#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] +fn detect_footnote_definition<'s>(input: OrgSource<'s>) -> Res, ()> { + tuple((start_of_line, tag_no_case("[fn:"), label, tag("]")))(input)?; + Ok((input, ())) +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/parser/inline_babel_call.rs b/src/parser/inline_babel_call.rs index 99857574..6f3479e0 100644 --- a/src/parser/inline_babel_call.rs +++ b/src/parser/inline_babel_call.rs @@ -4,7 +4,6 @@ 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::combinator::opt; use nom::combinator::recognize; use nom::combinator::verify; diff --git a/src/parser/inline_source_block.rs b/src/parser/inline_source_block.rs index b642339d..e61bea0d 100644 --- a/src/parser/inline_source_block.rs +++ b/src/parser/inline_source_block.rs @@ -4,7 +4,6 @@ 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::combinator::opt; use nom::combinator::recognize; use nom::combinator::verify; diff --git a/src/parser/regular_link.rs b/src/parser/regular_link.rs index 4bc27958..9a36d09d 100644 --- a/src/parser/regular_link.rs +++ b/src/parser/regular_link.rs @@ -3,7 +3,6 @@ use nom::bytes::complete::escaped; use nom::bytes::complete::tag; use nom::bytes::complete::take_till1; use nom::character::complete::one_of; - use nom::combinator::verify; use nom::multi::many_till; diff --git a/src/parser/subscript_and_superscript.rs b/src/parser/subscript_and_superscript.rs index 4b3ac127..91d42741 100644 --- a/src/parser/subscript_and_superscript.rs +++ b/src/parser/subscript_and_superscript.rs @@ -2,7 +2,6 @@ use nom::branch::alt; use nom::bytes::complete::tag; use nom::character::complete::anychar; use nom::character::complete::one_of; - use nom::combinator::map; use nom::combinator::not; use nom::combinator::opt; diff --git a/src/parser/target.rs b/src/parser/target.rs index 5d199f6e..fd6b040c 100644 --- a/src/parser/target.rs +++ b/src/parser/target.rs @@ -1,7 +1,6 @@ use nom::bytes::complete::tag; use nom::character::complete::anychar; use nom::character::complete::one_of; - use nom::combinator::peek; use nom::combinator::recognize; use nom::combinator::verify;