content adapter: Handle <!--more--> separator in content.value

Closes #12556
This commit is contained in:
Bjørn Erik Pedersen 2024-06-01 10:27:10 +02:00
parent 74b9b8a229
commit 0221ddb39e
6 changed files with 75 additions and 37 deletions

View file

@ -307,7 +307,10 @@ func (pco *pageContentOutput) RenderString(ctx context.Context, args ...any) (te
if pageparser.HasShortcode(contentToRender) { if pageparser.HasShortcode(contentToRender) {
contentToRenderb := []byte(contentToRender) contentToRenderb := []byte(contentToRender)
// String contains a shortcode. // 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 { if err != nil {
return "", err return "", err
} }

View file

@ -643,3 +643,29 @@ Footer: {{ range index site.Menus.footer }}{{ .Name }}|{{ end }}|
"Footer: Footer|p2||", "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>",
)
}

View file

@ -63,16 +63,18 @@ func (l *pageLexer) Input() []byte {
} }
type Config struct { type Config struct {
NoFrontMatter bool NoFrontMatter bool
NoSummaryDivider bool
} }
// note: the input position here is normally 0 (start), but // note: the input position here is normally 0 (start), but
// can be set if position of first shortcode is known // can be set if position of first shortcode is known
func newPageLexer(input []byte, stateStart stateFunc, cfg Config) *pageLexer { func newPageLexer(input []byte, stateStart stateFunc, cfg Config) *pageLexer {
lexer := &pageLexer{ lexer := &pageLexer{
input: input, input: input,
stateStart: stateStart, stateStart: stateStart,
cfg: cfg, summaryDivider: summaryDivider,
cfg: cfg,
lexerShortcodeState: lexerShortcodeState{ lexerShortcodeState: lexerShortcodeState{
currLeftDelimItem: tLeftDelimScNoMarkup, currLeftDelimItem: tLeftDelimScNoMarkup,
currRightDelimItem: tRightDelimScNoMarkup, currRightDelimItem: tRightDelimScNoMarkup,
@ -297,6 +299,8 @@ func (s *sectionHandlers) skip() int {
} }
func createSectionHandlers(l *pageLexer) *sectionHandlers { func createSectionHandlers(l *pageLexer) *sectionHandlers {
handlers := make([]*sectionHandler, 0, 2)
shortCodeHandler := &sectionHandler{ shortCodeHandler := &sectionHandler{
l: l, l: l,
skipFunc: func(l *pageLexer) int { skipFunc: func(l *pageLexer) int {
@ -332,31 +336,36 @@ func createSectionHandlers(l *pageLexer) *sectionHandlers {
}, },
} }
summaryDividerHandler := &sectionHandler{ handlers = append(handlers, shortCodeHandler)
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
}
l.summaryDividerChecked = true if !l.cfg.NoSummaryDivider {
l.pos += len(l.summaryDivider) summaryDividerHandler := &sectionHandler{
// This makes it a little easier to reason about later. l: l,
l.consumeSpace() skipFunc: func(l *pageLexer) int {
l.emit(TypeLeadSummaryDivider) 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
}
l.summaryDividerChecked = true
l.pos += len(l.summaryDivider)
// This makes it a little easier to reason about later.
l.consumeSpace()
l.emit(TypeLeadSummaryDivider)
return origin, true
},
}
handlers = append(handlers, summaryDividerHandler)
return origin, true
},
} }
handlers := []*sectionHandler{shortCodeHandler, summaryDividerHandler}
return &sectionHandlers{ return &sectionHandlers{
l: l, l: l,
handlers: handlers, handlers: handlers,

View file

@ -14,8 +14,6 @@
package pageparser package pageparser
func lexIntroSection(l *pageLexer) stateFunc { func lexIntroSection(l *pageLexer) stateFunc {
l.summaryDivider = summaryDivider
LOOP: LOOP:
for { for {
r := l.next() r := l.next()

View file

@ -47,15 +47,6 @@ func ParseBytes(b []byte, cfg Config) (Items, error) {
return l.items, l.err 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 { type ContentFrontMatter struct {
Content []byte Content []byte
FrontMatter map[string]any FrontMatter map[string]any

View file

@ -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)
}