Make ByCount sort consistently
authorRobert Basic <robertbasic.com@gmail.com>
Fri, 1 Apr 2016 18:17:16 +0000 (20:17 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 2 Apr 2016 20:59:10 +0000 (22:59 +0200)
When two or more taxonomies have the same number of pages,
sort them by name to have consistent ByCount sorting of
taxonomies.

Fixes #1930

hugolib/taxonomy.go
hugolib/taxonomy_test.go

index 1ba8f6d05a5d3cf5669883479d545d1e211ccd67..ffe586ffc02b15175ef2776275cdb05eee0f5807 100644 (file)
@@ -96,9 +96,16 @@ func (i Taxonomy) Alphabetical() OrderedTaxonomy {
 }
 
 // ByCount returns an ordered taxonomy sorted by # of pages per key.
+// If taxonomies have the same # of pages, sort them alphabetical
 func (i Taxonomy) ByCount() OrderedTaxonomy {
        count := func(i1, i2 *OrderedTaxonomyEntry) bool {
-               return len(i1.WeightedPages) > len(i2.WeightedPages)
+               li1 := len(i1.WeightedPages)
+               li2 := len(i2.WeightedPages)
+
+               if li1 == li2 {
+                       return i1.Name < i2.Name
+               }
+               return li1 > li2
        }
 
        ia := i.TaxonomyArray()
index 005be33b19d4cca4a4488110b152e121d41e2188..ab9df1080d67e80284ef200126cc6a0fe1f5dcda 100644 (file)
@@ -16,6 +16,8 @@ package hugolib
 import (
        "strings"
        "testing"
+
+       "github.com/spf13/viper"
 )
 
 func TestSitePossibleTaxonomies(t *testing.T) {
@@ -29,3 +31,29 @@ func TestSitePossibleTaxonomies(t *testing.T) {
                }
        }
 }
+
+func TestByCountOrderOfTaxonomies(t *testing.T) {
+       viper.Reset()
+       defer viper.Reset()
+
+       taxonomies := make(map[string]string)
+
+       taxonomies["tag"] = "tags"
+       taxonomies["category"] = "categories"
+
+       viper.Set("taxonomies", taxonomies)
+
+       site := new(Site)
+       page, _ := NewPageFrom(strings.NewReader(pageYamlWithTaxonomiesA), "path/to/page")
+       site.Pages = append(site.Pages, page)
+       site.assembleTaxonomies()
+
+       st := make([]string, 0)
+       for _, t := range site.Taxonomies["tags"].ByCount() {
+               st = append(st, t.Name)
+       }
+
+       if !compareStringSlice(st, []string{"a", "b", "c"}) {
+               t.Fatalf("ordered taxonomies do not match [a, b, c].  Got: %s", st)
+       }
+}