diff --git a/src/parser/text.rs b/src/parser/text.rs index 8067f1a3..0b7a9580 100644 --- a/src/parser/text.rs +++ b/src/parser/text.rs @@ -29,9 +29,6 @@ use nom::sequence::tuple; use nom::IResult; use tracing::instrument; -use super::nom_context::ContextTree; -use super::nom_context::OrgModeContextTree; -use super::parser_with_context::parser_with_context; use super::text_element_parser::paragraph; pub type Res = IResult>; diff --git a/src/parser/text_element_parser.rs b/src/parser/text_element_parser.rs index 0a2d7ef9..f261436e 100644 --- a/src/parser/text_element_parser.rs +++ b/src/parser/text_element_parser.rs @@ -5,9 +5,9 @@ use std::rc::Rc; use crate::parser::parser_with_context::parser_with_context; use crate::parser::text::paragraph_end; -use super::nom_context::ContextTree; -use super::nom_context::OrgModeContextNode; -use super::nom_context::OrgModeContextTree; +use super::new_context::ContextElement; +use super::new_context::ContextTree; +use super::new_context::FailMatcherNode; use super::text::bold_end; use super::text::bold_start; use super::text::line_break; @@ -37,12 +37,13 @@ use nom::Parser; use tracing::instrument; use tracing::trace; -fn context_many_till<'r, I, O, E, F, M, T>( - context: &'r OrgModeContextNode<'r>, +fn context_many_till<'r, C, I, O, E, F, M, T>( + context: &'r ContextTree<'r, C>, mut many_matcher: M, mut till_matcher: T, ) -> impl FnMut(I) -> IResult, F), E> where + C: ContextElement, I: Clone + InputLength, M: Parser, T: Parser, @@ -81,16 +82,19 @@ where } pub fn document(input: &str) -> Res<&str, Vec<(Vec, &str)>> { - let initial_context = ContextTree::new(); + let initial_context: ContextTree<'_, FailMatcherNode> = ContextTree::new(); let paragraph_parser = parser_with_context!(paragraph); let ret = many1(paragraph_parser(&initial_context))(input); ret } -pub fn paragraph<'s, 'r>( - context: &'r OrgModeContextNode<'r>, +pub fn paragraph<'s, 'r, C>( + context: &'r ContextTree<'r, C>, i: &'s str, -) -> Res<&'s str, (Vec>, &'s str)> { +) -> Res<&'s str, (Vec>, &'s str)> +where + C: ContextElement, +{ // Add a not(eof) check because many_till cannot match a zero-length string not(eof)(i)?; let paragraph_context = context.with_additional_fail_matcher(¶graph_end); @@ -100,11 +104,14 @@ pub fn paragraph<'s, 'r>( ret } -fn flat_text_element<'s, 'r>( - context: &'r OrgModeContextNode<'r>, +fn flat_text_element<'s, 'r, C>( + context: &'r ContextTree<'r, C>, i: &'s str, -) -> Res<&'s str, TextElement<'s>> { - not(|i| context.match_fail(i))(i)?; +) -> Res<&'s str, TextElement<'s>> +where + C: ContextElement, +{ + not(|i| context.check_fail_matcher(i))(i)?; let bold_matcher = parser_with_context!(flat_bold)(context); let link_matcher = parser_with_context!(flat_link)(context); @@ -125,7 +132,10 @@ fn recognize_bold_end(input: &str) -> Res<&str, &str> { recognize(bold_end)(input) } -fn flat_bold<'s, 'r>(context: &'r OrgModeContextNode<'r>, i: &'s str) -> Res<&'s str, Bold<'s>> { +fn flat_bold<'s, 'r, C>(context: &'r ContextTree<'r, C>, i: &'s str) -> Res<&'s str, Bold<'s>> +where + C: ContextElement, +{ let new_context = context.with_additional_fail_matcher(&recognize_bold_end); let text_element_parser = parser_with_context!(flat_text_element)(&new_context); let (remaining, captured) = recognize(tuple(( @@ -140,7 +150,10 @@ fn recognize_link_end(input: &str) -> Res<&str, &str> { recognize(link_end)(input) } -fn flat_link<'s, 'r>(context: &'r OrgModeContextNode<'r>, i: &'s str) -> Res<&'s str, Link<'s>> { +fn flat_link<'s, 'r, C>(context: &'r ContextTree<'r, C>, i: &'s str) -> Res<&'s str, Link<'s>> +where + C: ContextElement, +{ let new_context = context.with_additional_fail_matcher(&recognize_link_end); let text_element_parser = parser_with_context!(flat_text_element)(&new_context); let (remaining, captured) = recognize(tuple((