]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Prevent double escaping of image alt-text in Goldmar typographer
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 30 May 2023 11:21:45 +0000 (13:21 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 30 May 2023 13:03:54 +0000 (15:03 +0200)
Fixes #11045

markup/goldmark/convert_test.go
markup/goldmark/render_hooks.go

index 05279cd2c5879077f04f63406b0143b095d39e7a..6665298770534c31664cf366bceed8dcbabe0873 100644 (file)
@@ -584,6 +584,29 @@ rightDoubleQuote = "&raquo;"
        c.Assert(got, qt.Contains, "<p>A &laquo;quote&raquo; and &lsquo;another quote&rsquo; and a &laquo;quote with a &rsquo;nested&rsquo; quote&raquo; and a &lsquo;quote with a &laquo;nested&raquo; quote&rsquo; and an ellipsis&hellip;</p>\n")
 }
 
+// Issue #11045
+func TestTypographerImageAltText(t *testing.T) {
+       c := qt.New(t)
+
+       content := `
+!["They didn't even say 'hello'!" I exclaimed.](https://example.com/image.jpg)
+`
+
+       confStr := `
+[markup]
+[markup.goldmark]
+
+`
+
+       cfg := config.FromTOMLConfigString(confStr)
+       conf := testconfig.GetTestConfig(nil, cfg)
+
+       b := convert(c, conf, content)
+       got := string(b.Bytes())
+
+       c.Assert(got, qt.Contains, "&ldquo;They didn&rsquo;t even say &lsquo;hello&rsquo;!&rdquo; I exclaimed.")
+}
+
 func unsafeConf() config.AllProvider {
        cfg := config.FromTOMLConfigString(`
 [markup]
index 0bd800dc0d94a7f2bc60f4f32e9f9253fe5471aa..60a3a1efee3eb5d1cbc2796f00c4cb79d007ec9a 100644 (file)
@@ -225,7 +225,7 @@ func (r *hookedRenderer) renderImageDefault(w util.BufWriter, source []byte, nod
                _, _ = w.Write(util.EscapeHTML(util.URLEscape(n.Destination, true)))
        }
        _, _ = w.WriteString(`" alt="`)
-       _, _ = w.Write(util.EscapeHTML(n.Text(source)))
+       _, _ = w.Write(nodeToHTMLText(n, source))
        _ = w.WriteByte('"')
        if n.Title != nil {
                _, _ = w.WriteString(` title="`)
@@ -475,3 +475,18 @@ func (e *links) Extend(m goldmark.Markdown) {
                util.Prioritized(newLinkRenderer(e.cfg), 100),
        ))
 }
+
+// Borrowed from Goldmark.
+func nodeToHTMLText(n ast.Node, source []byte) []byte {
+       var buf bytes.Buffer
+       for c := n.FirstChild(); c != nil; c = c.NextSibling() {
+               if s, ok := c.(*ast.String); ok && s.IsCode() {
+                       buf.Write(s.Text(source))
+               } else if !c.HasChildren() {
+                       buf.Write(util.EscapeHTML(c.Text(source)))
+               } else {
+                       buf.Write(nodeToHTMLText(c, source))
+               }
+       }
+       return buf.Bytes()
+}