diff options
Diffstat (limited to 'output')
-rw-r--r-- | output/docshelper.go | 2 | ||||
-rw-r--r-- | output/layout.go | 2 | ||||
-rw-r--r-- | output/layout_test.go | 8 | ||||
-rw-r--r-- | output/outputFormat.go | 37 | ||||
-rw-r--r-- | output/outputFormat_test.go | 42 |
5 files changed, 45 insertions, 46 deletions
diff --git a/output/docshelper.go b/output/docshelper.go index 42b871ab5..95e521ea3 100644 --- a/output/docshelper.go +++ b/output/docshelper.go @@ -76,7 +76,7 @@ func createLayoutExamples() interface{} { Example: example.name, Kind: example.d.Kind, OutputFormat: example.f.Name, - Suffix: example.f.MediaType.Suffix(), + Suffix: example.f.MediaType.FirstSuffix.Suffix, Layouts: makeLayoutsPresentable(layouts), }) } diff --git a/output/layout.go b/output/layout.go index 55e7fa305..91c7cc652 100644 --- a/output/layout.go +++ b/output/layout.go @@ -229,7 +229,7 @@ func (l *layoutBuilder) resolveVariations() []string { continue } - s := constructLayoutPath(typeVar, layoutVar, variation, l.f.MediaType.Suffix()) + s := constructLayoutPath(typeVar, layoutVar, variation, l.f.MediaType.FirstSuffix.Suffix) if s != "" { layouts = append(layouts, s) } diff --git a/output/layout_test.go b/output/layout_test.go index f98eea960..8b7a2b541 100644 --- a/output/layout_test.go +++ b/output/layout_test.go @@ -28,12 +28,8 @@ import ( func TestLayout(t *testing.T) { c := qt.New(t) - noExtNoDelimMediaType := media.TextType - noExtNoDelimMediaType.Suffixes = nil - noExtNoDelimMediaType.Delimiter = "" - - noExtMediaType := media.TextType - noExtMediaType.Suffixes = nil + noExtNoDelimMediaType := media.WithDelimiterAndSuffixes(media.TextType, "", "") + noExtMediaType := media.WithDelimiterAndSuffixes(media.TextType, ".", "") var ( ampType = Format{ diff --git a/output/outputFormat.go b/output/outputFormat.go index ee5881e2a..1bd86d2ca 100644 --- a/output/outputFormat.go +++ b/output/outputFormat.go @@ -20,6 +20,8 @@ import ( "sort" "strings" + "github.com/pkg/errors" + "github.com/mitchellh/mapstructure" "github.com/gohugoio/hugo/media" @@ -207,14 +209,16 @@ func (formats Formats) Less(i, j int) bool { // The lookup is case insensitive. func (formats Formats) GetBySuffix(suffix string) (f Format, found bool) { for _, ff := range formats { - if strings.EqualFold(suffix, ff.MediaType.Suffix()) { - if found { - // ambiguous - found = false - return + for _, suffix2 := range ff.MediaType.Suffixes() { + if strings.EqualFold(suffix, suffix2) { + if found { + // ambiguous + found = false + return + } + f = ff + found = true } - f = ff - found = true } } return @@ -310,6 +314,7 @@ func DecodeFormats(mediaTypes media.Types, maps ...map[string]interface{}) (Form } f = append(f, newOutFormat) + } } } @@ -319,7 +324,7 @@ func DecodeFormats(mediaTypes media.Types, maps ...map[string]interface{}) (Form return f, nil } -func decode(mediaTypes media.Types, input, output interface{}) error { +func decode(mediaTypes media.Types, input interface{}, output *Format) error { config := &mapstructure.DecoderConfig{ Metadata: nil, Result: output, @@ -337,12 +342,19 @@ func decode(mediaTypes media.Types, input, output interface{}) error { // If mediaType is a string, look it up and replace it // in the map. vv := dataVal.MapIndex(key) - if mediaTypeStr, ok := vv.Interface().(string); ok { - mediaType, found := mediaTypes.GetByType(mediaTypeStr) + vvi := vv.Interface() + + switch vviv := vvi.(type) { + case media.Type: + // OK + case string: + mediaType, found := mediaTypes.GetByType(vviv) if !found { - return c, fmt.Errorf("media type %q not found", mediaTypeStr) + return c, fmt.Errorf("media type %q not found", vviv) } dataVal.SetMapIndex(key, reflect.ValueOf(mediaType)) + default: + return nil, errors.Errorf("invalid output format configuration; wrong type for media type, expected string (e.g. text/html), got %T", vvi) } } } @@ -357,12 +369,13 @@ func decode(mediaTypes media.Types, input, output interface{}) error { } return decoder.Decode(input) + } // BaseFilename returns the base filename of f including an extension (ie. // "index.xml"). func (f Format) BaseFilename() string { - return f.BaseName + f.MediaType.FullSuffix() + return f.BaseName + f.MediaType.FirstSuffix.FullSuffix } // MarshalJSON returns the JSON encoding of f. diff --git a/output/outputFormat_test.go b/output/outputFormat_test.go index d91f1e410..806998866 100644 --- a/output/outputFormat_test.go +++ b/output/outputFormat_test.go @@ -19,36 +19,26 @@ import ( qt "github.com/frankban/quicktest" "github.com/gohugoio/hugo/media" - "github.com/google/go-cmp/cmp" -) - -var eq = qt.CmpEquals( - cmp.Comparer(func(m1, m2 media.Type) bool { - return m1.Type() == m2.Type() - }), - cmp.Comparer(func(o1, o2 Format) bool { - return o1.Name == o2.Name - }), ) func TestDefaultTypes(t *testing.T) { c := qt.New(t) c.Assert(CalendarFormat.Name, qt.Equals, "Calendar") - c.Assert(CalendarFormat.MediaType, eq, media.CalendarType) + c.Assert(CalendarFormat.MediaType, qt.Equals, media.CalendarType) c.Assert(CalendarFormat.Protocol, qt.Equals, "webcal://") c.Assert(CalendarFormat.Path, qt.HasLen, 0) c.Assert(CalendarFormat.IsPlainText, qt.Equals, true) c.Assert(CalendarFormat.IsHTML, qt.Equals, false) c.Assert(CSSFormat.Name, qt.Equals, "CSS") - c.Assert(CSSFormat.MediaType, eq, media.CSSType) + c.Assert(CSSFormat.MediaType, qt.Equals, media.CSSType) c.Assert(CSSFormat.Path, qt.HasLen, 0) c.Assert(CSSFormat.Protocol, qt.HasLen, 0) // Will inherit the BaseURL protocol. c.Assert(CSSFormat.IsPlainText, qt.Equals, true) c.Assert(CSSFormat.IsHTML, qt.Equals, false) c.Assert(CSVFormat.Name, qt.Equals, "CSV") - c.Assert(CSVFormat.MediaType, eq, media.CSVType) + c.Assert(CSVFormat.MediaType, qt.Equals, media.CSVType) c.Assert(CSVFormat.Path, qt.HasLen, 0) c.Assert(CSVFormat.Protocol, qt.HasLen, 0) c.Assert(CSVFormat.IsPlainText, qt.Equals, true) @@ -56,7 +46,7 @@ func TestDefaultTypes(t *testing.T) { c.Assert(CSVFormat.Permalinkable, qt.Equals, false) c.Assert(HTMLFormat.Name, qt.Equals, "HTML") - c.Assert(HTMLFormat.MediaType, eq, media.HTMLType) + c.Assert(HTMLFormat.MediaType, qt.Equals, media.HTMLType) c.Assert(HTMLFormat.Path, qt.HasLen, 0) c.Assert(HTMLFormat.Protocol, qt.HasLen, 0) c.Assert(HTMLFormat.IsPlainText, qt.Equals, false) @@ -64,7 +54,7 @@ func TestDefaultTypes(t *testing.T) { c.Assert(AMPFormat.Permalinkable, qt.Equals, true) c.Assert(AMPFormat.Name, qt.Equals, "AMP") - c.Assert(AMPFormat.MediaType, eq, media.HTMLType) + c.Assert(AMPFormat.MediaType, qt.Equals, media.HTMLType) c.Assert(AMPFormat.Path, qt.Equals, "amp") c.Assert(AMPFormat.Protocol, qt.HasLen, 0) c.Assert(AMPFormat.IsPlainText, qt.Equals, false) @@ -72,7 +62,7 @@ func TestDefaultTypes(t *testing.T) { c.Assert(AMPFormat.Permalinkable, qt.Equals, true) c.Assert(RSSFormat.Name, qt.Equals, "RSS") - c.Assert(RSSFormat.MediaType, eq, media.RSSType) + c.Assert(RSSFormat.MediaType, qt.Equals, media.RSSType) c.Assert(RSSFormat.Path, qt.HasLen, 0) c.Assert(RSSFormat.IsPlainText, qt.Equals, false) c.Assert(RSSFormat.NoUgly, qt.Equals, true) @@ -83,7 +73,7 @@ func TestGetFormatByName(t *testing.T) { c := qt.New(t) formats := Formats{AMPFormat, CalendarFormat} tp, _ := formats.GetByName("AMp") - c.Assert(tp, eq, AMPFormat) + c.Assert(tp, qt.Equals, AMPFormat) _, found := formats.GetByName("HTML") c.Assert(found, qt.Equals, false) _, found = formats.GetByName("FOO") @@ -95,9 +85,9 @@ func TestGetFormatByExt(t *testing.T) { formats1 := Formats{AMPFormat, CalendarFormat} formats2 := Formats{AMPFormat, HTMLFormat, CalendarFormat} tp, _ := formats1.GetBySuffix("html") - c.Assert(tp, eq, AMPFormat) + c.Assert(tp, qt.Equals, AMPFormat) tp, _ = formats1.GetBySuffix("ics") - c.Assert(tp, eq, CalendarFormat) + c.Assert(tp, qt.Equals, CalendarFormat) _, found := formats1.GetBySuffix("not") c.Assert(found, qt.Equals, false) @@ -129,18 +119,18 @@ func TestGetFormatByFilename(t *testing.T) { formats := Formats{AMPFormat, HTMLFormat, noExtDelimFormat, noExt, CalendarFormat} f, found := formats.FromFilename("my.amp.html") c.Assert(found, qt.Equals, true) - c.Assert(f, eq, AMPFormat) + c.Assert(f, qt.Equals, AMPFormat) _, found = formats.FromFilename("my.ics") c.Assert(found, qt.Equals, true) f, found = formats.FromFilename("my.html") c.Assert(found, qt.Equals, true) - c.Assert(f, eq, HTMLFormat) + c.Assert(f, qt.Equals, HTMLFormat) f, found = formats.FromFilename("my.nem") c.Assert(found, qt.Equals, true) - c.Assert(f, eq, noExtDelimFormat) + c.Assert(f, qt.Equals, noExtDelimFormat) f, found = formats.FromFilename("my.nex") c.Assert(found, qt.Equals, true) - c.Assert(f, eq, noExt) + c.Assert(f, qt.Equals, noExt) _, found = formats.FromFilename("my.css") c.Assert(found, qt.Equals, false) } @@ -172,7 +162,7 @@ func TestDecodeFormats(t *testing.T) { c.Assert(len(f), qt.Equals, len(DefaultFormats), msg) json, _ := f.GetByName("JSON") c.Assert(json.BaseName, qt.Equals, "myindex") - c.Assert(json.MediaType, eq, media.JSONType) + c.Assert(json.MediaType, qt.Equals, media.JSONType) c.Assert(json.IsPlainText, qt.Equals, false) }, }, @@ -192,7 +182,7 @@ func TestDecodeFormats(t *testing.T) { xml, found := f.GetByName("MYXMLFORMAT") c.Assert(found, qt.Equals, true) c.Assert(xml.BaseName, qt.Equals, "myxml") - c.Assert(xml.MediaType, eq, media.XMLType) + c.Assert(xml.MediaType, qt.Equals, media.XMLType) // Verify that we haven't changed the DefaultFormats slice. json, _ := f.GetByName("JSON") @@ -234,7 +224,7 @@ func TestDecodeFormats(t *testing.T) { xml, found := f.GetByName("MYOTHERXMLFORMAT") c.Assert(found, qt.Equals, true) c.Assert(xml.BaseName, qt.Equals, "myredefined") - c.Assert(xml.MediaType, eq, media.XMLType) + c.Assert(xml.MediaType, qt.Equals, media.XMLType) }, }, } |