mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
helpers: Fix TrimShortHTML used by markdownify and RenderString
Closes #11698
This commit is contained in:
parent
ac7cffa7e2
commit
0bde6931ac
3 changed files with 78 additions and 11 deletions
|
@ -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
|
// where said tags are the only <p> tags in the input and enclose the content
|
||||||
// of the input (whitespace excluded).
|
// of the input (whitespace excluded).
|
||||||
func (c *ContentSpec) TrimShortHTML(input []byte) []byte {
|
func (c *ContentSpec) TrimShortHTML(input []byte) []byte {
|
||||||
firstOpeningP := bytes.Index(input, paragraphIndicator)
|
if bytes.Count(input, openingPTag) == 1 {
|
||||||
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)
|
|
||||||
input = bytes.TrimSpace(input)
|
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
|
return input
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,12 +32,15 @@ func TestTrimShortHTML(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
{[]byte(""), []byte("")},
|
{[]byte(""), []byte("")},
|
||||||
{[]byte("Plain text"), []byte("Plain text")},
|
{[]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("<p>Simple paragraph</p>"), []byte("Simple paragraph")},
|
||||||
{[]byte("\n \n \t <p> \t Whitespace\nHTML \n\t </p>\n\t"), []byte("Whitespace\nHTML")},
|
{[]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>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>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>")},
|
{[]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)
|
c := newTestContentSpec(nil)
|
||||||
|
|
67
tpl/transform/integration_test.go
Normal file
67
tpl/transform/integration_test.go
Normal file
|
@ -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_")
|
||||||
|
}
|
Loading…
Reference in a new issue