shithub: hugo

Download patch

ref: a67d95fe1a033ca4934957b5a98b12ecc8a9edbd
parent: ad6504e6b504277bbc7b60d093cdccd4f3baaa4f
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Thu Dec 19 12:43:07 EST 2019

Preserve HTML Text for image render hooks

Fixes #6639

--- a/hugolib/content_render_hooks_test.go
+++ b/hugolib/content_render_hooks_test.go
@@ -217,7 +217,17 @@
 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" }}
 P1: {{ $p.Content }}
@@ -224,6 +234,7 @@
 
 	`,
 		"_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 @@
 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 @@
 	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>
 `)
 
 }
@@ -255,6 +272,7 @@
 RSTART:{{ "**Bold Markdown**" | $p.RenderString }}:REND
 RSTART:{{  "**Bold Block Markdown**" | $p.RenderString  $optBlock }}:REND
 RSTART:{{  "/italic org mode/" | $p.RenderString  $optOrg }}:REND
+
 
 `)
 
--- a/markup/goldmark/render_link.go
+++ b/markup/goldmark/render_link.go
@@ -137,7 +137,7 @@
 	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 @@
 		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 @@
 			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
 
 }