mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-17 21:01:26 +02:00
Make Page an interface
The main motivation of this commit is to add a `page.Page` interface to replace the very file-oriented `hugolib.Page` struct. This is all a preparation step for issue #5074, "pages from other data sources". But this also fixes a set of annoying limitations, especially related to custom output formats, and shortcodes. Most notable changes: * The inner content of shortcodes using the `{{%` as the outer-most delimiter will now be sent to the content renderer, e.g. Blackfriday. This means that any markdown will partake in the global ToC and footnote context etc. * The Custom Output formats are now "fully virtualized". This removes many of the current limitations. * The taxonomy list type now has a reference to the `Page` object. This improves the taxonomy template `.Title` situation and make common template constructs much simpler. See #5074 Fixes #5763 Fixes #5758 Fixes #5090 Fixes #5204 Fixes #4695 Fixes #5607 Fixes #5707 Fixes #5719 Fixes #3113 Fixes #5706 Fixes #5767 Fixes #5723 Fixes #5769 Fixes #5770 Fixes #5771 Fixes #5759 Fixes #5776 Fixes #5777 Fixes #5778
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// Copyright 2018 The Hugo Authors. All rights reserved.
|
||||
// Copyright 2019 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.
|
||||
@@ -21,6 +21,8 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// TODO(bep) move and rewrite in resource/page.
|
||||
|
||||
func TestMergeLanguages(t *testing.T) {
|
||||
t.Parallel()
|
||||
assert := require.New(t)
|
||||
@@ -36,12 +38,12 @@ func TestMergeLanguages(t *testing.T) {
|
||||
frSite := h.Sites[1]
|
||||
nnSite := h.Sites[2]
|
||||
|
||||
assert.Equal(31, len(enSite.RegularPages))
|
||||
assert.Equal(6, len(frSite.RegularPages))
|
||||
assert.Equal(12, len(nnSite.RegularPages))
|
||||
assert.Equal(31, len(enSite.RegularPages()))
|
||||
assert.Equal(6, len(frSite.RegularPages()))
|
||||
assert.Equal(12, len(nnSite.RegularPages()))
|
||||
|
||||
for i := 0; i < 2; i++ {
|
||||
mergedNN := nnSite.RegularPages.MergeByLanguage(enSite.RegularPages)
|
||||
mergedNN := nnSite.RegularPages().MergeByLanguage(enSite.RegularPages())
|
||||
assert.Equal(31, len(mergedNN))
|
||||
for i := 1; i <= 31; i++ {
|
||||
expectedLang := "en"
|
||||
@@ -49,11 +51,11 @@ func TestMergeLanguages(t *testing.T) {
|
||||
expectedLang = "nn"
|
||||
}
|
||||
p := mergedNN[i-1]
|
||||
assert.Equal(expectedLang, p.Lang(), fmt.Sprintf("Test %d", i))
|
||||
assert.Equal(expectedLang, p.Language().Lang, fmt.Sprintf("Test %d", i))
|
||||
}
|
||||
}
|
||||
|
||||
mergedFR := frSite.RegularPages.MergeByLanguage(enSite.RegularPages)
|
||||
mergedFR := frSite.RegularPages().MergeByLanguage(enSite.RegularPages())
|
||||
assert.Equal(31, len(mergedFR))
|
||||
for i := 1; i <= 31; i++ {
|
||||
expectedLang := "en"
|
||||
@@ -61,28 +63,28 @@ func TestMergeLanguages(t *testing.T) {
|
||||
expectedLang = "fr"
|
||||
}
|
||||
p := mergedFR[i-1]
|
||||
assert.Equal(expectedLang, p.Lang(), fmt.Sprintf("Test %d", i))
|
||||
assert.Equal(expectedLang, p.Language().Lang, fmt.Sprintf("Test %d", i))
|
||||
}
|
||||
|
||||
firstNN := nnSite.RegularPages[0]
|
||||
firstNN := nnSite.RegularPages()[0]
|
||||
assert.Equal(4, len(firstNN.Sites()))
|
||||
assert.Equal("en", firstNN.Sites().First().Language().Lang)
|
||||
|
||||
nnBundle := nnSite.getPage("page", "bundle")
|
||||
enBundle := enSite.getPage("page", "bundle")
|
||||
|
||||
assert.Equal(6, len(enBundle.Resources))
|
||||
assert.Equal(2, len(nnBundle.Resources))
|
||||
assert.Equal(6, len(enBundle.Resources()))
|
||||
assert.Equal(2, len(nnBundle.Resources()))
|
||||
|
||||
var ri interface{} = nnBundle.Resources
|
||||
var ri interface{} = nnBundle.Resources()
|
||||
|
||||
// This looks less ugly in the templates ...
|
||||
mergedNNResources := ri.(resource.ResourcesLanguageMerger).MergeByLanguage(enBundle.Resources)
|
||||
mergedNNResources := ri.(resource.ResourcesLanguageMerger).MergeByLanguage(enBundle.Resources())
|
||||
assert.Equal(6, len(mergedNNResources))
|
||||
|
||||
unchanged, err := nnSite.RegularPages.MergeByLanguageInterface(nil)
|
||||
unchanged, err := nnSite.RegularPages().MergeByLanguageInterface(nil)
|
||||
assert.NoError(err)
|
||||
assert.Equal(nnSite.RegularPages, unchanged)
|
||||
assert.Equal(nnSite.RegularPages(), unchanged)
|
||||
|
||||
}
|
||||
|
||||
@@ -93,7 +95,7 @@ func TestMergeLanguagesTemplate(t *testing.T) {
|
||||
b.WithTemplates("home.html", `
|
||||
{{ $pages := .Site.RegularPages }}
|
||||
{{ .Scratch.Set "pages" $pages }}
|
||||
{{ if eq .Lang "nn" }}:
|
||||
{{ if eq .Language.Lang "nn" }}:
|
||||
{{ $enSite := index .Sites 0 }}
|
||||
{{ $frSite := index .Sites 1 }}
|
||||
{{ $nnBundle := .Site.GetPage "page" "bundle" }}
|
||||
@@ -103,8 +105,8 @@ func TestMergeLanguagesTemplate(t *testing.T) {
|
||||
{{ end }}
|
||||
{{ $pages := .Scratch.Get "pages" }}
|
||||
{{ $pages2 := .Scratch.Get "pages2" }}
|
||||
Pages1: {{ range $i, $p := $pages }}{{ add $i 1 }}: {{ .Path }} {{ .Lang }} | {{ end }}
|
||||
Pages2: {{ range $i, $p := $pages2 }}{{ add $i 1 }}: {{ .Title }} {{ .Lang }} | {{ end }}
|
||||
Pages1: {{ range $i, $p := $pages }}{{ add $i 1 }}: {{ .File.Path }} {{ .Language.Lang }} | {{ end }}
|
||||
Pages2: {{ range $i, $p := $pages2 }}{{ add $i 1 }}: {{ .Title }} {{ .Language.Lang }} | {{ end }}
|
||||
|
||||
`,
|
||||
"shortcodes/shortcode.html", "MyShort",
|
||||
@@ -178,7 +180,7 @@ func BenchmarkMergeByLanguage(b *testing.B) {
|
||||
nnSite := h.Sites[2]
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
merged := nnSite.RegularPages.MergeByLanguage(enSite.RegularPages)
|
||||
merged := nnSite.RegularPages().MergeByLanguage(enSite.RegularPages())
|
||||
if len(merged) != count {
|
||||
b.Fatal("Count mismatch")
|
||||
}
|
||||
|
Reference in New Issue
Block a user