From 4cfdfa12d6f9386040672513c64aced6a3220b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 1 Jun 2024 10:27:10 +0200 Subject: [PATCH] content adapter: Handle separator in content.value Closes #12556 --- hugolib/page__per_output.go | 5 +- .../pagesfromgotmpl_integration_test.go | 26 ++++++++ parser/pageparser/pagelexer.go | 59 +++++++++++-------- parser/pageparser/pagelexer_intro.go | 2 - parser/pageparser/pageparser.go | 9 --- parser/pageparser/pageparser_test.go | 11 ++++ 6 files changed, 75 insertions(+), 37 deletions(-) diff --git a/hugolib/page__per_output.go b/hugolib/page__per_output.go index 5b039b91b04..6dffd18a579 100644 --- a/hugolib/page__per_output.go +++ b/hugolib/page__per_output.go @@ -307,7 +307,10 @@ func (pco *pageContentOutput) RenderString(ctx context.Context, args ...any) (te if pageparser.HasShortcode(contentToRender) { contentToRenderb := []byte(contentToRender) // String contains a shortcode. - parseInfo.itemsStep1, err = pageparser.ParseBytesMain(contentToRenderb, pageparser.Config{}) + parseInfo.itemsStep1, err = pageparser.ParseBytes(contentToRenderb, pageparser.Config{ + NoFrontMatter: true, + NoSummaryDivider: true, + }) if err != nil { return "", err } diff --git a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go index cbb2da75c86..f351cbb9871 100644 --- a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go +++ b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go @@ -643,3 +643,29 @@ Footer: {{ range index site.Menus.footer }}{{ .Name }}|{{ end }}| "Footer: Footer|p2||", ) } + +func TestPagesFromGoTmplMore(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +[markup.goldmark.renderer] +unsafe = true +-- content/s1/_content.gotmpl -- +{{ $page := dict + "content" (dict "mediaType" "text/markdown" "value" "aaa bbb") + "title" "p1" + "path" "p1" + }} + {{ .AddPage $page }} +-- layouts/_default/single.html -- +summary: {{ .Summary }}|content: {{ .Content}} +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/s1/p1/index.html", + "

aaa

|content:

aaa

\n

bbb

", + ) +} diff --git a/parser/pageparser/pagelexer.go b/parser/pageparser/pagelexer.go index e3b0f1e5468..a5f64b0371b 100644 --- a/parser/pageparser/pagelexer.go +++ b/parser/pageparser/pagelexer.go @@ -63,16 +63,18 @@ func (l *pageLexer) Input() []byte { } type Config struct { - NoFrontMatter bool + NoFrontMatter bool + NoSummaryDivider bool } // note: the input position here is normally 0 (start), but // can be set if position of first shortcode is known func newPageLexer(input []byte, stateStart stateFunc, cfg Config) *pageLexer { lexer := &pageLexer{ - input: input, - stateStart: stateStart, - cfg: cfg, + input: input, + stateStart: stateStart, + summaryDivider: summaryDivider, + cfg: cfg, lexerShortcodeState: lexerShortcodeState{ currLeftDelimItem: tLeftDelimScNoMarkup, currRightDelimItem: tRightDelimScNoMarkup, @@ -297,6 +299,8 @@ func (s *sectionHandlers) skip() int { } func createSectionHandlers(l *pageLexer) *sectionHandlers { + handlers := make([]*sectionHandler, 0, 2) + shortCodeHandler := §ionHandler{ l: l, skipFunc: func(l *pageLexer) int { @@ -332,30 +336,35 @@ func createSectionHandlers(l *pageLexer) *sectionHandlers { }, } - summaryDividerHandler := §ionHandler{ - l: l, - skipFunc: func(l *pageLexer) int { - if l.summaryDividerChecked || l.summaryDivider == nil { - return -1 - } - return l.index(l.summaryDivider) - }, - lexFunc: func(origin stateFunc, l *pageLexer) (stateFunc, bool) { - if !l.hasPrefix(l.summaryDivider) { - return origin, false - } + handlers = append(handlers, shortCodeHandler) - l.summaryDividerChecked = true - l.pos += len(l.summaryDivider) - // This makes it a little easier to reason about later. - l.consumeSpace() - l.emit(TypeLeadSummaryDivider) + if !l.cfg.NoSummaryDivider { + summaryDividerHandler := §ionHandler{ + l: l, + skipFunc: func(l *pageLexer) int { + if l.summaryDividerChecked { + return -1 + } + return l.index(l.summaryDivider) + }, + lexFunc: func(origin stateFunc, l *pageLexer) (stateFunc, bool) { + if !l.hasPrefix(l.summaryDivider) { + return origin, false + } - return origin, true - }, - } + l.summaryDividerChecked = true + l.pos += len(l.summaryDivider) + // This makes it a little easier to reason about later. + l.consumeSpace() + l.emit(TypeLeadSummaryDivider) - handlers := []*sectionHandler{shortCodeHandler, summaryDividerHandler} + return origin, true + }, + } + + handlers = append(handlers, summaryDividerHandler) + + } return §ionHandlers{ l: l, diff --git a/parser/pageparser/pagelexer_intro.go b/parser/pageparser/pagelexer_intro.go index 0ff0958fee5..925c61c9e58 100644 --- a/parser/pageparser/pagelexer_intro.go +++ b/parser/pageparser/pagelexer_intro.go @@ -14,8 +14,6 @@ package pageparser func lexIntroSection(l *pageLexer) stateFunc { - l.summaryDivider = summaryDivider - LOOP: for { r := l.next() diff --git a/parser/pageparser/pageparser.go b/parser/pageparser/pageparser.go index 988a80c83cf..1cf87bb70c8 100644 --- a/parser/pageparser/pageparser.go +++ b/parser/pageparser/pageparser.go @@ -47,15 +47,6 @@ func ParseBytes(b []byte, cfg Config) (Items, error) { return l.items, l.err } -// ParseBytesMain parses b starting with the main section. -func ParseBytesMain(b []byte, cfg Config) (Items, error) { - l, err := parseBytes(b, cfg, lexMainSection) - if err != nil { - return nil, err - } - return l.items, l.err -} - type ContentFrontMatter struct { Content []byte FrontMatter map[string]any diff --git a/parser/pageparser/pageparser_test.go b/parser/pageparser/pageparser_test.go index a50ab46e9d7..c6bedbd6fd3 100644 --- a/parser/pageparser/pageparser_test.go +++ b/parser/pageparser/pageparser_test.go @@ -101,3 +101,14 @@ func BenchmarkHasShortcode(b *testing.B) { } }) } + +func TestSummaryDividerStartingFromMain(t *testing.T) { + c := qt.New(t) + + input := `aaa bbb` + items, err := collectStringMain(input) + c.Assert(err, qt.IsNil) + + c.Assert(items, qt.HasLen, 4) + c.Assert(items[1].Type, qt.Equals, TypeLeadSummaryDivider) +}