diff --git a/md/md_renderer.go b/md/md_renderer.go index 83c12bae..ebbea004 100644 --- a/md/md_renderer.go +++ b/md/md_renderer.go @@ -58,6 +58,7 @@ func (r *Renderer) list(w io.Writer, node *ast.List, entering bool) { } } else { r.listDepth-- + fmt.Fprintf(w, "\n") } } @@ -82,7 +83,14 @@ func (r *Renderer) listItem(w io.Writer, node *ast.ListItem, entering bool) { func (r *Renderer) para(w io.Writer, node *ast.Paragraph, entering bool) { if !entering && r.lastOutputLen > 0 { - r.outs(w, "\n") + var br = "\n\n" + + // List items don't need the extra line-break. + if _, ok := node.Parent.(*ast.ListItem); ok { + br = "\n" + } + + r.outs(w, br) } } @@ -224,7 +232,7 @@ func (r *Renderer) codeBlock(w io.Writer, node *ast.CodeBlock) { } r.outs(w, "\n") r.out(w, text) - r.outs(w, "\n```\n") + r.outs(w, "```\n\n") } func (r *Renderer) code(w io.Writer, node *ast.Code) { @@ -241,7 +249,7 @@ func (r *Renderer) heading(w io.Writer, node *ast.Heading, entering bool) { r.outs(w, " ") r.out(w, node.Literal) } else { - r.outs(w, "\n") + r.outs(w, "\n\n") } } diff --git a/md/md_renderer_test.go b/md/md_renderer_test.go index 4b5768b5..8aa5614f 100644 --- a/md/md_renderer_test.go +++ b/md/md_renderer_test.go @@ -11,7 +11,7 @@ import ( func TestRenderDocument(t *testing.T) { var source = []byte("# title\n* aaa\n* bbb\n* ccc") var input = markdown.Parse(source, nil) - var expected = "# title\n* aaa\n* bbb\n* ccc\n" + var expected = "# title\n\n* aaa\n* bbb\n* ccc\n\n" testRendering(t, input, expected) } @@ -31,7 +31,7 @@ func TestRenderStrong(t *testing.T) { func TestRenderHeading(t *testing.T) { var input ast.Node = &ast.Heading{Level: 3} ast.AppendChild(input, &ast.Text{Leaf: ast.Leaf{Literal: []byte(string("Hello"))}}) - expected := "### Hello\n" + expected := "### Hello\n\n" testRendering(t, input, expected) } @@ -80,7 +80,23 @@ func TestRenderCodeBlock(t *testing.T) { func TestRenderParagraph(t *testing.T) { var input = &ast.Paragraph{} ast.AppendChild(input, &ast.Text{Leaf: ast.Leaf{Literal: []byte(string("Hello World !"))}}) - expected := "Hello World !\n" + expected := "Hello World !\n\n" + testRendering(t, input, expected) +} + +func TestRenderDoubleParagraph(t *testing.T) { + input := markdown.Parse([]byte("Paragraph 1\n\nParagraph 2"), nil) + + expected := "Paragraph 1\n\nParagraph 2\n\n" + + testRendering(t, input, expected) +} + +func TestRenderCodeWithParagraph(t *testing.T) { + input := markdown.Parse([]byte("```\nnpm run build\nnpm run test:e2e:dev\n```"), nil) + + expected := "\n```\nnpm run build\nnpm run test:e2e:dev\n```\n\n" + testRendering(t, input, expected) } @@ -101,37 +117,37 @@ func TestRenderHTMLBlock(t *testing.T) { func TestRenderList(t *testing.T) { var source = []byte("* aaa\n* bbb\n* ccc\n* ddd\n") var input = markdown.Parse(source, nil) - var expected = "* aaa\n* bbb\n* ccc\n* ddd\n" + var expected = "* aaa\n* bbb\n* ccc\n* ddd\n\n" testRendering(t, input, expected) source = []byte("+ aaa\n+ bbb\n+ ccc\n+ ddd\n") input = markdown.Parse(source, nil) - expected = "+ aaa\n+ bbb\n+ ccc\n+ ddd\n" + expected = "+ aaa\n+ bbb\n+ ccc\n+ ddd\n\n" testRendering(t, input, expected) source = []byte("- aaa\n- bbb\n- ccc\n- ddd\n") input = markdown.Parse(source, nil) - expected = "- aaa\n- bbb\n- ccc\n- ddd\n" + expected = "- aaa\n- bbb\n- ccc\n- ddd\n\n" testRendering(t, input, expected) source = []byte("1. aaa\n2. bbb\n3. ccc\n4. ddd\n") input = markdown.Parse(source, nil) - expected = "1. aaa\n2. bbb\n3. ccc\n4. ddd\n" + expected = "1. aaa\n2. bbb\n3. ccc\n4. ddd\n\n" testRendering(t, input, expected) source = []byte("1. aaa\n1. bbb\n1. ccc\n1. ddd\n") input = markdown.Parse(source, nil) - expected = "1. aaa\n2. bbb\n3. ccc\n4. ddd\n" + expected = "1. aaa\n2. bbb\n3. ccc\n4. ddd\n\n" testRendering(t, input, expected) source = []byte("1. aaa\n3. bbb\n8. ccc\n1. ddd\n") input = markdown.Parse(source, nil) - expected = "1. aaa\n2. bbb\n3. ccc\n4. ddd\n" + expected = "1. aaa\n2. bbb\n3. ccc\n4. ddd\n\n" testRendering(t, input, expected) source = []byte("* aaa\n * aaa1\n * aaa2\n* bbb\n* ccc\n* ddd\n") input = markdown.Parse(source, nil) - expected = "* aaa\n * aaa1\n * aaa2\n* bbb\n* ccc\n* ddd\n" + expected = "* aaa\n * aaa1\n * aaa2\n\n* bbb\n* ccc\n* ddd\n\n" testRendering(t, input, expected) }