inline: trim verbatim whitespace
This commit is contained in:
		
					parent
					
						
							
								6e28b0e162
							
						
					
				
			
			
				commit
				
					
						b3896908a3
					
				
			
		
					 2 changed files with 46 additions and 0 deletions
				
			
		| 
						 | 
					@ -159,6 +159,9 @@ impl<I: Iterator<Item = char> + Clone> Parser<I> {
 | 
				
			||||||
            let mut span_inner = Span::empty_at(self.span.end());
 | 
					            let mut span_inner = Span::empty_at(self.span.end());
 | 
				
			||||||
            let mut span_outer = None;
 | 
					            let mut span_outer = None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let mut non_whitespace_first = None;
 | 
				
			||||||
 | 
					            let mut non_whitespace_last = None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            while let Some(t) = self.eat() {
 | 
					            while let Some(t) = self.eat() {
 | 
				
			||||||
                if matches!(t.kind, lex::Kind::Seq(lex::Sequence::Backtick)) && t.len == opener_len
 | 
					                if matches!(t.kind, lex::Kind::Seq(lex::Sequence::Backtick)) && t.len == opener_len
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
| 
						 | 
					@ -193,10 +196,23 @@ impl<I: Iterator<Item = char> + Clone> Parser<I> {
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                if !matches!(t.kind, lex::Kind::Whitespace) {
 | 
				
			||||||
 | 
					                    if non_whitespace_first.is_none() {
 | 
				
			||||||
 | 
					                        non_whitespace_first = Some((t.kind, span_inner.end()));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    non_whitespace_last = Some((t.kind, span_inner.end() + t.len));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                span_inner = span_inner.extend(t.len);
 | 
					                span_inner = span_inner.extend(t.len);
 | 
				
			||||||
                self.reset_span();
 | 
					                self.reset_span();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if let Some((lex::Kind::Seq(lex::Sequence::Backtick), pos)) = non_whitespace_first {
 | 
				
			||||||
 | 
					                span_inner = span_inner.with_start(pos);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if let Some((lex::Kind::Seq(lex::Sequence::Backtick), pos)) = non_whitespace_last {
 | 
				
			||||||
 | 
					                span_inner = span_inner.with_end(pos);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self.events.push_back(Event {
 | 
					            self.events.push_back(Event {
 | 
				
			||||||
                kind: EventKind::Str,
 | 
					                kind: EventKind::Str,
 | 
				
			||||||
                span: span_inner,
 | 
					                span: span_inner,
 | 
				
			||||||
| 
						 | 
					@ -572,6 +588,32 @@ mod test {
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[test]
 | 
				
			||||||
 | 
					    fn verbatim_whitespace() {
 | 
				
			||||||
 | 
					        test_parse!(
 | 
				
			||||||
 | 
					            "`  `",
 | 
				
			||||||
 | 
					            (Enter(Verbatim), "`"),
 | 
				
			||||||
 | 
					            (Str, "  "),
 | 
				
			||||||
 | 
					            (Exit(Verbatim), "`"),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        test_parse!(
 | 
				
			||||||
 | 
					            "` abc `",
 | 
				
			||||||
 | 
					            (Enter(Verbatim), "`"),
 | 
				
			||||||
 | 
					            (Str, " abc "),
 | 
				
			||||||
 | 
					            (Exit(Verbatim), "`"),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[test]
 | 
				
			||||||
 | 
					    fn verbatim_trim() {
 | 
				
			||||||
 | 
					        test_parse!(
 | 
				
			||||||
 | 
					            "` ``abc`` `",
 | 
				
			||||||
 | 
					            (Enter(Verbatim), "`"),
 | 
				
			||||||
 | 
					            (Str, "``abc``"),
 | 
				
			||||||
 | 
					            (Exit(Verbatim), "`"),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[test]
 | 
					    #[test]
 | 
				
			||||||
    fn math() {
 | 
					    fn math() {
 | 
				
			||||||
        test_parse!(
 | 
					        test_parse!(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,10 @@ impl Span {
 | 
				
			||||||
        Self::new(start, self.end())
 | 
					        Self::new(start, self.end())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn with_end(self, end: usize) -> Self {
 | 
				
			||||||
 | 
					        Self::new(self.start(), end)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn with_len(self, len: usize) -> Self {
 | 
					    pub fn with_len(self, len: usize) -> Self {
 | 
				
			||||||
        Self::by_len(self.start(), len)
 | 
					        Self::by_len(self.start(), len)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue