diff --git a/hugolib/content_render_hooks_test.go b/hugolib/content_render_hooks_test.go index de8eb720f..9df8d2e2e 100644 --- a/hugolib/content_render_hooks_test.go +++ b/hugolib/content_render_hooks_test.go @@ -350,3 +350,31 @@ Image: ![alt-"<>&](/destination-"<> 'title-"<>&') }) } } + +// Issue 13410. +func TestRenderHooksMultilineTitlePlainText(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +-- content/p1.md -- +--- +title: "p1" +--- + +First line. +Second line. +---------------- +-- layouts/_default/_markup/render-heading.html -- +Plain text: {{ .PlainText }}|Text: {{ .Text }}| +-- layouts/_default/single.html -- +Content: {{ .Content}}| +} +` + b := Test(t, files) + + b.AssertFileContent("public/p1/index.html", + "Content: Plain text: First line.\nSecond line.|", + "|Text: First line.\nSecond line.||\n", + ) +} diff --git a/markup/goldmark/goldmark_integration_test.go b/markup/goldmark/goldmark_integration_test.go index 184d0d7fc..a65600951 100644 --- a/markup/goldmark/goldmark_integration_test.go +++ b/markup/goldmark/goldmark_integration_test.go @@ -157,7 +157,7 @@ title: "p1" b := hugolib.Test(t, files) b.AssertFileContent("public/p1/index.html", - "

\n Hello Test\n\n #\n

", + "

\n Hello Test\n\n #\n

", ) } diff --git a/markup/goldmark/internal/extensions/attributes/attributes.go b/markup/goldmark/internal/extensions/attributes/attributes.go index 526635f45..f5f6f97b4 100644 --- a/markup/goldmark/internal/extensions/attributes/attributes.go +++ b/markup/goldmark/internal/extensions/attributes/attributes.go @@ -1,6 +1,8 @@ package attributes import ( + "strings" + "github.com/gohugoio/hugo/markup/goldmark/goldmark_config" "github.com/gohugoio/hugo/markup/goldmark/internal/render" "github.com/yuin/goldmark" @@ -181,12 +183,17 @@ func (a *transformer) generateAutoID(n ast.Node, reader text.Reader, pc parser.C } // Markdown settext headers can have multiple lines, use the last line for the ID. -func textHeadingID(node *ast.Heading, reader text.Reader) []byte { - var line []byte - lastIndex := node.Lines().Len() - 1 - if lastIndex > -1 { - lastLine := node.Lines().At(lastIndex) - line = lastLine.Value(reader.Source()) +func textHeadingID(n *ast.Heading, reader text.Reader) []byte { + text := render.TextPlain(n, reader.Source()) + if n.Lines().Len() > 1 { + + // For multiline headings, Goldmark's extension for headings returns the last line. + // We have a slightly different approach, but in most cases the end result should be the same. + // Instead of looking at the text segments in Lines (see #13405 for issues with that), + // we split the text above and use the last line. + parts := strings.Split(text, "\n") + text = parts[len(parts)-1] } - return line + + return []byte(text) } diff --git a/markup/goldmark/internal/extensions/attributes/attributes_integration_test.go b/markup/goldmark/internal/extensions/attributes/attributes_integration_test.go index fcce68ac2..90cf3d084 100644 --- a/markup/goldmark/internal/extensions/attributes/attributes_integration_test.go +++ b/markup/goldmark/internal/extensions/attributes/attributes_integration_test.go @@ -47,10 +47,12 @@ foo [something](/a/b/) bar Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď : Testing accents. -Mutiline set text header +Multiline set text header Second line --------------- +## Example [hyperlink](https://example.com/) in a header + -- layouts/_default/single.html -- {{ .Content }}|Identifiers: {{ .Fragments.Identifiers }}| ` @@ -68,7 +70,8 @@ Second line `
My Title
`, `
良善天父
`, `
Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď
`, - `

Mutiline set text header`, - "|Identifiers: [a-a-a-a-a-a-c-c-c-c-c-c-c-c-d base-name base-name-1 foo-something-bar foobar my-title my-title-1 second-line term title-with-id title-with-id]|", + `

`, + `