hugo-to-gemini/internal/gmnhg/templates.go
Timur Demin b4ae1981d6
Implement sort / sortRev in templates
This adds generic sort / sortRev functions for use in gmnhg templates
which use sort.Sort to sort anything that implements sort.Interface
(which includes lists of posts).

The existing sortPosts function that used to sort posts in reverse order
becomes an alias to sortRev for backwards compatibility.
2021-08-22 17:52:19 +03:00

36 lines
821 B
Go

package gmnhg
import (
"reflect"
"sort"
)
func sortWhatever(sortable interface{}, reverse bool) interface{} {
// convert slices to their sort.Interface counterparts
switch s := sortable.(type) {
case []int:
sortable = sort.IntSlice(s)
case []float64:
sortable = sort.Float64Slice(s)
case []string:
sortable = sort.StringSlice(s)
}
v := reflect.ValueOf(sortable)
cpy := reflect.MakeSlice(v.Type(), v.Len(), v.Cap())
reflect.Copy(cpy, v)
cpyAsInterface := v.Interface()
if !reverse {
sort.Sort(cpyAsInterface.(sort.Interface))
} else {
sort.Sort(sort.Reverse(cpyAsInterface.(sort.Interface)))
}
return cpyAsInterface
}
func Sort(sortable interface{}) interface{} {
return sortWhatever(sortable, false)
}
func SortRev(sortable interface{}) interface{} {
return sortWhatever(sortable, true)
}