// Copyright 2024 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 blockquotes_test import ( "path/filepath" "testing" "github.com/gohugoio/hugo/hugolib" ) func TestBlockquoteHook(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- [markup] [markup.goldmark] [markup.goldmark.parser] [markup.goldmark.parser.attribute] block = true title = true -- layouts/_default/_markup/render-blockquote.html -- Blockquote: |{{ .Text }}|{{ .Type }}| -- layouts/_default/_markup/render-blockquote-alert.html -- {{ $text := .Text }} Blockquote Alert: |{{ $text }}|{{ .Type }}| Blockquote Alert Attributes: |{{ $text }}|{{ .Attributes }}| Blockquote Alert Page: |{{ $text }}|{{ .Page.Title }}|{{ .PageInner.Title }}| {{ if .Attributes.showpos }} Blockquote Alert Position: |{{ $text }}|{{ .Position | safeHTML }}| {{ end }} -- layouts/_default/single.html -- Content: {{ .Content }} -- content/p1.md -- --- title: "p1" --- > [!NOTE] > This is a note with some whitespace after the alert type. > [!TIP] > This is a tip. > [!CAUTION] > This is a caution with some whitespace before the alert type. > A regular blockquote. > [!TIP] > This is a tip with attributes. {class="foo bar" id="baz"} > [!NOTE] > Note triggering showing the position. {showpos="true"} > [!nOtE] > Mixed case alert type. ` b := hugolib.Test(t, files) b.AssertFileContentExact("public/p1/index.html", "Blockquote Alert: |

This is a note with some whitespace after the alert type.

|alert|", "Blockquote Alert: |

This is a tip.

", "Blockquote Alert: |

This is a caution with some whitespace before the alert type.

|alert|", "Blockquote: |

A regular blockquote.

\n|regular|", "Blockquote Alert Attributes: |

This is a tip with attributes.

|map[class:foo bar id:baz]|", filepath.FromSlash("/content/p1.md:19:3"), "Blockquote Alert Page: |

This is a tip with attributes.

|p1|p1|", // Issue 12767. "Blockquote Alert: |

Mixed case alert type.

|alert", ) } func TestBlockquoteEmptyIssue12756(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- -- content/p1.md -- --- title: "p1" --- > -- layouts/_default/single.html -- Content: {{ .Content }} ` b := hugolib.Test(t, files) b.AssertFileContentExact("public/p1/index.html", "Content:
\n
\n") } func TestBlockquObsidianWithTitleAndSign(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- -- content/_index.md -- --- title: "Home" --- > [!danger] > Do not approach or handle without protective gear. > [!tip] Callouts can have custom titles > Like this one. > [!tip] Title-only callout > [!faq]- Foldable negated callout > Yes! In a foldable callout, the contents are hidden when the callout is collapsed > [!faq]+ Foldable callout > Yes! In a foldable callout, the contents are hidden when the callout is collapsed > [!info] Can callouts be nested? > > [!important] Yes!, they can. > > > [!tip] You can even use multiple layers of nesting. -- layouts/index.html -- {{ .Content }} -- layouts/_default/_markup/render-blockquote.html -- AlertType: {{ .AlertType }}|AlertTitle: {{ .AlertTitle }}|AlertSign: {{ .AlertSign | safeHTML }}|Text: {{ .Text }}| ` b := hugolib.Test(t, files) b.AssertFileContentExact("public/index.html", "AlertType: tip|AlertTitle: Callouts can have custom titles|AlertSign: |", "AlertType: tip|AlertTitle: Title-only callout|AlertSign: |", "AlertType: faq|AlertTitle: Foldable negated callout|AlertSign: -|Text:

Yes! In a foldable callout, the contents are hidden when the callout is collapsed

|", "AlertType: faq|AlertTitle: Foldable callout|AlertSign: +|Text:

Yes! In a foldable callout, the contents are hidden when the callout is collapsed

|", "AlertType: danger|AlertTitle: |AlertSign: |Text:

Do not approach or handle without protective gear.

|", "AlertTitle: Can callouts be nested?|", "AlertTitle: You can even use multiple layers of nesting.|", ) } // Issue 12913 // Issue 13119 func TestBlockquoteRenderHookTextParsing(t *testing.T) { t.Parallel() files := ` -- hugo.toml -- disableKinds = ['page','rss','section','sitemap','taxonomy','term'] -- layouts/index.html -- {{ .Content }} -- layouts/_default/_markup/render-blockquote.html -- AlertType: {{ .AlertType }}|AlertTitle: {{ .AlertTitle }}|Text: {{ .Text }}| -- content/_index.md -- --- title: home --- > [!one] > [!two] title > [!three] > line 1 > [!four] title > line 1 > [!five] > line 1 > line 2 > [!six] title > line 1 > line 2 > [!seven] > - list item > [!eight] title > - list item > [!nine] > line 1 > - list item > [!ten] title > line 1 > - list item > [!eleven] > line 1 > - list item > > line 2 > [!twelve] title > line 1 > - list item > > line 2 > [!thirteen] > ![alt](a.jpg) > [!fourteen] title > ![alt](a.jpg) > [!fifteen] _title_ > [!sixteen] _title_ > line one ` b := hugolib.Test(t, files) b.AssertFileContent("public/index.html", "AlertType: one|AlertTitle: |Text: |", "AlertType: two|AlertTitle: title|Text: |", "AlertType: three|AlertTitle: |Text:

line 1

|", "AlertType: four|AlertTitle: title|Text:

line 1

|", "AlertType: five|AlertTitle: |Text:

line 1\nline 2

|", "AlertType: six|AlertTitle: title|Text:

line 1\nline 2

|", "AlertType: seven|AlertTitle: |Text: |", "AlertType: eight|AlertTitle: title|Text: |", "AlertType: nine|AlertTitle: |Text:

line 1

\n|", "AlertType: ten|AlertTitle: title|Text:

line 1

\n|", "AlertType: eleven|AlertTitle: |Text:

line 1

\n\n

line 2

|", "AlertType: twelve|AlertTitle: title|Text:

line 1

\n\n

line 2

|", "AlertType: thirteen|AlertTitle: |Text:

\"alt\"

|", "AlertType: fourteen|AlertTitle: title|Text:

\"alt\"

|", "AlertType: fifteen|AlertTitle: title|Text: |", "AlertType: sixteen|AlertTitle: title|Text:

line one

|", ) }