Make string sorting (e.g. ByTitle, ByLinkTitle and ByParam) language aware

Fixes #2180
This commit is contained in:
Bjørn Erik Pedersen
2022-04-10 20:30:52 +02:00
parent 82ba634ed9
commit 627eed1d62
11 changed files with 297 additions and 31 deletions

View File

@@ -133,7 +133,9 @@ func TestDelimit(t *testing.T) {
t.Parallel()
c := qt.New(t)
ns := New(&deps.Deps{})
ns := New(&deps.Deps{
Language: langs.NewDefaultLanguage(config.New()),
})
for i, test := range []struct {
seq any

View File

@@ -20,6 +20,7 @@ import (
"strings"
"github.com/gohugoio/hugo/common/maps"
"github.com/gohugoio/hugo/langs"
"github.com/gohugoio/hugo/tpl/compare"
"github.com/spf13/cast"
)
@@ -47,8 +48,10 @@ func (ns *Namespace) Sort(seq any, args ...any) (any, error) {
return nil, errors.New("can't sort " + reflect.ValueOf(seq).Type().String())
}
collator := langs.GetCollator(ns.deps.Language)
// Create a list of pairs that will be used to do the sort
p := pairList{SortAsc: true, SliceType: sliceType}
p := pairList{Collator: collator, SortAsc: true, SliceType: sliceType}
p.Pairs = make([]pair, seqv.Len())
var sortByField string
@@ -124,6 +127,10 @@ func (ns *Namespace) Sort(seq any, args ...any) (any, error) {
}
}
}
collator.Lock()
defer collator.Unlock()
return p.sort(), nil
}
@@ -137,6 +144,7 @@ type pair struct {
// A slice of pairs that implements sort.Interface to sort by Value.
type pairList struct {
Collator *langs.Collator
Pairs []pair
SortAsc bool
SliceType reflect.Type
@@ -151,16 +159,16 @@ func (p pairList) Less(i, j int) bool {
if iv.IsValid() {
if jv.IsValid() {
// can only call Interface() on valid reflect Values
return sortComp.Lt(iv.Interface(), jv.Interface())
return sortComp.LtCollate(p.Collator, iv.Interface(), jv.Interface())
}
// if j is invalid, test i against i's zero value
return sortComp.Lt(iv.Interface(), reflect.Zero(iv.Type()))
return sortComp.LtCollate(p.Collator, iv.Interface(), reflect.Zero(iv.Type()))
}
if jv.IsValid() {
// if i is invalid, test j against j's zero value
return sortComp.Lt(reflect.Zero(jv.Type()), jv.Interface())
return sortComp.LtCollate(p.Collator, reflect.Zero(jv.Type()), jv.Interface())
}
return false

View File

@@ -19,6 +19,8 @@ import (
"testing"
"github.com/gohugoio/hugo/common/maps"
"github.com/gohugoio/hugo/config"
"github.com/gohugoio/hugo/langs"
"github.com/gohugoio/hugo/deps"
)
@@ -28,7 +30,9 @@ type stringsSlice []string
func TestSort(t *testing.T) {
t.Parallel()
ns := New(&deps.Deps{})
ns := New(&deps.Deps{
Language: langs.NewDefaultLanguage(config.New()),
})
type ts struct {
MyInt int