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:
acclassic 2023-01-02 17:35:08 +01:00 committed by GitHub
parent e754d5cb3e
commit f95fd57aac
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 31 deletions

29
.gitignore vendored
View file

@ -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

View file

@ -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
} }

View file

@ -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},