mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
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
This commit is contained in:
parent
bb2fe814c2
commit
cfda13b363
2 changed files with 44 additions and 1 deletions
|
@ -296,3 +296,10 @@ func (p Pages) GroupByParamDate(key string, format string, order ...string) (Pag
|
||||||
}
|
}
|
||||||
return p.groupByDateField(sorter, formatter, order...)
|
return p.groupByDateField(sorter, formatter, order...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Group creates a PageGroup from a key and a Pages object
|
||||||
|
func (p *Page) Group(key interface{}, pages Pages) (PageGroup, error) {
|
||||||
|
pageGroup := PageGroup{Key: key, Pages: pages}
|
||||||
|
|
||||||
|
return pageGroup, nil
|
||||||
|
}
|
||||||
|
|
|
@ -399,7 +399,11 @@ func paginatePages(td targetPathDescriptor, seq interface{}, pagerSize int) (pag
|
||||||
|
|
||||||
var paginator *paginator
|
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)
|
paginator, _ = newPaginatorFromPageGroups(groups, pagerSize, urlFactory)
|
||||||
} else {
|
} else {
|
||||||
pages, err := toPages(seq)
|
pages, err := toPages(seq)
|
||||||
|
@ -414,6 +418,36 @@ func paginatePages(td targetPathDescriptor, seq interface{}, pagerSize int) (pag
|
||||||
return pagers, nil
|
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) {
|
func toPages(seq interface{}) (Pages, error) {
|
||||||
if seq == nil {
|
if seq == nil {
|
||||||
return Pages{}, nil
|
return Pages{}, nil
|
||||||
|
@ -424,6 +458,8 @@ func toPages(seq interface{}) (Pages, error) {
|
||||||
return seq.(Pages), nil
|
return seq.(Pages), nil
|
||||||
case *Pages:
|
case *Pages:
|
||||||
return *(seq.(*Pages)), nil
|
return *(seq.(*Pages)), nil
|
||||||
|
case []*Page:
|
||||||
|
return Pages(seq.([]*Page)), nil
|
||||||
case WeightedPages:
|
case WeightedPages:
|
||||||
return (seq.(WeightedPages)).Pages(), nil
|
return (seq.(WeightedPages)).Pages(), nil
|
||||||
case PageGroup:
|
case PageGroup:
|
||||||
|
|
Loading…
Reference in a new issue