From 7f6466a88246e76a5eac4f139ccd84bc3fd318db Mon Sep 17 00:00:00 2001
From: Egor Kovetskiy
Date: Tue, 2 Feb 2021 17:43:31 +0300
Subject: [PATCH] upgrade to blackfriday v2, fixes #53 and #61, add tests
---
go.mod | 2 +
go.sum | 3 +
pkg/mark/markdown.go | 106 +++++++++++++++++---------------
pkg/mark/testdata/codes.html | 38 +++++++++++-
pkg/mark/testdata/codes.md | 12 ++++
pkg/mark/testdata/lists.html | 21 +++----
pkg/mark/testdata/newlines.html | 4 +-
pkg/mark/testdata/tags.html | 4 +-
8 files changed, 124 insertions(+), 66 deletions(-)
diff --git a/go.mod b/go.mod
index ab9b0dd..78ead73 100644
--- a/go.mod
+++ b/go.mod
@@ -7,6 +7,7 @@ require (
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38
github.com/alecthomas/colour v0.1.0 // indirect
github.com/alecthomas/repr v0.0.0-20201120212035-bb82daffcca2 // indirect
+ github.com/davecgh/go-spew v1.1.1
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
github.com/go-yaml/yaml v2.1.0+incompatible // indirect
github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334 // indirect
@@ -19,6 +20,7 @@ require (
github.com/reconquest/pkg v0.0.0-20201028091908-8e9a5e0226ef
github.com/reconquest/regexputil-go v0.0.0-20160905154124-38573e70c1f4
github.com/russross/blackfriday v1.5.2
+ github.com/russross/blackfriday/v2 v2.1.0
github.com/sergi/go-diff v1.1.0 // indirect
github.com/stretchr/testify v1.5.1
gopkg.in/yaml.v2 v2.2.8
diff --git a/go.sum b/go.sum
index e2567de..5ed86ee 100644
--- a/go.sum
+++ b/go.sum
@@ -48,6 +48,9 @@ github.com/reconquest/regexputil-go v0.0.0-20160905154124-38573e70c1f4 h1:bcDXaT
github.com/reconquest/regexputil-go v0.0.0-20160905154124-38573e70c1f4/go.mod h1:OI1di2iiFSwX3D70iZjzdmCPPfssjOl+HX40tI3VaXA=
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
+github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
diff --git a/pkg/mark/markdown.go b/pkg/mark/markdown.go
index dc68426..cd55094 100644
--- a/pkg/mark/markdown.go
+++ b/pkg/mark/markdown.go
@@ -1,18 +1,18 @@
package mark
import (
- "bytes"
+ "io"
"regexp"
"strconv"
"strings"
"github.com/kovetskiy/mark/pkg/mark/stdlib"
"github.com/reconquest/pkg/log"
- "github.com/russross/blackfriday"
+ bf "github.com/russross/blackfriday/v2"
)
type ConfluenceRenderer struct {
- blackfriday.Renderer
+ bf.Renderer
Stdlib *stdlib.Lib
}
@@ -48,30 +48,36 @@ func ParseTitle(lang string) string {
return ""
}
-func (renderer ConfluenceRenderer) BlockCode(
- out *bytes.Buffer,
- text []byte,
- lang string,
-) {
- renderer.Stdlib.Templates.ExecuteTemplate(
- out,
- "ac:code",
- struct {
- Language string
- Collapse string
- Title string
- Text string
- }{
- ParseLanguage(lang),
- strconv.FormatBool(strings.Contains(lang, "collapse")),
- ParseTitle(lang),
- string(text),
- },
- )
+func (renderer ConfluenceRenderer) RenderNode(
+ writer io.Writer,
+ node *bf.Node,
+ entering bool,
+) bf.WalkStatus {
+ if node.Type == bf.CodeBlock {
+ lang := string(node.Info)
+ renderer.Stdlib.Templates.ExecuteTemplate(
+ writer,
+ "ac:code",
+ struct {
+ Language string
+ Collapse string
+ Title string
+ Text string
+ }{
+ ParseLanguage(lang),
+ strconv.FormatBool(strings.Contains(lang, "collapse")),
+ ParseTitle(lang),
+ string(node.Literal),
+ },
+ )
+
+ return bf.GoToNext
+ }
+ return renderer.Renderer.RenderNode(writer, node, entering)
}
// compileMarkdown will replace tags like with escaped
-// equivalent, because blackfriday markdown parser replaces that tags with
+// equivalent, because bf markdown parser replaces that tags with
// ac:rich-text-body for whatever reason.
func CompileMarkdown(
markdown []byte,
@@ -79,7 +85,7 @@ func CompileMarkdown(
) string {
log.Tracef(nil, "rendering markdown:\n%s", string(markdown))
- colon := regexp.MustCompile(`---BLACKFRIDAY-COLON---`)
+ colon := regexp.MustCompile(`---bf-COLON---`)
tags := regexp.MustCompile(`<(/?\S+?):(\S+?)>`)
@@ -89,37 +95,37 @@ func CompileMarkdown(
)
renderer := ConfluenceRenderer{
- Renderer: blackfriday.HtmlRenderer(
- blackfriday.HTML_USE_XHTML|
- blackfriday.HTML_USE_SMARTYPANTS|
- blackfriday.HTML_SMARTYPANTS_FRACTIONS|
- blackfriday.HTML_SMARTYPANTS_DASHES|
- blackfriday.HTML_SMARTYPANTS_LATEX_DASHES,
- "", "",
+ Renderer: bf.NewHTMLRenderer(
+ bf.HTMLRendererParameters{
+ Flags: bf.UseXHTML |
+ bf.Smartypants |
+ bf.SmartypantsFractions |
+ bf.SmartypantsDashes |
+ bf.SmartypantsLatexDashes,
+ },
),
Stdlib: stdlib,
}
- html := blackfriday.MarkdownOptions(
+ html := bf.Run(
markdown,
- renderer,
- blackfriday.Options{
- Extensions: blackfriday.EXTENSION_NO_INTRA_EMPHASIS |
- blackfriday.EXTENSION_TABLES |
- blackfriday.EXTENSION_FENCED_CODE |
- blackfriday.EXTENSION_AUTOLINK |
- blackfriday.EXTENSION_LAX_HTML_BLOCKS |
- blackfriday.EXTENSION_STRIKETHROUGH |
- blackfriday.EXTENSION_SPACE_HEADERS |
- blackfriday.EXTENSION_HEADER_IDS |
- blackfriday.EXTENSION_AUTO_HEADER_IDS |
- blackfriday.EXTENSION_TITLEBLOCK |
- blackfriday.EXTENSION_BACKSLASH_LINE_BREAK |
- blackfriday.EXTENSION_DEFINITION_LISTS |
- blackfriday.EXTENSION_HARD_LINE_BREAK |
- blackfriday.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK,
- },
+ bf.WithRenderer(renderer),
+ bf.WithExtensions(
+ bf.NoIntraEmphasis|
+ bf.Tables|
+ bf.FencedCode|
+ bf.Autolink|
+ bf.LaxHTMLBlocks|
+ bf.Strikethrough|
+ bf.SpaceHeadings|
+ bf.HeadingIDs|
+ bf.AutoHeadingIDs|
+ bf.Titleblock|
+ bf.BackslashLineBreak|
+ bf.DefinitionLists|
+ bf.NoEmptyLineBeforeBlock,
+ ),
)
html = colon.ReplaceAll(html, []byte(`:`))
diff --git a/pkg/mark/testdata/codes.html b/pkg/mark/testdata/codes.html
index cf9db53..fe11812 100644
--- a/pkg/mark/testdata/codes.html
+++ b/pkg/mark/testdata/codes.html
@@ -36,7 +36,7 @@
-text
+
text
text 2
@@ -50,3 +50,39 @@ text 2
+
+A b c
+
+
+sh
+false
+A b c
+
+
+
+
+
+A b c
+
+
+bash
+true
+A b c
+
+
+
+
+
+
+
+
+c
+true
+
+
+
+
+
diff --git a/pkg/mark/testdata/codes.md b/pkg/mark/testdata/codes.md
index afbb727..dd6497e 100644
--- a/pkg/mark/testdata/codes.md
+++ b/pkg/mark/testdata/codes.md
@@ -15,3 +15,15 @@ text 2
```unknown
unknown code 2
```
+
+```sh title A b c
+no-collapse-title
+```
+
+```bash collapse title A b c
+collapse-and-title
+```
+
+```c collapse
+collapse-no-title
+```
diff --git a/pkg/mark/testdata/lists.html b/pkg/mark/testdata/lists.html
index 5a5b909..25fbcd1 100644
--- a/pkg/mark/testdata/lists.html
+++ b/pkg/mark/testdata/lists.html
@@ -1,16 +1,15 @@
-- dash 1-1
-- dash 1-2
-- dash 1-3
+ - dash 1-1
+- dash 1-2
+- dash 1-3
-- dash 1-3-1
-- dash 1-3-2
-- dash 1-3-3
+ - dash 1-3-1
+- dash 1-3-2
+- dash 1-3-3
-- dash 1-3-3-1
-
+- dash 1-3-3-1
@@ -18,7 +17,7 @@
text
diff --git a/pkg/mark/testdata/newlines.html b/pkg/mark/testdata/newlines.html
index 0e020cb..c425cc6 100644
--- a/pkg/mark/testdata/newlines.html
+++ b/pkg/mark/testdata/newlines.html
@@ -1,4 +1,4 @@
-one-1
+
one-1
one-2
two-1
@@ -9,7 +9,7 @@ one-2
three-2
-space-1
+
space-1
space-2
2space-1
diff --git a/pkg/mark/testdata/tags.html b/pkg/mark/testdata/tags.html
index 729cd5a..c9ab4f8 100644
--- a/pkg/mark/testdata/tags.html
+++ b/pkg/mark/testdata/tags.html
@@ -1,5 +1,5 @@
-
bold
+
bold
bold
-vitalik
+
vitalik
vitalik