]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Fix render hook's PlainText with typographer extension enabled
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 21 Jan 2025 09:57:06 +0000 (10:57 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 22 Jan 2025 11:49:25 +0000 (12:49 +0100)
Fixes #13286
Fixes #13292

markup/goldmark/goldmark_integration_test.go
markup/goldmark/internal/render/context.go

index 67348d894d850955926e5a52abb53da24ce1f5bf..184d0d7fc8c4bb13745042330f7f81191547742a 100644 (file)
@@ -527,6 +527,39 @@ a <!-- b --> 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 &gt; than B’s\">",
+       )
+}
+
 // Issue #7332
 // Issue #11587
 func TestGoldmarkEmojiExtension(t *testing.T) {
index cd64fc9449895d88c3fac1f341d22426a197a967..32304fafaa3020468483894e37dcb040660403a7 100644 (file)
@@ -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: