hugolib: Fix output format handling of mix cased page kinds
Fixes #4528
This commit is contained in:
parent
9ef4dca361
commit
de87624241
5 changed files with 85 additions and 23 deletions
|
@ -14,6 +14,8 @@
|
||||||
package hugolib
|
package hugolib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/gohugoio/hugo/resources/page"
|
"github.com/gohugoio/hugo/resources/page"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -38,3 +40,17 @@ const (
|
||||||
|
|
||||||
pageResourceType = "page"
|
pageResourceType = "page"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var kindMap = map[string]string{
|
||||||
|
strings.ToLower(kindRSS): kindRSS,
|
||||||
|
strings.ToLower(kindSitemap): kindSitemap,
|
||||||
|
strings.ToLower(kindRobotsTXT): kindRobotsTXT,
|
||||||
|
strings.ToLower(kind404): kind404,
|
||||||
|
}
|
||||||
|
|
||||||
|
func getKind(s string) string {
|
||||||
|
if pkind := page.GetKind(s); pkind != "" {
|
||||||
|
return pkind
|
||||||
|
}
|
||||||
|
return kindMap[strings.ToLower(s)]
|
||||||
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ func createDefaultOutputFormats(allFormats output.Formats, cfg config.Provider)
|
||||||
page.KindSection: {htmlOut, rssOut},
|
page.KindSection: {htmlOut, rssOut},
|
||||||
page.KindTaxonomy: {htmlOut, rssOut},
|
page.KindTaxonomy: {htmlOut, rssOut},
|
||||||
page.KindTaxonomyTerm: {htmlOut, rssOut},
|
page.KindTaxonomyTerm: {htmlOut, rssOut},
|
||||||
// Below are for conistency. They are currently not used during rendering.
|
// Below are for consistency. They are currently not used during rendering.
|
||||||
kindRSS: {rssOut},
|
kindRSS: {rssOut},
|
||||||
kindSitemap: {sitemapOut},
|
kindSitemap: {sitemapOut},
|
||||||
kindRobotsTXT: {robotsOut},
|
kindRobotsTXT: {robotsOut},
|
||||||
|
@ -61,6 +61,11 @@ func createSiteOutputFormats(allFormats output.Formats, cfg config.Provider) (ma
|
||||||
seen := make(map[string]bool)
|
seen := make(map[string]bool)
|
||||||
|
|
||||||
for k, v := range outputs {
|
for k, v := range outputs {
|
||||||
|
k = getKind(k)
|
||||||
|
if k == "" {
|
||||||
|
// Invalid kind
|
||||||
|
continue
|
||||||
|
}
|
||||||
var formats output.Formats
|
var formats output.Formats
|
||||||
vals := cast.ToStringSlice(v)
|
vals := cast.ToStringSlice(v)
|
||||||
for _, format := range vals {
|
for _, format := range vals {
|
||||||
|
|
|
@ -327,33 +327,53 @@ baseName = "customdelimbase"
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreateSiteOutputFormats(t *testing.T) {
|
func TestCreateSiteOutputFormats(t *testing.T) {
|
||||||
assert := require.New(t)
|
|
||||||
|
|
||||||
outputsConfig := map[string]interface{}{
|
t.Run("Basic", func(t *testing.T) {
|
||||||
page.KindHome: []string{"HTML", "JSON"},
|
assert := require.New(t)
|
||||||
page.KindSection: []string{"JSON"},
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg := viper.New()
|
outputsConfig := map[string]interface{}{
|
||||||
cfg.Set("outputs", outputsConfig)
|
page.KindHome: []string{"HTML", "JSON"},
|
||||||
|
page.KindSection: []string{"JSON"},
|
||||||
|
}
|
||||||
|
|
||||||
outputs, err := createSiteOutputFormats(output.DefaultFormats, cfg)
|
cfg := viper.New()
|
||||||
assert.NoError(err)
|
cfg.Set("outputs", outputsConfig)
|
||||||
assert.Equal(output.Formats{output.JSONFormat}, outputs[page.KindSection])
|
|
||||||
assert.Equal(output.Formats{output.HTMLFormat, output.JSONFormat}, outputs[page.KindHome])
|
|
||||||
|
|
||||||
// Defaults
|
outputs, err := createSiteOutputFormats(output.DefaultFormats, cfg)
|
||||||
assert.Equal(output.Formats{output.HTMLFormat, output.RSSFormat}, outputs[page.KindTaxonomy])
|
assert.NoError(err)
|
||||||
assert.Equal(output.Formats{output.HTMLFormat, output.RSSFormat}, outputs[page.KindTaxonomyTerm])
|
assert.Equal(output.Formats{output.JSONFormat}, outputs[page.KindSection])
|
||||||
assert.Equal(output.Formats{output.HTMLFormat}, outputs[page.KindPage])
|
assert.Equal(output.Formats{output.HTMLFormat, output.JSONFormat}, outputs[page.KindHome])
|
||||||
|
|
||||||
// These aren't (currently) in use when rendering in Hugo,
|
// Defaults
|
||||||
// but the pages needs to be assigned an output format,
|
assert.Equal(output.Formats{output.HTMLFormat, output.RSSFormat}, outputs[page.KindTaxonomy])
|
||||||
// so these should also be correct/sensible.
|
assert.Equal(output.Formats{output.HTMLFormat, output.RSSFormat}, outputs[page.KindTaxonomyTerm])
|
||||||
assert.Equal(output.Formats{output.RSSFormat}, outputs[kindRSS])
|
assert.Equal(output.Formats{output.HTMLFormat}, outputs[page.KindPage])
|
||||||
assert.Equal(output.Formats{output.SitemapFormat}, outputs[kindSitemap])
|
|
||||||
assert.Equal(output.Formats{output.RobotsTxtFormat}, outputs[kindRobotsTXT])
|
// These aren't (currently) in use when rendering in Hugo,
|
||||||
assert.Equal(output.Formats{output.HTMLFormat}, outputs[kind404])
|
// but the pages needs to be assigned an output format,
|
||||||
|
// so these should also be correct/sensible.
|
||||||
|
assert.Equal(output.Formats{output.RSSFormat}, outputs[kindRSS])
|
||||||
|
assert.Equal(output.Formats{output.SitemapFormat}, outputs[kindSitemap])
|
||||||
|
assert.Equal(output.Formats{output.RobotsTxtFormat}, outputs[kindRobotsTXT])
|
||||||
|
assert.Equal(output.Formats{output.HTMLFormat}, outputs[kind404])
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
// Issue #4528
|
||||||
|
t.Run("Mixed case", func(t *testing.T) {
|
||||||
|
assert := require.New(t)
|
||||||
|
cfg := viper.New()
|
||||||
|
|
||||||
|
outputsConfig := map[string]interface{}{
|
||||||
|
"taxonomyterm": []string{"JSON"},
|
||||||
|
}
|
||||||
|
cfg.Set("outputs", outputsConfig)
|
||||||
|
|
||||||
|
outputs, err := createSiteOutputFormats(output.DefaultFormats, cfg)
|
||||||
|
assert.NoError(err)
|
||||||
|
assert.Equal(output.Formats{output.JSONFormat}, outputs[page.KindTaxonomyTerm])
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
|
|
||||||
package page
|
package page
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
KindPage = "page"
|
KindPage = "page"
|
||||||
|
|
||||||
|
@ -23,3 +25,16 @@ const (
|
||||||
KindTaxonomy = "taxonomy"
|
KindTaxonomy = "taxonomy"
|
||||||
KindTaxonomyTerm = "taxonomyTerm"
|
KindTaxonomyTerm = "taxonomyTerm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var kindMap = map[string]string{
|
||||||
|
strings.ToLower(KindPage): KindPage,
|
||||||
|
strings.ToLower(KindHome): KindHome,
|
||||||
|
strings.ToLower(KindSection): KindSection,
|
||||||
|
strings.ToLower(KindTaxonomy): KindTaxonomy,
|
||||||
|
strings.ToLower(KindTaxonomyTerm): KindTaxonomyTerm,
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetKind gets the page kind given a string, empty if not found.
|
||||||
|
func GetKind(s string) string {
|
||||||
|
return kindMap[strings.ToLower(s)]
|
||||||
|
}
|
||||||
|
|
|
@ -28,4 +28,10 @@ func TestKind(t *testing.T) {
|
||||||
require.Equal(t, "taxonomy", KindTaxonomy)
|
require.Equal(t, "taxonomy", KindTaxonomy)
|
||||||
require.Equal(t, "taxonomyTerm", KindTaxonomyTerm)
|
require.Equal(t, "taxonomyTerm", KindTaxonomyTerm)
|
||||||
|
|
||||||
|
require.Equal(t, KindTaxonomyTerm, GetKind("TAXONOMYTERM"))
|
||||||
|
require.Equal(t, KindTaxonomy, GetKind("Taxonomy"))
|
||||||
|
require.Equal(t, KindPage, GetKind("Page"))
|
||||||
|
require.Equal(t, KindHome, GetKind("Home"))
|
||||||
|
require.Equal(t, KindSection, GetKind("SEction"))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue