mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-07 20:30:36 -05:00
parent
4ef9baf5bd
commit
168858331f
4 changed files with 78 additions and 2 deletions
|
@ -384,8 +384,8 @@ func (p *pageContentOutput) RenderString(args ...any) (template.HTML, error) {
|
||||||
|
|
||||||
var rendered []byte
|
var rendered []byte
|
||||||
|
|
||||||
if strings.Contains(contentToRender, "{{") {
|
if pageparser.HasShortcode(contentToRender) {
|
||||||
// Probably a shortcode.
|
// String contains a shortcode.
|
||||||
parsed, err := pageparser.ParseMain(strings.NewReader(contentToRender), pageparser.Config{})
|
parsed, err := pageparser.ParseMain(strings.NewReader(contentToRender), pageparser.Config{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|
|
@ -190,3 +190,39 @@ Has other: false
|
||||||
`)
|
`)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRenderStringWithShortcodeIssue10654(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
files := `
|
||||||
|
-- config.toml --
|
||||||
|
timeout = '300ms'
|
||||||
|
-- content/p1.md --
|
||||||
|
---
|
||||||
|
title: "P1"
|
||||||
|
---
|
||||||
|
{{< toc >}}
|
||||||
|
|
||||||
|
## Heading 1
|
||||||
|
|
||||||
|
{{< noop >}}
|
||||||
|
{{ not a shortcode
|
||||||
|
{{< /noop >}}
|
||||||
|
}
|
||||||
|
-- layouts/shortcodes/noop.html --
|
||||||
|
{{ .Inner | $.Page.RenderString }}
|
||||||
|
-- layouts/shortcodes/toc.html --
|
||||||
|
{{ .Page.TableOfContents }}
|
||||||
|
-- layouts/_default/single.html --
|
||||||
|
{{ .Content }}
|
||||||
|
`
|
||||||
|
|
||||||
|
b := NewIntegrationTestBuilder(
|
||||||
|
IntegrationTestConfig{
|
||||||
|
T: t,
|
||||||
|
TxtarString: files,
|
||||||
|
},
|
||||||
|
).Build()
|
||||||
|
|
||||||
|
b.AssertFileContent("public/p1/index.html", `TableOfContents`)
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/gohugoio/hugo/parser/metadecoders"
|
"github.com/gohugoio/hugo/parser/metadecoders"
|
||||||
)
|
)
|
||||||
|
@ -234,3 +236,14 @@ func IsProbablySourceOfItems(source []byte, items Items) bool {
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var hasShortcodeRe = regexp.MustCompile(`{{[%,<][^\/]`)
|
||||||
|
|
||||||
|
// HasShortcode returns true if the given string contains a shortcode.
|
||||||
|
func HasShortcode(s string) bool {
|
||||||
|
// Fast path for the common case.
|
||||||
|
if !strings.Contains(s, "{{") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return hasShortcodeRe.MatchString(s)
|
||||||
|
}
|
||||||
|
|
|
@ -101,3 +101,30 @@ func TestIsProbablyItemsSource(t *testing.T) {
|
||||||
c.Assert(IsProbablySourceOfItems([]byte(`{{< foo >}} `), items), qt.IsFalse)
|
c.Assert(IsProbablySourceOfItems([]byte(`{{< foo >}} `), items), qt.IsFalse)
|
||||||
c.Assert(IsProbablySourceOfItems([]byte(``), items), qt.IsFalse)
|
c.Assert(IsProbablySourceOfItems([]byte(``), items), qt.IsFalse)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHasShortcode(t *testing.T) {
|
||||||
|
c := qt.New(t)
|
||||||
|
|
||||||
|
c.Assert(HasShortcode("{{< foo >}}"), qt.IsTrue)
|
||||||
|
c.Assert(HasShortcode("aSDasd SDasd aSD\n\nasdfadf{{% foo %}}\nasdf"), qt.IsTrue)
|
||||||
|
c.Assert(HasShortcode("{{</* foo */>}}"), qt.IsFalse)
|
||||||
|
c.Assert(HasShortcode("{{%/* foo */%}}"), qt.IsFalse)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkHasShortcode(b *testing.B) {
|
||||||
|
withShortcode := strings.Repeat("this is text", 30) + "{{< myshortcode >}}This is some inner content.{{< /myshortcode >}}" + strings.Repeat("this is text", 30)
|
||||||
|
withoutShortcode := strings.Repeat("this is text", 30) + "This is some inner content." + strings.Repeat("this is text", 30)
|
||||||
|
b.Run("Match", func(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
HasShortcode(withShortcode)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
b.Run("NoMatch", func(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
HasShortcode(withoutShortcode)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue