diff --git a/src/parser/nom_context.rs b/src/parser/nom_context.rs index 54e0d40..3ac7105 100644 --- a/src/parser/nom_context.rs +++ b/src/parser/nom_context.rs @@ -7,147 +7,29 @@ use nom::error::VerboseError; use nom::IResult; use nom::Parser; -type ContextReference = Option>>; +type ContextReference<'r, T> = Option<&'r ContextLayer<'r, T>>; +type MatcherRef = dyn for<'s> FnMut(&'s str) -> IResult<&'s str, &'s str, VerboseError<&'s str>>; -pub struct ContextLayer { +pub struct ContextLayer<'r, T> { data: T, - parent: ContextReference, + parent: ContextReference<'r, T>, } -impl ContextLayer { - pub fn with_new_layer(self: Rc, new_layer: T) -> ContextLayer { - ContextLayer { - data: new_layer, - parent: Some(self), - } - } +pub struct TestContext<'r, T> { + head: ContextReference<'r, T>, } -pub struct TestContext { - head: ContextReference, -} - -// type ContextReference = Option>>; - -// struct ContextLayer { -// data: T, -// parent: ContextReference, -// } - pub struct ContextData<'r> { fail_matcher: ChainBehavior<'r>, } -impl<'r> TestContext> { +impl<'r> TestContext<'r, ContextData<'r>> { pub fn new() -> Self { TestContext { head: None } } - - pub fn with_additional_fail_matcher( - &self, - new_matcher: MatcherRef<'r>, - ) -> TestContext> { - TestContext { - head: Some(Rc::new(ContextLayer { - data: ContextData { - fail_matcher: ChainBehavior::AndParent(Some(new_matcher)), - }, - parent: self.head.clone(), - })), - } - } } -///// -///// OLD -///// - -type MatcherRef<'r> = Rc< - RefCell FnMut(&'s str) -> IResult<&'s str, &'s str, VerboseError<&'s str>> + 'r>, ->; - -// struct FailChecker<'r>(&'r NomContext<'r>); - -// impl<'r> FailChecker<'r> { -// fn new(func: &'r NomContext<'r>) -> Self { -// Self(func) -// } -// } - enum ChainBehavior<'r> { - AndParent(Option>), - IgnoreParent(Option>), + AndParent(Option<&'r MatcherRef>), + IgnoreParent(Option<&'r MatcherRef>), } - -// pub struct NomContext<'r> { -// parent: Option<&'r Self>, -// fail_matcher: ChainBehavior<'r>, -// /// You can't have nested bolds or links in org-mode -// match_bold_allowed: bool, -// match_link_allowed: bool, -// } - -// impl<'r> NomContext<'r> { -// pub fn new(fail_matcher: MatcherRef) -> Self { -// NomContext { -// parent: None, -// fail_matcher: ChainBehavior::IgnoreParent(Some(fail_matcher)), -// match_bold_allowed: true, -// match_link_allowed: true, -// } -// } - -// pub fn with_additional_fail_matcher(&self, other: MatcherRef) -> NomContext { -// NomContext { -// parent: Some(&self), -// fail_matcher: ChainBehavior::AndParent(Some(other)), -// match_bold_allowed: self.match_bold_allowed, -// match_link_allowed: self.match_link_allowed, -// } -// } - -// pub fn without_bold(&self, other: MatcherRef) -> NomContext { -// NomContext { -// parent: Some(&self), -// fail_matcher: ChainBehavior::AndParent(Some(other)), -// match_bold_allowed: false, -// match_link_allowed: self.match_link_allowed, -// } -// } - -// pub fn not_matching_fail<'s>(&self, i: &'s str) -> IResult<&'s str, (), VerboseError<&'s str>> { -// not(FailChecker::new(self))(i) -// } - -// pub fn can_match_bold(&self) -> bool { -// self.match_bold_allowed -// } - -// pub fn can_match_link(&self) -> bool { -// self.match_link_allowed -// } -// } - -// impl<'r, 's> Parser<&'s str, &'s str, VerboseError<&'s str>> for FailChecker<'r> { -// fn parse(&mut self, i: &'s str) -> IResult<&'s str, &'s str, VerboseError<&'s str>> { -// let fail_func = match &self.0.fail_matcher { -// ChainBehavior::AndParent(inner) => inner, -// ChainBehavior::IgnoreParent(inner) => inner, -// }; -// if let Some(inner) = fail_func { -// let parsed = (&mut *inner.borrow_mut())(i); -// if parsed.is_ok() { -// return parsed; -// } -// } -// match (self.0.parent, &self.0.fail_matcher) { -// (None, _) | (_, ChainBehavior::IgnoreParent(_)) => Err(nom::Err::Error( -// nom::error::make_error(i, nom::error::ErrorKind::Alt), -// )), -// (Some(parent), ChainBehavior::AndParent(_)) => { -// let mut parent_fail_checker = FailChecker::new(parent); -// parent_fail_checker.parse(i) -// } -// } -// } -// } diff --git a/src/parser/text.rs b/src/parser/text.rs index 6a5d9e7..9513d43 100644 --- a/src/parser/text.rs +++ b/src/parser/text.rs @@ -138,8 +138,9 @@ pub fn paragraph_end(input: &str) -> Res<&str, &str> { pub fn document(input: &str) -> Res<&str, Vec<(Vec, &str)>> { let initial_context = TestContext::new(); - let paragraph_context = - initial_context.with_additional_fail_matcher(Rc::new(RefCell::new(paragraph_end))); + let paragraph_context = initial_context; + // let paragraph_context = + // initial_context.with_additional_fail_matcher(Rc::new(RefCell::new(paragraph_end))); // let initial_context = NomContext::new(Rc::new(RefCell::new(paragraph_end))); let ret = many1(parser_with_context!(paragraph)(¶graph_context))(input); ret diff --git a/src/parser/text_element_parser.rs b/src/parser/text_element_parser.rs index 2a49c71..9d6d490 100644 --- a/src/parser/text_element_parser.rs +++ b/src/parser/text_element_parser.rs @@ -47,8 +47,8 @@ fn flat_bold<'s, 'r>( ) -> Res<&'s str, TextElement<'s>> { // let fail_matcher = recognize(bold_end); // let new_context = context.with_additional_fail_matcher(Rc::new(RefCell::new(paragraph_end))); - let new_context = - context.with_additional_fail_matcher(Rc::new(RefCell::new(recognize(bold_end)))); + // let new_context = + // context.with_additional_fail_matcher(Rc::new(RefCell::new(recognize(bold_end)))); // let new_context = context.without_bold(Rc::new(RefCell::new(recognize(bold_end)))); todo!() }