From 6265c7ff8139c9de02c082f490e8bd773b8e11bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Manuel=20R=C3=BCger?=
Date: Wed, 29 Mar 2023 15:31:13 +0200
Subject: [PATCH] Render CodeBlocks properly
---
pkg/mark/markdown.go | 54 +++++++++++++++++++++++++++++++++---
pkg/mark/testdata/codes.html | 13 +++++++++
pkg/mark/testdata/codes.md | 9 ++++++
3 files changed, 72 insertions(+), 4 deletions(-)
diff --git a/pkg/mark/markdown.go b/pkg/mark/markdown.go
index 52c8123..335166d 100644
--- a/pkg/mark/markdown.go
+++ b/pkg/mark/markdown.go
@@ -68,7 +68,7 @@ func (r *ConfluenceRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegister
// reg.Register(ast.KindHeading, r.renderNode)
reg.Register(ast.KindBlockquote, r.renderBlockQuote)
reg.Register(ast.KindCodeBlock, r.renderCodeBlock)
- reg.Register(ast.KindFencedCodeBlock, r.renderCodeBlock)
+ reg.Register(ast.KindFencedCodeBlock, r.renderFencedCodeBlock)
// reg.Register(ast.KindHTMLBlock, r.renderNode)
// reg.Register(ast.KindList, r.renderNode)
// reg.Register(ast.KindListItem, r.renderNode)
@@ -307,9 +307,8 @@ func (r *ConfluenceRenderer) goldmarkRenderLink(w util.BufWriter, source []byte,
return ast.WalkContinue, nil
}
-// renderCodeBlock renders a (Fenced)CodeBlock
-func (r *ConfluenceRenderer) renderCodeBlock(writer util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
-
+// renderFencedCodeBlock renders a FencedCodeBlock
+func (r *ConfluenceRenderer) renderFencedCodeBlock(writer util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
if !entering {
return ast.WalkContinue, nil
}
@@ -384,6 +383,53 @@ func (r *ConfluenceRenderer) renderCodeBlock(writer util.BufWriter, source []byt
return ast.WalkContinue, nil
}
+// renderCodeBlock renders a CodeBlock
+func (r *ConfluenceRenderer) renderCodeBlock(writer util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
+ if !entering {
+ return ast.WalkContinue, nil
+ }
+ linenumbers := false
+ firstline := 0
+ theme := ""
+ collapse := false
+ lang := ""
+ title := ""
+
+ var lval []byte
+
+ lines := node.Lines().Len()
+ for i := 0; i < lines; i++ {
+ line := node.Lines().At(i)
+ lval = append(lval, line.Value(source)...)
+ }
+ err := r.Stdlib.Templates.ExecuteTemplate(
+ writer,
+ "ac:code",
+ struct {
+ Language string
+ Collapse bool
+ Title string
+ Theme string
+ Linenumbers bool
+ Firstline int
+ Text string
+ }{
+ lang,
+ collapse,
+ title,
+ theme,
+ linenumbers,
+ firstline,
+ strings.TrimSuffix(string(lval), "\n"),
+ },
+ )
+ if err != nil {
+ return ast.WalkStop, err
+ }
+
+ return ast.WalkContinue, nil
+}
+
// compileMarkdown will replace tags like with escaped
// equivalent, because goldmark markdown parser replaces that tags with
// ac:rich-text-body because of the autolink
diff --git a/pkg/mark/testdata/codes.html b/pkg/mark/testdata/codes.html
index c3d724d..163f71c 100644
--- a/pkg/mark/testdata/codes.html
+++ b/pkg/mark/testdata/codes.html
@@ -44,6 +44,19 @@ text 2
true
+
+nested
+false
+
+
+
+
+false
+
+
true
false
diff --git a/pkg/mark/testdata/codes.md b/pkg/mark/testdata/codes.md
index f0a91f9..951f7e1 100644
--- a/pkg/mark/testdata/codes.md
+++ b/pkg/mark/testdata/codes.md
@@ -33,6 +33,15 @@ collapse-and-title
collapse-no-title
```
+```nested
+code
+``` more code ```
+even more code
+```
+
+ indented code block
+ with multiple lines
+
```mermaid
graph TD;
A-->B;