diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-03-15 09:37:30 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-03-16 10:10:01 +0100 |
commit | ffaec4ca8c4c6fd05b195879ccd65acf2fd5a6ac (patch) | |
tree | 28d4a68d5b41d5ccd769208856d0e3b4f086ebe5 /hugolib/pages_language_merge_test.go | |
parent | 91fb8f1b59cce50de914d66dac1d406655c3c43b (diff) |
Add a way to merge pages by language
As an example:
```html
{{ $pages := .Site.RegularPages | lang.Merge $frSite.RegularPages | lang.Merge $enSite.RegularPages }}
```
Will "fill in the gaps" in the current site with, from left to right, content from the French site, and lastly the English.
Fixes #4463
Diffstat (limited to 'hugolib/pages_language_merge_test.go')
-rw-r--r-- | hugolib/pages_language_merge_test.go | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/hugolib/pages_language_merge_test.go b/hugolib/pages_language_merge_test.go new file mode 100644 index 000000000..3b55a6288 --- /dev/null +++ b/hugolib/pages_language_merge_test.go @@ -0,0 +1,150 @@ +// Copyright 2018 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" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMergeLanguages(t *testing.T) { + t.Parallel() + assert := require.New(t) + + b := newTestSiteForLanguageMerge(t, 30) + b.CreateSites() + + b.Build(BuildCfg{SkipRender: true}) + + h := b.H + + enSite := h.Sites[0] + frSite := h.Sites[1] + nnSite := h.Sites[2] + + assert.Equal(30, len(enSite.RegularPages)) + assert.Equal(6, len(frSite.RegularPages)) + assert.Equal(11, len(nnSite.RegularPages)) + + for i := 0; i < 2; i++ { + mergedNN := nnSite.RegularPages.MergeByLanguage(enSite.RegularPages) + assert.Equal(30, len(mergedNN)) + for i := 1; i <= 30; i++ { + expectedLang := "en" + if i == 2 || i%3 == 0 { + expectedLang = "nn" + } + p := mergedNN[i-1] + assert.Equal(expectedLang, p.Lang(), fmt.Sprintf("Test %d", i)) + } + } + + mergedFR := frSite.RegularPages.MergeByLanguage(enSite.RegularPages) + assert.Equal(30, len(mergedFR)) + for i := 1; i <= 30; i++ { + expectedLang := "en" + if i%5 == 0 { + expectedLang = "fr" + } + p := mergedFR[i-1] + assert.Equal(expectedLang, p.Lang(), fmt.Sprintf("Test %d", i)) + } + + firstNN := nnSite.RegularPages[0] + assert.Equal(4, len(firstNN.Sites())) + assert.Equal("en", firstNN.Sites().First().Language.Lang) + +} + +func TestMergeLanguagesTemplate(t *testing.T) { + t.Parallel() + + b := newTestSiteForLanguageMerge(t, 15) + b.WithTemplates("home.html", ` +{{ $pages := .Site.RegularPages }} +{{ .Scratch.Set "pages" $pages }} +{{ if eq .Lang "nn" }}: +{{ $enSite := index .Sites 0 }} +{{ $frSite := index .Sites 1 }} +{{ .Scratch.Set "pages" ($pages | lang.Merge $frSite.RegularPages| lang.Merge $enSite.RegularPages) }} +{{ end }} +{{ $pages := .Scratch.Get "pages" }} +{{ range $i, $p := $pages }}{{ add $i 1 }}: {{ .Path }} {{ .Lang }} | {{ end }} +`, + "shortcodes/shortcode.html", "MyShort", + "shortcodes/lingo.html", "MyLingo", + ) + + b.CreateSites() + b.Build(BuildCfg{}) + + b.AssertFileContent("public/nn/index.html", "p1.md en | 2: p2.nn.md nn | 3: p3.nn.md nn | 4: p4.md en | 5: p5.fr.md fr | 6: p6.nn.md nn | 7: p7.md en | 8: p8.md en | 9: p9.nn.md nn | 10: p10.fr.md fr | 11: p11.md en | 12: p12.nn.md nn | 13: p13.md en | 14: p14.md en | 15: p15.nn.md nn") +} + +func newTestSiteForLanguageMerge(t testing.TB, count int) *sitesBuilder { + contentTemplate := `--- +title: doc%d +weight: %d +date: "2018-02-28" +--- +# doc +*some "content"* + +{{< shortcode >}} + +{{< lingo >}} +` + + builder := newTestSitesBuilder(t).WithDefaultMultiSiteConfig() + + // We need some content with some missing translations. + // "en" is the main language, so add some English content + some Norwegian (nn, nynorsk) content. + var contentPairs []string + for i := 1; i <= count; i++ { + content := fmt.Sprintf(contentTemplate, i, i) + contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.md", i), content}...) + if i == 2 || i%3 == 0 { + // Add page 2,3, 6, 9 ... to both languages + contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.nn.md", i), content}...) + } + if i%5 == 0 { + // Add some French content, too. + contentPairs = append(contentPairs, []string{fmt.Sprintf("p%d.fr.md", i), content}...) + } + } + + builder.WithContent(contentPairs...) + return builder +} + +func BenchmarkMergeByLanguage(b *testing.B) { + const count = 100 + + builder := newTestSiteForLanguageMerge(b, count) + builder.CreateSites() + builder.Build(BuildCfg{SkipRender: true}) + h := builder.H + + enSite := h.Sites[0] + nnSite := h.Sites[2] + + for i := 0; i < b.N; i++ { + merged := nnSite.RegularPages.MergeByLanguage(enSite.RegularPages) + if len(merged) != count { + b.Fatal("Count mismatch") + } + } +} |