diff --git a/src/parser/text_element_parser.rs b/src/parser/text_element_parser.rs index ffb37b5..cc02ca3 100644 --- a/src/parser/text_element_parser.rs +++ b/src/parser/text_element_parser.rs @@ -39,12 +39,12 @@ use nom::Parser; use tracing::instrument; use tracing::trace; -type UnboundMatcher<'r, I, O, E> = dyn for<'s> Fn(Context<'r>, I) -> IResult; +type UnboundMatcher<'r, I, O, E> = dyn Fn(Context<'r>, I) -> IResult; fn context_many_till<'r, I, O, E, F>( context: Context<'r>, - mut many_matcher: UnboundMatcher<'r, I, O, E>, - mut till_matcher: UnboundMatcher<'r, I, F, E>, + mut many_matcher: &UnboundMatcher<'r, I, O, E>, + mut till_matcher: &UnboundMatcher<'r, I, F, E>, ) -> impl FnMut(I) -> IResult, F), E> where I: Clone + InputLength, @@ -54,10 +54,12 @@ where let mut ret = Vec::new(); loop { let len = i.input_len(); - match till_matcher.parse(i.clone()) { + let till_parser = parser_with_context!(till_matcher); + match till_parser(context.clone())(i.clone()) { Ok((remaining, finish)) => return Ok((remaining, (ret, finish))), Err(nom::Err::Error(_)) => { - match many_matcher.parse(i.clone()) { + let many_parser = parser_with_context!(many_matcher); + match many_parser(context.clone())(i.clone()) { Err(nom::Err::Error(err)) => { return Err(nom::Err::Error(E::append(i, ErrorKind::ManyTill, err))) } @@ -77,7 +79,7 @@ where } } Err(e) => return Err(e), - } + }; } } } @@ -89,6 +91,10 @@ pub fn document(input: &str) -> Res<&str, Vec<(Vec, &str)>> { ret } +pub fn context_paragraph_end<'s, 'r>(context: Context<'r>, input: &str) -> Res<&str, &str> { + paragraph_end(input) +} + pub fn paragraph<'s, 'r>( context: Context<'r>, i: &'s str, @@ -100,8 +106,11 @@ pub fn paragraph<'s, 'r>( fail_matcher: ChainBehavior::AndParent(Some(¶graph_end)), })); let ret = { - let text_element_parser = parser_with_context!(flat_text_element)(paragraph_context); - context_many_till(¶graph_context, text_element_parser, paragraph_end)(i) + context_many_till( + ¶graph_context, + &flat_text_element, + &context_paragraph_end, + )(i) }; ret }