Skip to content

Commit

Permalink
markup/goldmark: Improve attributes vs options
Browse files Browse the repository at this point in the history
Fixes #9571
  • Loading branch information
bep committed Feb 26, 2022
1 parent 928a896 commit 579ff9b
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 21 deletions.
4 changes: 4 additions & 0 deletions hugolib/site.go
Original file line number Diff line number Diff line change
Expand Up @@ -1798,6 +1798,10 @@ func (hr hookRendererTemplate) ResolvePosition(ctx interface{}) text.Position {
return hr.resolvePosition(ctx)
}

func (hr hookRendererTemplate) IsDefaultCodeBlockRenderer() bool {
return false
}

func (s *Site) renderForTemplate(name, outputFormat string, d interface{}, w io.Writer, templ tpl.Template) (err error) {
if templ == nil {
s.logMissingLayout(name, "", "", outputFormat)
Expand Down
4 changes: 2 additions & 2 deletions markup/converter/hooks/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
29 changes: 17 additions & 12 deletions markup/goldmark/codeblocks/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
package codeblocks_test

import (
"strings"
"testing"

"github.com/gohugoio/hugo/hugolib"
Expand Down Expand Up @@ -176,7 +177,7 @@ Position: {{ .Position | safeHTML }}
}

// Issue 9571
func TestOptionsNonChroma(t *testing.T) {
func TestAttributesChroma(t *testing.T) {
t.Parallel()

files := `
Expand All @@ -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[]|")
}
17 changes: 12 additions & 5 deletions markup/goldmark/codeblocks/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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{
Expand Down
5 changes: 5 additions & 0 deletions markup/highlight/highlight.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
5 changes: 3 additions & 2 deletions markup/internal/attributes/attributes.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ type AttributesOwnerType int

const (
AttributesOwnerGeneral AttributesOwnerType = iota
AttributesOwnerCodeBlock
AttributesOwnerCodeBlockChroma
AttributesOwnerCodeBlockCustom
)

func New(astAttributes []ast.Attribute, ownerType AttributesOwnerType) *AttributesHolder {
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 579ff9b

Please sign in to comment.