Skip to content

Commit

Permalink
Add option to not generate aliases for first page of pagination pages
Browse files Browse the repository at this point in the history
Also consolidate the pagination configuration into a struct.

Closes gohugoio#12572
  • Loading branch information
bep committed Jun 7, 2024
1 parent 1a53a8c commit 1e93e9a
Show file tree
Hide file tree
Showing 9 changed files with 134 additions and 14 deletions.
16 changes: 16 additions & 0 deletions config/allconfig/allconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,9 @@ type Config struct {
// Server configuration.
Server config.Server `mapstructure:"-"`

// Pagination configuration.
Pagination config.Pagination `mapstructure:"-"`

// Privacy configuration.
Privacy privacy.Config `mapstructure:"-"`

Expand Down Expand Up @@ -369,6 +372,17 @@ func (c *Config) CompileConfig(logger loggers.Logger) error {
return err
}

// Legacy paginate values.
if c.Paginate != 0 {
hugo.Deprecate("site config key paginate", "Use paginator.defaultPageSize instead.", "v0.128.0")
c.Pagination.DefaultPageSize = c.Paginate
}

if c.PaginatePath != "" {
hugo.Deprecate("site config key paginatePath", "Use paginator.path instead.", "v0.128.0")
c.Pagination.Path = c.PaginatePath
}

c.C = &ConfigCompiled{
Timeout: timeout,
BaseURL: baseURL,
Expand Down Expand Up @@ -557,9 +571,11 @@ type RootConfig struct {
HasCJKLanguage bool

// The default number of pages per page when paginating.
// Deprecated: Use the Pagination struct.
Paginate int

// The path to use when creating pagination URLs, e.g. "page" in /page/2/.
// Deprecated: Use the Pagination struct.
PaginatePath string

// Whether to pluralize default list titles.
Expand Down
81 changes: 81 additions & 0 deletions config/allconfig/allconfig_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,84 @@ suffixes = ["html", "xhtml"]
b.Assert(contentTypes.HTML.Suffixes(), qt.DeepEquals, []string{"html", "xhtml"})
b.Assert(contentTypes.Markdown.Suffixes(), qt.DeepEquals, []string{"md", "mdown", "markdown"})
}

func TestPaginationConfigOld(t *testing.T) {
files := `
-- hugo.toml --
[languages.en]
weight = 1
paginatePath = "page-en"
[languages.de]
weight = 2
paginatePath = "page-de"
paginate = 20
`

b := hugolib.Test(t, files)

confEn := b.H.Sites[0].Conf.Pagination()
confDe := b.H.Sites[1].Conf.Pagination()

b.Assert(confEn.Path, qt.Equals, "page-en")
b.Assert(confEn.DefaultPageSize, qt.Equals, 10)
b.Assert(confDe.Path, qt.Equals, "page-de")
b.Assert(confDe.DefaultPageSize, qt.Equals, 20)
}

func TestPaginationConfigNew(t *testing.T) {
files := `
-- hugo.toml --
[languages.en]
weight = 1
[languages.en.pagination]
[languages.de]
weight = 2
[languages.de.pagination]
path = "page-de"
defaultPageSize = 20
`

b := hugolib.Test(t, files)

confEn := b.H.Sites[0].Conf.Pagination()
confDe := b.H.Sites[1].Conf.Pagination()

b.Assert(confEn.Path, qt.Equals, "page-en")
b.Assert(confEn.DefaultPageSize, qt.Equals, 10)
b.Assert(confDe.Path, qt.Equals, "page-de")
b.Assert(confDe.DefaultPageSize, qt.Equals, 20)
}

func TestPaginationConfigDisableAliases(t *testing.T) {
files := `
-- hugo.toml --
disableKinds = ["taxonomy", "term"]
[pagination]
disableAliases = true
defaultPageSize = 2
-- layouts/_default/list.html --
{{ $paginator := .Paginate site.RegularPages }}
{{ template "_internal/pagination.html" . }}
{{ range $paginator.Pages }}
{{ .Title }}
{{ end }}
-- content/p1.md --
---
title: "p1"
---
-- content/p2.md --
---
title: "p2"
---
-- content/p3.md --
---
title: "p3"
---
`

b := hugolib.Test(t, files)

b.AssertFileExists("public/page/1/index.html", false)
b.AssertFileContent("public/page/2/index.html", "pagination-default")
}
16 changes: 16 additions & 0 deletions config/allconfig/alldecoders.go
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,22 @@ var allDecoderSetups = map[string]decodeWeight{
return err
},
},
"pagination": {
key: "pagination",
decode: func(d decodeWeight, p decodeConfig) error {
p.c.Pagination = config.Pagination{
DefaultPageSize: 10,
Path: "page",
}
if p.p.IsSet(d.key) {
if err := mapstructure.WeakDecode(p.p.Get(d.key), &p.c.Pagination); err != nil {
return err
}
}

return nil
},
},
"privacy": {
key: "privacy",
decode: func(d decodeWeight, p decodeConfig) error {
Expand Down
8 changes: 2 additions & 6 deletions config/allconfig/configlanguage.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,12 +248,8 @@ func (c ConfigLanguage) CreateTitle(s string) string {
return c.config.C.CreateTitle(s)
}

func (c ConfigLanguage) Paginate() int {
return c.config.Paginate
}

func (c ConfigLanguage) PaginatePath() string {
return c.config.PaginatePath
func (c ConfigLanguage) Pagination() config.Pagination {
return c.config.Pagination
}

func (c ConfigLanguage) StaticDirs() []string {
Expand Down
4 changes: 2 additions & 2 deletions config/allconfig/load.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,8 @@ func (l configLoader) applyDefaultConfig() error {
"footnoteAnchorPrefix": "",
"footnoteReturnLinkContents": "",
"newContentEditor": "",
"paginate": 10,
"paginatePath": "page",
"paginate": 0, // Moved into the paginator struct in Hugo v0.128.0.
"paginatePath": "", // Moved into the paginator struct in Hugo v0.128.0.
"summaryLength": 70,
"rssLimit": -1,
"sectionPagesMenu": "",
Expand Down
12 changes: 12 additions & 0 deletions config/commonConfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -410,3 +410,15 @@ func DecodeServer(cfg Provider) (Server, error) {

return *s, nil
}

// Pagination configures the pagination behavior.
type Pagination struct {
// Default number of elements per page in pagination.
DefaultPageSize int

// The path element used during pagination.
Path string

// WHether to disable generation of alias for the first pagination page.
DisableAliases bool
}
3 changes: 1 addition & 2 deletions config/configProvider.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ type AllProvider interface {
DefaultContentLanguageInSubdir() bool
IsLangDisabled(string) bool
SummaryLength() int
Paginate() int
PaginatePath() string
Pagination() Pagination
BuildExpired() bool
BuildFuture() bool
BuildDrafts() bool
Expand Down
4 changes: 2 additions & 2 deletions hugolib/site_render.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ func (s *Site) logMissingLayout(name, layout, kind, outputFormat string) {

// renderPaginator must be run after the owning Page has been rendered.
func (s *Site) renderPaginator(p *pageState, templ tpl.Template) error {
paginatePath := s.conf.PaginatePath
paginatePath := s.Conf.Pagination().Path

d := p.targetPathDescriptor
f := p.s.rc.Format
Expand All @@ -233,7 +233,7 @@ func (s *Site) renderPaginator(p *pageState, templ tpl.Template) error {
panic(fmt.Sprintf("invalid paginator state for %q", p.pathOrTitle()))
}

if f.IsHTML {
if f.IsHTML && !s.Conf.Pagination().DisableAliases {
// Write alias for page 1
d.Addends = fmt.Sprintf("/%s/%d", paginatePath, 1)
targetPaths := page.CreateTargetPaths(d)
Expand Down
4 changes: 2 additions & 2 deletions resources/page/pagination.go
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ func splitPageGroups(pageGroups PagesGroup, size int) []paginatedElement {

func ResolvePagerSize(conf config.AllProvider, options ...any) (int, error) {
if len(options) == 0 {
return conf.Paginate(), nil
return conf.Pagination().DefaultPageSize, nil
}

if len(options) > 1 {
Expand Down Expand Up @@ -400,7 +400,7 @@ func newPaginationURLFactory(d TargetPathDescriptor) paginationURLFactory {
pathDescriptor := d
var rel string
if pageNumber > 1 {
rel = fmt.Sprintf("/%s/%d/", d.PathSpec.Cfg.PaginatePath(), pageNumber)
rel = fmt.Sprintf("/%s/%d/", d.PathSpec.Cfg.Pagination().Path, pageNumber)
pathDescriptor.Addends = rel
}

Expand Down

0 comments on commit 1e93e9a

Please sign in to comment.