Skip to content

А list followed by a header is parsed (or rendered?) the wrong way #283

@alx-ef

Description

@alx-ef

It expects an empty line between a header and a list when parsing.
This code is parsed well:

         # Header1
        * list item
        
        # Header2

this is wrong (header is interpreted as a list item):

         # Header1
        * list item        
        # Header2

But when rendering, the render doesn't put this blank line.

Thus, let say, you have AST like this:

Heading
  Text 'Header1'
List 'tight flags=start'
  ListItem 'flags=start end'
    Paragraph
      Text 'list item'
Heading
  Text 'Header2'

if you render it and parse the result, it will be different:

Heading
  Text 'Header1'
List 'flags=start'
  ListItem 'flags=has_block start'
    Paragraph
      Text 'list item'
    Heading
      Text 'Header2

Here is the test:

package md

import (
	"github.com/gomarkdown/markdown"
	"github.com/gomarkdown/markdown/md"
	"github.com/gomarkdown/markdown/parser"
	"github.com/stretchr/testify/require"
	"testing"
)

func Test_mdHeaderRendering(t *testing.T) {
	r := require.New(t)
	inMd := `# Header1
* list item

# Header2
`
	p := parser.NewWithExtensions(parser.CommonExtensions)
	doc1 := p.Parse([]byte(inMd))
	outMd := string(markdown.Render(doc1, md.NewRenderer()))

	t.Log("original MD:\n", inMd)
	t.Log("MD after serialization/deserialization:\n", outMd)

	p = parser.NewWithExtensions(parser.CommonExtensions)
	doc2 := p.Parse([]byte(outMd))
	r.Equal(len(doc1.GetChildren()), len(doc2.GetChildren()))

}

I don't know whether the renderer or the parser has a bug, but this behavior is inconsistent

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions