Fix render hook's PlainText with typographer extension enabled - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 6aa72acaf95723bef83051c4fceb1f326a9a5fab
DIR parent 9885e7020d75bb69f5ce67a766571bd0c4b119f5
HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date: Tue, 21 Jan 2025 10:57:06 +0100
Fix render hook's PlainText with typographer extension enabled
Fixes #13286
Fixes #13292
Diffstat:
M markup/goldmark/goldmark_integrati… | 33 +++++++++++++++++++++++++++++++
M markup/goldmark/internal/render/co… | 7 ++++++-
2 files changed, 39 insertions(+), 1 deletion(-)
---
DIR diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go
@@ -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
+
+
+
+
+-- 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) {
DIR diff --git 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: