From c4989c39f1b29b82475fd350d91af7b5c2c19bf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 2 Mar 2017 15:35:25 +0100 Subject: [PATCH] Add MediaType and a crude implementation See #2828 --- hugolib/hugo_sites.go | 7 +++++ hugolib/page.go | 11 +++++++ hugolib/site_render.go | 36 ++++++++++++++--------- media/type.go | 65 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 13 deletions(-) create mode 100644 media/type.go diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go index d0ad57525..88c0caa39 100644 --- a/hugolib/hugo_sites.go +++ b/hugolib/hugo_sites.go @@ -548,6 +548,13 @@ func (s *Site) preparePagesForRender(cfg *BuildCfg) { 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() diff --git a/hugolib/page.go b/hugolib/page.go index 141a71420..db31a90ae 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -38,6 +38,7 @@ import ( "github.com/spf13/cast" bp "github.com/spf13/hugo/bufferpool" + "github.com/spf13/hugo/media" "github.com/spf13/hugo/source" ) @@ -199,6 +200,10 @@ type Page struct { 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 @@ -1879,6 +1884,12 @@ func kindFromFilename(filename string) string { 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 { // This is either a taxonomy list, taxonomy term or a section diff --git a/hugolib/site_render.go b/hugolib/site_render.go index 9cc2f0eec..24c77a60b 100644 --- a/hugolib/site_render.go +++ b/hugolib/site_render.go @@ -21,6 +21,7 @@ import ( "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 (s *Site) renderPages() error { 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 - } } } diff --git a/media/type.go b/media/type.go new file mode 100644 index 000000000..701f8f4e1 --- /dev/null +++ b/media/type.go @@ -0,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