site_output.go (3001B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package hugolib 15 16 import ( 17 "fmt" 18 "strings" 19 20 "github.com/gohugoio/hugo/output" 21 "github.com/gohugoio/hugo/resources/page" 22 "github.com/spf13/cast" 23 ) 24 25 func createDefaultOutputFormats(allFormats output.Formats) map[string]output.Formats { 26 rssOut, rssFound := allFormats.GetByName(output.RSSFormat.Name) 27 htmlOut, _ := allFormats.GetByName(output.HTMLFormat.Name) 28 robotsOut, _ := allFormats.GetByName(output.RobotsTxtFormat.Name) 29 sitemapOut, _ := allFormats.GetByName(output.SitemapFormat.Name) 30 31 defaultListTypes := output.Formats{htmlOut} 32 if rssFound { 33 defaultListTypes = append(defaultListTypes, rssOut) 34 } 35 36 m := map[string]output.Formats{ 37 page.KindPage: {htmlOut}, 38 page.KindHome: defaultListTypes, 39 page.KindSection: defaultListTypes, 40 page.KindTerm: defaultListTypes, 41 page.KindTaxonomy: defaultListTypes, 42 // Below are for consistency. They are currently not used during rendering. 43 kindSitemap: {sitemapOut}, 44 kindRobotsTXT: {robotsOut}, 45 kind404: {htmlOut}, 46 } 47 48 // May be disabled 49 if rssFound { 50 m[kindRSS] = output.Formats{rssOut} 51 } 52 53 return m 54 } 55 56 func createSiteOutputFormats(allFormats output.Formats, outputs map[string]any, rssDisabled bool) (map[string]output.Formats, error) { 57 defaultOutputFormats := createDefaultOutputFormats(allFormats) 58 59 if outputs == nil { 60 return defaultOutputFormats, nil 61 } 62 63 outFormats := make(map[string]output.Formats) 64 65 if len(outputs) == 0 { 66 return outFormats, nil 67 } 68 69 seen := make(map[string]bool) 70 71 for k, v := range outputs { 72 k = getKind(k) 73 if k == "" { 74 // Invalid kind 75 continue 76 } 77 var formats output.Formats 78 vals := cast.ToStringSlice(v) 79 for _, format := range vals { 80 f, found := allFormats.GetByName(format) 81 if !found { 82 if rssDisabled && strings.EqualFold(format, "RSS") { 83 // This is legacy behaviour. We used to have both 84 // a RSS page kind and output format. 85 continue 86 } 87 return nil, fmt.Errorf("failed to resolve output format %q from site config", format) 88 } 89 formats = append(formats, f) 90 } 91 92 // This effectively prevents empty outputs entries for a given Kind. 93 // We need at least one. 94 if len(formats) > 0 { 95 seen[k] = true 96 outFormats[k] = formats 97 } 98 } 99 100 // Add defaults for the entries not provided by the user. 101 for k, v := range defaultOutputFormats { 102 if !seen[k] { 103 outFormats[k] = v 104 } 105 } 106 107 return outFormats, nil 108 }