hugo/output/docshelper.go
Bjørn Erik Pedersen b874a1ba7a media: Allow multiple file suffixes per media type
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
2018-07-10 22:13:52 +02:00

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
}