Repository: gohugoio/hugo (language: go)

Issue:
Trim trailing newlines for normal blockquotes too, to mirror callout blockquotes
### What version of Hugo are you using (`hugo version`)?

<pre>
hugo v0.142.0+extended+withdeploy linux/amd64 BuildDate=unknown
</pre>

### Description

Related: https://github.com/gohugoio/hugo/issues/13301

Currently, trailing newlines are removed from blockquotes with callouts, but are kept for normal blockquotes, e.g.

```
<blockquote>
	<p>Example</p>

</blockquote>

<blockquote>
	<p>Example</p>
</blockquote>

```

This is slightly confusing (in that sense that it's unintuitive why they'd differ), even if easy enough to mitigate by reimplementing the trimming in the `render-blockquotes.html` file, so it'd be nice if both types of blockquotes mirrored each other for more consistent HTML output. It's pretty minor, but without a built-in way to prettify HTML in Hugo (related issue: https://github.com/gohugoio/hugo/issues/7190), it is something users will need to keep in mind when wanting to achieve clean & mostly reproducible output


Discussion / hints:
Apologies in advance if this is more a proposal; I wasn't sure if the fact the behaviour was different in the past would make it count as a bug or an enhancement

Fix patch:
diff --git a/markup/goldmark/blockquotes/blockquotes.go b/markup/goldmark/blockquotes/blockquotes.go
index 064200d5e9f..539cd187590 100644
--- a/markup/goldmark/blockquotes/blockquotes.go
+++ b/markup/goldmark/blockquotes/blockquotes.go
@@ -69,7 +69,7 @@ func (r *htmlRenderer) renderBlockquote(w util.BufWriter, src []byte, node ast.N
 		return ast.WalkContinue, nil
 	}
 
-	text := ctx.PopRenderedString()
+	text := strings.TrimSpace(ctx.PopRenderedString())
 
 	ordinal := ctx.GetAndIncrementOrdinal(ast.KindBlockquote)
 
@@ -90,7 +90,7 @@ func (r *htmlRenderer) renderBlockquote(w util.BufWriter, src []byte, node ast.N
 		// tag if the first line of the blockquote content does not have a
 		// closing p tag. At some point we might want to move this to the
 		// parser.
-		before, after, found := strings.Cut(strings.TrimSpace(text), "\n")
+		before, after, found := strings.Cut(text, "\n")
 		if found {
 			if strings.HasSuffix(before, "</p>") {
 				text = after


Test patch:
diff --git a/markup/goldmark/blockquotes/blockquotes_integration_test.go b/markup/goldmark/blockquotes/blockquotes_integration_test.go
index 93fe5b27d17..6f7914d0734 100644
--- a/markup/goldmark/blockquotes/blockquotes_integration_test.go
+++ b/markup/goldmark/blockquotes/blockquotes_integration_test.go
@@ -76,7 +76,7 @@ title: "p1"
 		"Blockquote Alert: |<p>This is a note with some whitespace after the alert type.</p>|alert|",
 		"Blockquote Alert: |<p>This is a tip.</p>",
 		"Blockquote Alert: |<p>This is a caution with some whitespace before the alert type.</p>|alert|",
-		"Blockquote: |<p>A regular blockquote.</p>\n|regular|",
+		"Blockquote: |<p>A regular blockquote.</p>|regular|",
 		"Blockquote Alert Attributes: |<p>This is a tip with attributes.</p>|map[class:foo bar id:baz]|",
 		filepath.FromSlash("/content/p1.md:19:3"),
 		"Blockquote Alert Page: |<p>This is a tip with attributes.</p>|p1|p1|",
@@ -155,6 +155,7 @@ AlertType: {{ .AlertType }}|AlertTitle: {{ .AlertTitle }}|AlertSign: {{ .AlertSi
 
 // Issue 12913
 // Issue 13119
+// Issue 13302
 func TestBlockquoteRenderHookTextParsing(t *testing.T) {
 	t.Parallel()
 
@@ -225,6 +226,7 @@ title: home
 > [!sixteen] _title_
 > line one
 
+> seventeen
 `
 
 	b := hugolib.Test(t, files)
@@ -246,5 +248,6 @@ title: home
 		"AlertType: fourteen|AlertTitle: title|Text: <p><img src=\"a.jpg\" alt=\"alt\"></p>|",
 		"AlertType: fifteen|AlertTitle: <em>title</em>|Text: |",
 		"AlertType: sixteen|AlertTitle: <em>title</em>|Text: <p>line one</p>|",
+		"AlertType: |AlertTitle: |Text: <p>seventeen</p>|",
 	)
 }