summaryrefslogtreecommitdiffhomepage
path: root/output/outputFormat.go
diff options
context:
space:
mode:
Diffstat (limited to 'output/outputFormat.go')
-rw-r--r--output/outputFormat.go120
1 files changed, 120 insertions, 0 deletions
diff --git a/output/outputFormat.go b/output/outputFormat.go
new file mode 100644
index 000000000..8c99aa139
--- /dev/null
+++ b/output/outputFormat.go
@@ -0,0 +1,120 @@
+// Copyright 2017-present The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package output
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/spf13/hugo/media"
+)
+
+var (
+ // An ordered list of built-in output formats
+ // See https://www.ampproject.org/learn/overview/
+ AMPType = Format{
+ Name: "AMP",
+ MediaType: media.HTMLType,
+ BaseName: "index",
+ Path: "amp",
+ }
+
+ CSSType = Format{
+ Name: "CSS",
+ MediaType: media.CSSType,
+ BaseName: "styles",
+ }
+
+ HTMLType = Format{
+ Name: "HTML",
+ MediaType: media.HTMLType,
+ BaseName: "index",
+ }
+
+ JSONType = Format{
+ Name: "JSON",
+ MediaType: media.JSONType,
+ BaseName: "index",
+ IsPlainText: true,
+ }
+
+ RSSType = Format{
+ Name: "RSS",
+ MediaType: media.RSSType,
+ BaseName: "index",
+ NoUgly: true,
+ }
+)
+
+var builtInTypes = map[string]Format{
+ strings.ToLower(AMPType.Name): AMPType,
+ strings.ToLower(CSSType.Name): CSSType,
+ strings.ToLower(HTMLType.Name): HTMLType,
+ strings.ToLower(JSONType.Name): JSONType,
+ strings.ToLower(RSSType.Name): RSSType,
+}
+
+type Formats []Format
+
+// Format represents an output represenation, usually to a file on disk.
+type Format struct {
+ // The Name is used as an identifier. Internal output formats (i.e. HTML and RSS)
+ // can be overridden by providing a new definition for those types.
+ Name string
+
+ MediaType media.Type
+
+ // Must be set to a value when there are two or more conflicting mediatype for the same resource.
+ Path string
+
+ // The base output file name used when not using "ugly URLs", defaults to "index".
+ BaseName string
+
+ // The protocol to use, i.e. "webcal://". Defaults to the protocol of the baseURL.
+ Protocol string
+
+ // IsPlainText decides whether to use text/template or html/template
+ // as template parser.
+ IsPlainText bool
+
+ // Enable to ignore the global uglyURLs setting.
+ NoUgly bool
+}
+
+func GetType(key string) (Format, bool) {
+ found, ok := builtInTypes[key]
+ if !ok {
+ found, ok = builtInTypes[strings.ToLower(key)]
+ }
+ return found, ok
+}
+
+// TODO(bep) outputs rewamp on global config?
+func GetTypes(keys ...string) (Formats, error) {
+ var types []Format
+
+ for _, key := range keys {
+ tpe, ok := GetType(key)
+ if !ok {
+ return types, fmt.Errorf("OutputFormat with key %q not found", key)
+ }
+ types = append(types, tpe)
+ }
+
+ return types, nil
+}
+
+func (t Format) BaseFilename() string {
+ return t.BaseName + "." + t.MediaType.Suffix
+}