diff --git a/hugolib/content_render_hooks_test.go b/hugolib/content_render_hooks_test.go index aa697220d1b..7de97f4761b 100644 --- a/hugolib/content_render_hooks_test.go +++ b/hugolib/content_render_hooks_test.go @@ -213,6 +213,37 @@ P3:

P3. xml-link: https://www.example.org|

} +// https://github.com/gohugoio/hugo/issues/6629 +func TestRenderLinkWithMarkupInText(t *testing.T) { + + b := newTestSitesBuilder(t) + + b.WithTemplates("index.html", ` +{{ $p := site.GetPage "p1.md" }} +P1: {{ $p.Content }} + + `, + "_default/_markup/render-link.html", `html-link: {{ .Destination | safeURL }}|Text: {{ .Text | safeHTML }}`, + ) + + b.WithContent("p1.md", `--- +title: "p1" +--- + +START: [**should be bold**](https://gohugo.io)END + +Some regular **markup**. +`) + + b.Build(BuildCfg{}) + + b.AssertFileContent("public/index.html", ` + P1:

START: html-link: https://gohugo.io|Text: should be boldEND

+

Some regular markup.

+`) + +} + func TestRenderString(t *testing.T) { b := newTestSitesBuilder(t) diff --git a/markup/goldmark/convert.go b/markup/goldmark/convert.go index 130f02a2fb7..ac8b505652a 100644 --- a/markup/goldmark/convert.go +++ b/markup/goldmark/convert.go @@ -15,9 +15,9 @@ package goldmark import ( - "bufio" "bytes" "fmt" + "math" "path/filepath" "runtime/debug" @@ -162,8 +162,25 @@ func (c converterResult) GetIdentities() identity.Identities { return c.ids } +type bufWriter struct { + *bytes.Buffer +} + +func (b *bufWriter) Available() int { + return int(math.MaxInt64) +} + +func (b *bufWriter) Buffered() int { + return b.Len() +} + +func (b *bufWriter) Flush() error { + return nil +} + type renderContext struct { - util.BufWriter + *bufWriter + pos int renderContextData } @@ -205,7 +222,7 @@ func (c *goldmarkConverter) Convert(ctx converter.RenderContext) (result convert } }() - buf := &bytes.Buffer{} + buf := &bufWriter{Buffer: &bytes.Buffer{}} result = buf pctx := newParserContext(ctx) reader := text.NewReader(ctx.Src) @@ -221,8 +238,8 @@ func (c *goldmarkConverter) Convert(ctx converter.RenderContext) (result convert ids: identity.NewManager(converterIdentity), } - w := renderContext{ - BufWriter: bufio.NewWriter(buf), + w := &renderContext{ + bufWriter: buf, renderContextData: rcx, } diff --git a/markup/goldmark/render_link.go b/markup/goldmark/render_link.go index 17ba5badacc..69aa01f5447 100644 --- a/markup/goldmark/render_link.go +++ b/markup/goldmark/render_link.go @@ -166,7 +166,7 @@ func (r *linkRenderer) renderLink(w util.BufWriter, source []byte, node ast.Node n := node.(*ast.Link) var h *hooks.Render - ctx, ok := w.(renderContextData) + ctx, ok := w.(*renderContext) if ok { h = ctx.RenderContext().RenderHooks ok = h != nil && h.LinkRenderer != nil @@ -176,24 +176,29 @@ func (r *linkRenderer) renderLink(w util.BufWriter, source []byte, node ast.Node return r.renderDefaultLink(w, source, node, entering) } - if !entering { + if entering { + // Store the current pos so we can capture the rendered text. + ctx.pos = ctx.Buffer.Len() return ast.WalkContinue, nil } + text := ctx.Buffer.Bytes()[ctx.pos:] + ctx.Buffer.Truncate(ctx.pos) + err := h.LinkRenderer.Render( w, linkContext{ page: ctx.DocumentContext().Document, destination: string(n.Destination), title: string(n.Title), - text: string(n.Text(source)), + text: string(text), + //text: string(n.Text(source)), TODO1 add PlainText? }, ) ctx.AddIdentity(h.LinkRenderer.GetIdentity()) - // Do not render the inner text. - return ast.WalkSkipChildren, err + return ast.WalkContinue, err }