From c0d15a2897be0bc9f6df2514f5a477b6df1fa0e5 Mon Sep 17 00:00:00 2001 From: Khayyam Saleem Date: Fri, 27 Jan 2023 11:57:31 -0500 Subject: [PATCH] strings: fix Truncate behavior for formatted html 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 | 5 +++-- tpl/strings/truncate_test.go | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/tpl/strings/truncate.go b/tpl/strings/truncate.go index e8da7b84b..efa910618 100644 --- a/tpl/strings/truncate.go +++ b/tpl/strings/truncate.go @@ -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 { diff --git a/tpl/strings/truncate_test.go b/tpl/strings/truncate_test.go index 62125e1b4..e2339aa27 100644 --- a/tpl/strings/truncate_test.go +++ b/tpl/strings/truncate_test.go @@ -47,6 +47,23 @@ func TestTruncate(t *testing.T) { {3, template.HTML(strings.Repeat("

P

", 20)), nil, template.HTML("

P

P

P …

"), false}, {18, template.HTML("

test hello test something

"), nil, template.HTML("

test hello test …

"), false}, {4, template.HTML("

abc d e

"), nil, template.HTML("

abc …

"), false}, + { + 42, + template.HTML(`With strangely formatted + HTML + inside.`), + nil, + template.HTML(`With strangely formatted + HTML …`), + false, + }, {10, nil, nil, template.HTML(""), true}, {nil, nil, nil, template.HTML(""), true}, }