mirror of
				https://github.com/gohugoio/hugo.git
				synced 2024-05-11 05:54:58 +00:00 
			
		
		
		
	This allows a `config.toml` (or `yaml`, ´yml`, or `json`)  in the theme to set:
1) `params` (but cannot override params in project. Will also get its own "namespace", i.e. `{{ .Site.Params.mytheme.my_param }}` will be the same as `{{ .Site.Params.my_param }}` providing that the main project does not define a param with that key.
2) `menu` -- but cannot redefine/add menus in the project. Must create its own menus with its own identifiers.
3) `languages` -- only `params` and `menu`. Same rules as above.
4) **new** `outputFormats`
5) **new** `mediaTypes`
This should help with the "theme portability" issue and people having to copy and paste lots of setting into their projects.
Fixes #4490
		
	
		
			
				
	
	
		
			307 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2016 The Hugo Authors. All rights reserved.
 | |
| //
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| // http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| 
 | |
| package hugolib
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/gohugoio/hugo/deps"
 | |
| 	"github.com/gohugoio/hugo/hugofs"
 | |
| 	"github.com/spf13/afero"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	caseMixingSiteConfigTOML = `
 | |
| Title = "In an Insensitive Mood"
 | |
| DefaultContentLanguage = "nn"
 | |
| defaultContentLanguageInSubdir = true
 | |
| 
 | |
| [Blackfriday]
 | |
| AngledQuotes = true
 | |
| HrefTargetBlank = true
 | |
| 
 | |
| [Params]
 | |
| Search = true
 | |
| Color = "green"
 | |
| mood = "Happy"
 | |
| [Params.Colors]
 | |
| Blue = "blue"
 | |
| Yellow = "yellow"
 | |
| 
 | |
| [Languages]
 | |
| [Languages.nn]
 | |
| title = "Nynorsk title"
 | |
| languageName = "Nynorsk"
 | |
| weight = 1
 | |
| 
 | |
| [Languages.en]
 | |
| TITLE = "English title"
 | |
| LanguageName = "English"
 | |
| Mood = "Thoughtful"
 | |
| Weight = 2
 | |
| COLOR = "Pink"
 | |
| [Languages.en.blackfriday]
 | |
| angledQuotes = false
 | |
| hrefTargetBlank = false
 | |
| [Languages.en.Colors]
 | |
| BLUE = "blues"
 | |
| yellow = "golden"
 | |
| `
 | |
| 	caseMixingPage1En = `
 | |
| ---
 | |
| TITLE: Page1 En Translation
 | |
| BlackFriday:
 | |
|   AngledQuotes: false
 | |
| Color: "black"
 | |
| Search: true
 | |
| mooD: "sad and lonely"
 | |
| ColorS: 
 | |
|   Blue: "bluesy"
 | |
|   Yellow: "sunny"  
 | |
| ---
 | |
| # "Hi"
 | |
| {{< shortcode >}}
 | |
| `
 | |
| 
 | |
| 	caseMixingPage1 = `
 | |
| ---
 | |
| titLe: Side 1
 | |
| blackFriday:
 | |
|   angledQuotes: true
 | |
| color: "red"
 | |
| search: false
 | |
| MooD: "sad"
 | |
| COLORS: 
 | |
|   blue: "heavenly"
 | |
|   yelloW: "Sunny"  
 | |
| ---
 | |
| # "Hi"
 | |
| {{< shortcode >}}
 | |
| `
 | |
| 
 | |
| 	caseMixingPage2 = `
 | |
| ---
 | |
| TITLE: Page2 Title
 | |
| BlackFriday:
 | |
|   AngledQuotes: false
 | |
| Color: "black"
 | |
| search: true
 | |
| MooD: "moody"
 | |
| ColorS: 
 | |
|   Blue: "sky"
 | |
|   YELLOW: "flower"  
 | |
| ---
 | |
| # Hi
 | |
| {{< shortcode >}}
 | |
| `
 | |
| )
 | |
| 
 | |
| func caseMixingTestsWriteCommonSources(t *testing.T, fs afero.Fs) {
 | |
| 	writeToFs(t, fs, filepath.Join("content", "sect1", "page1.md"), caseMixingPage1)
 | |
| 	writeToFs(t, fs, filepath.Join("content", "sect2", "page2.md"), caseMixingPage2)
 | |
| 	writeToFs(t, fs, filepath.Join("content", "sect1", "page1.en.md"), caseMixingPage1En)
 | |
| 
 | |
| 	writeToFs(t, fs, "layouts/shortcodes/shortcode.html", `
 | |
| Shortcode Page: {{ .Page.Params.COLOR }}|{{ .Page.Params.Colors.Blue  }}
 | |
| Shortcode Site: {{ .Page.Site.Params.COLOR }}|{{ .Site.Params.COLORS.YELLOW  }}
 | |
| `)
 | |
| 
 | |
| 	writeToFs(t, fs, "layouts/partials/partial.html", `
 | |
| Partial Page: {{ .Params.COLOR }}|{{ .Params.Colors.Blue }}
 | |
| Partial Site: {{ .Site.Params.COLOR }}|{{ .Site.Params.COLORS.YELLOW }}
 | |
| `)
 | |
| 
 | |
| 	writeToFs(t, fs, "config.toml", caseMixingSiteConfigTOML)
 | |
| 
 | |
| }
 | |
| 
 | |
| func TestCaseInsensitiveConfigurationVariations(t *testing.T) {
 | |
| 	t.Parallel()
 | |
| 
 | |
| 	// See issues 2615, 1129, 2590 and maybe some others
 | |
| 	// Also see 2598
 | |
| 	//
 | |
| 	// Viper is now, at least for the Hugo part, case insensitive
 | |
| 	// So we need tests for all of it, with needed adjustments on the Hugo side.
 | |
| 	// Not sure what that will be. Let us see.
 | |
| 
 | |
| 	// So all the below with case variations:
 | |
| 	// config: regular fields, blackfriday config, param with nested map
 | |
| 	// language: new and overridden values, in regular fields and nested paramsmap
 | |
| 	// page frontmatter: regular fields, blackfriday config, param with nested map
 | |
| 
 | |
| 	mm := afero.NewMemMapFs()
 | |
| 
 | |
| 	caseMixingTestsWriteCommonSources(t, mm)
 | |
| 
 | |
| 	cfg, _, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Filename: "config.toml"})
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	fs := hugofs.NewFrom(mm, cfg)
 | |
| 
 | |
| 	th := testHelper{cfg, fs, t}
 | |
| 
 | |
| 	writeSource(t, fs, filepath.Join("layouts", "_default", "baseof.html"), `
 | |
| Block Page Colors: {{ .Params.COLOR }}|{{ .Params.Colors.Blue }}	
 | |
| {{ block "main" . }}default{{end}}`)
 | |
| 
 | |
| 	writeSource(t, fs, filepath.Join("layouts", "sect2", "single.html"), `
 | |
| {{ define "main"}}
 | |
| Page Colors: {{ .Params.CoLOR }}|{{ .Params.Colors.Blue }}
 | |
| Site Colors: {{ .Site.Params.COlOR }}|{{ .Site.Params.COLORS.YELLOW }}
 | |
| {{ .Content }}
 | |
| {{ partial "partial.html" . }}
 | |
| {{ end }}
 | |
| `)
 | |
| 
 | |
| 	writeSource(t, fs, filepath.Join("layouts", "_default", "single.html"), `
 | |
| Page Title: {{ .Title }}
 | |
| Site Title: {{ .Site.Title }}
 | |
| Site Lang Mood: {{ .Site.Language.Params.MOoD }}
 | |
| Page Colors: {{ .Params.COLOR }}|{{ .Params.Colors.Blue }}
 | |
| Site Colors: {{ .Site.Params.COLOR }}|{{ .Site.Params.COLORS.YELLOW }}
 | |
| {{ .Content }}
 | |
| {{ partial "partial.html" . }}
 | |
| `)
 | |
| 
 | |
| 	sites, err := NewHugoSites(deps.DepsCfg{Fs: fs, Cfg: cfg})
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("Failed to create sites: %s", err)
 | |
| 	}
 | |
| 
 | |
| 	err = sites.Build(BuildCfg{})
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("Failed to build sites: %s", err)
 | |
| 	}
 | |
| 
 | |
| 	th.assertFileContent(filepath.Join("public", "nn", "sect1", "page1", "index.html"),
 | |
| 		"Page Colors: red|heavenly",
 | |
| 		"Site Colors: green|yellow",
 | |
| 		"Site Lang Mood: Happy",
 | |
| 		"Shortcode Page: red|heavenly",
 | |
| 		"Shortcode Site: green|yellow",
 | |
| 		"Partial Page: red|heavenly",
 | |
| 		"Partial Site: green|yellow",
 | |
| 		"Page Title: Side 1",
 | |
| 		"Site Title: Nynorsk title",
 | |
| 		"«Hi»", // angled quotes
 | |
| 	)
 | |
| 
 | |
| 	th.assertFileContent(filepath.Join("public", "en", "sect1", "page1", "index.html"),
 | |
| 		"Site Colors: Pink|golden",
 | |
| 		"Page Colors: black|bluesy",
 | |
| 		"Site Lang Mood: Thoughtful",
 | |
| 		"Page Title: Page1 En Translation",
 | |
| 		"Site Title: English title",
 | |
| 		"“Hi”",
 | |
| 	)
 | |
| 
 | |
| 	th.assertFileContent(filepath.Join("public", "nn", "sect2", "page2", "index.html"),
 | |
| 		"Page Colors: black|sky",
 | |
| 		"Site Colors: green|yellow",
 | |
| 		"Shortcode Page: black|sky",
 | |
| 		"Block Page Colors: black|sky",
 | |
| 		"Partial Page: black|sky",
 | |
| 		"Partial Site: green|yellow",
 | |
| 	)
 | |
| }
 | |
| 
 | |
| func TestCaseInsensitiveConfigurationForAllTemplateEngines(t *testing.T) {
 | |
| 	t.Parallel()
 | |
| 
 | |
| 	noOp := func(s string) string {
 | |
| 		return s
 | |
| 	}
 | |
| 
 | |
| 	amberFixer := func(s string) string {
 | |
| 		fixed := strings.Replace(s, "{{ .Site.Params", "{{ Site.Params", -1)
 | |
| 		fixed = strings.Replace(fixed, "{{ .Params", "{{ Params", -1)
 | |
| 		fixed = strings.Replace(fixed, ".Content", "Content", -1)
 | |
| 		fixed = strings.Replace(fixed, "{{", "#{", -1)
 | |
| 		fixed = strings.Replace(fixed, "}}", "}", -1)
 | |
| 
 | |
| 		return fixed
 | |
| 	}
 | |
| 
 | |
| 	for _, config := range []struct {
 | |
| 		suffix        string
 | |
| 		templateFixer func(s string) string
 | |
| 	}{
 | |
| 		{"amber", amberFixer},
 | |
| 		{"html", noOp},
 | |
| 		{"ace", noOp},
 | |
| 	} {
 | |
| 		doTestCaseInsensitiveConfigurationForTemplateEngine(t, config.suffix, config.templateFixer)
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| func doTestCaseInsensitiveConfigurationForTemplateEngine(t *testing.T, suffix string, templateFixer func(s string) string) {
 | |
| 
 | |
| 	mm := afero.NewMemMapFs()
 | |
| 
 | |
| 	caseMixingTestsWriteCommonSources(t, mm)
 | |
| 
 | |
| 	cfg, err := LoadConfigDefault(mm)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	fs := hugofs.NewFrom(mm, cfg)
 | |
| 
 | |
| 	th := testHelper{cfg, fs, t}
 | |
| 
 | |
| 	t.Log("Testing", suffix)
 | |
| 
 | |
| 	templTemplate := `
 | |
| p
 | |
| 	|
 | |
| 	| Page Colors: {{ .Params.CoLOR }}|{{ .Params.Colors.Blue }}
 | |
| 	| Site Colors: {{ .Site.Params.COlOR }}|{{ .Site.Params.COLORS.YELLOW }}
 | |
| 	| {{ .Content }}
 | |
| 
 | |
| `
 | |
| 
 | |
| 	templ := templateFixer(templTemplate)
 | |
| 
 | |
| 	t.Log(templ)
 | |
| 
 | |
| 	writeSource(t, fs, filepath.Join("layouts", "_default", fmt.Sprintf("single.%s", suffix)), templ)
 | |
| 
 | |
| 	sites, err := NewHugoSites(deps.DepsCfg{Fs: fs, Cfg: cfg})
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("Failed to create sites: %s", err)
 | |
| 	}
 | |
| 
 | |
| 	err = sites.Build(BuildCfg{})
 | |
| 
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("Failed to build sites: %s", err)
 | |
| 	}
 | |
| 
 | |
| 	th.assertFileContent(filepath.Join("public", "nn", "sect1", "page1", "index.html"),
 | |
| 		"Page Colors: red|heavenly",
 | |
| 		"Site Colors: green|yellow",
 | |
| 		"Shortcode Page: red|heavenly",
 | |
| 		"Shortcode Site: green|yellow",
 | |
| 	)
 | |
| 
 | |
| }
 |