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