summaryrefslogtreecommitdiffstats
path: root/markup/goldmark/codeblocks/render.go
diff options
context:
space:
mode:
Diffstat (limited to 'markup/goldmark/codeblocks/render.go')
-rw-r--r--markup/goldmark/codeblocks/render.go28
1 files changed, 19 insertions, 9 deletions
diff --git a/markup/goldmark/codeblocks/render.go b/markup/goldmark/codeblocks/render.go
index cf5a0f296..5f053d278 100644
--- a/markup/goldmark/codeblocks/render.go
+++ b/markup/goldmark/codeblocks/render.go
@@ -15,6 +15,7 @@ package codeblocks
import (
"bytes"
+ "errors"
"fmt"
"strings"
"sync"
@@ -101,7 +102,10 @@ func (r *htmlRenderer) renderCodeBlock(w util.BufWriter, src []byte, node ast.No
}
// IsDefaultCodeBlockRendererProvider
- attrs := getAttributes(n.b, info)
+ attrs, attrStr, err := getAttributes(n.b, info)
+ if err != nil {
+ return ast.WalkStop, &herrors.TextSegmentError{Err: err, Segment: attrStr}
+ }
cbctx := &codeBlockContext{
page: ctx.DocumentContext().Document,
lang: lang,
@@ -123,7 +127,7 @@ func (r *htmlRenderer) renderCodeBlock(w util.BufWriter, src []byte, node ast.No
cr := renderer.(hooks.CodeBlockRenderer)
- err := cr.RenderCodeblock(
+ err = cr.RenderCodeblock(
ctx.RenderContext().Ctx,
w,
cbctx,
@@ -182,30 +186,36 @@ func getLang(node *ast.FencedCodeBlock, src []byte) string {
return lang
}
-func getAttributes(node *ast.FencedCodeBlock, infostr []byte) []ast.Attribute {
+func getAttributes(node *ast.FencedCodeBlock, infostr []byte) ([]ast.Attribute, string, error) {
if node.Attributes() != nil {
- return node.Attributes()
+ return node.Attributes(), "", nil
}
if infostr != nil {
attrStartIdx := -1
+ attrEndIdx := -1
for idx, char := range infostr {
- if char == '{' {
+ if attrEndIdx == -1 && char == '{' {
attrStartIdx = idx
+ }
+ if attrStartIdx != -1 && char == '}' {
+ attrEndIdx = idx
break
}
}
- if attrStartIdx != -1 {
+ if attrStartIdx != -1 && attrEndIdx != -1 {
n := ast.NewTextBlock() // dummy node for storing attributes
- attrStr := infostr[attrStartIdx:]
+ attrStr := infostr[attrStartIdx : attrEndIdx+1]
if attrs, hasAttr := parser.ParseAttributes(text.NewReader(attrStr)); hasAttr {
for _, attr := range attrs {
n.SetAttribute(attr.Name, attr.Value)
}
- return n.Attributes()
+ return n.Attributes(), "", nil
+ } else {
+ return nil, string(attrStr), errors.New("failed to parse Markdown attributes; you may need to quote the values")
}
}
}
- return nil
+ return nil, "", nil
}