mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-30 22:39:58 +02:00
Merge pull request #6149 from bep/sort-caseinsensitive
Implement lexicographically string sorting
This commit is contained in:
committed by
GitHub
parent
a4f96a9d8c
commit
53077b0da5
@@ -20,18 +20,20 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gohugoio/hugo/common/types"
|
||||
|
||||
"github.com/gohugoio/hugo/compare"
|
||||
|
||||
"github.com/gohugoio/hugo/common/types"
|
||||
)
|
||||
|
||||
// New returns a new instance of the compare-namespaced template functions.
|
||||
func New() *Namespace {
|
||||
return &Namespace{}
|
||||
func New(caseInsensitive bool) *Namespace {
|
||||
return &Namespace{caseInsensitive: caseInsensitive}
|
||||
}
|
||||
|
||||
// Namespace provides template functions for the "compare" namespace.
|
||||
type Namespace struct {
|
||||
// Enable to do case insensitive string compares.
|
||||
caseInsensitive bool
|
||||
}
|
||||
|
||||
// Default checks whether a given value is set and returns a default value if it
|
||||
@@ -89,7 +91,10 @@ func (*Namespace) Default(dflt interface{}, given ...interface{}) (interface{},
|
||||
}
|
||||
|
||||
// Eq returns the boolean truth of arg1 == arg2.
|
||||
func (*Namespace) Eq(x, y interface{}) bool {
|
||||
func (ns *Namespace) Eq(x, y interface{}) bool {
|
||||
if ns.caseInsensitive {
|
||||
panic("caseInsensitive not implemented for Eq")
|
||||
}
|
||||
if e, ok := x.(compare.Eqer); ok {
|
||||
return e.Eq(y)
|
||||
}
|
||||
@@ -157,7 +162,7 @@ func (n *Namespace) Conditional(condition bool, a, b interface{}) interface{} {
|
||||
return b
|
||||
}
|
||||
|
||||
func (*Namespace) compareGet(a interface{}, b interface{}) (float64, float64) {
|
||||
func (ns *Namespace) compareGet(a interface{}, b interface{}) (float64, float64) {
|
||||
if ac, ok := a.(compare.Comparer); ok {
|
||||
c := ac.Compare(b)
|
||||
if c < 0 {
|
||||
@@ -228,6 +233,17 @@ func (*Namespace) compareGet(a interface{}, b interface{}) (float64, float64) {
|
||||
}
|
||||
}
|
||||
|
||||
if ns.caseInsensitive && leftStr != nil && rightStr != nil {
|
||||
c := compare.Strings(*leftStr, *rightStr)
|
||||
if c < 0 {
|
||||
return 0, 1
|
||||
} else if c > 0 {
|
||||
return 1, 0
|
||||
} else {
|
||||
return 0, 0
|
||||
}
|
||||
}
|
||||
|
||||
switch {
|
||||
case leftStr == nil || rightStr == nil:
|
||||
case *leftStr < *rightStr:
|
||||
|
@@ -83,7 +83,7 @@ func TestDefaultFunc(t *testing.T) {
|
||||
|
||||
then := time.Now()
|
||||
now := time.Now()
|
||||
ns := New()
|
||||
ns := New(false)
|
||||
|
||||
for i, test := range []struct {
|
||||
dflt interface{}
|
||||
@@ -139,7 +139,7 @@ func TestDefaultFunc(t *testing.T) {
|
||||
func TestCompare(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
n := New()
|
||||
n := New(false)
|
||||
|
||||
for _, test := range []struct {
|
||||
tstCompareType
|
||||
@@ -233,6 +233,14 @@ func doTestCompare(t *testing.T, tp tstCompareType, funcUnderTest func(a, b inte
|
||||
}
|
||||
}
|
||||
|
||||
func TestCase(t *testing.T) {
|
||||
assert := require.New(t)
|
||||
n := New(true)
|
||||
|
||||
assert.True(n.Lt("az", "Za"))
|
||||
assert.True(n.Gt("ab", "Ab"))
|
||||
}
|
||||
|
||||
func TestTimeUnix(t *testing.T) {
|
||||
t.Parallel()
|
||||
var sec int64 = 1234567890
|
||||
@@ -258,7 +266,7 @@ func TestTimeUnix(t *testing.T) {
|
||||
|
||||
func TestConditional(t *testing.T) {
|
||||
assert := require.New(t)
|
||||
n := New()
|
||||
n := New(false)
|
||||
a, b := "a", "b"
|
||||
|
||||
assert.Equal(a, n.Conditional(true, a, b))
|
||||
|
@@ -22,7 +22,7 @@ const name = "compare"
|
||||
|
||||
func init() {
|
||||
f := func(d *deps.Deps) *internal.TemplateFuncsNamespace {
|
||||
ctx := New()
|
||||
ctx := New(false)
|
||||
|
||||
ns := &internal.TemplateFuncsNamespace{
|
||||
Name: name,
|
||||
|
@@ -23,7 +23,7 @@ import (
|
||||
)
|
||||
|
||||
func TestTruth(t *testing.T) {
|
||||
n := New()
|
||||
n := New(false)
|
||||
|
||||
truthv, falsev := reflect.ValueOf(time.Now()), reflect.ValueOf(false)
|
||||
|
||||
|
Reference in New Issue
Block a user