mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-28 22:32:05 -05:00
tpl/compare: Sort special float values as string
When sorting strings a worng order is returned. This happens because the strings are first converted to floating values to check whether or not they should be sorted as floating values. When an error is returned the strings will be handled as string literals. No error will be returned when parsing Inf, Infinity or NaN (case insensitive) because they will be coverted to special floating point values and therefore are legal float values. Now we check if the returned converted values are special floating values and treat them as string literals. Fixes #10389
This commit is contained in:
parent
e754d5cb3e
commit
f95fd57aac
3 changed files with 7 additions and 31 deletions
29
.gitignore
vendored
29
.gitignore
vendored
|
@ -1,29 +0,0 @@
|
||||||
/hugo
|
|
||||||
docs/public*
|
|
||||||
/.idea
|
|
||||||
.vscode/*
|
|
||||||
hugo.exe
|
|
||||||
*.test
|
|
||||||
*.prof
|
|
||||||
nohup.out
|
|
||||||
cover.out
|
|
||||||
*.swp
|
|
||||||
*.swo
|
|
||||||
.DS_Store
|
|
||||||
*~
|
|
||||||
vendor/*/
|
|
||||||
*.bench
|
|
||||||
*.debug
|
|
||||||
coverage*.out
|
|
||||||
|
|
||||||
dock.sh
|
|
||||||
|
|
||||||
GoBuilds
|
|
||||||
dist
|
|
||||||
|
|
||||||
hugolib/hugo_stats.json
|
|
||||||
resources/sunset.jpg
|
|
||||||
|
|
||||||
vendor
|
|
||||||
|
|
||||||
.hugo_build.lock
|
|
|
@ -16,6 +16,7 @@ package compare
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
@ -273,7 +274,8 @@ func (ns *Namespace) compareGetWithCollator(collator *langs.Collator, a any, b a
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
var err error
|
var err error
|
||||||
left, err = strconv.ParseFloat(av.String(), 64)
|
left, err = strconv.ParseFloat(av.String(), 64)
|
||||||
if err != nil {
|
// Check if float is a special floating value and cast value as string.
|
||||||
|
if math.IsInf(left, 0) || math.IsNaN(left) || err != nil {
|
||||||
str := av.String()
|
str := av.String()
|
||||||
leftStr = &str
|
leftStr = &str
|
||||||
}
|
}
|
||||||
|
@ -300,7 +302,8 @@ func (ns *Namespace) compareGetWithCollator(collator *langs.Collator, a any, b a
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
var err error
|
var err error
|
||||||
right, err = strconv.ParseFloat(bv.String(), 64)
|
right, err = strconv.ParseFloat(bv.String(), 64)
|
||||||
if err != nil {
|
// Check if float is a special floating value and cast value as string.
|
||||||
|
if math.IsInf(right, 0) || math.IsNaN(right) || err != nil {
|
||||||
str := bv.String()
|
str := bv.String()
|
||||||
rightStr = &str
|
rightStr = &str
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,6 +217,8 @@ func doTestCompare(t *testing.T, tp tstCompareType, funcUnderTest func(a, b any)
|
||||||
{"a", "a", 0},
|
{"a", "a", 0},
|
||||||
{"a", "b", -1},
|
{"a", "b", -1},
|
||||||
{"b", "a", 1},
|
{"b", "a", 1},
|
||||||
|
{"infinity", "infinity", 0},
|
||||||
|
{"nan", "nan", 0},
|
||||||
{tstEqerType1("a"), tstEqerType1("a"), 0},
|
{tstEqerType1("a"), tstEqerType1("a"), 0},
|
||||||
{tstEqerType1("a"), tstEqerType2("a"), 0},
|
{tstEqerType1("a"), tstEqerType2("a"), 0},
|
||||||
{tstEqerType2("a"), tstEqerType1("a"), 0},
|
{tstEqerType2("a"), tstEqerType1("a"), 0},
|
||||||
|
|
Loading…
Reference in a new issue