From 6aa72acaf95723bef83051c4fceb1f326a9a5fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 21 Jan 2025 10:57:06 +0100 Subject: [PATCH] Fix render hook's PlainText with typographer extension enabled Fixes #13286 Fixes #13292 --- markup/goldmark/goldmark_integration_test.go | 33 ++++++++++++++++++++ markup/goldmark/internal/render/context.go | 7 ++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go index 67348d894..184d0d7fc 100644 --- a/markup/goldmark/goldmark_integration_test.go +++ b/markup/goldmark/goldmark_integration_test.go @@ -527,6 +527,39 @@ a c ) } +// Issue 13286 +func TestImageAltApostrophesWithTypographer(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +[markup.goldmark.extensions.typographer] +disable = false + [markup.goldmark.renderHooks.image] + enableDefault = true +-- content/p1.md -- +--- +title: "p1" +--- + +## Image + +![A's is > than B's](some-image.png) + + +-- layouts/_default/single.html -- +{{ .Content }} +` + + b := hugolib.Test(t, files) + + b.AssertFileContentExact("public/p1/index.html", + // Note that this markup is slightly different than the one produced by the default Goldmark renderer, + // see issue 13292. + "alt=\"A’s is > than B’s\">", + ) +} + // Issue #7332 // Issue #11587 func TestGoldmarkEmojiExtension(t *testing.T) { diff --git a/markup/goldmark/internal/render/context.go b/markup/goldmark/internal/render/context.go index cd64fc944..32304fafa 100644 --- a/markup/goldmark/internal/render/context.go +++ b/markup/goldmark/internal/render/context.go @@ -27,6 +27,7 @@ import ( "github.com/gohugoio/hugo/markup/converter" "github.com/gohugoio/hugo/markup/converter/hooks" "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/util" ) type BufWriter struct { @@ -264,6 +265,8 @@ func (c *hookBase) PositionerSourceTarget() []byte { } // TextPlain returns a plain text representation of the given node. +// This will resolve any lefover HTML entities. This will typically be +// entities inserted by e.g. the typographer extension. // Goldmark's Node.Text was deprecated in 1.7.8. func TextPlain(n ast.Node, source []byte) string { buf := bp.GetBuffer() @@ -272,7 +275,7 @@ func TextPlain(n ast.Node, source []byte) string { for c := n.FirstChild(); c != nil; c = c.NextSibling() { textPlainTo(c, source, buf) } - return buf.String() + return string(util.ResolveEntityNames(buf.Bytes())) } func textPlainTo(c ast.Node, source []byte, buf *bytes.Buffer) { @@ -283,6 +286,8 @@ func textPlainTo(c ast.Node, source []byte, buf *bytes.Buffer) { case *ast.RawHTML: s := strings.TrimSpace(tpl.StripHTML(string(c.Segments.Value(source)))) buf.WriteString(s) + case *ast.String: + buf.Write(c.Value) case *ast.Text: buf.Write(c.Segment.Value(source)) default: