docshelper.go (4173B)
1 package output
2
3 import (
4 "strings"
5
6 // "fmt"
7
8 "github.com/gohugoio/hugo/docshelper"
9 )
10
11 // This is is just some helpers used to create some JSON used in the Hugo docs.
12 func init() {
13 docsProvider := func() docshelper.DocProvider {
14 return docshelper.DocProvider{
15 "output": map[string]any{
16 "formats": DefaultFormats,
17 "layouts": createLayoutExamples(),
18 },
19 }
20 }
21
22 docshelper.AddDocProviderFunc(docsProvider)
23 }
24
25 func createLayoutExamples() any {
26 type Example struct {
27 Example string
28 Kind string
29 OutputFormat string
30 Suffix string
31 Layouts []string `json:"Template Lookup Order"`
32 }
33
34 var (
35 basicExamples []Example
36 demoLayout = "demolayout"
37 demoType = "demotype"
38 )
39
40 for _, example := range []struct {
41 name string
42 d LayoutDescriptor
43 f Format
44 }{
45 // Taxonomy output.LayoutDescriptor={categories category taxonomy en false Type Section
46 {"Single page in \"posts\" section", LayoutDescriptor{Kind: "page", Type: "posts"}, HTMLFormat},
47 {"Base template for single page in \"posts\" section", LayoutDescriptor{Baseof: true, Kind: "page", Type: "posts"}, HTMLFormat},
48 {"Single page in \"posts\" section with layout set", LayoutDescriptor{Kind: "page", Type: "posts", Layout: demoLayout}, HTMLFormat},
49 {"Base template for single page in \"posts\" section with layout set", LayoutDescriptor{Baseof: true, Kind: "page", Type: "posts", Layout: demoLayout}, HTMLFormat},
50 {"AMP single page", LayoutDescriptor{Kind: "page", Type: "posts"}, AMPFormat},
51 {"AMP single page, French language", LayoutDescriptor{Kind: "page", Type: "posts", Lang: "fr"}, AMPFormat},
52 // All section or typeless pages gets "page" as type
53 {"Home page", LayoutDescriptor{Kind: "home", Type: "page"}, HTMLFormat},
54 {"Base template for home page", LayoutDescriptor{Baseof: true, Kind: "home", Type: "page"}, HTMLFormat},
55 {"Home page with type set", LayoutDescriptor{Kind: "home", Type: demoType}, HTMLFormat},
56 {"Base template for home page with type set", LayoutDescriptor{Baseof: true, Kind: "home", Type: demoType}, HTMLFormat},
57 {"Home page with layout set", LayoutDescriptor{Kind: "home", Type: "page", Layout: demoLayout}, HTMLFormat},
58 {"AMP home, French language", LayoutDescriptor{Kind: "home", Type: "page", Lang: "fr"}, AMPFormat},
59 {"JSON home", LayoutDescriptor{Kind: "home", Type: "page"}, JSONFormat},
60 {"RSS home", LayoutDescriptor{Kind: "home", Type: "page"}, RSSFormat},
61 {"RSS section posts", LayoutDescriptor{Kind: "section", Type: "posts"}, RSSFormat},
62 {"Taxonomy in categories", LayoutDescriptor{Kind: "taxonomy", Type: "categories", Section: "category"}, RSSFormat},
63 {"Term in categories", LayoutDescriptor{Kind: "term", Type: "categories", Section: "category"}, RSSFormat},
64 {"Section list for \"posts\" section", LayoutDescriptor{Kind: "section", Type: "posts", Section: "posts"}, HTMLFormat},
65 {"Section list for \"posts\" section with type set to \"blog\"", LayoutDescriptor{Kind: "section", Type: "blog", Section: "posts"}, HTMLFormat},
66 {"Section list for \"posts\" section with layout set to \"demoLayout\"", LayoutDescriptor{Kind: "section", Layout: demoLayout, Section: "posts"}, HTMLFormat},
67
68 {"Taxonomy list in categories", LayoutDescriptor{Kind: "taxonomy", Type: "categories", Section: "category"}, HTMLFormat},
69 {"Taxonomy term in categories", LayoutDescriptor{Kind: "term", Type: "categories", Section: "category"}, HTMLFormat},
70 } {
71
72 l := NewLayoutHandler()
73 layouts, _ := l.For(example.d, example.f)
74
75 basicExamples = append(basicExamples, Example{
76 Example: example.name,
77 Kind: example.d.Kind,
78 OutputFormat: example.f.Name,
79 Suffix: example.f.MediaType.FirstSuffix.Suffix,
80 Layouts: makeLayoutsPresentable(layouts),
81 })
82 }
83
84 return basicExamples
85 }
86
87 func makeLayoutsPresentable(l []string) []string {
88 var filtered []string
89 for _, ll := range l {
90 if strings.Contains(ll, "page/") {
91 // This is a valid lookup, but it's more confusing than useful.
92 continue
93 }
94 ll = "layouts/" + strings.TrimPrefix(ll, "_text/")
95
96 if !strings.Contains(ll, "indexes") {
97 filtered = append(filtered, ll)
98 }
99 }
100
101 return filtered
102 }