summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2024-06-01 10:27:10 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2024-06-01 12:04:05 +0200
commit0221ddb39ee5d49387a779bc83af464e42fb3ebe (patch)
tree33ff51d4a795e396189b4bd3c2654427bf279b81
parent74b9b8a2297852f37be55d4e12acb79de492707b (diff)
content adapter: Handle <!--more--> separator in content.value
Closes #12556
-rw-r--r--hugolib/page__per_output.go5
-rw-r--r--hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go26
-rw-r--r--parser/pageparser/pagelexer.go59
-rw-r--r--parser/pageparser/pagelexer_intro.go2
-rw-r--r--parser/pageparser/pageparser.go9
-rw-r--r--parser/pageparser/pageparser_test.go11
6 files changed, 75 insertions, 37 deletions
diff --git a/hugolib/page__per_output.go b/hugolib/page__per_output.go
index 5b039b91b..6dffd18a5 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 cbb2da75c..f351cbb98 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 <!--more--> 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",
+ "<p>aaa</p>|content: <p>aaa</p>\n<p>bbb</p>",
+ )
+}
diff --git a/parser/pageparser/pagelexer.go b/parser/pageparser/pagelexer.go
index e3b0f1e54..a5f64b037 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 := &sectionHandler{
l: l,
skipFunc: func(l *pageLexer) int {
@@ -332,30 +336,35 @@ func createSectionHandlers(l *pageLexer) *sectionHandlers {
},
}
- summaryDividerHandler := &sectionHandler{
- 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 := &sectionHandler{
+ 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 &sectionHandlers{
l: l,
diff --git a/parser/pageparser/pagelexer_intro.go b/parser/pageparser/pagelexer_intro.go
index 0ff0958fe..925c61c9e 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 988a80c83..1cf87bb70 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 a50ab46e9..c6bedbd6f 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 <!--more--> bbb`
+ items, err := collectStringMain(input)
+ c.Assert(err, qt.IsNil)
+
+ c.Assert(items, qt.HasLen, 4)
+ c.Assert(items[1].Type, qt.Equals, TypeLeadSummaryDivider)
+}