add inline State
This commit is contained in:
		
					parent
					
						
							
								3c5093f4db
							
						
					
				
			
			
				commit
				
					
						7c53d1a093
					
				
			
		
					 2 changed files with 60 additions and 16 deletions
				
			
		|  | @ -21,7 +21,6 @@ pub enum Atom { | ||||||
| #[derive(Debug, Copy, Clone, PartialEq, Eq)] | #[derive(Debug, Copy, Clone, PartialEq, Eq)] | ||||||
| pub enum Container { | pub enum Container { | ||||||
|     Span, |     Span, | ||||||
|     Attributes, |  | ||||||
|     // typesetting
 |     // typesetting
 | ||||||
|     Subscript, |     Subscript, | ||||||
|     Superscript, |     Superscript, | ||||||
|  | @ -38,6 +37,10 @@ pub enum Container { | ||||||
|     RawFormat, |     RawFormat, | ||||||
|     InlineMath, |     InlineMath, | ||||||
|     DisplayMath, |     DisplayMath, | ||||||
|  |     // Links
 | ||||||
|  |     ReferenceLink, | ||||||
|  |     InlineLink, | ||||||
|  |     AutoLink, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, PartialEq, Eq)] | #[derive(Debug, PartialEq, Eq)] | ||||||
|  | @ -46,6 +49,7 @@ pub enum EventKind { | ||||||
|     Exit(Container), |     Exit(Container), | ||||||
|     Atom(Atom), |     Atom(Atom), | ||||||
|     Str, |     Str, | ||||||
|  |     Attributes, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, PartialEq, Eq)] | #[derive(Debug, PartialEq, Eq)] | ||||||
|  | @ -54,11 +58,36 @@ pub struct Event { | ||||||
|     pub span: Span, |     pub span: Span, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, Copy)] | /// Current parsing state of elements that are not recursive, i.e. may not contain arbitrary inline
 | ||||||
| pub enum Dir { | /// elements, can only be one of these at a time.
 | ||||||
|     Open, | enum State { | ||||||
|     Close, |     None, | ||||||
|     Both, |     /// Within a verbatim element, e.g. '$`xxxxx'
 | ||||||
|  |     Verbatim { | ||||||
|  |         kind: Container, | ||||||
|  |         opener_len: usize, | ||||||
|  |     }, | ||||||
|  |     /// Potentially within an attribute list, e.g. '{a=b '.
 | ||||||
|  |     Attributes { | ||||||
|  |         comment: bool, | ||||||
|  |     }, | ||||||
|  |     /// Potentially within an autolink URL or an inline link URL, e.g. '<https://' or
 | ||||||
|  |     /// '[text](https://'.
 | ||||||
|  |     Url { | ||||||
|  |         auto: bool, | ||||||
|  |     }, | ||||||
|  |     /// Potentially within a reference link tag, e.g. '[text][tag '
 | ||||||
|  |     ReferenceLinkTag, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl State { | ||||||
|  |     fn verbatim(&self) -> Option<(Container, usize)> { | ||||||
|  |         if let Self::Verbatim { kind, opener_len } = self { | ||||||
|  |             Some((*kind, *opener_len)) | ||||||
|  |         } else { | ||||||
|  |             None | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct Parser<'s> { | pub struct Parser<'s> { | ||||||
|  | @ -68,7 +97,7 @@ pub struct Parser<'s> { | ||||||
| 
 | 
 | ||||||
|     lexer: lex::Lexer<'s>, |     lexer: lex::Lexer<'s>, | ||||||
| 
 | 
 | ||||||
|     verbatim: Option<(Container, usize)>, |     state: State, | ||||||
|     last: bool, |     last: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -81,7 +110,7 @@ impl<'s> Parser<'s> { | ||||||
| 
 | 
 | ||||||
|             lexer: lex::Lexer::new(""), |             lexer: lex::Lexer::new(""), | ||||||
| 
 | 
 | ||||||
|             verbatim: None, |             state: State::None, | ||||||
|             last: false, |             last: false, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -142,13 +171,18 @@ impl<'s> Parser<'s> { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn parse_verbatim(&mut self, first: &lex::Token) -> Option<Event> { |     fn parse_verbatim(&mut self, first: &lex::Token) -> Option<Event> { | ||||||
|         self.verbatim |         self.state | ||||||
|  |             .verbatim() | ||||||
|             .map(|(kind, opener_len)| { |             .map(|(kind, opener_len)| { | ||||||
|                 let kind = if matches!(first.kind, lex::Kind::Seq(lex::Sequence::Backtick)) |                 let kind = if matches!(first.kind, lex::Kind::Seq(lex::Sequence::Backtick)) | ||||||
|                     && first.len == opener_len |                     && first.len == opener_len | ||||||
|                 { |                 { | ||||||
|                     self.verbatim = None; |                     self.state = State::None; | ||||||
|  |                     if matches!(kind, Container::Span) { | ||||||
|  |                         todo!() | ||||||
|  |                     } else { | ||||||
|                         EventKind::Exit(kind) |                         EventKind::Exit(kind) | ||||||
|  |                     } | ||||||
|                 } else { |                 } else { | ||||||
|                     EventKind::Str |                     EventKind::Str | ||||||
|                 }; |                 }; | ||||||
|  | @ -191,7 +225,7 @@ impl<'s> Parser<'s> { | ||||||
|                     _ => None, |                     _ => None, | ||||||
|                 } |                 } | ||||||
|                 .map(|(kind, opener_len)| { |                 .map(|(kind, opener_len)| { | ||||||
|                     self.verbatim = Some((kind, opener_len)); |                     self.state = State::Verbatim { kind, opener_len }; | ||||||
|                     Event { |                     Event { | ||||||
|                         kind: EventKind::Enter(kind), |                         kind: EventKind::Enter(kind), | ||||||
|                         span: self.span, |                         span: self.span, | ||||||
|  | @ -201,6 +235,12 @@ impl<'s> Parser<'s> { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn parse_container(&mut self, first: &lex::Token) -> Option<Event> { |     fn parse_container(&mut self, first: &lex::Token) -> Option<Event> { | ||||||
|  |         enum Dir { | ||||||
|  |             Open, | ||||||
|  |             Close, | ||||||
|  |             Both, | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         match first.kind { |         match first.kind { | ||||||
|             lex::Kind::Sym(Symbol::Asterisk) => Some((Strong, Dir::Both)), |             lex::Kind::Sym(Symbol::Asterisk) => Some((Strong, Dir::Both)), | ||||||
|             lex::Kind::Sym(Symbol::Underscore) => Some((Emphasis, Dir::Both)), |             lex::Kind::Sym(Symbol::Underscore) => Some((Emphasis, Dir::Both)), | ||||||
|  | @ -294,9 +334,12 @@ impl<'s> Iterator for Parser<'s> { | ||||||
|             }) |             }) | ||||||
|             .or_else(|| { |             .or_else(|| { | ||||||
|                 if self.last { |                 if self.last { | ||||||
|                     self.verbatim.take().map(|(kind, _)| Event { |                     self.state.verbatim().map(|(kind, _)| { | ||||||
|  |                         self.state = State::None; | ||||||
|  |                         Event { | ||||||
|                             kind: EventKind::Exit(kind), |                             kind: EventKind::Exit(kind), | ||||||
|                             span: self.span, |                             span: self.span, | ||||||
|  |                         } | ||||||
|                     }) |                     }) | ||||||
|                 } else { |                 } else { | ||||||
|                     None |                     None | ||||||
|  |  | ||||||
|  | @ -166,7 +166,7 @@ impl<'s> Container<'s> { | ||||||
| pub enum LinkType { | pub enum LinkType { | ||||||
|     Inline, |     Inline, | ||||||
|     Reference, |     Reference, | ||||||
|     Autolink, |     AutoLink, | ||||||
|     Email, |     Email, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -262,6 +262,7 @@ impl<'s> Event<'s> { | ||||||
|                 inline::Atom::Escape => Atom::Escape, |                 inline::Atom::Escape => Atom::Escape, | ||||||
|             }), |             }), | ||||||
|             inline::EventKind::Str => Self::Str(content), |             inline::EventKind::Str => Self::Str(content), | ||||||
|  |             inline::EventKind::Attributes => todo!(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue