github.com/graemephi/kahugo@v0.62.3-0.20211121071557-d78c0423784d/resources/resource/resourcetypes.go (about) 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 resource 15 16 import ( 17 "image" 18 19 "github.com/gohugoio/hugo/common/maps" 20 "github.com/gohugoio/hugo/langs" 21 "github.com/gohugoio/hugo/media" 22 "github.com/gohugoio/hugo/resources/images/exif" 23 24 "github.com/gohugoio/hugo/common/hugio" 25 ) 26 27 // Cloner is an internal template and not meant for use in the templates. It 28 // may change without notice. 29 type Cloner interface { 30 Clone() Resource 31 } 32 33 // OriginProvider provides the original Resource if this is wrapped. 34 // This is an internal Hugo interface and not meant for use in the templates. 35 type OriginProvider interface { 36 Origin() Resource 37 GetFieldString(pattern string) (string, bool) 38 } 39 40 // Resource represents a linkable resource, i.e. a content page, image etc. 41 type Resource interface { 42 ResourceTypeProvider 43 MediaTypeProvider 44 ResourceLinksProvider 45 ResourceMetaProvider 46 ResourceParamsProvider 47 ResourceDataProvider 48 } 49 50 // Image represents an image resource. 51 type Image interface { 52 Resource 53 ImageOps 54 } 55 56 type ImageOps interface { 57 Height() int 58 Width() int 59 Fill(spec string) (Image, error) 60 Fit(spec string) (Image, error) 61 Resize(spec string) (Image, error) 62 Filter(filters ...interface{}) (Image, error) 63 Exif() *exif.Exif 64 65 // Internal 66 DecodeImage() (image.Image, error) 67 } 68 69 type ResourceTypeProvider interface { 70 // ResourceType is the resource type. For most file types, this is the main 71 // part of the MIME type, e.g. "image", "application", "text" etc. 72 // For content pages, this value is "page". 73 ResourceType() string 74 } 75 76 type ResourceTypesProvider interface { 77 ResourceTypeProvider 78 MediaTypeProvider 79 } 80 81 type MediaTypeProvider interface { 82 // MediaType is this resource's MIME type. 83 MediaType() media.Type 84 } 85 86 type ResourceLinksProvider interface { 87 // Permalink represents the absolute link to this resource. 88 Permalink() string 89 90 // RelPermalink represents the host relative link to this resource. 91 RelPermalink() string 92 } 93 94 type ResourceMetaProvider interface { 95 // Name is the logical name of this resource. This can be set in the front matter 96 // metadata for this resource. If not set, Hugo will assign a value. 97 // This will in most cases be the base filename. 98 // So, for the image "/some/path/sunset.jpg" this will be "sunset.jpg". 99 // The value returned by this method will be used in the GetByPrefix and ByPrefix methods 100 // on Resources. 101 Name() string 102 103 // Title returns the title if set in front matter. For content pages, this will be the expected value. 104 Title() string 105 } 106 107 type ResourceParamsProvider interface { 108 // Params set in front matter for this resource. 109 Params() maps.Params 110 } 111 112 type ResourceDataProvider interface { 113 // Resource specific data set by Hugo. 114 // One example would be.Data.Digest for fingerprinted resources. 115 Data() interface{} 116 } 117 118 // ResourcesLanguageMerger describes an interface for merging resources from a 119 // different language. 120 type ResourcesLanguageMerger interface { 121 MergeByLanguage(other Resources) Resources 122 // Needed for integration with the tpl package. 123 MergeByLanguageInterface(other interface{}) (interface{}, error) 124 } 125 126 // Identifier identifies a resource. 127 type Identifier interface { 128 Key() string 129 } 130 131 // ContentResource represents a Resource that provides a way to get to its content. 132 // Most Resource types in Hugo implements this interface, including Page. 133 type ContentResource interface { 134 MediaType() media.Type 135 ContentProvider 136 } 137 138 // ContentProvider provides Content. 139 // This should be used with care, as it will read the file content into memory, but it 140 // should be cached as effectively as possible by the implementation. 141 type ContentProvider interface { 142 // Content returns this resource's content. It will be equivalent to reading the content 143 // that RelPermalink points to in the published folder. 144 // The return type will be contextual, and should be what you would expect: 145 // * Page: template.HTML 146 // * JSON: String 147 // * Etc. 148 Content() (interface{}, error) 149 } 150 151 // OpenReadSeekCloser allows setting some other way (than reading from a filesystem) 152 // to open or create a ReadSeekCloser. 153 type OpenReadSeekCloser func() (hugio.ReadSeekCloser, error) 154 155 // ReadSeekCloserResource is a Resource that supports loading its content. 156 type ReadSeekCloserResource interface { 157 MediaType() media.Type 158 ReadSeekCloserProvider 159 } 160 161 type ReadSeekCloserProvider interface { 162 ReadSeekCloser() (hugio.ReadSeekCloser, error) 163 } 164 165 // LengthProvider is a Resource that provides a length 166 // (typically the length of the content). 167 type LengthProvider interface { 168 Len() int 169 } 170 171 // LanguageProvider is a Resource in a language. 172 type LanguageProvider interface { 173 Language() *langs.Language 174 } 175 176 // TranslationKeyProvider connects translations of the same Resource. 177 type TranslationKeyProvider interface { 178 TranslationKey() string 179 } 180 181 // UnmarshableResource represents a Resource that can be unmarshaled to some other format. 182 type UnmarshableResource interface { 183 ReadSeekCloserResource 184 Identifier 185 } 186 187 type resourceTypesHolder struct { 188 mediaType media.Type 189 resourceType string 190 } 191 192 func (r resourceTypesHolder) MediaType() media.Type { 193 return r.mediaType 194 } 195 196 func (r resourceTypesHolder) ResourceType() string { 197 return r.resourceType 198 } 199 200 func NewResourceTypesProvider(mediaType media.Type, resourceType string) ResourceTypesProvider { 201 return resourceTypesHolder{mediaType: mediaType, resourceType: resourceType} 202 } 203 204 type languageHolder struct { 205 lang *langs.Language 206 } 207 208 func (l languageHolder) Language() *langs.Language { 209 return l.lang 210 } 211 212 func NewLanguageProvider(lang *langs.Language) LanguageProvider { 213 return languageHolder{lang: lang} 214 }