block: fix parsing end of list
following paragraphs were considered part of list
This commit is contained in:
		
					parent
					
						
							
								5672ef4198
							
						
					
				
			
			
				commit
				
					
						5d9f90342c
					
				
			
		
					 1 changed files with 54 additions and 19 deletions
				
			
		
							
								
								
									
										73
									
								
								src/block.rs
									
										
									
									
									
								
							
							
						
						
									
										73
									
								
								src/block.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -558,6 +558,7 @@ enum Kind {
 | 
			
		|||
    ListItem {
 | 
			
		||||
        indent: usize,
 | 
			
		||||
        ty: ListType,
 | 
			
		||||
        last_blankline: bool,
 | 
			
		||||
    },
 | 
			
		||||
    Table {
 | 
			
		||||
        caption: bool,
 | 
			
		||||
| 
						 | 
				
			
			@ -623,12 +624,20 @@ impl IdentifiedBlock {
 | 
			
		|||
                    && chars.next() == Some(']')
 | 
			
		||||
                    && chars.next().map_or(true, char::is_whitespace);
 | 
			
		||||
                if task_list {
 | 
			
		||||
                    (Kind::ListItem { indent, ty: Task }, Span::by_len(indent, 5))
 | 
			
		||||
                    (
 | 
			
		||||
                        Kind::ListItem {
 | 
			
		||||
                            indent,
 | 
			
		||||
                            ty: Task,
 | 
			
		||||
                            last_blankline: false,
 | 
			
		||||
                        },
 | 
			
		||||
                        Span::by_len(indent, 5),
 | 
			
		||||
                    )
 | 
			
		||||
                } else {
 | 
			
		||||
                    (
 | 
			
		||||
                        Kind::ListItem {
 | 
			
		||||
                            indent,
 | 
			
		||||
                            ty: Unordered(b as u8),
 | 
			
		||||
                            last_blankline: false,
 | 
			
		||||
                        },
 | 
			
		||||
                        Span::by_len(indent, 1),
 | 
			
		||||
                    )
 | 
			
		||||
| 
						 | 
				
			
			@ -638,6 +647,7 @@ impl IdentifiedBlock {
 | 
			
		|||
                Kind::ListItem {
 | 
			
		||||
                    indent,
 | 
			
		||||
                    ty: Description,
 | 
			
		||||
                    last_blankline: false,
 | 
			
		||||
                },
 | 
			
		||||
                Span::by_len(indent, 1),
 | 
			
		||||
            )),
 | 
			
		||||
| 
						 | 
				
			
			@ -668,6 +678,7 @@ impl IdentifiedBlock {
 | 
			
		|||
                    Kind::ListItem {
 | 
			
		||||
                        indent,
 | 
			
		||||
                        ty: Ordered(num, style),
 | 
			
		||||
                        last_blankline: false,
 | 
			
		||||
                    },
 | 
			
		||||
                    Span::by_len(indent, len),
 | 
			
		||||
                )
 | 
			
		||||
| 
						 | 
				
			
			@ -788,11 +799,18 @@ impl Kind {
 | 
			
		|||
            Self::Paragraph | Self::Table { caption: true } => {
 | 
			
		||||
                !matches!(next, Self::Atom(Blankline))
 | 
			
		||||
            }
 | 
			
		||||
            Self::ListItem { indent, .. } => {
 | 
			
		||||
            Self::ListItem {
 | 
			
		||||
                indent,
 | 
			
		||||
                last_blankline,
 | 
			
		||||
                ..
 | 
			
		||||
            } => {
 | 
			
		||||
                let spaces = line.chars().take_while(|c| c.is_whitespace()).count();
 | 
			
		||||
                matches!(next, Self::Atom(Blankline))
 | 
			
		||||
                    || spaces > *indent
 | 
			
		||||
                    || matches!(next, Self::Paragraph)
 | 
			
		||||
                if matches!(next, Self::Atom(Blankline)) {
 | 
			
		||||
                    *last_blankline = true;
 | 
			
		||||
                    true
 | 
			
		||||
                } else {
 | 
			
		||||
                    spaces > *indent || (!*last_blankline && matches!(next, Self::Paragraph))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            Self::Definition { indent, footnote } => {
 | 
			
		||||
                if *footnote {
 | 
			
		||||
| 
						 | 
				
			
			@ -1541,6 +1559,7 @@ mod test {
 | 
			
		|||
                "- a\n",   //
 | 
			
		||||
                "\n",      //
 | 
			
		||||
                "  * b\n", //
 | 
			
		||||
                "\n",      //
 | 
			
		||||
                "cd\n",    //
 | 
			
		||||
            ),
 | 
			
		||||
            (
 | 
			
		||||
| 
						 | 
				
			
			@ -1564,9 +1583,9 @@ mod test {
 | 
			
		|||
            ),
 | 
			
		||||
            (Enter(Container(ListItem(Unordered(42)))), "*"),
 | 
			
		||||
            (Enter(Leaf(Paragraph)), ""),
 | 
			
		||||
            (Inline, "b\n"),
 | 
			
		||||
            (Inline, "cd"),
 | 
			
		||||
            (Inline, "b"),
 | 
			
		||||
            (Exit(Leaf(Paragraph)), ""),
 | 
			
		||||
            (Atom(Blankline), "\n"),
 | 
			
		||||
            (Exit(Container(ListItem(Unordered(42)))), "*"),
 | 
			
		||||
            (
 | 
			
		||||
                Exit(Container(List {
 | 
			
		||||
| 
						 | 
				
			
			@ -1583,8 +1602,12 @@ mod test {
 | 
			
		|||
                })),
 | 
			
		||||
                "-"
 | 
			
		||||
            ),
 | 
			
		||||
            (Enter(Leaf(Paragraph)), ""),
 | 
			
		||||
            (Inline, "cd"),
 | 
			
		||||
            (Exit(Leaf(Paragraph)), ""),
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn parse_list_mixed() {
 | 
			
		||||
        test_parse!(
 | 
			
		||||
| 
						 | 
				
			
			@ -2038,7 +2061,8 @@ mod test {
 | 
			
		|||
            "- abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Unordered(b'-')
 | 
			
		||||
                ty: Unordered(b'-'),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "-",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2047,7 +2071,8 @@ mod test {
 | 
			
		|||
            "+ abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Unordered(b'+')
 | 
			
		||||
                ty: Unordered(b'+'),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "+",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2056,7 +2081,8 @@ mod test {
 | 
			
		|||
            "* abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Unordered(b'*')
 | 
			
		||||
                ty: Unordered(b'*'),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "*",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2069,7 +2095,8 @@ mod test {
 | 
			
		|||
            "- [ ] abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Task
 | 
			
		||||
                ty: Task,
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "- [ ]",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2078,7 +2105,8 @@ mod test {
 | 
			
		|||
            "+ [x] abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Task
 | 
			
		||||
                ty: Task,
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "+ [x]",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2087,7 +2115,8 @@ mod test {
 | 
			
		|||
            "* [X] abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Task
 | 
			
		||||
                ty: Task,
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "* [X]",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2100,7 +2129,8 @@ mod test {
 | 
			
		|||
            "123. abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Ordered(Decimal, Period)
 | 
			
		||||
                ty: Ordered(Decimal, Period),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "123.",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2109,7 +2139,8 @@ mod test {
 | 
			
		|||
            "i. abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Ordered(RomanLower, Period)
 | 
			
		||||
                ty: Ordered(RomanLower, Period),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "i.",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2118,7 +2149,8 @@ mod test {
 | 
			
		|||
            "I. abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Ordered(RomanUpper, Period)
 | 
			
		||||
                ty: Ordered(RomanUpper, Period),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "I.",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2127,7 +2159,8 @@ mod test {
 | 
			
		|||
            "IJ. abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Ordered(AlphaUpper, Period)
 | 
			
		||||
                ty: Ordered(AlphaUpper, Period),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "IJ.",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2136,7 +2169,8 @@ mod test {
 | 
			
		|||
            "(a) abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Ordered(AlphaLower, ParenParen)
 | 
			
		||||
                ty: Ordered(AlphaLower, ParenParen),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "(a)",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			@ -2145,7 +2179,8 @@ mod test {
 | 
			
		|||
            "a) abc\n",
 | 
			
		||||
            Kind::ListItem {
 | 
			
		||||
                indent: 0,
 | 
			
		||||
                ty: Ordered(AlphaLower, Paren)
 | 
			
		||||
                ty: Ordered(AlphaLower, Paren),
 | 
			
		||||
                last_blankline: false,
 | 
			
		||||
            },
 | 
			
		||||
            "a)",
 | 
			
		||||
            1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue