shithub: hugo

Download patch

ref: 6ff435aa3f19a628f26d5ce755238e359eb77df6
parent: 82abca32fa8791e526edd820c32c0b8f9d8e0e78
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Fri Jun 19 06:13:35 EDT 2020

Make GroupByParamDate work with string params

Fixes #3983

--- a/resources/page/pagegroup.go
+++ b/resources/page/pagegroup.go
@@ -21,6 +21,8 @@
 	"strings"
 	"time"
 
+	"github.com/spf13/cast"
+
 	"github.com/gohugoio/hugo/common/collections"
 	"github.com/gohugoio/hugo/compare"
 
@@ -225,6 +227,10 @@
 		sp = sp.Reverse()
 	}
 
+	if sp == nil {
+		return nil, nil
+	}
+
 	date := formatter(sp[0].(Page))
 	var r []PageGroup
 	r = append(r, PageGroup{Key: date, Pages: make(Pages, 0)})
@@ -303,23 +309,36 @@
 // Valid values for order is asc, desc, rev and reverse.
 // For valid format strings, see https://golang.org/pkg/time/#Time.Format
 func (p Pages) GroupByParamDate(key string, format string, order ...string) (PagesGroup, error) {
-	sorter := func(p Pages) Pages {
+	// Cache the dates.
+	dates := make(map[Page]time.Time)
+
+	sorter := func(pages Pages) Pages {
 		var r Pages
-		for _, e := range p {
-			param := resource.GetParamToLower(e, key)
-			if _, ok := param.(time.Time); ok {
-				r = append(r, e)
+
+		for _, p := range pages {
+			param := resource.GetParamToLower(p, key)
+			var t time.Time
+
+			if param != nil {
+				var ok bool
+				if t, ok = param.(time.Time); !ok {
+					// Probably a string. Try to convert it to time.Time.
+					t = cast.ToTime(param)
+				}
 			}
+
+			dates[p] = t
+			r = append(r, p)
 		}
+
 		pdate := func(p1, p2 Page) bool {
-			p1p, p2p := p1.(Page), p2.(Page)
-			return resource.GetParamToLower(p1p, key).(time.Time).Unix() < resource.GetParamToLower(p2p, key).(time.Time).Unix()
+			return dates[p1].Unix() < dates[p2].Unix()
 		}
 		pageBy(pdate).Sort(r)
 		return r
 	}
 	formatter := func(p Page) string {
-		return resource.GetParamToLower(p, key).(time.Time).Format(format)
+		return dates[p].Format(format)
 	}
 	return p.groupByDateField(sorter, formatter, order...)
 }
--- a/resources/page/pagegroup_test.go
+++ b/resources/page/pagegroup_test.go
@@ -52,6 +52,7 @@
 		p.lastMod = cast.ToTime(src.date).AddDate(3, 0, 0)
 		p.params["custom_param"] = src.param
 		p.params["custom_date"] = cast.ToTime(src.date)
+		p.params["custom_string_date"] = src.date
 		pages = append(pages, p)
 	}
 	return pages
@@ -371,6 +372,25 @@
 	}
 
 	groups, err := pages.GroupByParamDate("custom_date", "2006-01")
+	if err != nil {
+		t.Fatalf("Unable to make PagesGroup array: %s", err)
+	}
+	if !reflect.DeepEqual(groups, expect) {
+		t.Errorf("PagesGroup has unexpected groups. It should be %#v, got %#v", expect, groups)
+	}
+}
+
+// https://github.com/gohugoio/hugo/issues/3983
+func TestGroupByParamDateWithStringParams(t *testing.T) {
+	t.Parallel()
+	pages := preparePageGroupTestPages(t)
+	expect := PagesGroup{
+		{Key: "2012-04", Pages: Pages{pages[4], pages[2], pages[0]}},
+		{Key: "2012-03", Pages: Pages{pages[3]}},
+		{Key: "2012-01", Pages: Pages{pages[1]}},
+	}
+
+	groups, err := pages.GroupByParamDate("custom_string_date", "2006-01")
 	if err != nil {
 		t.Fatalf("Unable to make PagesGroup array: %s", err)
 	}