mirror of
https://github.com/gohugoio/hugo.git
synced 2024-12-27 21:21:14 +00:00
b874a1ba7a
Before this commit, `Suffix` on `MediaType` was used both to set a custom file suffix and as a way to augment the mediatype definition (what you see after the "+", e.g. "image/svg+xml"). This had its limitations. For one, it was only possible with one file extension per MIME type. Now you can specify multiple file suffixes using "suffixes", but you need to specify the full MIME type identifier: [mediaTypes] [mediaTypes."image/svg+xml"] suffixes = ["svg", "abc ] In most cases, it will be enough to just change: [mediaTypes] [mediaTypes."my/custom-mediatype"] suffix = "txt" To: [mediaTypes] [mediaTypes."my/custom-mediatype"] suffixes = ["txt"] Hugo will still respect values set in "suffix" if no value for "suffixes" is provided, but this will be removed in a future release. Note that you can still get the Media Type's suffix from a template: {{ $mediaType.Suffix }}. But this will now map to the MIME type filename. Fixes #4920
98 lines
3.6 KiB
Go
98 lines
3.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
|
|
Kind 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
|
|
f Format
|
|
}{
|
|
// Taxonomy output.LayoutDescriptor={categories category taxonomy en false Type Section
|
|
{"Single page in \"posts\" section", LayoutDescriptor{Kind: "page", Type: "posts"}, HTMLFormat},
|
|
{"Single page in \"posts\" section with layout set", LayoutDescriptor{Kind: "page", Type: "posts", Layout: demoLayout}, HTMLFormat},
|
|
{"AMP single page", LayoutDescriptor{Kind: "page", Type: "posts"}, AMPFormat},
|
|
{"AMP single page, French language", LayoutDescriptor{Kind: "page", Type: "posts", Lang: "fr"}, AMPFormat},
|
|
// All section or typeless pages gets "page" as type
|
|
{"Home page", LayoutDescriptor{Kind: "home", Type: "page"}, HTMLFormat},
|
|
{"Home page with type set", LayoutDescriptor{Kind: "home", Type: demoType}, HTMLFormat},
|
|
{"Home page with layout set", LayoutDescriptor{Kind: "home", Type: "page", Layout: demoLayout}, HTMLFormat},
|
|
{`AMP home, French language"`, LayoutDescriptor{Kind: "home", Type: "page", Lang: "fr"}, AMPFormat},
|
|
{"JSON home", LayoutDescriptor{Kind: "home", Type: "page"}, JSONFormat},
|
|
{"RSS home", LayoutDescriptor{Kind: "home", Type: "page"}, RSSFormat},
|
|
{"RSS section posts", LayoutDescriptor{Kind: "section", Type: "posts"}, RSSFormat},
|
|
{"Taxonomy list in categories", LayoutDescriptor{Kind: "taxonomy", Type: "categories", Section: "category"}, RSSFormat},
|
|
{"Taxonomy terms in categories", LayoutDescriptor{Kind: "taxonomyTerm", Type: "categories", Section: "category"}, RSSFormat},
|
|
{"Section list for \"posts\" section", LayoutDescriptor{Kind: "section", Type: "posts", Section: "posts"}, HTMLFormat},
|
|
{"Section list for \"posts\" section with type set to \"blog\"", LayoutDescriptor{Kind: "section", Type: "blog", Section: "posts"}, HTMLFormat},
|
|
{"Section list for \"posts\" section with layout set to \"demoLayout\"", LayoutDescriptor{Kind: "section", Layout: demoLayout, Section: "posts"}, HTMLFormat},
|
|
|
|
{"Taxonomy list in categories", LayoutDescriptor{Kind: "taxonomy", Type: "categories", Section: "category"}, HTMLFormat},
|
|
{"Taxonomy term in categories", LayoutDescriptor{Kind: "taxonomyTerm", Type: "categories", Section: "category"}, HTMLFormat},
|
|
} {
|
|
|
|
l := NewLayoutHandler()
|
|
layouts, _ := l.For(example.d, example.f)
|
|
|
|
basicExamples = append(basicExamples, Example{
|
|
Example: example.name,
|
|
Kind: example.d.Kind,
|
|
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 {
|
|
if strings.Contains(ll, "page/") {
|
|
// This is a valid lookup, but it's more confusing than useful.
|
|
continue
|
|
}
|
|
ll = "layouts/" + strings.TrimPrefix(ll, "_text/")
|
|
|
|
if !strings.Contains(ll, "indexes") {
|
|
filtered = append(filtered, ll)
|
|
}
|
|
}
|
|
|
|
return filtered
|
|
}
|