From 0bde6931ac8fb288565b6f951f6e10adf529d527 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Sat, 11 Nov 2023 21:27:44 -0800 Subject: [PATCH] helpers: Fix TrimShortHTML used by markdownify and RenderString Closes #11698 --- helpers/content.go | 17 ++++---- helpers/content_test.go | 5 ++- tpl/transform/integration_test.go | 67 +++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 tpl/transform/integration_test.go diff --git a/helpers/content.go b/helpers/content.go index 510d496b9..c0a6d8221 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -251,18 +251,15 @@ func (c *ContentSpec) TruncateWordsToWholeSentence(s string) (string, bool) { // where said tags are the only

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 } diff --git a/helpers/content_test.go b/helpers/content_test.go index 2909c0266..72e3eeb49 100644 --- a/helpers/content_test.go +++ b/helpers/content_test.go @@ -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("

Simple paragraph

"), []byte("Simple paragraph")}, {[]byte("\n \n \t

\t Whitespace\nHTML \n\t

\n\t"), []byte("Whitespace\nHTML")}, {[]byte("

Multiple

paragraphs

"), []byte("

Multiple

paragraphs

")}, {[]byte("

Nested

paragraphs

"), []byte("

Nested

paragraphs

")}, {[]byte("

Hello

\n"), []byte("

Hello

\n")}, + // Issue #11698 + {[]byte("

b

\n\n

c

"), []byte("

b

\n\n

c

")}, } c := newTestContentSpec(nil) diff --git a/tpl/transform/integration_test.go b/tpl/transform/integration_test.go new file mode 100644 index 000000000..17348928d --- /dev/null +++ b/tpl/transform/integration_test.go @@ -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", "_

foo

\n

bar

\n_") + b.AssertFileContent("public/p3/index.html", "_

foo

\n

bar

\n_") + b.AssertFileContent("public/p4/index.html", "_

foo

\n_") +}