From 519f41dbd72d4b13208225ab5b28c6d98ecb07ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 29 May 2024 12:59:57 +0200 Subject: [PATCH] content adapter: Fix issue with content starting out with a shortcode Fixes #12544 --- hugolib/page__content.go | 18 +++++++------ .../pagesfromgotmpl_integration_test.go | 25 +++++++++++++++++++ parser/pageparser/pagelexer.go | 4 ++- parser/pageparser/pageparser.go | 6 ++++- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/hugolib/page__content.go b/hugolib/page__content.go index 1ef31f0f9..1119a8a95 100644 --- a/hugolib/page__content.go +++ b/hugolib/page__content.go @@ -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 } diff --git a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go index 7f0f19f1c..c7e3d96c7 100644 --- a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go +++ b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go @@ -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 +} diff --git a/parser/pageparser/pagelexer.go b/parser/pageparser/pagelexer.go index 5f90e3687..e3b0f1e54 100644 --- a/parser/pageparser/pagelexer.go +++ b/parser/pageparser/pagelexer.go @@ -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 diff --git a/parser/pageparser/pageparser.go b/parser/pageparser/pageparser.go index 9e8b6d803..988a80c83 100644 --- a/parser/pageparser/pageparser.go +++ b/parser/pageparser/pageparser.go @@ -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 }