Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-02 17:35:25 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-27 16:43:56 +0300
commitc4989c39f1b29b82475fd350d91af7b5c2c19bf5 (patch)
tree250d1fc5212b9565606e989880ef0f7cc65ec7a6
parent9262c5b32f99d677b6878984e35dbd6a5b31fbd8 (diff)
Add MediaType and a crude implementation
See #2828
-rw-r--r--hugolib/hugo_sites.go7
-rw-r--r--hugolib/page.go11
-rw-r--r--hugolib/site_render.go42
-rw-r--r--media/type.go65
4 files changed, 109 insertions, 16 deletions
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()
-
- layouts := p.layouts()
- s.Log.DEBUG.Printf("Render %s to %q with layouts %q", p.Kind, targetPath, layouts)
-
- 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() {
- if err := s.renderPaginator(p); err != nil {
- results <- err
+ // TODO(bep) output
+ for _, mediaType := range p.mediaTypes {
+ switch mediaType {
+
+ case media.HtmlType:
+ targetPath := p.TargetPath()
+
+ layouts := p.layouts()
+ s.Log.DEBUG.Printf("Render %s to %q with layouts %q", p.Kind, targetPath, layouts)
+
+ 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