]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
markup/goldmark/codeblock: Fix attributes when no language identifier in CodeBlock
authorpiyo <chick.p.1120@gmail.com>
Wed, 3 Aug 2022 09:32:08 +0000 (18:32 +0900)
committerGitHub <noreply@github.com>
Wed, 3 Aug 2022 09:32:08 +0000 (11:32 +0200)
Fixes #10118

markup/goldmark/codeblocks/integration_test.go
markup/goldmark/codeblocks/render.go

index 1990497892d2dfda1b8e2ad8f9540c6daf25b4b4..d0206957a1ddf36bbd70cc53f0cff325b77ffcf7 100644 (file)
@@ -265,6 +265,39 @@ Position: {{ .Position | safeHTML }}
        b.AssertFileContent("public/p1/index.html", filepath.FromSlash("Position: \"/content/p1.md:7:1\""))
 }
 
+// Issue 10118
+func TestAttributes(t *testing.T) {
+       t.Parallel()
+
+       files := `
+-- config.toml --
+-- content/p1.md --
+---
+title: "p1"
+---
+
+## Issue 10118
+
+§§§ {foo="bar"}
+Hello, World!
+§§§
+
+-- layouts/_default/single.html --
+{{ .Content }}
+-- layouts/_default/_markup/render-codeblock.html --
+Attributes: {{ .Attributes }}|Type: {{ .Type }}|
+`
+
+       b := hugolib.NewIntegrationTestBuilder(
+               hugolib.IntegrationTestConfig{
+                       T:           t,
+                       TxtarString: files,
+               },
+       ).Build()
+
+       b.AssertFileContent("public/p1/index.html", "<h2 id=\"issue-10118\">Issue 10118</h2>\nAttributes: map[foo:bar]|Type: |")
+}
+
 // Issue 9571
 func TestAttributesChroma(t *testing.T) {
        t.Parallel()
index e245688e7e6c34834719df2c3ced624ced9ed600..3daad0af6d2b79125faa27d60a860abdad826735 100644 (file)
@@ -16,6 +16,7 @@ package codeblocks
 import (
        "bytes"
        "fmt"
+       "strings"
        "sync"
 
        "github.com/alecthomas/chroma/v2/lexers"
@@ -69,7 +70,7 @@ func (r *htmlRenderer) renderCodeBlock(w util.BufWriter, src []byte, node ast.No
        }
 
        n := node.(*codeBlock)
-       lang := string(n.b.Language(src))
+       lang := getLang(n.b, src)
        renderer := ctx.RenderContext().GetRenderer(hooks.CodeBlockRendererType, lang)
        if renderer == nil {
                return ast.WalkStop, fmt.Errorf("no code renderer found for %q", lang)
@@ -174,6 +175,12 @@ func (c *codeBlockContext) Position() htext.Position {
        return c.pos
 }
 
+func getLang(node *ast.FencedCodeBlock, src []byte) string {
+       langWithAttributes := string(node.Language(src))
+       lang, _, _ := strings.Cut(langWithAttributes, "{")
+       return lang
+}
+
 func getAttributes(node *ast.FencedCodeBlock, infostr []byte) []ast.Attribute {
        if node.Attributes() != nil {
                return node.Attributes()
@@ -188,7 +195,7 @@ func getAttributes(node *ast.FencedCodeBlock, infostr []byte) []ast.Attribute {
                        }
                }
 
-               if attrStartIdx > 0 {
+               if attrStartIdx != -1 {
                        n := ast.NewTextBlock() // dummy node for storing attributes
                        attrStr := infostr[attrStartIdx:]
                        if attrs, hasAttr := parser.ParseAttributes(text.NewReader(attrStr)); hasAttr {