Skip to content

Commit

Permalink
content adapter: Handle <!--more--> separator in content.value
Browse files Browse the repository at this point in the history
Closes #12556
  • Loading branch information
bep committed Jun 1, 2024
1 parent 74b9b8a commit 0221ddb
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 37 deletions.
5 changes: 4 additions & 1 deletion hugolib/page__per_output.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
26 changes: 26 additions & 0 deletions hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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>",
)
}
59 changes: 34 additions & 25 deletions parser/pageparser/pagelexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 0 additions & 2 deletions parser/pageparser/pagelexer_intro.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
package pageparser

func lexIntroSection(l *pageLexer) stateFunc {
l.summaryDivider = summaryDivider

LOOP:
for {
r := l.next()
Expand Down
9 changes: 0 additions & 9 deletions parser/pageparser/pageparser.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions parser/pageparser/pageparser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

0 comments on commit 0221ddb

Please sign in to comment.