mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-30 00:33:31 -05:00
hugolib: Fix output formats override when no outputs definition given
A common use case for this is to redefine the built-in output format `RSS` to give it a different URL. Before this commit, that was not possible without also providing an `outputs` definition. Fixes #3447
This commit is contained in:
parent
94b5be67fc
commit
6e2f2dd8d3
2 changed files with 64 additions and 8 deletions
|
@ -26,7 +26,7 @@ import (
|
||||||
|
|
||||||
func createSiteOutputFormats(allFormats output.Formats, cfg config.Provider) (map[string]output.Formats, error) {
|
func createSiteOutputFormats(allFormats output.Formats, cfg config.Provider) (map[string]output.Formats, error) {
|
||||||
if !cfg.IsSet("outputs") {
|
if !cfg.IsSet("outputs") {
|
||||||
return createDefaultOutputFormats(cfg)
|
return createDefaultOutputFormats(allFormats, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
outFormats := make(map[string]output.Formats)
|
outFormats := make(map[string]output.Formats)
|
||||||
|
@ -64,20 +64,22 @@ func createSiteOutputFormats(allFormats output.Formats, cfg config.Provider) (ma
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func createDefaultOutputFormats(cfg config.Provider) (map[string]output.Formats, error) {
|
func createDefaultOutputFormats(allFormats output.Formats, cfg config.Provider) (map[string]output.Formats, error) {
|
||||||
outFormats := make(map[string]output.Formats)
|
outFormats := make(map[string]output.Formats)
|
||||||
|
rssOut, _ := allFormats.GetByName(output.RSSFormat.Name)
|
||||||
|
htmlOut, _ := allFormats.GetByName(output.HTMLFormat.Name)
|
||||||
|
|
||||||
for _, kind := range allKinds {
|
for _, kind := range allKinds {
|
||||||
var formats output.Formats
|
var formats output.Formats
|
||||||
// All have HTML
|
// All have HTML
|
||||||
formats = append(formats, output.HTMLFormat)
|
formats = append(formats, htmlOut)
|
||||||
|
|
||||||
// All but page have RSS
|
// All but page have RSS
|
||||||
if kind != KindPage {
|
if kind != KindPage {
|
||||||
rssType := output.RSSFormat
|
|
||||||
|
|
||||||
rssBase := cfg.GetString("rssURI")
|
rssBase := cfg.GetString("rssURI")
|
||||||
if rssBase == "" || rssBase == "index.xml" {
|
if rssBase == "" || rssBase == "index.xml" {
|
||||||
rssBase = rssType.BaseName
|
rssBase = rssOut.BaseName
|
||||||
} else {
|
} else {
|
||||||
// Remove in Hugo 0.22.
|
// Remove in Hugo 0.22.
|
||||||
helpers.Deprecated("Site config", "rssURI", "Set baseName in outputFormats.RSS", false)
|
helpers.Deprecated("Site config", "rssURI", "Set baseName in outputFormats.RSS", false)
|
||||||
|
@ -85,8 +87,8 @@ func createDefaultOutputFormats(cfg config.Provider) (map[string]output.Formats,
|
||||||
rssBase = strings.TrimSuffix(rssBase, path.Ext(rssBase))
|
rssBase = strings.TrimSuffix(rssBase, path.Ext(rssBase))
|
||||||
}
|
}
|
||||||
|
|
||||||
rssType.BaseName = rssBase
|
rssOut.BaseName = rssBase
|
||||||
formats = append(formats, rssType)
|
formats = append(formats, rssOut)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ import (
|
||||||
|
|
||||||
func TestDefaultOutputFormats(t *testing.T) {
|
func TestDefaultOutputFormats(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
defs, err := createDefaultOutputFormats(viper.New())
|
defs, err := createDefaultOutputFormats(output.DefaultFormats, viper.New())
|
||||||
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
@ -53,6 +53,30 @@ func TestDefaultOutputFormats(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDefaultOutputFormatsWithOverrides(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
htmlOut := output.HTMLFormat
|
||||||
|
htmlOut.BaseName = "htmlindex"
|
||||||
|
rssOut := output.RSSFormat
|
||||||
|
rssOut.BaseName = "feed"
|
||||||
|
|
||||||
|
defs, err := createDefaultOutputFormats(output.Formats{htmlOut, rssOut}, viper.New())
|
||||||
|
|
||||||
|
homeDefs := defs[KindHome]
|
||||||
|
|
||||||
|
rss, found := homeDefs.GetByName("RSS")
|
||||||
|
require.True(t, found)
|
||||||
|
require.Equal(t, rss.BaseName, "feed")
|
||||||
|
|
||||||
|
html, found := homeDefs.GetByName("HTML")
|
||||||
|
require.True(t, found)
|
||||||
|
require.Equal(t, html.BaseName, "htmlindex")
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func TestSiteWithPageOutputs(t *testing.T) {
|
func TestSiteWithPageOutputs(t *testing.T) {
|
||||||
for _, outputs := range [][]string{{"html", "json", "calendar"}, {"json"}} {
|
for _, outputs := range [][]string{{"html", "json", "calendar"}, {"json"}} {
|
||||||
t.Run(fmt.Sprintf("%v", outputs), func(t *testing.T) {
|
t.Run(fmt.Sprintf("%v", outputs), func(t *testing.T) {
|
||||||
|
@ -231,3 +255,33 @@ Content: {{ .Content }}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Issue #3447
|
||||||
|
func TestRedefineRSSOutputFormat(t *testing.T) {
|
||||||
|
siteConfig := `
|
||||||
|
baseURL = "http://example.com/blog"
|
||||||
|
|
||||||
|
paginate = 1
|
||||||
|
defaultContentLanguage = "en"
|
||||||
|
|
||||||
|
disableKinds = ["page", "section", "taxonomy", "taxonomyTerm", "sitemap", "robotsTXT", "404"]
|
||||||
|
|
||||||
|
[outputFormats]
|
||||||
|
[outputFormats.RSS]
|
||||||
|
mediatype = "application/rss"
|
||||||
|
baseName = "feed"
|
||||||
|
|
||||||
|
`
|
||||||
|
|
||||||
|
mf := afero.NewMemMapFs()
|
||||||
|
writeToFs(t, mf, "content/foo.html", `foo`)
|
||||||
|
|
||||||
|
th, h := newTestSitesFromConfig(t, mf, siteConfig)
|
||||||
|
|
||||||
|
err := h.Build(BuildCfg{})
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
th.assertFileContent("public/feed.xml", "Recent content on")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue