shithub: hugo

Download patch

ref: 50c64415aa6593ba93bff086602a121aa9760d40
parent: 348834d0176611fc0a08121b86c40e37644a89e3
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Mon Mar 6 14:54:46 EST 2017

hugolib, output: Add theme logic to LayoutHandler

--- a/hugolib/shortcode_test.go
+++ b/hugolib/shortcode_test.go
@@ -37,7 +37,7 @@
 		var err error
 		cfg, fs := newTestCfg()
 
-		d := deps.DepsCfg{Language: helpers.NewLanguage("en", cfg), Fs: fs, WithTemplate: withTemplate[0]}
+		d := deps.DepsCfg{Language: helpers.NewLanguage("en", cfg), Cfg: cfg, Fs: fs, WithTemplate: withTemplate[0]}
 
 		s, err = NewSiteForCfg(d)
 		if err != nil {
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -124,7 +124,7 @@
 
 // reset returns a new Site prepared for rebuild.
 func (s *Site) reset() *Site {
-	return &Site{Deps: s.Deps, layoutHandler: &output.LayoutHandler{}, disabledKinds: s.disabledKinds, Language: s.Language, owner: s.owner, PageCollections: newPageCollections()}
+	return &Site{Deps: s.Deps, layoutHandler: output.NewLayoutHandler(s.PathSpec.ThemeSet()), disabledKinds: s.disabledKinds, Language: s.Language, owner: s.owner, PageCollections: newPageCollections()}
 }
 
 // newSite creates a new site with the given configuration.
@@ -140,7 +140,7 @@
 		disabledKinds[disabled] = true
 	}
 
-	s := &Site{PageCollections: c, layoutHandler: &output.LayoutHandler{}, Language: cfg.Language, disabledKinds: disabledKinds}
+	s := &Site{PageCollections: c, layoutHandler: output.NewLayoutHandler(cfg.Cfg.GetString("themesDir") != ""), Language: cfg.Language, disabledKinds: disabledKinds}
 
 	s.Info = newSiteInfo(siteBuilderCfg{s: s, pageCollections: c, language: s.Language})
 
@@ -193,7 +193,7 @@
 		return nil
 	}
 
-	cfg := deps.DepsCfg{WithTemplate: withTemplates, Language: lang}
+	cfg := deps.DepsCfg{WithTemplate: withTemplates, Language: lang, Cfg: lang}
 
 	return NewSiteForCfg(cfg)
 
@@ -1676,7 +1676,7 @@
 	close(errs)
 }
 
-// TODO(bep) output move
+// TODO(bep) output remove
 func (s *Site) appendThemeTemplates(in []string) []string {
 	if !s.PathSpec.ThemeSet() {
 		return in
--- a/hugolib/site_render.go
+++ b/hugolib/site_render.go
@@ -82,7 +82,7 @@
 
 			s.Log.DEBUG.Printf("Render %s to %q with layouts %q", p.Kind, targetPath, layouts)
 
-			if err := s.renderAndWritePage("page "+p.FullFilePath(), targetPath, p, s.appendThemeTemplates(layouts)...); err != nil {
+			if err := s.renderAndWritePage("page "+p.FullFilePath(), targetPath, p, layouts...); err != nil {
 				results <- err
 			}
 
--- a/hugolib/testhelpers_test.go
+++ b/hugolib/testhelpers_test.go
@@ -104,7 +104,7 @@
 		cfg.Set(configKeyValues[i].(string), configKeyValues[i+1])
 	}
 
-	d := deps.DepsCfg{Language: helpers.NewLanguage("en", cfg), Fs: fs}
+	d := deps.DepsCfg{Language: helpers.NewLanguage("en", cfg), Fs: fs, Cfg: cfg}
 
 	s, err := NewSiteForCfg(d)
 
--- a/output/layout.go
+++ b/output/layout.go
@@ -30,8 +30,13 @@
 // Layout calculates the layout template to use to render a given output type.
 // TODO(bep) output improve names
 type LayoutHandler struct {
+	hasTheme bool
 }
 
+func NewLayoutHandler(hasTheme bool) *LayoutHandler {
+	return &LayoutHandler{hasTheme: hasTheme}
+}
+
 // TODO(bep) output theme layouts
 var (
 	layoutsHome        = "index.html _default/list.html"
@@ -63,8 +68,30 @@
 		layouts = regularPageLayouts(id.PageType(), layout)
 	}
 
-	for _, l := range layouts {
-		layouts = append(layouts, "theme/"+l)
+	if l.hasTheme {
+		layoutsWithThemeLayouts := []string{}
+		// First place all non internal templates
+		for _, t := range layouts {
+			if !strings.HasPrefix(t, "_internal/") {
+				layoutsWithThemeLayouts = append(layoutsWithThemeLayouts, t)
+			}
+		}
+
+		// Then place theme templates with the same names
+		for _, t := range layouts {
+			if !strings.HasPrefix(t, "_internal/") {
+				layoutsWithThemeLayouts = append(layoutsWithThemeLayouts, "theme/"+t)
+			}
+		}
+
+		// Lastly place internal templates
+		for _, t := range layouts {
+			if strings.HasPrefix(t, "_internal/") {
+				layoutsWithThemeLayouts = append(layoutsWithThemeLayouts, t)
+			}
+		}
+
+		return layoutsWithThemeLayouts
 	}
 
 	return layouts
--- a/output/layout_test.go
+++ b/output/layout_test.go
@@ -14,6 +14,7 @@
 package output
 
 import (
+	"fmt"
 	"testing"
 
 	"github.com/stretchr/testify/require"
@@ -43,28 +44,45 @@
 }
 
 func TestLayout(t *testing.T) {
-	l := &LayoutHandler{}
 
-	for _, this := range []struct {
+	for i, this := range []struct {
 		li             testLayoutIdentifier
+		hasTheme       bool
 		layoutOverride string
 		tp             Type
 		expect         []string
 	}{
-		{testLayoutIdentifier{"home", "", "", ""}, "", HTMLType, []string{"index.html", "_default/list.html", "theme/index.html", "theme/_default/list.html"}},
-		{testLayoutIdentifier{"section", "sect1", "", ""}, "", HTMLType, []string{"section/sect1.html", "sect1/list.html"}},
-		{testLayoutIdentifier{"taxonomy", "tag", "", ""}, "", HTMLType, []string{"taxonomy/tag.html", "indexes/tag.html"}},
-		{testLayoutIdentifier{"taxonomyTerm", "categories", "", ""}, "", HTMLType, []string{"taxonomy/categories.terms.html", "_default/terms.html"}},
-		{testLayoutIdentifier{"page", "", "", ""}, "", HTMLType, []string{"_default/single.html", "theme/_default/single.html"}},
-		{testLayoutIdentifier{"page", "", "mylayout", ""}, "", HTMLType, []string{"_default/mylayout.html"}},
-		{testLayoutIdentifier{"page", "", "mylayout", "myttype"}, "", HTMLType, []string{"myttype/mylayout.html", "_default/mylayout.html"}},
-		{testLayoutIdentifier{"page", "", "mylayout", "myttype/mysubtype"}, "", HTMLType, []string{"myttype/mysubtype/mylayout.html", "myttype/mylayout.html", "_default/mylayout.html"}},
-		{testLayoutIdentifier{"page", "", "mylayout", "myttype"}, "myotherlayout", HTMLType, []string{"myttype/myotherlayout.html", "_default/myotherlayout.html"}},
+		{testLayoutIdentifier{"home", "", "", ""}, true, "", HTMLType,
+			[]string{"index.html", "_default/list.html", "theme/index.html", "theme/_default/list.html"}},
+		{testLayoutIdentifier{"section", "sect1", "", ""}, false, "", HTMLType,
+			[]string{"section/sect1.html", "sect1/list.html"}},
+		{testLayoutIdentifier{"taxonomy", "tag", "", ""}, false, "", HTMLType,
+			[]string{"taxonomy/tag.html", "indexes/tag.html"}},
+		{testLayoutIdentifier{"taxonomyTerm", "categories", "", ""}, false, "", HTMLType,
+			[]string{"taxonomy/categories.terms.html", "_default/terms.html"}},
+		{testLayoutIdentifier{"page", "", "", ""}, true, "", HTMLType,
+			[]string{"_default/single.html", "theme/_default/single.html"}},
+		{testLayoutIdentifier{"page", "", "mylayout", ""}, false, "", HTMLType,
+			[]string{"_default/mylayout.html"}},
+		{testLayoutIdentifier{"page", "", "mylayout", "myttype"}, false, "", HTMLType,
+			[]string{"myttype/mylayout.html", "_default/mylayout.html"}},
+		{testLayoutIdentifier{"page", "", "mylayout", "myttype/mysubtype"}, false, "", HTMLType,
+			[]string{"myttype/mysubtype/mylayout.html", "myttype/mylayout.html", "_default/mylayout.html"}},
+		{testLayoutIdentifier{"page", "", "mylayout", "myttype"}, false, "myotherlayout", HTMLType,
+			[]string{"myttype/myotherlayout.html", "_default/myotherlayout.html"}},
 	} {
+		l := NewLayoutHandler(this.hasTheme)
+		logMsg := fmt.Sprintf("Test %d", i)
 		layouts := l.For(this.li, this.layoutOverride, this.tp)
-		require.NotNil(t, layouts)
-		require.True(t, len(layouts) >= len(this.expect))
+		require.NotNil(t, layouts, logMsg)
+		require.True(t, len(layouts) >= len(this.expect), logMsg)
 		// Not checking the complete list for now ...
-		require.Equal(t, this.expect, layouts[:len(this.expect)])
+		require.Equal(t, this.expect, layouts[:len(this.expect)], logMsg)
+
+		if !this.hasTheme {
+			for _, layout := range layouts {
+				require.NotContains(t, layout, "theme", logMsg)
+			}
+		}
 	}
 }
--