hugo/output/docshelper.go
Bjørn Erik Pedersen 51dd462c39 layout: Respect Type and Layout for list template selection
This commit also has some other nice side-effects:

* The layout logic is unified for all page types, which should make it less surprising
* Page.Render now supports all types
* The legacy "indexes" type is removed from the template lookup order. This is an undocumented type from early Hugo days. This means that having a template in, say, `/layouts/indexes/list.html` will no longer work.
* The theme override logic is improved. As an example, an `index.html` in theme will now wn over a `_default/list.html` in the project, which most will expect.

Fixes #3005
Fixes #3245
2018-01-14 19:59:51 +01:00

88 lines
2.6 KiB
Go

package output
import (
"strings"
"fmt"
"github.com/gohugoio/hugo/docshelper"
)
// This is is just some helpers used to create some JSON used in the Hugo docs.
func init() {
docsProvider := func() map[string]interface{} {
docs := make(map[string]interface{})
docs["formats"] = DefaultFormats
docs["layouts"] = createLayoutExamples()
return docs
}
docshelper.AddDocProvider("output", docsProvider)
}
func createLayoutExamples() interface{} {
type Example struct {
Example string
OutputFormat string
Suffix string
Layouts []string `json:"Template Lookup Order"`
}
var (
basicExamples []Example
demoLayout = "demolayout"
demoType = "demotype"
)
for _, example := range []struct {
name string
d LayoutDescriptor
hasTheme bool
f Format
}{
{`AMP home, with theme "demoTheme".`, LayoutDescriptor{Kind: "home"}, true, AMPFormat},
{`AMP home, French language".`, LayoutDescriptor{Kind: "home", Lang: "fr"}, false, AMPFormat},
{"RSS home, no theme.", LayoutDescriptor{Kind: "home"}, false, RSSFormat},
{"JSON home, no theme.", LayoutDescriptor{Kind: "home"}, false, JSONFormat},
{fmt.Sprintf(`CSV regular, "layout: %s" in front matter.`, demoLayout), LayoutDescriptor{Kind: "page", Layout: demoLayout}, false, CSVFormat},
{fmt.Sprintf(`JSON regular, "type: %s" in front matter.`, demoType), LayoutDescriptor{Kind: "page", Type: demoType}, false, JSONFormat},
{"HTML regular.", LayoutDescriptor{Kind: "page"}, false, HTMLFormat},
{"AMP regular.", LayoutDescriptor{Kind: "page"}, false, AMPFormat},
{"Calendar blog section.", LayoutDescriptor{Kind: "section", Section: "blog"}, false, CalendarFormat},
{"Calendar taxonomy list.", LayoutDescriptor{Kind: "taxonomy", Section: "tag"}, false, CalendarFormat},
{"Calendar taxonomy term.", LayoutDescriptor{Kind: "taxonomyTerm", Section: "tag"}, false, CalendarFormat},
} {
l := NewLayoutHandler(example.hasTheme)
layouts, _ := l.For(example.d, example.f)
basicExamples = append(basicExamples, Example{
Example: example.name,
OutputFormat: example.f.Name,
Suffix: example.f.MediaType.Suffix,
Layouts: makeLayoutsPresentable(layouts)})
}
return basicExamples
}
func makeLayoutsPresentable(l []string) []string {
var filtered []string
for _, ll := range l {
ll = strings.TrimPrefix(ll, "_text/")
if strings.Contains(ll, "theme/") {
ll = strings.Replace(ll, "theme/", "demoTheme/layouts/", -1)
} else {
ll = "layouts/" + ll
}
if !strings.Contains(ll, "indexes") {
filtered = append(filtered, ll)
}
}
return filtered
}