Allow markdown attribute lists to be used in title render hooks

Fixes #8270
This commit is contained in:
Bjørn Erik Pedersen
2021-02-22 11:27:14 +01:00
parent e7e194435b
commit cd0c5d7ef3
4 changed files with 54 additions and 7 deletions

View File

@@ -14,6 +14,8 @@
package goldmark
import (
"sync"
"github.com/gohugoio/hugo/markup/converter/hooks"
"github.com/yuin/goldmark"
@@ -38,6 +40,25 @@ func newLinks() goldmark.Extender {
return &links{}
}
type attributesHolder struct {
// What we get from Goldmark.
astAttributes []ast.Attribute
// What we send to the the render hooks.
attributesInit sync.Once
attributes map[string]string
}
func (a *attributesHolder) Attributes() map[string]string {
a.attributesInit.Do(func() {
a.attributes = make(map[string]string)
for _, attr := range a.astAttributes {
a.attributes[string(attr.Name)] = string(util.EscapeHTML(attr.Value.([]byte)))
}
})
return a.attributes
}
type linkContext struct {
page interface{}
destination string
@@ -76,6 +97,7 @@ type headingContext struct {
anchor string
text string
plainText string
*attributesHolder
}
func (ctx headingContext) Page() interface{} {
@@ -301,11 +323,12 @@ func (r *hookedRenderer) renderHeading(w util.BufWriter, source []byte, node ast
err := h.HeadingRenderer.RenderHeading(
w,
headingContext{
page: ctx.DocumentContext().Document,
level: n.Level,
anchor: string(anchor),
text: string(text),
plainText: string(n.Text(source)),
page: ctx.DocumentContext().Document,
level: n.Level,
anchor: string(anchor),
text: string(text),
plainText: string(n.Text(source)),
attributesHolder: &attributesHolder{astAttributes: n.Attributes()},
},
)