Support subscript/superscript wrapped in parenthesis.
This commit is contained in:
		
							parent
							
								
									9b2348c0ef
								
							
						
					
					
						commit
						4f34ab9089
					
				| @ -7,3 +7,7 @@ foo_(b{ar) | ||||
| foo_{b(ar} | ||||
| 
 | ||||
| foo_(b(a)r) | ||||
| 
 | ||||
| foo_b(a)r | ||||
| 
 | ||||
| foo_(b+ar) | ||||
|  | ||||
| @ -257,13 +257,6 @@ fn _path_plain_parenthesis_end<'s>( | ||||
|     starting_parenthesis_depth: BracketDepth, | ||||
| ) -> Res<OrgSource<'s>, OrgSource<'s>> { | ||||
|     let current_depth = input.get_parenthesis_depth() - starting_parenthesis_depth; | ||||
|     eprintln!( | ||||
|         "current_depth: {}, starting: {}, now: {}, remaining input: {}", | ||||
|         current_depth, | ||||
|         starting_parenthesis_depth, | ||||
|         input.get_parenthesis_depth(), | ||||
|         input | ||||
|     ); | ||||
|     if current_depth < 0 { | ||||
|         // This shouldn't be possible because if depth is 0 then a closing parenthesis should end the link.
 | ||||
|         unreachable!("Exceeded plain link parenthesis depth.") | ||||
|  | ||||
| @ -23,6 +23,7 @@ use crate::context::ContextElement; | ||||
| use crate::context::ContextMatcher; | ||||
| use crate::context::ExitClass; | ||||
| use crate::context::ExitMatcherNode; | ||||
| use crate::context::Matcher; | ||||
| use crate::context::RefContext; | ||||
| use crate::error::CustomError; | ||||
| use crate::error::MyError; | ||||
| @ -112,6 +113,10 @@ fn script_body<'b, 'g, 'r, 's>( | ||||
|         map(parser_with_context!(script_with_braces)(context), |body| { | ||||
|             ScriptBody::WithBraces(body.into()) | ||||
|         }), | ||||
|         map( | ||||
|             parser_with_context!(script_with_parenthesis)(context), | ||||
|             |body| ScriptBody::Braceless(body.into()), | ||||
|         ), | ||||
|     ))(input) | ||||
| } | ||||
| 
 | ||||
| @ -199,3 +204,49 @@ fn _script_with_braces_end<'b, 'g, 'r, 's>( | ||||
|     } | ||||
|     tag("}")(input) | ||||
| } | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| fn script_with_parenthesis<'b, 'g, 'r, 's>( | ||||
|     context: RefContext<'b, 'g, 'r, 's>, | ||||
|     input: OrgSource<'s>, | ||||
| ) -> Res<OrgSource<'s>, OrgSource<'s>> { | ||||
|     let (remaining, _) = tag("(")(input)?; | ||||
|     let exit_with_depth = script_with_parenthesis_end(remaining.get_parenthesis_depth()); | ||||
| 
 | ||||
|     let (remaining, _) = many_till( | ||||
|         anychar, | ||||
|         alt(( | ||||
|             peek(exit_with_depth), | ||||
|             parser_with_context!(exit_matcher_parser)(context), | ||||
|         )), | ||||
|     )(remaining)?; | ||||
| 
 | ||||
|     let (remaining, _) = tag(")")(remaining)?; | ||||
|     let source = get_consumed(input, remaining); | ||||
|     Ok((remaining, source)) | ||||
| } | ||||
| 
 | ||||
| fn script_with_parenthesis_end(starting_parenthesis_depth: BracketDepth) -> impl Matcher { | ||||
|     move |input: OrgSource<'_>| _script_with_parenthesis_end(input, starting_parenthesis_depth) | ||||
| } | ||||
| 
 | ||||
| #[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))] | ||||
| fn _script_with_parenthesis_end<'s>( | ||||
|     input: OrgSource<'s>, | ||||
|     starting_parenthesis_depth: BracketDepth, | ||||
| ) -> Res<OrgSource<'s>, OrgSource<'s>> { | ||||
|     let current_depth = input.get_parenthesis_depth() - starting_parenthesis_depth; | ||||
|     if current_depth < 0 { | ||||
|         // This shouldn't be possible because if depth is 0 then a closing bracket should end the citation.
 | ||||
|         unreachable!("Exceeded citation key suffix bracket depth.") | ||||
|     } | ||||
|     if current_depth == 0 { | ||||
|         let close_parenthesis = tag::<&str, OrgSource<'_>, CustomError<OrgSource<'_>>>(")")(input); | ||||
|         if close_parenthesis.is_ok() { | ||||
|             return close_parenthesis; | ||||
|         } | ||||
|     } | ||||
|     Err(nom::Err::Error(CustomError::MyError(MyError( | ||||
|         "No script parenthesis end.".into(), | ||||
|     )))) | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander