Preserve HTML Text for image render hooks
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 19 Dec 2019 16:43:07 +0000 (17:43 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 19 Dec 2019 18:02:03 +0000 (19:02 +0100)
Fixes #6639

hugolib/content_render_hooks_test.go
markup/goldmark/render_link.go

index deccbff48f43cbfbc5c65750a713694293c1b681..d206013ba8ffeb00b8dc09f86936222d2b50e43b 100644 (file)
@@ -217,6 +217,16 @@ P3: <p>P3. xml-link: https://www.example.org|</p>
 func TestRenderLinkWithMarkupInText(t *testing.T) {
 
        b := newTestSitesBuilder(t)
+       b.WithConfigFile("toml", `
+
+baseURL="https://example.org"
+
+[markup]
+  [markup.goldmark]
+    [markup.goldmark.renderer]
+      unsafe = true
+    
+`)
 
        b.WithTemplates("index.html", `
 {{ $p := site.GetPage "p1.md" }}
@@ -224,6 +234,7 @@ P1: {{ $p.Content }}
 
        `,
                "_default/_markup/render-link.html", `html-link: {{ .Destination | safeURL }}|Text: {{ .Text | safeHTML }}|Plain: {{ .PlainText | safeHTML }}`,
+               "_default/_markup/render-image.html", `html-image: {{ .Destination | safeURL }}|Text: {{ .Text | safeHTML }}|Plain: {{ .PlainText | safeHTML }}`,
        )
 
        b.WithContent("p1.md", `---
@@ -233,6 +244,11 @@ title: "p1"
 START: [**should be bold**](https://gohugo.io)END
 
 Some regular **markup**.
+
+Image:
+
+![Hello<br> Goodbye](image.jpg)END
+
 `)
 
        b.Build(BuildCfg{})
@@ -240,6 +256,7 @@ Some regular **markup**.
        b.AssertFileContent("public/index.html", `
   P1: <p>START: html-link: https://gohugo.io|Text: <strong>should be bold</strong>|Plain: should be boldEND</p>
 <p>Some regular <strong>markup</strong>.</p>
+<p>html-image: image.jpg|Text: Hello<br> Goodbye|Plain: Hello GoodbyeEND</p>
 `)
 
 }
@@ -256,6 +273,7 @@ RSTART:{{ "**Bold Markdown**" | $p.RenderString }}:REND
 RSTART:{{  "**Bold Block Markdown**" | $p.RenderString  $optBlock }}:REND
 RSTART:{{  "/italic org mode/" | $p.RenderString  $optOrg }}:REND
 
+
 `)
 
        b.WithContent("p1.md", `---
index cefb786a69b0a0c67772889cbe0d965c50064110..c0269bedfeab30bb8a8fb7774fd5bb2762053390 100644 (file)
@@ -137,7 +137,7 @@ func (r *linkRenderer) renderImage(w util.BufWriter, source []byte, node ast.Nod
        n := node.(*ast.Image)
        var h *hooks.Render
 
-       ctx, ok := w.(renderContextData)
+       ctx, ok := w.(*renderContext)
        if ok {
                h = ctx.RenderContext().RenderHooks
                ok = h != nil && h.ImageRenderer != nil
@@ -147,11 +147,14 @@ func (r *linkRenderer) renderImage(w util.BufWriter, source []byte, node ast.Nod
                return r.renderDefaultImage(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 := string(n.Text(source))
+       text := ctx.Buffer.Bytes()[ctx.pos:]
+       ctx.Buffer.Truncate(ctx.pos)
 
        err := h.ImageRenderer.Render(
                w,
@@ -159,14 +162,14 @@ func (r *linkRenderer) renderImage(w util.BufWriter, source []byte, node ast.Nod
                        page:        ctx.DocumentContext().Document,
                        destination: string(n.Destination),
                        title:       string(n.Title),
-                       text:        text,
-                       plainText:   text,
+                       text:        string(text),
+                       plainText:   string(n.Text(source)),
                },
        )
 
        ctx.AddIdentity(h.ImageRenderer.GetIdentity())
 
-       return ast.WalkSkipChildren, err
+       return ast.WalkContinue, err
 
 }