]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
content adapter: Fix issue with content starting out with a shortcode
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 29 May 2024 10:59:57 +0000 (12:59 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 30 May 2024 09:29:21 +0000 (11:29 +0200)
Fixes #12544

hugolib/page__content.go
hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go
parser/pageparser/pagelexer.go
parser/pageparser/pageparser.go

index 1ef31f0f9860f47e1e68e70d3d67e264a2c68aa1..1119a8a95bba7c15b0c6afd971ed6d0caf5d654e 100644 (file)
@@ -57,14 +57,14 @@ type pageContentReplacement struct {
 
 func (m *pageMeta) parseFrontMatter(h *HugoSites, pid uint64) (*contentParseInfo, error) {
        var (
-               sourceKey  string
-               openSource hugio.OpenReadSeekCloser
-               hasContent = m.pageConfig.IsFromContentAdapter
+               sourceKey            string
+               openSource           hugio.OpenReadSeekCloser
+               isFromContentAdapter = m.pageConfig.IsFromContentAdapter
        )
 
-       if m.f != nil && !hasContent {
+       if m.f != nil && !isFromContentAdapter {
                sourceKey = filepath.ToSlash(m.f.Filename())
-               if !hasContent {
+               if !isFromContentAdapter {
                        meta := m.f.FileInfo().Meta()
                        openSource = func() (hugio.ReadSeekCloser, error) {
                                r, err := meta.Open()
@@ -74,7 +74,7 @@ func (m *pageMeta) parseFrontMatter(h *HugoSites, pid uint64) (*contentParseInfo
                                return r, nil
                        }
                }
-       } else if hasContent {
+       } else if isFromContentAdapter {
                openSource = m.pageConfig.Content.ValueAsOpenReadSeekCloser()
        }
 
@@ -96,7 +96,9 @@ func (m *pageMeta) parseFrontMatter(h *HugoSites, pid uint64) (*contentParseInfo
 
        items, err := pageparser.ParseBytes(
                source,
-               pageparser.Config{},
+               pageparser.Config{
+                       NoFrontMatter: isFromContentAdapter,
+               },
        )
        if err != nil {
                return nil, err
@@ -104,7 +106,7 @@ func (m *pageMeta) parseFrontMatter(h *HugoSites, pid uint64) (*contentParseInfo
 
        pi.itemsStep1 = items
 
-       if hasContent {
+       if isFromContentAdapter {
                // No front matter.
                return pi, nil
        }
index 7f0f19f1c9399c3006300e52fc045f107970c91e..c7e3d96c7b8722d0078130fd9e221fc4967dd1d9 100644 (file)
@@ -585,3 +585,28 @@ value: data1
 
        b.AssertLogNotContains("WARN")
 }
+
+func TestPagesFromGoTmplShortcodeNoPreceddingCharacterIssue12544(t *testing.T) {
+       t.Parallel()
+
+       files := `
+-- hugo.toml --
+disableKinds = ['home','rss','section','sitemap','taxonomy','term']
+-- content/_content.gotmpl --
+{{ $content := dict "mediaType" "text/html" "value" "x{{< sc >}}" }}
+{{ .AddPage (dict "content" $content "path" "a") }}
+
+{{ $content := dict "mediaType" "text/html" "value" "{{< sc >}}" }}
+{{ .AddPage (dict "content" $content "path" "b") }}
+-- layouts/_default/single.html --
+|{{ .Content }}|
+-- layouts/shortcodes/sc.html --
+foo
+{{- /**/ -}}
+`
+
+       b := hugolib.Test(t, files)
+
+       b.AssertFileContent("public/a/index.html", "|xfoo|")
+       b.AssertFileContent("public/b/index.html", "|foo|") // fails
+}
index 5f90e3687b37d5aedb0d54ea3bbc273598a7bd59..e3b0f1e546832bb70ef30ba4911d2a297e8eee44 100644 (file)
@@ -62,7 +62,9 @@ func (l *pageLexer) Input() []byte {
        return l.input
 }
 
-type Config struct{}
+type Config struct {
+       NoFrontMatter bool
+}
 
 // note: the input position here is normally 0 (start), but
 // can be set if position of first shortcode is known
index 9e8b6d8032beb8e2bda47ed0a469ebcbd7d52629..988a80c83cfe9167affde1c42920ac24a1f7de68 100644 (file)
@@ -36,7 +36,11 @@ var _ Result = (*pageLexer)(nil)
 
 // ParseBytes parses the page in b according to the given Config.
 func ParseBytes(b []byte, cfg Config) (Items, error) {
-       l, err := parseBytes(b, cfg, lexIntroSection)
+       startLexer := lexIntroSection
+       if cfg.NoFrontMatter {
+               startLexer = lexMainSection
+       }
+       l, err := parseBytes(b, cfg, startLexer)
        if err != nil {
                return nil, err
        }