markup/goldmark: Fix mangling of headers/links in render hooks

```bash

name                    old time/op    new time/op    delta
SiteWithRenderHooks-10    11.9ms ± 1%    11.9ms ± 1%    ~     (p=0.486 n=4+4)

name                    old alloc/op   new alloc/op   delta
SiteWithRenderHooks-10    11.2MB ± 0%    11.3MB ± 0%  +0.16%  (p=0.029 n=4+4)

name                    old allocs/op  new allocs/op  delta
SiteWithRenderHooks-10      145k ± 0%      145k ± 0%  +0.14%  (p=0.029 n=4+4)
```

Fixes #9504
This commit is contained in:
Bjørn Erik Pedersen
2022-02-16 13:44:09 +01:00
parent 77c7059ff8
commit b2a827c52c
3 changed files with 69 additions and 24 deletions

View File

@@ -144,16 +144,13 @@ func (r *hookedRenderer) renderAttributesForNode(w util.BufWriter, node ast.Node
renderAttributes(w, false, node.Attributes()...)
}
var (
// Attributes with special meaning that does not make sense to render in HTML.
attributeExcludes = map[string]bool{
"hl_lines": true,
"hl_style": true,
"linenos": true,
"linenostart": true,
}
)
// Attributes with special meaning that does not make sense to render in HTML.
var attributeExcludes = map[string]bool{
"hl_lines": true,
"hl_style": true,
"linenos": true,
"linenostart": true,
}
func renderAttributes(w util.BufWriter, skipClass bool, attributes ...ast.Attribute) {
for _, attr := range attributes {
@@ -197,12 +194,13 @@ func (r *hookedRenderer) renderImage(w util.BufWriter, source []byte, node ast.N
if entering {
// Store the current pos so we can capture the rendered text.
ctx.pos = ctx.Buffer.Len()
ctx.pushPos(ctx.Buffer.Len())
return ast.WalkContinue, nil
}
text := ctx.Buffer.Bytes()[ctx.pos:]
ctx.Buffer.Truncate(ctx.pos)
pos := ctx.popPos()
text := ctx.Buffer.Bytes()[pos:]
ctx.Buffer.Truncate(pos)
err := h.ImageRenderer.RenderLink(
w,
@@ -263,12 +261,13 @@ func (r *hookedRenderer) renderLink(w util.BufWriter, source []byte, node ast.No
if entering {
// Store the current pos so we can capture the rendered text.
ctx.pos = ctx.Buffer.Len()
ctx.pushPos(ctx.Buffer.Len())
return ast.WalkContinue, nil
}
text := ctx.Buffer.Bytes()[ctx.pos:]
ctx.Buffer.Truncate(ctx.pos)
pos := ctx.popPos()
text := ctx.Buffer.Bytes()[pos:]
ctx.Buffer.Truncate(pos)
err := h.LinkRenderer.RenderLink(
w,
@@ -395,12 +394,13 @@ func (r *hookedRenderer) renderHeading(w util.BufWriter, source []byte, node ast
if entering {
// Store the current pos so we can capture the rendered text.
ctx.pos = ctx.Buffer.Len()
ctx.pushPos(ctx.Buffer.Len())
return ast.WalkContinue, nil
}
text := ctx.Buffer.Bytes()[ctx.pos:]
ctx.Buffer.Truncate(ctx.pos)
pos := ctx.popPos()
text := ctx.Buffer.Bytes()[pos:]
ctx.Buffer.Truncate(pos)
// All ast.Heading nodes are guaranteed to have an attribute called "id"
// that is an array of bytes that encode a valid string.
anchori, _ := n.AttributeString("id")
@@ -440,8 +440,7 @@ func (r *hookedRenderer) renderHeadingDefault(w util.BufWriter, source []byte, n
return ast.WalkContinue, nil
}
type links struct {
}
type links struct{}
// Extend implements goldmark.Extender.
func (e *links) Extend(m goldmark.Markdown) {