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 @@ @@ -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