diff options
Diffstat (limited to 'parser/metadecoders/format.go')
-rw-r--r-- | parser/metadecoders/format.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/parser/metadecoders/format.go b/parser/metadecoders/format.go index 3f5a8a5c1..4a30898fe 100644 --- a/parser/metadecoders/format.go +++ b/parser/metadecoders/format.go @@ -17,6 +17,8 @@ import ( "path/filepath" "strings" + "github.com/gohugoio/hugo/media" + "github.com/gohugoio/hugo/parser/pageparser" ) @@ -55,6 +57,18 @@ func FormatFromString(formatStr string) Format { } +// FormatFromMediaType gets the Format given a MIME type, empty string +// if unknown. +func FormatFromMediaType(m media.Type) Format { + for _, suffix := range m.Suffixes { + if f := FormatFromString(suffix); f != "" { + return f + } + } + + return "" +} + // FormatFromFrontMatterType will return empty if not supported. func FormatFromFrontMatterType(typ pageparser.ItemType) Format { switch typ { @@ -70,3 +84,39 @@ func FormatFromFrontMatterType(typ pageparser.ItemType) Format { return "" } } + +// FormatFromContentString tries to detect the format (JSON, YAML or TOML) +// in the given string. +// It return an empty string if no format could be detected. +func FormatFromContentString(data string) Format { + jsonIdx := strings.Index(data, "{") + yamlIdx := strings.Index(data, ":") + tomlIdx := strings.Index(data, "=") + + if isLowerIndexThan(jsonIdx, yamlIdx, tomlIdx) { + return JSON + } + + if isLowerIndexThan(yamlIdx, tomlIdx) { + return YAML + } + + if tomlIdx != -1 { + return TOML + } + + return "" +} + +func isLowerIndexThan(first int, others ...int) bool { + if first == -1 { + return false + } + for _, other := range others { + if other != -1 && other < first { + return false + } + } + + return true +} |