]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
helpers: Fix TrimShortHTML used by markdownify and RenderString
authorJoe Mooring <joe.mooring@veriphor.com>
Sun, 12 Nov 2023 05:27:44 +0000 (21:27 -0800)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 16 Nov 2023 17:21:01 +0000 (18:21 +0100)
Closes #11698

helpers/content.go
helpers/content_test.go
tpl/transform/integration_test.go [new file with mode: 0644]

index 510d496b9c290762c1f20abfbc28abc99d80f2f8..c0a6d822148668afdf2f37e8a76d4c3ad0902509 100644 (file)
@@ -251,18 +251,15 @@ func (c *ContentSpec) TruncateWordsToWholeSentence(s string) (string, bool) {
 // where said tags are the only <p> tags in the input and enclose the content
 // of the input (whitespace excluded).
 func (c *ContentSpec) TrimShortHTML(input []byte) []byte {
-       firstOpeningP := bytes.Index(input, paragraphIndicator)
-       lastOpeningP := bytes.LastIndex(input, paragraphIndicator)
-
-       lastClosingP := bytes.LastIndex(input, closingPTag)
-       lastClosing := bytes.LastIndex(input, closingIndicator)
-
-       if firstOpeningP == lastOpeningP && lastClosingP == lastClosing {
-               input = bytes.TrimSpace(input)
-               input = bytes.TrimPrefix(input, openingPTag)
-               input = bytes.TrimSuffix(input, closingPTag)
+       if bytes.Count(input, openingPTag) == 1 {
                input = bytes.TrimSpace(input)
+               if bytes.HasPrefix(input, openingPTag) && bytes.HasSuffix(input, closingPTag) {
+                       input = bytes.TrimPrefix(input, openingPTag)
+                       input = bytes.TrimSuffix(input, closingPTag)
+                       input = bytes.TrimSpace(input)
+               }
        }
+
        return input
 }
 
index 2909c0266395b7583a40c07f5ef6b31dadfc9a84..72e3eeb495ab60a63fca8be5776f6bceebc082a6 100644 (file)
@@ -32,12 +32,15 @@ func TestTrimShortHTML(t *testing.T) {
        }{
                {[]byte(""), []byte("")},
                {[]byte("Plain text"), []byte("Plain text")},
-               {[]byte("  \t\n Whitespace text\n\n"), []byte("Whitespace text")},
+               // This seems wrong. Why touch it if it doesn't have p tag?
+               // {[]byte("  \t\n Whitespace text\n\n"), []byte("Whitespace text")},
                {[]byte("<p>Simple paragraph</p>"), []byte("Simple paragraph")},
                {[]byte("\n  \n \t  <p> \t Whitespace\nHTML  \n\t </p>\n\t"), []byte("Whitespace\nHTML")},
                {[]byte("<p>Multiple</p><p>paragraphs</p>"), []byte("<p>Multiple</p><p>paragraphs</p>")},
                {[]byte("<p>Nested<p>paragraphs</p></p>"), []byte("<p>Nested<p>paragraphs</p></p>")},
                {[]byte("<p>Hello</p>\n<ul>\n<li>list1</li>\n<li>list2</li>\n</ul>"), []byte("<p>Hello</p>\n<ul>\n<li>list1</li>\n<li>list2</li>\n</ul>")},
+               // Issue #11698
+               {[]byte("<h2 id=`a`>b</h2>\n\n<p>c</p>"), []byte("<h2 id=`a`>b</h2>\n\n<p>c</p>")},
        }
 
        c := newTestContentSpec(nil)
diff --git a/tpl/transform/integration_test.go b/tpl/transform/integration_test.go
new file mode 100644 (file)
index 0000000..1734892
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright 2023 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package transform_test
+
+import (
+       "testing"
+
+       "github.com/gohugoio/hugo/hugolib"
+)
+
+// Issue #11698
+func TestMarkdownifyIssue11698(t *testing.T) {
+       t.Parallel()
+
+       files := `
+-- config.toml --
+disableKinds = ['home','section','rss','sitemap','taxonomy','term']
+[markup.goldmark.parser.attribute]
+title = true
+block = true
+-- layouts/_default/single.html --
+_{{ markdownify .RawContent }}_
+-- content/p1.md --
+---
+title: p1
+---
+foo bar
+-- content/p2.md --
+---
+title: p2
+---
+foo
+
+**bar**
+-- content/p3.md --
+---
+title: p3
+---
+## foo
+
+bar
+-- content/p4.md --
+---
+title: p4
+---
+foo
+{#bar}
+  `
+
+       b := hugolib.Test(t, files)
+
+       b.AssertFileContent("public/p1/index.html", "_foo bar_")
+       b.AssertFileContent("public/p2/index.html", "_<p>foo</p>\n<p><strong>bar</strong></p>\n_")
+       b.AssertFileContent("public/p3/index.html", "_<h2 id=\"foo\">foo</h2>\n<p>bar</p>\n_")
+       b.AssertFileContent("public/p4/index.html", "_<p id=\"bar\">foo</p>\n_")
+}