diff options
author | Vincent Danjean <vdanjean@users.noreply.github.com> | 2018-09-08 11:14:09 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-09-08 11:14:09 +0200 |
commit | cfda13b36367465016f4458ab9924c948ed02b6f (patch) | |
tree | 0a7a99e77fecba344f18871de1a2ba35e9d5776b /hugolib/pagination.go | |
parent | bb2fe814c2db0c494b3b678a5da20a6cc0538857 (diff) |
hugolib: Allow creating page groups from any page collection
This also adjusts the pagination logic to allow for these new collections.
Note that we will follow up with a template function named `group` that will be the end user API. The `.Group` method on `Page` should be considered as internal.
Updates #4865
Diffstat (limited to 'hugolib/pagination.go')
-rw-r--r-- | hugolib/pagination.go | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/hugolib/pagination.go b/hugolib/pagination.go index 58cec576b..9a9b10c48 100644 --- a/hugolib/pagination.go +++ b/hugolib/pagination.go @@ -399,7 +399,11 @@ func paginatePages(td targetPathDescriptor, seq interface{}, pagerSize int) (pag var paginator *paginator - if groups, ok := seq.(PagesGroup); ok { + groups, err := toPagesGroup(seq) + if err != nil { + return nil, err + } + if groups != nil { paginator, _ = newPaginatorFromPageGroups(groups, pagerSize, urlFactory) } else { pages, err := toPages(seq) @@ -414,6 +418,36 @@ func paginatePages(td targetPathDescriptor, seq interface{}, pagerSize int) (pag return pagers, nil } +func toPagesGroup(seq interface{}) (PagesGroup, error) { + switch v := seq.(type) { + case nil: + return nil, nil + case PagesGroup: + return v, nil + case []PageGroup: + return PagesGroup(v), nil + case []interface{}: + l := len(v) + if l == 0 { + break + } + switch v[0].(type) { + case PageGroup: + pagesGroup := make(PagesGroup, l) + for i, ipg := range v { + if pg, ok := ipg.(PageGroup); ok { + pagesGroup[i] = pg + } else { + return nil, fmt.Errorf("unsupported type in paginate from slice, got %T instead of PageGroup", ipg) + } + } + return PagesGroup(pagesGroup), nil + } + } + + return nil, nil +} + func toPages(seq interface{}) (Pages, error) { if seq == nil { return Pages{}, nil @@ -424,6 +458,8 @@ func toPages(seq interface{}) (Pages, error) { return seq.(Pages), nil case *Pages: return *(seq.(*Pages)), nil + case []*Page: + return Pages(seq.([]*Page)), nil case WeightedPages: return (seq.(WeightedPages)).Pages(), nil case PageGroup: |