Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
output: Fix permalink in sitemap etc. when multiple permalinkable out…
…put formats

In Hugo 0.55.0 we made AMP `permalinkable`. We also render the output formats in their natural sort order, meaning `AMP` will be rendered before `HTML`. References in the sitemap would then point to the AMP version, and this is normally not what you'd want.

This commit fixes that by making `HTML` by default sort before the others.

If this is not you want, you can set `weight` on the output format configuration.

Fixes gohugoio#5910
  • Loading branch information
bep committed May 2, 2019
1 parent bcbed4e commit 0edbf59
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 4 deletions.
2 changes: 1 addition & 1 deletion hugolib/site_render.go
Expand Up @@ -35,7 +35,7 @@ type siteRenderContext struct {
sitesOutIdx int

// Zero based index of the output formats configured within a Site.
// Note that these outputs are sorted, so CSS will come before HTML.
// Note that these outputs are sorted.
outIdx int

multihost bool
Expand Down
19 changes: 19 additions & 0 deletions hugolib/sitemap_test.go
Expand Up @@ -100,3 +100,22 @@ func TestParseSitemap(t *testing.T) {
}

}

// https://github.com/gohugoio/hugo/issues/5910
func TestSitemapOutputFormats(t *testing.T) {

b := newTestSitesBuilder(t).WithSimpleConfigFile()

b.WithContent("blog/html-amp.md", `
---
Title: AMP and HTML
outputs: [ "html", "amp" ]
---
`)

b.Build(BuildCfg{})

// Should link to the HTML version.
b.AssertFileContent("public/sitemap.xml", " <loc>http://example.com/blog/html-amp/</loc>")
}
26 changes: 23 additions & 3 deletions output/outputFormat.go
Expand Up @@ -78,6 +78,9 @@ type Format struct {
// example. AMP would, however, be a good example of an output format where this
// behaviour is wanted.
Permalinkable bool `json:"permalinkable"`

// Setting this to a non-zero value will be used as the first sort criteria.
Weight int `json:"weight"`
}

// An ordered list of built-in output formats.
Expand Down Expand Up @@ -125,6 +128,11 @@ var (
Rel: "canonical",
IsHTML: true,
Permalinkable: true,

// Weight will be used as first sort criteria. HTML will, by,
// default be rendered first, but set it to 10 so it's easy
// to put one above it.
Weight: 10,
}

JSONFormat = Format{
Expand Down Expand Up @@ -180,9 +188,21 @@ func init() {
// Formats is a slice of Format.
type Formats []Format

func (formats Formats) Len() int { return len(formats) }
func (formats Formats) Swap(i, j int) { formats[i], formats[j] = formats[j], formats[i] }
func (formats Formats) Less(i, j int) bool { return formats[i].Name < formats[j].Name }
func (formats Formats) Len() int { return len(formats) }
func (formats Formats) Swap(i, j int) { formats[i], formats[j] = formats[j], formats[i] }
func (formats Formats) Less(i, j int) bool {
fi, fj := formats[i], formats[j]
if fi.Weight == fj.Weight {
return fi.Name < fj.Name
}

if fj.Weight == 0 {
return true
}

return fi.Weight > 0 && fi.Weight < fj.Weight

}

// GetBySuffix gets a output format given as suffix, e.g. "html".
// It will return false if no format could be found, or if the suffix given
Expand Down
23 changes: 23 additions & 0 deletions output/outputFormat_test.go
Expand Up @@ -15,6 +15,7 @@ package output

import (
"fmt"
"sort"
"testing"

"github.com/gohugoio/hugo/media"
Expand Down Expand Up @@ -225,3 +226,25 @@ func TestDecodeFormats(t *testing.T) {
}
}
}

func TestSort(t *testing.T) {
assert := require.New(t)
assert.Equal("HTML", DefaultFormats[0].Name)
assert.Equal("AMP", DefaultFormats[1].Name)

json := JSONFormat
json.Weight = 1

formats := Formats{
AMPFormat,
HTMLFormat,
json,
}

sort.Sort(formats)

assert.Equal("JSON", formats[0].Name)
assert.Equal("HTML", formats[1].Name)
assert.Equal("AMP", formats[2].Name)

}

0 comments on commit 0edbf59

Please sign in to comment.