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  }