shithub: hugo

Download patch

ref: c4989c39f1b29b82475fd350d91af7b5c2c19bf5
parent: 9262c5b32f99d677b6878984e35dbd6a5b31fbd8
author: Bjørn Erik Pedersen <[email protected]>
date: Thu Mar 2 10:35:25 EST 2017

Add MediaType and a crude implementation

See #2828

--- a/hugolib/hugo_sites.go
+++ b/hugolib/hugo_sites.go
@@ -548,6 +548,13 @@
 					p.Content = helpers.BytesToHTML(workContentCopy)
 				}
 
+				// TODO(bep) output this is temporary
+				if p.IsNode() && p.Kind != KindTaxonomyTerm {
+					p.mediaTypes = mediaTypesWithRSS
+				} else {
+					p.mediaTypes = mediaTypesHTML
+				}
+
 				//analyze for raw stats
 				p.analyzePage()
 
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -38,6 +38,7 @@
 
 	"github.com/spf13/cast"
 	bp "github.com/spf13/hugo/bufferpool"
+	"github.com/spf13/hugo/media"
 	"github.com/spf13/hugo/source"
 )
 
@@ -199,6 +200,10 @@
 	language *helpers.Language
 
 	lang string
+
+	// The media types this page will be rendered to.
+	// TODO(bep) probably wrap this to add additional information like template evaluation?
+	mediaTypes media.Types
 }
 
 // pageInit lazy initializes different parts of the page. It is extracted
@@ -1878,6 +1883,12 @@
 	// We don't know enough yet to determine the type.
 	return kindUnknown
 }
+
+// TODO(bep) output
+var (
+	mediaTypesWithRSS = media.Types{media.HtmlType, media.RSSType}
+	mediaTypesHTML    = media.Types{media.HtmlType}
+)
 
 func (p *Page) setValuesForKind(s *Site) {
 	if p.Kind == kindUnknown {
--- a/hugolib/site_render.go
+++ b/hugolib/site_render.go
@@ -21,6 +21,7 @@
 	"time"
 
 	bp "github.com/spf13/hugo/bufferpool"
+	"github.com/spf13/hugo/media"
 )
 
 // renderPages renders pages each corresponding to a markdown file.
@@ -62,25 +63,34 @@
 func pageRenderer(s *Site, pages <-chan *Page, results chan<- error, wg *sync.WaitGroup) {
 	defer wg.Done()
 	for p := range pages {
-		targetPath := p.TargetPath()
+		// TODO(bep) output
+		for _, mediaType := range p.mediaTypes {
+			switch mediaType {
 
-		layouts := p.layouts()
-		s.Log.DEBUG.Printf("Render %s to %q with layouts %q", p.Kind, targetPath, layouts)
+			case media.HtmlType:
+				targetPath := p.TargetPath()
 
-		if err := s.renderAndWritePage("page "+p.FullFilePath(), targetPath, p, s.appendThemeTemplates(layouts)...); err != nil {
-			results <- err
-		}
+				layouts := p.layouts()
+				s.Log.DEBUG.Printf("Render %s to %q with layouts %q", p.Kind, targetPath, layouts)
 
-		// Taxonomy terms have no page set to paginate, so skip that for now.
-		if p.IsNode() {
-			if err := s.renderPaginator(p); err != nil {
-				results <- err
+				if err := s.renderAndWritePage("page "+p.FullFilePath(), targetPath, p, s.appendThemeTemplates(layouts)...); err != nil {
+					results <- err
+				}
+
+				// Taxonomy terms have no page set to paginate, so skip that for now.
+				if p.IsNode() && p.Kind != KindTaxonomyTerm {
+					if err := s.renderPaginator(p); err != nil {
+						results <- err
+					}
+				}
+
+			case media.RSSType:
+				if err := s.renderRSS(p); err != nil {
+					results <- err
+				}
 			}
 		}
 
-		if err := s.renderRSS(p); err != nil {
-			results <- err
-		}
 	}
 }
 
--- /dev/null
+++ b/media/type.go
@@ -1,0 +1,65 @@
+// 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 media
+
+import (
+	"fmt"
+)
+
+type Types []Type
+
+// A media type (also known as MIME type and content type) is a two-part identifier for
+// file formats and format contents transmitted on the Internet.
+// For Hugo's use case, we use the top-level type name / subtype name + suffix.
+// One example would be image/jpeg+jpg
+// If suffix is not provided, the sub type will be used.
+// See // https://en.wikipedia.org/wiki/Media_type
+type Type struct {
+	Type    string // i.e. text
+	SubType string // i.e. html
+	Suffix  string // i.e html
+}
+
+// Key return a key used to identify this media type. Hugo will register a set of
+// default media types. These can be overridden by the user in the configuration,
+// by defining a media type with the same Key.
+func (m Type) Key() string {
+	if m.Suffix != "" {
+		return fmt.Sprintf("%s/%s+%s", m.Type, m.SubType, m.Suffix)
+	}
+	return fmt.Sprintf("%s/%s", m.Type, m.SubType)
+}
+
+func (m Type) String() string {
+	return m.Key()
+}
+
+var (
+	HtmlType = Type{"text", "html", "html"}
+	RSSType  = Type{"application", "rss", "xml"}
+)
+
+// DefaultMediaTypes holds a default set of media types by Hugo.
+// These can be ovverriden, and more added if needed, in the Hugo configuration file.
+// The final media type set set will also be added as extensions to mime so
+// they will be recognised by the built-in server in Hugo.
+var DefaultMediaTypes = Types{
+	HtmlType,
+	RSSType,
+
+	// TODO(bep) output
+}
+
+// TODO(bep) output mime.AddExtensionType
+// TODO(bep) text/template vs html/template