page_outputformat.go (3022B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 // Package page contains the core interfaces and types for the Page resource, 15 // a core component in Hugo. 16 package page 17 18 import ( 19 "strings" 20 21 "github.com/gohugoio/hugo/media" 22 "github.com/gohugoio/hugo/output" 23 ) 24 25 // OutputFormats holds a list of the relevant output formats for a given page. 26 type OutputFormats []OutputFormat 27 28 // OutputFormat links to a representation of a resource. 29 type OutputFormat struct { 30 // Rel contains a value that can be used to construct a rel link. 31 // This is value is fetched from the output format definition. 32 // Note that for pages with only one output format, 33 // this method will always return "canonical". 34 // As an example, the AMP output format will, by default, return "amphtml". 35 // 36 // See: 37 // https://www.ampproject.org/docs/guides/deploy/discovery 38 // 39 // Most other output formats will have "alternate" as value for this. 40 Rel string 41 42 Format output.Format 43 44 relPermalink string 45 permalink string 46 } 47 48 // Name returns this OutputFormat's name, i.e. HTML, AMP, JSON etc. 49 func (o OutputFormat) Name() string { 50 return o.Format.Name 51 } 52 53 // MediaType returns this OutputFormat's MediaType (MIME type). 54 func (o OutputFormat) MediaType() media.Type { 55 return o.Format.MediaType 56 } 57 58 // Permalink returns the absolute permalink to this output format. 59 func (o OutputFormat) Permalink() string { 60 return o.permalink 61 } 62 63 // RelPermalink returns the relative permalink to this output format. 64 func (o OutputFormat) RelPermalink() string { 65 return o.relPermalink 66 } 67 68 func NewOutputFormat(relPermalink, permalink string, isCanonical bool, f output.Format) OutputFormat { 69 isUserConfigured := true 70 for _, d := range output.DefaultFormats { 71 if strings.EqualFold(d.Name, f.Name) { 72 isUserConfigured = false 73 } 74 } 75 rel := f.Rel 76 // If the output format is the canonical format for the content, we want 77 // to specify this in the "rel" attribute of an HTML "link" element. 78 // However, for custom output formats, we don't want to surprise users by 79 // overwriting "rel" 80 if isCanonical && !isUserConfigured { 81 rel = "canonical" 82 } 83 return OutputFormat{Rel: rel, Format: f, relPermalink: relPermalink, permalink: permalink} 84 } 85 86 // Get gets a OutputFormat given its name, i.e. json, html etc. 87 // It returns nil if none found. 88 func (o OutputFormats) Get(name string) *OutputFormat { 89 for _, f := range o { 90 if strings.EqualFold(f.Format.Name, name) { 91 return &f 92 } 93 } 94 return nil 95 }