diff options
author | Joe Mooring <[email protected]> | 2024-04-13 21:17:39 -0700 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2024-04-14 17:53:05 +0200 |
commit | 6049ba99f006389c444aaecee57ae88c1f21abfa (patch) | |
tree | 7daf09c8e495234062ede2ebcd750f7fc6e1ff57 /helpers | |
parent | 8e50ccfae721e204f79a2d5d221e37f0770289cd (diff) | |
download | hugo-6049ba99f006389c444aaecee57ae88c1f21abfa.tar.gz hugo-6049ba99f006389c444aaecee57ae88c1f21abfa.zip |
helpers: Fix TrimShortHTML when used with AsciiDoc content
Fixes #12369
Diffstat (limited to 'helpers')
-rw-r--r-- | helpers/content.go | 30 | ||||
-rw-r--r-- | helpers/content_test.go | 31 |
2 files changed, 33 insertions, 28 deletions
diff --git a/helpers/content.go b/helpers/content.go index 889294382..be79ad540 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -36,11 +36,6 @@ import ( "github.com/gohugoio/hugo/config" ) -var ( - openingPTag = []byte("<p>") - closingPTag = []byte("</p>") -) - // ContentSpec provides functionality to render markdown content. type ContentSpec struct { Converters markup.ConverterProvider @@ -242,19 +237,26 @@ func (c *ContentSpec) TruncateWordsToWholeSentence(s string) (string, bool) { return strings.TrimSpace(s[:endIndex]), endIndex < len(s) } -// TrimShortHTML removes the <p>/</p> tags from HTML input in the situation -// 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 { - if bytes.Count(input, openingPTag) == 1 { +// TrimShortHTML removes the outer tags from HTML input where (a) the opening +// tag is present only once with the input, and (b) the opening and closing +// tags wrap the input after white space removal. +func (c *ContentSpec) TrimShortHTML(input []byte, markup string) []byte { + openingTag := []byte("<p>") + closingTag := []byte("</p>") + + if markup == "asciidocext" { + openingTag = []byte("<div class=\"paragraph\">\n<p>") + closingTag = []byte("</p>\n</div>") + } + + if bytes.Count(input, openingTag) == 1 { input = bytes.TrimSpace(input) - if bytes.HasPrefix(input, openingPTag) && bytes.HasSuffix(input, closingPTag) { - input = bytes.TrimPrefix(input, openingPTag) - input = bytes.TrimSuffix(input, closingPTag) + if bytes.HasPrefix(input, openingTag) && bytes.HasSuffix(input, closingTag) { + input = bytes.TrimPrefix(input, openingTag) + input = bytes.TrimSuffix(input, closingTag) input = bytes.TrimSpace(input) } } - return input } diff --git a/helpers/content_test.go b/helpers/content_test.go index 53e18e727..f1cbfad04 100644 --- a/helpers/content_test.go +++ b/helpers/content_test.go @@ -26,24 +26,27 @@ import ( func TestTrimShortHTML(t *testing.T) { tests := []struct { - input, output []byte + markup string + input []byte + output []byte }{ - {[]byte(""), []byte("")}, - {[]byte("Plain text"), []byte("Plain 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>")}, + {"markdown", []byte(""), []byte("")}, + {"markdown", []byte("Plain text"), []byte("Plain text")}, + {"markdown", []byte("<p>Simple paragraph</p>"), []byte("Simple paragraph")}, + {"markdown", []byte("\n \n \t <p> \t Whitespace\nHTML \n\t </p>\n\t"), []byte("Whitespace\nHTML")}, + {"markdown", []byte("<p>Multiple</p><p>paragraphs</p>"), []byte("<p>Multiple</p><p>paragraphs</p>")}, + {"markdown", []byte("<p>Nested<p>paragraphs</p></p>"), []byte("<p>Nested<p>paragraphs</p></p>")}, + {"markdown", []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 + {"markdown", []byte("<h2 id=`a`>b</h2>\n\n<p>c</p>"), []byte("<h2 id=`a`>b</h2>\n\n<p>c</p>")}, + // Issue 12369 + {"markdown", []byte("<div class=\"paragraph\">\n<p>foo</p>\n</div>"), []byte("<div class=\"paragraph\">\n<p>foo</p>\n</div>")}, + {"asciidocext", []byte("<div class=\"paragraph\">\n<p>foo</p>\n</div>"), []byte("foo")}, } c := newTestContentSpec(nil) for i, test := range tests { - output := c.TrimShortHTML(test.input) + output := c.TrimShortHTML(test.input, test.markup) if !bytes.Equal(test.output, output) { t.Errorf("Test %d failed. Expected %q got %q", i, test.output, output) } @@ -54,7 +57,7 @@ func BenchmarkTrimShortHTML(b *testing.B) { c := newTestContentSpec(nil) b.ResetTimer() for i := 0; i < b.N; i++ { - c.TrimShortHTML([]byte("<p>Simple paragraph</p>")) + c.TrimShortHTML([]byte("<p>Simple paragraph</p>"), "markdown") } } |