shithub: hugo

Download patch

ref: cfda13b36367465016f4458ab9924c948ed02b6f
parent: bb2fe814c2db0c494b3b678a5da20a6cc0538857
author: Vincent Danjean <[email protected]>
date: Sat Sep 8 07:14:09 EDT 2018

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

--- a/hugolib/pageGroup.go
+++ b/hugolib/pageGroup.go
@@ -296,3 +296,10 @@
 	}
 	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
+}
--- a/hugolib/pagination.go
+++ b/hugolib/pagination.go
@@ -399,7 +399,11 @@
 
 	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 @@
 	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 @@
 		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: