aboutsummaryrefslogtreecommitdiffhomepage
path: root/markup
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <[email protected]>2022-02-26 17:24:10 +0100
committerBjørn Erik Pedersen <[email protected]>2022-02-26 21:54:36 +0100
commit579ff9b6524ed4e55c191ab94251f5a2fe315f68 (patch)
tree0249f3ae723241c4cc2fef7e9ad9ddf06e4bc523 /markup
parent928a89696273b1a5defa0e85115c9bd0e167cbf0 (diff)
downloadhugo-579ff9b6524ed4e55c191ab94251f5a2fe315f68.tar.gz
hugo-579ff9b6524ed4e55c191ab94251f5a2fe315f68.zip
markup/goldmark: Improve attributes vs options
Fixes #9571
Diffstat (limited to 'markup')
-rw-r--r--markup/converter/hooks/hooks.go4
-rw-r--r--markup/goldmark/codeblocks/integration_test.go29
-rw-r--r--markup/goldmark/codeblocks/render.go17
-rw-r--r--markup/highlight/highlight.go5
-rw-r--r--markup/internal/attributes/attributes.go5
5 files changed, 39 insertions, 21 deletions
diff --git a/markup/converter/hooks/hooks.go b/markup/converter/hooks/hooks.go
index a570113ff..e81689f04 100644
--- a/markup/converter/hooks/hooks.go
+++ b/markup/converter/hooks/hooks.go
@@ -90,11 +90,11 @@ type HeadingRenderer interface {
identity.Provider
}
-// ElementPositionRevolver provides a way to resolve the start Position
+// ElementPositionResolver provides a way to resolve the start Position
// of a markdown element in the original source document.
// This may be both slow and aproximate, so should only be
// used for error logging.
-type ElementPositionRevolver interface {
+type ElementPositionResolver interface {
ResolvePosition(ctx interface{}) text.Position
}
diff --git a/markup/goldmark/codeblocks/integration_test.go b/markup/goldmark/codeblocks/integration_test.go
index 68f6b809e..c33ea31e3 100644
--- a/markup/goldmark/codeblocks/integration_test.go
+++ b/markup/goldmark/codeblocks/integration_test.go
@@ -14,6 +14,7 @@
package codeblocks_test
import (
+ "strings"
"testing"
"github.com/gohugoio/hugo/hugolib"
@@ -176,7 +177,7 @@ Position: {{ .Position | safeHTML }}
}
// Issue 9571
-func TestOptionsNonChroma(t *testing.T) {
+func TestAttributesChroma(t *testing.T) {
t.Parallel()
files := `
@@ -188,23 +189,27 @@ title: "p1"
## Code
-§§§bash {style=monokai}
+§§§LANGUAGE {style=monokai}
echo "p1";
§§§
-- layouts/_default/single.html --
{{ .Content }}
-- layouts/_default/_markup/render-codeblock.html --
-Style: {{ .Attributes }}|
+Attributes: {{ .Attributes }}|Options: {{ .Options }}|
`
-
- b := hugolib.NewIntegrationTestBuilder(
- hugolib.IntegrationTestConfig{
- T: t,
- TxtarString: files,
- },
- ).Build()
-
- b.AssertFileContent("public/p1/index.html", "asdfadf")
+ testLanguage := func(language, expect string) {
+ b := hugolib.NewIntegrationTestBuilder(
+ hugolib.IntegrationTestConfig{
+ T: t,
+ TxtarString: strings.ReplaceAll(files, "LANGUAGE", language),
+ },
+ ).Build()
+
+ b.AssertFileContent("public/p1/index.html", expect)
+ }
+
+ testLanguage("bash", "Attributes: map[]|Options: map[style:monokai]|")
+ testLanguage("hugo", "Attributes: map[style:monokai]|Options: map[]|")
}
diff --git a/markup/goldmark/codeblocks/render.go b/markup/goldmark/codeblocks/render.go
index bbf15bef3..27252fc27 100644
--- a/markup/goldmark/codeblocks/render.go
+++ b/markup/goldmark/codeblocks/render.go
@@ -18,7 +18,7 @@ import (
"fmt"
"sync"
- "github.com/gohugoio/hugo/common/herrors"
+ "github.com/alecthomas/chroma/lexers"
htext "github.com/gohugoio/hugo/common/text"
"github.com/gohugoio/hugo/markup/converter/hooks"
"github.com/gohugoio/hugo/markup/goldmark/internal/render"
@@ -61,8 +61,6 @@ func (r *htmlRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
}
func (r *htmlRenderer) renderCodeBlock(w util.BufWriter, src []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
- defer herrors.Recover()
-
ctx := w.(*render.Context)
if entering {
@@ -92,17 +90,26 @@ func (r *htmlRenderer) renderCodeBlock(w util.BufWriter, src []byte, node ast.No
if n.b.Info != nil {
info = n.b.Info.Segment.Value(src)
}
+
+ attrtp := attributes.AttributesOwnerCodeBlockCustom
+ if isd, ok := renderer.(hooks.IsDefaultCodeBlockRendererProvider); (ok && isd.IsDefaultCodeBlockRenderer()) || lexers.Get(lang) != nil {
+ // We say that this is a Chroma code block if it's the default code block renderer
+ // or if the language is supported by Chroma.
+ attrtp = attributes.AttributesOwnerCodeBlockChroma
+ }
+
+ // IsDefaultCodeBlockRendererProvider
attrs := getAttributes(n.b, info)
cbctx := &codeBlockContext{
page: ctx.DocumentContext().Document,
lang: lang,
code: s,
ordinal: ordinal,
- AttributesHolder: attributes.New(attrs, attributes.AttributesOwnerCodeBlock),
+ AttributesHolder: attributes.New(attrs, attrtp),
}
cbctx.createPos = func() htext.Position {
- if resolver, ok := renderer.(hooks.ElementPositionRevolver); ok {
+ if resolver, ok := renderer.(hooks.ElementPositionResolver); ok {
return resolver.ResolvePosition(cbctx)
}
return htext.Position{
diff --git a/markup/highlight/highlight.go b/markup/highlight/highlight.go
index 156007d0a..dac45e312 100644
--- a/markup/highlight/highlight.go
+++ b/markup/highlight/highlight.go
@@ -61,6 +61,7 @@ type Highlighter interface {
Highlight(code, lang string, opts interface{}) (string, error)
HighlightCodeBlock(ctx hooks.CodeblockContext, opts interface{}) (HightlightResult, error)
hooks.CodeBlockRenderer
+ hooks.IsDefaultCodeBlockRendererProvider
}
type chromaHighlighter struct {
@@ -129,6 +130,10 @@ func (h chromaHighlighter) RenderCodeblock(w hugio.FlexiWriter, ctx hooks.Codebl
return highlight(w, code, ctx.Lang(), attributes, cfg)
}
+func (h chromaHighlighter) IsDefaultCodeBlockRenderer() bool {
+ return true
+}
+
var id = identity.NewPathIdentity("chroma", "highlight")
func (h chromaHighlighter) GetIdentity() identity.Identity {
diff --git a/markup/internal/attributes/attributes.go b/markup/internal/attributes/attributes.go
index 1cce7edd1..a20690c4c 100644
--- a/markup/internal/attributes/attributes.go
+++ b/markup/internal/attributes/attributes.go
@@ -50,7 +50,8 @@ type AttributesOwnerType int
const (
AttributesOwnerGeneral AttributesOwnerType = iota
- AttributesOwnerCodeBlock
+ AttributesOwnerCodeBlockChroma
+ AttributesOwnerCodeBlockCustom
)
func New(astAttributes []ast.Attribute, ownerType AttributesOwnerType) *AttributesHolder {
@@ -99,7 +100,7 @@ func New(astAttributes []ast.Attribute, ownerType AttributesOwnerType) *Attribut
panic(fmt.Sprintf("not implemented: %T", vvv))
}
- if ownerType == AttributesOwnerCodeBlock && chromaHightlightProcessingAttributes[nameLower] {
+ if ownerType == AttributesOwnerCodeBlockChroma && chromaHightlightProcessingAttributes[nameLower] {
attr := Attribute{Name: string(v.Name), Value: vv}
opts = append(opts, attr)
} else {