parser: fix end section eating block attributes
This commit is contained in:
		
					parent
					
						
							
								7b8157cb51
							
						
					
				
			
			
				commit
				
					
						b726580724
					
				
			
		
					 1 changed files with 28 additions and 5 deletions
				
			
		
							
								
								
									
										33
									
								
								src/lib.rs
									
										
									
									
									
								
							
							
						
						
									
										33
									
								
								src/lib.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -330,6 +330,8 @@ pub struct Parser<'s> {
 | 
			
		|||
    inlines: span::InlineSpans<'s>,
 | 
			
		||||
    /// Inline parser, recreated for each new inline.
 | 
			
		||||
    inline_parser: Option<inline::Parser<span::InlineCharsIter<'s>>>,
 | 
			
		||||
    /// Last parsed block attributes
 | 
			
		||||
    block_attributes: Attributes<'s>,
 | 
			
		||||
 | 
			
		||||
    /// Current table row is a head row.
 | 
			
		||||
    table_head_row: bool,
 | 
			
		||||
| 
						 | 
				
			
			@ -383,6 +385,7 @@ impl<'s> Parser<'s> {
 | 
			
		|||
            src,
 | 
			
		||||
            link_definitions,
 | 
			
		||||
            tree: branch,
 | 
			
		||||
            block_attributes: Attributes::new(),
 | 
			
		||||
            table_head_row: false,
 | 
			
		||||
            footnote_references: Vec::new(),
 | 
			
		||||
            footnotes: std::collections::HashMap::new(),
 | 
			
		||||
| 
						 | 
				
			
			@ -528,7 +531,6 @@ impl<'s> Parser<'s> {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    fn block(&mut self) -> Option<Event<'s>> {
 | 
			
		||||
        let mut attributes = Attributes::new();
 | 
			
		||||
        while let Some(ev) = &mut self.tree.next() {
 | 
			
		||||
            let content = ev.span.of(self.src);
 | 
			
		||||
            let event = match ev.kind {
 | 
			
		||||
| 
						 | 
				
			
			@ -536,7 +538,7 @@ impl<'s> Parser<'s> {
 | 
			
		|||
                    block::Atom::Blankline => Event::Atom(Atom::Blankline),
 | 
			
		||||
                    block::Atom::ThematicBreak => Event::Atom(Atom::ThematicBreak),
 | 
			
		||||
                    block::Atom::Attributes => {
 | 
			
		||||
                        attributes.parse(content);
 | 
			
		||||
                        self.block_attributes.parse(content);
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
| 
						 | 
				
			
			@ -549,7 +551,7 @@ impl<'s> Parser<'s> {
 | 
			
		|||
                                if enter {
 | 
			
		||||
                                    self.tree.take_inlines().last();
 | 
			
		||||
                                }
 | 
			
		||||
                                attributes = Attributes::new();
 | 
			
		||||
                                self.block_attributes = Attributes::new();
 | 
			
		||||
                                continue;
 | 
			
		||||
                            }
 | 
			
		||||
                            if enter {
 | 
			
		||||
| 
						 | 
				
			
			@ -587,7 +589,7 @@ impl<'s> Parser<'s> {
 | 
			
		|||
                            block::Container::Footnote => {
 | 
			
		||||
                                assert!(enter);
 | 
			
		||||
                                self.footnotes.insert(content, self.tree.take_branch());
 | 
			
		||||
                                attributes = Attributes::new();
 | 
			
		||||
                                self.block_attributes = Attributes::new();
 | 
			
		||||
                                continue;
 | 
			
		||||
                            }
 | 
			
		||||
                            block::Container::List { ty, tight } => {
 | 
			
		||||
| 
						 | 
				
			
			@ -633,7 +635,7 @@ impl<'s> Parser<'s> {
 | 
			
		|||
                        },
 | 
			
		||||
                    };
 | 
			
		||||
                    if enter {
 | 
			
		||||
                        Event::Start(cont, attributes)
 | 
			
		||||
                        Event::Start(cont, self.block_attributes.take())
 | 
			
		||||
                    } else {
 | 
			
		||||
                        Event::End(cont)
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -766,6 +768,27 @@ mod test {
 | 
			
		|||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn heading_attr() {
 | 
			
		||||
        test_parse!(
 | 
			
		||||
            concat!(
 | 
			
		||||
                "# abc\n",
 | 
			
		||||
                "{a=b}\n",
 | 
			
		||||
                "# def\n", //
 | 
			
		||||
            ),
 | 
			
		||||
            Start(Section, Attributes::new()),
 | 
			
		||||
            Start(Heading { level: 1 }, Attributes::new()),
 | 
			
		||||
            Str("abc".into()),
 | 
			
		||||
            End(Heading { level: 1 }),
 | 
			
		||||
            End(Section),
 | 
			
		||||
            Start(Section, [("a", "b")].into_iter().collect(),),
 | 
			
		||||
            Start(Heading { level: 1 }, Attributes::new(),),
 | 
			
		||||
            Str("def".into()),
 | 
			
		||||
            End(Heading { level: 1 }),
 | 
			
		||||
            End(Section),
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn blockquote() {
 | 
			
		||||
        test_parse!(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue