]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
strings: fix Truncate behavior for formatted html
authorKhayyam Saleem <hello@khayyam.me>
Fri, 27 Jan 2023 16:57:31 +0000 (11:57 -0500)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 1 Mar 2023 16:59:50 +0000 (17:59 +0100)
Before this fix, strings.Truncate would erroneously re-include
attributes from the opening tag in the closing tag when closing
formatted html, due to a bug in how tagnames were extracted from the
regex capture group for html tags used in `truncate.go`. This change
ensures that only the tagname is retained and all attributes are discarded
when storing the tags for closing them later.

Fixes #10399

tpl/strings/truncate.go
tpl/strings/truncate_test.go

index e8da7b84b506aaee08e7e17fd312fcf5239492b8..efa910618219f0d1f2a46612360d66b284f8ba29 100644 (file)
@@ -18,6 +18,7 @@ import (
        "html"
        "html/template"
        "regexp"
+       "strings"
        "unicode"
        "unicode/utf8"
 
@@ -92,12 +93,12 @@ func (ns *Namespace) Truncate(s any, options ...any) (template.HTML, error) {
                }
 
                if isHTML {
-                       // Make sure we keep tag of HTML tags
+                       // Make sure we keep tagname of HTML tags
                        slice := text[i:]
                        m := tagRE.FindStringSubmatchIndex(slice)
                        if len(m) > 0 && m[0] == 0 {
                                nextTag = i + m[1]
-                               tagname := slice[m[4]:m[5]]
+                               tagname := strings.Fields(slice[m[4]:m[5]])[0]
                                lastWordIndex = lastNonSpace
                                _, singlet := htmlSinglets[tagname]
                                if !singlet && m[6] == -1 {
index 62125e1b4e70fd68d2379f41cd77ae548c5ea33c..e2339aa2739b46b8e1b77587c807f5300939d1ba 100644 (file)
@@ -47,6 +47,23 @@ func TestTruncate(t *testing.T) {
                {3, template.HTML(strings.Repeat("<p>P</p>", 20)), nil, template.HTML("<p>P</p><p>P</p><p>P …</p>"), false},
                {18, template.HTML("<p>test <b>hello</b> test something</p>"), nil, template.HTML("<p>test <b>hello</b> test …</p>"), false},
                {4, template.HTML("<p>a<b><i>b</b>c d e</p>"), nil, template.HTML("<p>a<b><i>b</b>c …</p>"), false},
+               {
+                       42,
+                       template.HTML(`With strangely formatted
+                                                       <a
+                                                       href="#"
+                                                               target="_blank"
+                                                       >HTML</a
+                                                       >
+                                                       inside.`),
+                       nil,
+                       template.HTML(`With strangely formatted
+                                                       <a
+                                                       href="#"
+                                                               target="_blank"
+                                                       >HTML …</a>`),
+                       false,
+               },
                {10, nil, nil, template.HTML(""), true},
                {nil, nil, nil, template.HTML(""), true},
        }