]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
For render hooks, only fallback to HTML (or the defaultOutputFormat) template
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 15 Jan 2025 14:45:13 +0000 (15:45 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 15 Jan 2025 17:59:58 +0000 (19:59 +0200)
Closes #13242

config/allconfig/allconfig.go
hugolib/content_render_hooks_test.go
hugolib/page__per_output.go
hugolib/rebuild_test.go

index 4d65d5f2bab83b75fc3010f57844b5e0a09e6393..ceb6304802656a2aea4196159b6ea4e5afa89d3c 100644 (file)
@@ -301,6 +301,18 @@ func (c *Config) CompileConfig(logger loggers.Logger) error {
                }
        }
 
+       defaultOutputFormat := outputFormats[0]
+       c.DefaultOutputFormat = strings.ToLower(c.DefaultOutputFormat)
+       if c.DefaultOutputFormat != "" {
+               f, found := outputFormats.GetByName(c.DefaultOutputFormat)
+               if !found {
+                       return fmt.Errorf("unknown default output format %q", c.DefaultOutputFormat)
+               }
+               defaultOutputFormat = f
+       } else {
+               c.DefaultOutputFormat = defaultOutputFormat.Name
+       }
+
        disabledLangs := make(map[string]bool)
        for _, lang := range c.DisableLanguages {
                disabledLangs[lang] = true
@@ -391,22 +403,23 @@ func (c *Config) CompileConfig(logger loggers.Logger) error {
        }
 
        c.C = &ConfigCompiled{
-               Timeout:           timeout,
-               BaseURL:           baseURL,
-               BaseURLLiveReload: baseURL,
-               DisabledKinds:     disabledKinds,
-               DisabledLanguages: disabledLangs,
-               IgnoredLogs:       ignoredLogIDs,
-               KindOutputFormats: kindOutputFormats,
-               ContentTypes:      media.DefaultContentTypes.FromTypes(c.MediaTypes.Config),
-               CreateTitle:       helpers.GetTitleFunc(c.TitleCaseStyle),
-               IsUglyURLSection:  isUglyURL,
-               IgnoreFile:        ignoreFile,
-               SegmentFilter:     c.Segments.Config.Get(func(s string) { logger.Warnf("Render segment %q not found in configuration", s) }, c.RootConfig.RenderSegments...),
-               MainSections:      c.MainSections,
-               Clock:             clock,
-               HTTPCache:         httpCache,
-               transientErr:      transientErr,
+               Timeout:             timeout,
+               BaseURL:             baseURL,
+               BaseURLLiveReload:   baseURL,
+               DisabledKinds:       disabledKinds,
+               DisabledLanguages:   disabledLangs,
+               IgnoredLogs:         ignoredLogIDs,
+               KindOutputFormats:   kindOutputFormats,
+               DefaultOutputFormat: defaultOutputFormat,
+               ContentTypes:        media.DefaultContentTypes.FromTypes(c.MediaTypes.Config),
+               CreateTitle:         helpers.GetTitleFunc(c.TitleCaseStyle),
+               IsUglyURLSection:    isUglyURL,
+               IgnoreFile:          ignoreFile,
+               SegmentFilter:       c.Segments.Config.Get(func(s string) { logger.Warnf("Render segment %q not found in configuration", s) }, c.RootConfig.RenderSegments...),
+               MainSections:        c.MainSections,
+               Clock:               clock,
+               HTTPCache:           httpCache,
+               transientErr:        transientErr,
        }
 
        for _, s := range allDecoderSetups {
@@ -430,22 +443,23 @@ func (c *Config) IsLangDisabled(lang string) bool {
 
 // ConfigCompiled holds values and functions that are derived from the config.
 type ConfigCompiled struct {
-       Timeout           time.Duration
-       BaseURL           urls.BaseURL
-       BaseURLLiveReload urls.BaseURL
-       ServerInterface   string
-       KindOutputFormats map[string]output.Formats
-       ContentTypes      media.ContentTypes
-       DisabledKinds     map[string]bool
-       DisabledLanguages map[string]bool
-       IgnoredLogs       map[string]bool
-       CreateTitle       func(s string) string
-       IsUglyURLSection  func(section string) bool
-       IgnoreFile        func(filename string) bool
-       SegmentFilter     segments.SegmentFilter
-       MainSections      []string
-       Clock             time.Time
-       HTTPCache         httpcache.ConfigCompiled
+       Timeout             time.Duration
+       BaseURL             urls.BaseURL
+       BaseURLLiveReload   urls.BaseURL
+       ServerInterface     string
+       KindOutputFormats   map[string]output.Formats
+       DefaultOutputFormat output.Format
+       ContentTypes        media.ContentTypes
+       DisabledKinds       map[string]bool
+       DisabledLanguages   map[string]bool
+       IgnoredLogs         map[string]bool
+       CreateTitle         func(s string) string
+       IsUglyURLSection    func(section string) bool
+       IgnoreFile          func(filename string) bool
+       SegmentFilter       segments.SegmentFilter
+       MainSections        []string
+       Clock               time.Time
+       HTTPCache           httpcache.ConfigCompiled
 
        // This is set to the last transient error found during config compilation.
        // With themes/modules we compute the configuration in multiple passes, and
@@ -505,6 +519,10 @@ type RootConfig struct {
        // Set this to true to put all languages below their language ID.
        DefaultContentLanguageInSubdir bool
 
+       // The default output format to use for the site.
+       // If not set, we will use the first output format.
+       DefaultOutputFormat string
+
        // Disable generation of redirect to the default language when DefaultContentLanguageInSubdir is enabled.
        DisableDefaultLanguageRedirect bool
 
index 3e599f946b6ffdc81147e5d8594d9eee7124e183..de8eb720f22e26f85038b480ff54050f605fb8eb 100644 (file)
@@ -79,6 +79,63 @@ xml-heading: Heading in p2|
 `)
 }
 
+// Issue 13242.
+func TestRenderHooksRSSOnly(t *testing.T) {
+       files := `
+-- hugo.toml --
+baseURL = "https://example.org"
+disableKinds = ["taxonomy", "term"]
+-- layouts/index.html --
+{{ $p := site.GetPage "p1.md" }}
+{{ $p2 := site.GetPage "p2.md" }}
+P1: {{ $p.Content }}
+P2: {{ $p2.Content }}
+-- layouts/index.xml --
+{{ $p2 := site.GetPage "p2.md" }}
+{{ $p3 := site.GetPage "p3.md" }}
+P2: {{ $p2.Content }}
+P3: {{ $p3.Content }}
+-- layouts/_default/_markup/render-link.rss.xml --
+xml-link: {{ .Destination | safeURL }}|
+-- layouts/_default/_markup/render-heading.rss.xml --
+xml-heading: {{ .Text }}|
+-- content/p1.md --
+---
+title: "p1"
+---
+P1. [I'm an inline-style link](https://www.gohugo.io)
+
+# Heading in p1
+
+-- content/p2.md --
+---
+title: "p2"
+---
+P2. [I'm an inline-style link](https://www.bep.is)
+
+# Heading in p2
+
+-- content/p3.md --
+---
+title: "p3"
+outputs: ["rss"]
+---
+P3. [I'm an inline-style link](https://www.example.org)
+`
+       b := Test(t, files)
+
+       b.AssertFileContent("public/index.html", `
+P1: <p>P1. <a href="https://www.gohugo.io">I&rsquo;m an inline-style link</a></p>
+<h1 id="heading-in-p1">Heading in p1</h1>
+<h1 id="heading-in-p2">Heading in p2</h1>
+`)
+       b.AssertFileContent("public/index.xml", `
+P2: <p>P2. xml-link: https://www.bep.is|</p>
+P3: <p>P3. xml-link: https://www.example.org|</p>
+xml-heading: Heading in p2|
+`)
+}
+
 // https://github.com/gohugoio/hugo/issues/6629
 func TestRenderLinkWithMarkupInText(t *testing.T) {
        b := newTestSitesBuilder(t)
index 6ebddbe442ec32104f8d8fec68d406ab0caeb668..7c6395e57b583684cb865f45bfac95b1c3266313 100644 (file)
@@ -318,7 +318,9 @@ func (pco *pageContentOutput) initRenderHooks() error {
                                }
                                if found {
                                        if isitp, ok := templ.(tpl.IsInternalTemplateProvider); ok && isitp.IsInternalTemplate() {
+
                                                renderHookConfig := pco.po.p.s.conf.Markup.Goldmark.RenderHooks
+
                                                switch templ.Name() {
                                                case "_default/_markup/render-link.html":
                                                        if !renderHookConfig.Link.IsEnableDefault() {
@@ -335,17 +337,20 @@ func (pco *pageContentOutput) initRenderHooks() error {
                        }
 
                        templ, found1 := getHookTemplate(pco.po.f)
-
                        if !found1 || pco.po.p.reusePageOutputContent() {
+                               defaultOutputFormat := pco.po.p.s.conf.C.DefaultOutputFormat
+
+                               candidates := pco.po.p.s.renderFormats
+
                                // Some hooks may only be available in HTML, and if
                                // this site is configured to not have HTML output, we need to
                                // make sure we have a fallback. This should be very rare.
-                               candidates := pco.po.p.s.renderFormats
                                if pco.po.f.MediaType.FirstSuffix.Suffix != "html" {
                                        if _, found := candidates.GetBySuffix("html"); !found {
                                                candidates = append(candidates, output.HTMLFormat)
                                        }
                                }
+
                                // Check if some of the other output formats would give a different template.
                                for _, f := range candidates {
                                        if f.Name == pco.po.f.Name {
@@ -354,7 +359,7 @@ func (pco *pageContentOutput) initRenderHooks() error {
                                        templ2, found2 := getHookTemplate(f)
 
                                        if found2 {
-                                               if !found1 {
+                                               if !found1 && f.Name == defaultOutputFormat.Name {
                                                        templ = templ2
                                                        found1 = true
                                                        break
@@ -367,6 +372,7 @@ func (pco *pageContentOutput) initRenderHooks() error {
                                        }
                                }
                        }
+
                        if !found1 {
                                if tp == hooks.CodeBlockRendererType {
                                        // No user provided template for code blocks, so we use the native Go version -- which is also faster.
index 42e1b8ed521ea37f3f11bc8ff9eefb17083edb94..793263e0409c4c3351b7202014bfd2122bf33203 100644 (file)
@@ -208,7 +208,7 @@ func TestRebuildRenameTextFileInLeafBundle(t *testing.T) {
                b.RenameFile("content/mysection/mysectionbundle/mysectionbundletext.txt", "content/mysection/mysectionbundle/mysectionbundletext2.txt").Build()
                b.AssertFileContent("public/mysection/mysectionbundle/index.html", "mysectionbundletext2", "My Section Bundle Text 2 Content.", "Len Resources: 2|")
                b.AssertRenderCountPage(8)
-               b.AssertRenderCountContent(8)
+               b.AssertRenderCountContent(9)
        })
 }