From d9f0eda5b736c1cf5e05e0879b32508c54478042 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 26 Nov 2022 19:54:46 -0500 Subject: [PATCH] many_till ignoring context. --- src/parser/text_element_parser.rs | 32 ++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/parser/text_element_parser.rs b/src/parser/text_element_parser.rs index 37902321..0a2d7ef9 100644 --- a/src/parser/text_element_parser.rs +++ b/src/parser/text_element_parser.rs @@ -49,8 +49,34 @@ where E: ParseError, { move |mut i: I| { - // todo - todo!() + let mut ret = Vec::new(); + loop { + let len = i.input_len(); + match till_matcher.parse(i.clone()) { + Ok((remaining, finish)) => return Ok((remaining, (ret, finish))), + Err(nom::Err::Error(_)) => { + match many_matcher.parse(i.clone()) { + Err(nom::Err::Error(err)) => { + return Err(nom::Err::Error(E::append(i, ErrorKind::ManyTill, err))) + } + Err(e) => return Err(e), + Ok((remaining, many_elem)) => { + // infinite loop check: the parser must always consume + if remaining.input_len() == len { + return Err(nom::Err::Error(E::from_error_kind( + remaining, + ErrorKind::ManyTill, + ))); + } + + ret.push(many_elem); + i = remaining; + } + } + } + Err(e) => return Err(e), + } + } } } @@ -70,7 +96,7 @@ pub fn paragraph<'s, 'r>( let paragraph_context = context.with_additional_fail_matcher(¶graph_end); let text_element_parser = parser_with_context!(flat_text_element)(¶graph_context); let ret = context_many_till(¶graph_context, text_element_parser, paragraph_end)(i); - let ret = many_till(text_element_parser, paragraph_end)(i); + // let ret = many_till(text_element_parser, paragraph_end)(i); ret }