From f95fd57aaccb999b6fefe7b2ac9239a6c3325b0f Mon Sep 17 00:00:00 2001 From: acclassic <84147355+acclassic@users.noreply.github.com> Date: Mon, 2 Jan 2023 17:35:08 +0100 Subject: [PATCH] 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 --- .gitignore | 29 ----------------------------- tpl/compare/compare.go | 7 +++++-- tpl/compare/compare_test.go | 2 ++ 3 files changed, 7 insertions(+), 31 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b2aeb9142..000000000 --- a/.gitignore +++ /dev/null @@ -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 diff --git a/tpl/compare/compare.go b/tpl/compare/compare.go index 47f77cc99..2ef5aacfe 100644 --- a/tpl/compare/compare.go +++ b/tpl/compare/compare.go @@ -16,6 +16,7 @@ package compare import ( "fmt" + "math" "reflect" "strconv" "time" @@ -273,7 +274,8 @@ func (ns *Namespace) compareGetWithCollator(collator *langs.Collator, a any, b a case reflect.String: var err error 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() leftStr = &str } @@ -300,7 +302,8 @@ func (ns *Namespace) compareGetWithCollator(collator *langs.Collator, a any, b a case reflect.String: var err error 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() rightStr = &str } diff --git a/tpl/compare/compare_test.go b/tpl/compare/compare_test.go index ce2016b38..4c50f5f0f 100644 --- a/tpl/compare/compare_test.go +++ b/tpl/compare/compare_test.go @@ -217,6 +217,8 @@ func doTestCompare(t *testing.T, tp tstCompareType, funcUnderTest func(a, b any) {"a", "a", 0}, {"a", "b", -1}, {"b", "a", 1}, + {"infinity", "infinity", 0}, + {"nan", "nan", 0}, {tstEqerType1("a"), tstEqerType1("a"), 0}, {tstEqerType1("a"), tstEqerType2("a"), 0}, {tstEqerType2("a"), tstEqerType1("a"), 0},