Code view:

A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.

Before

…lines 1–15 unchanged (15 lines)
16import (
17 "encoding/json"
18 "fmt"
19 "image"
20 "image/color"
21 "image/draw"
22 "image/gif"
23 _ "image/png"
24 "io"
25 "os"
26 "strings"
27 "sync"
28
29 color_extractor "github.com/marekm4/color-extractor"
30
31 "github.com/gohugoio/hugo/cache/filecache"
32 "github.com/gohugoio/hugo/common/hashing"
33 "github.com/gohugoio/hugo/common/paths"
34
35 "github.com/disintegration/gift"
36
37 "github.com/gohugoio/hugo/resources/images/exif"
38 "github.com/gohugoio/hugo/resources/internal"
39
40 "github.com/gohugoio/hugo/resources/resource"
41
42 "github.com/gohugoio/hugo/resources/images"
43
44 // Blind import for image.Decode
45 _ "golang.org/x/image/webp"
46)
47
48var (
49 _ images.ImageResource = (*imageResource)(nil)
50 _ resource.Source = (*imageResource)(nil)
51 _ resource.Cloner = (*imageResource)(nil)
…lines 52–111 unchanged (60 lines)
112 i.metaInitErr = err
113 return
114 }
115 defer f.Close()
116
117 filename := i.getResourcePaths().Path()
118 x, err := i.getSpec().imaging.DecodeExif(filename, mf, f)
119 if err != nil {
120 i.getSpec().Logger.Warnf("Unable to decode Exif metadata from image: %s", i.Key())
121 return nil
122 }
123
124 i.meta = &imageMeta{Exif: x}
…lines 125–212 unchanged (88 lines)
213}
214
215// Resize resizes the image to the specified width and height using the specified resampling
216// filter and returns the transformed image. If one of width or height is 0, the image aspect
217// ratio is preserved.
218func (i *imageResource) Resize(spec string) (images.ImageResource, error) {
219 return i.processActionSpec(images.ActionResize, spec)
220}
221
222// Crop the image to the specified dimensions without resizing using the given anchor point.
223// Space delimited config, e.g. `200x300 TopLeft`.
224func (i *imageResource) Crop(spec string) (images.ImageResource, error) {
225 return i.processActionSpec(images.ActionCrop, spec)
…lines 226–379 unchanged (154 lines)
380 draw.FloydSteinberg.Draw(tmp, tmp.Bounds(), converted, converted.Bounds().Min)
381 converted = tmp
382 }
383 }
384
385 ci := i.clone(converted)
386 targetPath := i.relTargetPathFromConfig(conf, i.getSpec().imaging.Cfg.SourceHash)
387 ci.setTargetPath(targetPath)
388 ci.Format = conf.TargetFormat
389 ci.setMediaType(conf.TargetFormat.MediaType())
390
391 return ci, converted, nil
392 })
393 if err != nil {
394 return nil, err
395 }
396 return img, nil
397}
398
399type giphy struct {
400 image.Image
401 gif *gif.GIF
402}
403
404func (g *giphy) GIF() *gif.GIF {
405 return g.gif
406}
407
408// DecodeImage decodes the image source into an Image.
409// This for internal use only.
410func (i *imageResource) DecodeImage() (image.Image, error) {
411 f, err := i.ReadSeekCloser()
412 if err != nil {
413 return nil, fmt.Errorf("failed to open image for decode: %w", err)
414 }
415 defer f.Close()
416
417 if i.Format == images.GIF {
418 g, err := gif.DecodeAll(f)
419 if err != nil {
420 return nil, fmt.Errorf("failed to decode gif: %w", err)
421 }
422 return &giphy{gif: g, Image: g.Image[0]}, nil
423 }
424 img, _, err := image.Decode(f)
425 return img, err
426}
427
428func (i *imageResource) clone(img image.Image) *imageResource {
429 spec := i.baseResource.Clone().(baseResource)
430
431 var image *images.Image
…lines 432–443 unchanged (12 lines)
444
445func (i *imageResource) getImageMetaCacheTargetPath() string {
446 // Increment to invalidate the meta cache
447 // Last increment: v0.130.0 when change to the new imagemeta library for Exif.
448 const imageMetaVersionNumber = 2
449
450 cfgHash := i.getSpec().imaging.Cfg.SourceHash
451 df := i.getResourcePaths()
452 p1, _ := paths.FileAndExt(df.File)
453 h := i.hash()
454 idStr := hashing.HashStringHex(h, i.size(), imageMetaVersionNumber, cfgHash)
455 df.File = fmt.Sprintf("%s_%s.json", p1, idStr)
456 return df.TargetPath()
…lines 457–481 unchanged (25 lines)

After

…lines 1–15 unchanged (15 lines)
16import (
17 "encoding/json"
18 "fmt"
19 "image"
20 "image/color"
21 "image/draw"
22 "io"
23 "os"
24 "strings"
25 "sync"
26
27 color_extractor "github.com/marekm4/color-extractor"
28
29 "github.com/gohugoio/hugo/cache/filecache"
30 "github.com/gohugoio/hugo/common/hashing"
31 "github.com/gohugoio/hugo/common/herrors"
32 "github.com/gohugoio/hugo/common/paths"
33
34 "github.com/disintegration/gift"
35
36 "github.com/gohugoio/hugo/resources/images/exif"
37 "github.com/gohugoio/hugo/resources/internal"
38
39 "github.com/gohugoio/hugo/resources/resource"
40
41 "github.com/gohugoio/hugo/resources/images"
42)
43
44var (
45 _ images.ImageResource = (*imageResource)(nil)
46 _ resource.Source = (*imageResource)(nil)
47 _ resource.Cloner = (*imageResource)(nil)
48 _ resource.NameNormalizedProvider = (*imageResource)(nil)
…lines 49–107 unchanged (59 lines)
108 i.metaInitErr = err
109 return
110 }
111 defer f.Close()
112
113 filename := i.getResourcePaths().Path()
114 x, err := i.getSpec().Imaging.DecodeExif(filename, mf, f)
115 if err != nil {
116 i.getSpec().Logger.Warnf("Unable to decode Exif metadata from image: %s", i.Key())
117 return nil
118 }
119
120 i.meta = &imageMeta{Exif: x}
…lines 121–208 unchanged (88 lines)
209}
210
211// Resize resizes the image to the specified width and height using the specified resampling
212// filter and returns the transformed image. If one of width or height is 0, the image aspect
213// ratio is preserved.
214func (i *imageResource) Resize(spec string) (images.ImageResource, error) {
215 defer herrors.Recover()
216 return i.processActionSpec(images.ActionResize, spec)
217}
218
219// Crop the image to the specified dimensions without resizing using the given anchor point.
220// Space delimited config, e.g. `200x300 TopLeft`.
221func (i *imageResource) Crop(spec string) (images.ImageResource, error) {
…lines 222–376 unchanged (155 lines)
377 draw.FloydSteinberg.Draw(tmp, tmp.Bounds(), converted, converted.Bounds().Min)
378 converted = tmp
379 }
380 }
381
382 ci := i.clone(converted)
383 targetPath := i.relTargetPathFromConfig(conf, i.getSpec().Imaging.Cfg.SourceHash)
384 ci.setTargetPath(targetPath)
385 ci.Format = conf.TargetFormat
386 ci.setMediaType(conf.TargetFormat.MediaType())
387
388 return ci, converted, nil
389 })
390 if err != nil {
391 return nil, err
392 }
393 return img, nil
394}
395
396// DecodeImage decodes the image source into an Image.
397// This for internal use only.
398func (i *imageResource) DecodeImage() (image.Image, error) {
399 f, err := i.ReadSeekCloser()
400 if err != nil {
401 return nil, fmt.Errorf("failed to open image for decode: %w", err)
402 }
403 defer f.Close()
404
405 return i.getSpec().Imaging.Codec.DecodeFormat(i.Format, f)
406}
407
408func (i *imageResource) clone(img image.Image) *imageResource {
409 spec := i.baseResource.Clone().(baseResource)
410
411 var image *images.Image
…lines 412–423 unchanged (12 lines)
424
425func (i *imageResource) getImageMetaCacheTargetPath() string {
426 // Increment to invalidate the meta cache
427 // Last increment: v0.130.0 when change to the new imagemeta library for Exif.
428 const imageMetaVersionNumber = 2
429
430 cfgHash := i.getSpec().Imaging.Cfg.SourceHash
431 df := i.getResourcePaths()
432 p1, _ := paths.FileAndExt(df.File)
433 h := i.hash()
434 idStr := hashing.HashStringHex(h, i.size(), imageMetaVersionNumber, cfgHash)
435 df.File = fmt.Sprintf("%s_%s.json", p1, idStr)
436 return df.TargetPath()
…lines 437–461 unchanged (25 lines)

Before

source_file
comment "// Copyright 2019 The Hugo Authors. All rights reserved."
comment "//"
comment "// Licensed under the Apache License, Version 2.0 (the \"Lice"...
comment "// you may not use this file except in compliance with the L"...
comment "// You may obtain a copy of the License at"
comment "// http://www.apache.org/licenses/LICENSE-2.0"
comment "//"
comment "// Unless required by applicable law or agreed to in writing"...
comment "// distributed under the License is distributed on an \"AS IS"...
comment "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expr"...
comment "// See the License for the specific language governing permi"...
comment "// limitations under the License."
package_clause
package "package"
package_identifier "resources"
import_declaration
import "import"
import_spec_list
( "("
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "encoding/json"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "fmt"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "image"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "image/color"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "image/draw"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "image/gif"
" "\""
import_spec
blank_identifier "_"
interpreted_string_literal
" "\""
interpreted_string_literal_content "image/png"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "io"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "os"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "strings"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "sync"
" "\""
import_spec
package_identifier "color_extractor"
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/marekm4/color-extractor"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/cache/filecache"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/common/hashing"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/common/paths"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/disintegration/gift"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/resources/images/exif"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/resources/internal"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/resources/resource"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/resources/images"
" "\""
comment "// Blind import for image.Decode"
import_spec
blank_identifier "_"
interpreted_string_literal
" "\""
interpreted_string_literal_content "golang.org/x/image/webp"
" "\""
) ")"
var_declaration (+97 nodes collapsed)
comment "// imageResource represents an image resource."
type_declaration (+53 nodes collapsed)
type_declaration
type "type"
type_spec
type_identifier "imageMeta"
struct_type
struct "struct"
field_declaration_list
{ "{"
field_declaration
field_identifier "Exif"
pointer_type
* "*"
qualified_type
package_identifier "exif"
. "."
type_identifier "ExifInfo"
} "}"
method_declaration (+38 nodes collapsed)
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "getExif"
parameter_list
( "("
) ")"
pointer_type
* "*"
qualified_type
package_identifier "exif"
. "."
type_identifier "ExifInfo"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "i"
. "."
field_identifier "metaInit"
. "."
field_identifier "Do"
argument_list
( "("
func_literal
func "func"
parameter_list
( "("
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "mf"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
identifier "i"
. "."
field_identifier "Format"
. "."
field_identifier "ToImageMetaImageFormatFormat"
argument_list
( "("
) ")"
if_statement
if "if"
binary_expression
identifier "mf"
== "=="
unary_expression
- "-"
int_literal "1"
block
{ "{"
comment "// No Exif support for this format."
statement_list
return_statement
return "return"
} "}"
short_var_declaration
expression_list
identifier "key"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getImageMetaCacheTargetPath"
argument_list
( "("
) ")"
short_var_declaration (+116 nodes collapsed)
short_var_declaration
expression_list
identifier "create"
:= ":="
expression_list
func_literal
func "func"
parameter_list
( "("
parameter_declaration
identifier "info"
qualified_type
package_identifier "filecache"
. "."
type_identifier "ItemInfo"
, ","
parameter_declaration
identifier "w"
qualified_type
package_identifier "io"
. "."
type_identifier "WriteCloser"
) ")"
parameter_list
( "("
parameter_declaration
identifier "err"
type_identifier "error"
) ")"
block
{ "{"
statement_list
defer_statement
defer "defer"
call_expression
selector_expression
identifier "w"
. "."
field_identifier "Close"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "f"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
identifier "i"
. "."
field_identifier "root"
. "."
field_identifier "ReadSeekCloser"
argument_list
( "("
) ")"
if_statement (+21 nodes collapsed)
defer_statement
defer "defer"
call_expression
selector_expression
identifier "f"
. "."
field_identifier "Close"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "filename"
:= ":="
expression_list
call_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getResourcePaths"
argument_list
( "("
) ")"
. "."
field_identifier "Path"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "x"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "imaging"
. "."
field_identifier "DecodeExif"
argument_list
( "("
identifier "filename"
, ","
identifier "mf"
, ","
identifier "f"
) ")"
if_statement (+46 nodes collapsed)
assignment_statement (+21 nodes collapsed)
comment "// Also write it to cache"
short_var_declaration
expression_list
identifier "enc"
:= ":="
expression_list
call_expression
selector_expression
identifier "json"
. "."
field_identifier "NewEncoder"
argument_list
( "("
identifier "w"
) ")"
return_statement
return "return"
expression_list
call_expression
selector_expression
identifier "enc"
. "."
field_identifier "Encode"
argument_list
( "("
selector_expression
identifier "i"
. "."
field_identifier "meta"
) ")"
} "}"
assignment_statement (+36 nodes collapsed)
} "}"
) ")"
if_statement (+36 nodes collapsed)
if_statement
if "if"
binary_expression
selector_expression
identifier "i"
. "."
field_identifier "meta"
== "=="
nil "nil"
block
{ "{"
statement_list
return_statement
return "return"
expression_list
nil "nil"
} "}"
return_statement
return "return"
expression_list
selector_expression
selector_expression
identifier "i"
. "."
field_identifier "meta"
. "."
field_identifier "Exif"
} "}"
comment "// Colors returns a slice of the most dominant colors in an "...
comment "// using a simple histogram method."
method_declaration (+157 nodes collapsed)
method_declaration (+30 nodes collapsed)
comment "// Clone is for internal use."
method_declaration (+85 nodes collapsed)
method_declaration (+89 nodes collapsed)
method_declaration (+154 nodes collapsed)
comment "// Process processes the image with the given spec."
comment "// The spec can contain an optional action, one of \"resize\","...
comment "// This makes this method a more flexible version that cover"...
comment "// but it also supports e.g. format conversions without any "...
method_declaration (+48 nodes collapsed)
comment "// Resize resizes the image to the specified width and heigh"...
comment "// filter and returns the transformed image. If one of width"...
comment "// ratio is preserved."
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "Resize"
parameter_list
( "("
parameter_declaration
identifier "spec"
type_identifier "string"
) ")"
parameter_list
( "("
parameter_declaration
qualified_type
package_identifier "images"
. "."
type_identifier "ImageResource"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
return_statement
return "return"
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "processActionSpec"
argument_list
( "("
selector_expression
identifier "images"
. "."
field_identifier "ActionResize"
, ","
identifier "spec"
) ")"
} "}"
comment "// Crop the image to the specified dimensions without resizi"...
comment "// Space delimited config, e.g. `200x300 TopLeft`."
method_declaration (+49 nodes collapsed)
comment "// Fit scales down the image using the specified resample fi"...
comment "// maximum width and height."
method_declaration (+49 nodes collapsed)
comment "// Fill scales the image to the smallest possible size that "...
comment "// crops the resized image to the specified dimensions using"...
comment "// Space delimited config, e.g. `200x300 TopLeft`."
method_declaration (+49 nodes collapsed)
method_declaration (+579 nodes collapsed)
method_declaration (+86 nodes collapsed)
method_declaration (+296 nodes collapsed)
comment "// Serialize image processing. The imaging library spins up "...
comment "// so there is not much to gain from adding more load to the"...
comment "// can even have negative effect in low resource scenarios."
comment "// Note that this only effects the non-cached scenario. Once"...
comment "// image is written to disk, everything is fast, fast fast."
const_declaration
const "const"
const_spec
identifier "imageProcWorkers"
= "="
expression_list
int_literal "1"
var_declaration
var "var"
var_spec
identifier "imageProcSem"
= "="
expression_list
call_expression
identifier "make"
argument_list
( "("
channel_type
chan "chan"
type_identifier "bool"
, ","
identifier "imageProcWorkers"
) ")"
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "doWithImageConfig"
parameter_list (+34 nodes collapsed)
parameter_list
( "("
parameter_declaration
qualified_type
package_identifier "images"
. "."
type_identifier "ImageResource"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "img"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "ImageCache"
. "."
field_identifier "getOrCreate"
argument_list
( "("
identifier "i"
, ","
identifier "conf"
, ","
func_literal
func "func"
parameter_list
( "("
) ")"
parameter_list
( "("
parameter_declaration
pointer_type
* "*"
type_identifier "imageResource"
, ","
parameter_declaration
qualified_type
package_identifier "image"
. "."
type_identifier "Image"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
send_statement
identifier "imageProcSem"
<- "<-"
true "true"
defer_statement
defer "defer"
call_expression
func_literal
func "func"
parameter_list
( "("
) ")"
block
{ "{"
statement_list
expression_statement
unary_expression
<- "<-"
identifier "imageProcSem"
} "}"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "src"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "DecodeImage"
argument_list
( "("
) ")"
if_statement (+57 nodes collapsed)
short_var_declaration
expression_list
identifier "converted"
, ","
identifier "err"
:= ":="
expression_list
call_expression
identifier "f"
argument_list
( "("
identifier "src"
) ")"
if_statement (+57 nodes collapsed)
short_var_declaration
expression_list
identifier "hasAlpha"
:= ":="
expression_list
unary_expression
! "!"
call_expression
selector_expression
identifier "images"
. "."
field_identifier "IsOpaque"
argument_list
( "("
identifier "converted"
) ")"
short_var_declaration
expression_list
identifier "shouldFill"
:= ":="
expression_list
binary_expression
binary_expression
selector_expression
identifier "conf"
. "."
field_identifier "BgColor"
!= "!="
nil "nil"
&& "&&"
identifier "hasAlpha"
assignment_statement (+27 nodes collapsed)
var_declaration
var "var"
var_spec
identifier "bgColor"
qualified_type
package_identifier "color"
. "."
type_identifier "Color"
if_statement (+152 nodes collapsed)
if_statement (+177 nodes collapsed)
short_var_declaration
expression_list
identifier "ci"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "clone"
argument_list
( "("
identifier "converted"
) ")"
short_var_declaration
expression_list
identifier "targetPath"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "relTargetPathFromConfig"
argument_list
( "("
identifier "conf"
, ","
selector_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "imaging"
. "."
field_identifier "Cfg"
. "."
field_identifier "SourceHash"
) ")"
expression_statement
call_expression
selector_expression
identifier "ci"
. "."
field_identifier "setTargetPath"
argument_list
( "("
identifier "targetPath"
) ")"
assignment_statement
expression_list
selector_expression
identifier "ci"
. "."
field_identifier "Format"
= "="
expression_list
selector_expression
identifier "conf"
. "."
field_identifier "TargetFormat"
expression_statement
call_expression
selector_expression
identifier "ci"
. "."
field_identifier "setMediaType"
argument_list
( "("
call_expression
selector_expression
selector_expression
identifier "conf"
. "."
field_identifier "TargetFormat"
. "."
field_identifier "MediaType"
argument_list
( "("
) ")"
) ")"
return_statement
return "return"
expression_list
identifier "ci"
, ","
identifier "converted"
, ","
nil "nil"
} "}"
) ")"
if_statement
if "if"
binary_expression
identifier "err"
!= "!="
nil "nil"
block
{ "{"
statement_list
return_statement
return "return"
expression_list
nil "nil"
, ","
identifier "err"
} "}"
return_statement
return "return"
expression_list
identifier "img"
, ","
nil "nil"
} "}"
type_declaration
type "type"
type_spec
type_identifier "giphy"
struct_type
struct "struct"
field_declaration_list
{ "{"
field_declaration
qualified_type
package_identifier "image"
. "."
type_identifier "Image"
field_declaration
field_identifier "gif"
pointer_type
* "*"
qualified_type
package_identifier "gif"
. "."
type_identifier "GIF"
} "}"
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "g"
pointer_type
* "*"
type_identifier "giphy"
) ")"
field_identifier "GIF"
parameter_list
( "("
) ")"
pointer_type
* "*"
qualified_type
package_identifier "gif"
. "."
type_identifier "GIF"
block
{ "{"
statement_list
return_statement
return "return"
expression_list
selector_expression
identifier "g"
. "."
field_identifier "gif"
} "}"
comment "// DecodeImage decodes the image source into an Image."
comment "// This for internal use only."
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "DecodeImage"
parameter_list
( "("
) ")"
parameter_list
( "("
parameter_declaration
qualified_type
package_identifier "image"
. "."
type_identifier "Image"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "f"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "ReadSeekCloser"
argument_list
( "("
) ")"
if_statement (+29 nodes collapsed)
defer_statement
defer "defer"
call_expression
selector_expression
identifier "f"
. "."
field_identifier "Close"
argument_list
( "("
) ")"
if_statement
if "if"
binary_expression
selector_expression
identifier "i"
. "."
field_identifier "Format"
== "=="
selector_expression
identifier "images"
. "."
field_identifier "GIF"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "g"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
identifier "gif"
. "."
field_identifier "DecodeAll"
argument_list
( "("
identifier "f"
) ")"
if_statement
if "if"
binary_expression
identifier "err"
!= "!="
nil "nil"
block
{ "{"
statement_list
return_statement
return "return"
expression_list
nil "nil"
, ","
call_expression
selector_expression
identifier "fmt"
. "."
field_identifier "Errorf"
argument_list
( "("
interpreted_string_literal
" "\""
interpreted_string_literal_content "failed to decode gif: %w"
" "\""
, ","
identifier "err"
) ")"
} "}"
return_statement
return "return"
expression_list
unary_expression
& "&"
composite_literal
type_identifier "giphy"
literal_value
{ "{"
keyed_element
literal_element
identifier "gif"
: ":"
literal_element
identifier "g"
, ","
keyed_element
literal_element
identifier "Image"
: ":"
literal_element
index_expression
selector_expression
identifier "g"
. "."
field_identifier "Image"
[ "["
int_literal "0"
] "]"
} "}"
, ","
nil "nil"
} "}"
short_var_declaration
expression_list
identifier "img"
, ","
identifier "_"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
identifier "image"
. "."
field_identifier "Decode"
argument_list
( "("
identifier "f"
) ")"
return_statement
return "return"
expression_list
identifier "img"
, ","
identifier "err"
} "}"
method_declaration (+135 nodes collapsed)
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "getImageMetaCacheTargetPath"
parameter_list
( "("
) ")"
type_identifier "string"
block
{ "{"
comment "// Increment to invalidate the meta cache"
comment "// Last increment: v0.130.0 when change to the new imagemeta"...
statement_list
const_declaration
const "const"
const_spec
identifier "imageMetaVersionNumber"
= "="
expression_list
int_literal "2"
short_var_declaration
expression_list
identifier "cfgHash"
:= ":="
expression_list
selector_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "imaging"
. "."
field_identifier "Cfg"
. "."
field_identifier "SourceHash"
short_var_declaration
expression_list
identifier "df"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getResourcePaths"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "p1"
, ","
identifier "_"
:= ":="
expression_list
call_expression
selector_expression
identifier "paths"
. "."
field_identifier "FileAndExt"
argument_list
( "("
selector_expression
identifier "df"
. "."
field_identifier "File"
) ")"
short_var_declaration
expression_list
identifier "h"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "hash"
argument_list
( "("
) ")"
short_var_declaration (+27 nodes collapsed)
assignment_statement (+24 nodes collapsed)
return_statement
return "return"
expression_list
call_expression
selector_expression
identifier "df"
. "."
field_identifier "TargetPath"
argument_list
( "("
) ")"
} "}"
method_declaration (+242 nodes collapsed)

After

source_file
comment "// Copyright 2019 The Hugo Authors. All rights reserved."
comment "//"
comment "// Licensed under the Apache License, Version 2.0 (the \"Lice"...
comment "// you may not use this file except in compliance with the L"...
comment "// You may obtain a copy of the License at"
comment "// http://www.apache.org/licenses/LICENSE-2.0"
comment "//"
comment "// Unless required by applicable law or agreed to in writing"...
comment "// distributed under the License is distributed on an \"AS IS"...
comment "// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expr"...
comment "// See the License for the specific language governing permi"...
comment "// limitations under the License."
package_clause
package "package"
package_identifier "resources"
import_declaration
import "import"
import_spec_list
( "("
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "encoding/json"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "fmt"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "image"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "image/color"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "image/draw"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "io"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "os"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "strings"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "sync"
" "\""
import_spec
package_identifier "color_extractor"
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/marekm4/color-extractor"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/cache/filecache"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/common/hashing"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/common/herrors"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/common/paths"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/disintegration/gift"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/resources/images/exif"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/resources/internal"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/resources/resource"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/gohugoio/hugo/resources/images"
" "\""
) ")"
var_declaration (+97 nodes collapsed)
comment "// imageResource represents an image resource."
type_declaration (+53 nodes collapsed)
type_declaration
type "type"
type_spec
type_identifier "imageMeta"
struct_type
struct "struct"
field_declaration_list
{ "{"
field_declaration
field_identifier "Exif"
pointer_type
* "*"
qualified_type
package_identifier "exif"
. "."
type_identifier "ExifInfo"
} "}"
method_declaration (+38 nodes collapsed)
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "getExif"
parameter_list
( "("
) ")"
pointer_type
* "*"
qualified_type
package_identifier "exif"
. "."
type_identifier "ExifInfo"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "i"
. "."
field_identifier "metaInit"
. "."
field_identifier "Do"
argument_list
( "("
func_literal
func "func"
parameter_list
( "("
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "mf"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
identifier "i"
. "."
field_identifier "Format"
. "."
field_identifier "ToImageMetaImageFormatFormat"
argument_list
( "("
) ")"
if_statement
if "if"
binary_expression
identifier "mf"
== "=="
unary_expression
- "-"
int_literal "1"
block
{ "{"
comment "// No Exif support for this format."
statement_list
return_statement
return "return"
} "}"
short_var_declaration
expression_list
identifier "key"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getImageMetaCacheTargetPath"
argument_list
( "("
) ")"
short_var_declaration (+116 nodes collapsed)
short_var_declaration
expression_list
identifier "create"
:= ":="
expression_list
func_literal
func "func"
parameter_list
( "("
parameter_declaration
identifier "info"
qualified_type
package_identifier "filecache"
. "."
type_identifier "ItemInfo"
, ","
parameter_declaration
identifier "w"
qualified_type
package_identifier "io"
. "."
type_identifier "WriteCloser"
) ")"
parameter_list
( "("
parameter_declaration
identifier "err"
type_identifier "error"
) ")"
block
{ "{"
statement_list
defer_statement
defer "defer"
call_expression
selector_expression
identifier "w"
. "."
field_identifier "Close"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "f"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
identifier "i"
. "."
field_identifier "root"
. "."
field_identifier "ReadSeekCloser"
argument_list
( "("
) ")"
if_statement (+21 nodes collapsed)
defer_statement
defer "defer"
call_expression
selector_expression
identifier "f"
. "."
field_identifier "Close"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "filename"
:= ":="
expression_list
call_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getResourcePaths"
argument_list
( "("
) ")"
. "."
field_identifier "Path"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "x"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "Imaging"
. "."
field_identifier "DecodeExif"
argument_list
( "("
identifier "filename"
, ","
identifier "mf"
, ","
identifier "f"
) ")"
if_statement (+46 nodes collapsed)
assignment_statement (+21 nodes collapsed)
comment "// Also write it to cache"
short_var_declaration
expression_list
identifier "enc"
:= ":="
expression_list
call_expression
selector_expression
identifier "json"
. "."
field_identifier "NewEncoder"
argument_list
( "("
identifier "w"
) ")"
return_statement
return "return"
expression_list
call_expression
selector_expression
identifier "enc"
. "."
field_identifier "Encode"
argument_list
( "("
selector_expression
identifier "i"
. "."
field_identifier "meta"
) ")"
} "}"
assignment_statement (+36 nodes collapsed)
} "}"
) ")"
if_statement (+36 nodes collapsed)
if_statement
if "if"
binary_expression
selector_expression
identifier "i"
. "."
field_identifier "meta"
== "=="
nil "nil"
block
{ "{"
statement_list
return_statement
return "return"
expression_list
nil "nil"
} "}"
return_statement
return "return"
expression_list
selector_expression
selector_expression
identifier "i"
. "."
field_identifier "meta"
. "."
field_identifier "Exif"
} "}"
comment "// Colors returns a slice of the most dominant colors in an "...
comment "// using a simple histogram method."
method_declaration (+157 nodes collapsed)
method_declaration (+30 nodes collapsed)
comment "// Clone is for internal use."
method_declaration (+85 nodes collapsed)
method_declaration (+89 nodes collapsed)
method_declaration (+154 nodes collapsed)
comment "// Process processes the image with the given spec."
comment "// The spec can contain an optional action, one of \"resize\","...
comment "// This makes this method a more flexible version that cover"...
comment "// but it also supports e.g. format conversions without any "...
method_declaration (+48 nodes collapsed)
comment "// Resize resizes the image to the specified width and heigh"...
comment "// filter and returns the transformed image. If one of width"...
comment "// ratio is preserved."
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "Resize"
parameter_list
( "("
parameter_declaration
identifier "spec"
type_identifier "string"
) ")"
parameter_list
( "("
parameter_declaration
qualified_type
package_identifier "images"
. "."
type_identifier "ImageResource"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
defer_statement
defer "defer"
call_expression
selector_expression
identifier "herrors"
. "."
field_identifier "Recover"
argument_list
( "("
) ")"
return_statement
return "return"
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "processActionSpec"
argument_list
( "("
selector_expression
identifier "images"
. "."
field_identifier "ActionResize"
, ","
identifier "spec"
) ")"
} "}"
comment "// Crop the image to the specified dimensions without resizi"...
comment "// Space delimited config, e.g. `200x300 TopLeft`."
method_declaration (+49 nodes collapsed)
comment "// Fit scales down the image using the specified resample fi"...
comment "// maximum width and height."
method_declaration (+49 nodes collapsed)
comment "// Fill scales the image to the smallest possible size that "...
comment "// crops the resized image to the specified dimensions using"...
comment "// Space delimited config, e.g. `200x300 TopLeft`."
method_declaration (+49 nodes collapsed)
method_declaration (+579 nodes collapsed)
method_declaration (+86 nodes collapsed)
method_declaration (+296 nodes collapsed)
comment "// Serialize image processing. The imaging library spins up "...
comment "// so there is not much to gain from adding more load to the"...
comment "// can even have negative effect in low resource scenarios."
comment "// Note that this only effects the non-cached scenario. Once"...
comment "// image is written to disk, everything is fast, fast fast."
const_declaration
const "const"
const_spec
identifier "imageProcWorkers"
= "="
expression_list
int_literal "1"
var_declaration
var "var"
var_spec
identifier "imageProcSem"
= "="
expression_list
call_expression
identifier "make"
argument_list
( "("
channel_type
chan "chan"
type_identifier "bool"
, ","
identifier "imageProcWorkers"
) ")"
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "doWithImageConfig"
parameter_list (+34 nodes collapsed)
parameter_list
( "("
parameter_declaration
qualified_type
package_identifier "images"
. "."
type_identifier "ImageResource"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "img"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "ImageCache"
. "."
field_identifier "getOrCreate"
argument_list
( "("
identifier "i"
, ","
identifier "conf"
, ","
func_literal
func "func"
parameter_list
( "("
) ")"
parameter_list
( "("
parameter_declaration
pointer_type
* "*"
type_identifier "imageResource"
, ","
parameter_declaration
qualified_type
package_identifier "image"
. "."
type_identifier "Image"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
send_statement
identifier "imageProcSem"
<- "<-"
true "true"
defer_statement
defer "defer"
call_expression
func_literal
func "func"
parameter_list
( "("
) ")"
block
{ "{"
statement_list
expression_statement
unary_expression
<- "<-"
identifier "imageProcSem"
} "}"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "src"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "DecodeImage"
argument_list
( "("
) ")"
if_statement (+57 nodes collapsed)
short_var_declaration
expression_list
identifier "converted"
, ","
identifier "err"
:= ":="
expression_list
call_expression
identifier "f"
argument_list
( "("
identifier "src"
) ")"
if_statement (+57 nodes collapsed)
short_var_declaration
expression_list
identifier "hasAlpha"
:= ":="
expression_list
unary_expression
! "!"
call_expression
selector_expression
identifier "images"
. "."
field_identifier "IsOpaque"
argument_list
( "("
identifier "converted"
) ")"
short_var_declaration
expression_list
identifier "shouldFill"
:= ":="
expression_list
binary_expression
binary_expression
selector_expression
identifier "conf"
. "."
field_identifier "BgColor"
!= "!="
nil "nil"
&& "&&"
identifier "hasAlpha"
assignment_statement (+27 nodes collapsed)
var_declaration
var "var"
var_spec
identifier "bgColor"
qualified_type
package_identifier "color"
. "."
type_identifier "Color"
if_statement (+152 nodes collapsed)
if_statement (+177 nodes collapsed)
short_var_declaration
expression_list
identifier "ci"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "clone"
argument_list
( "("
identifier "converted"
) ")"
short_var_declaration
expression_list
identifier "targetPath"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "relTargetPathFromConfig"
argument_list
( "("
identifier "conf"
, ","
selector_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "Imaging"
. "."
field_identifier "Cfg"
. "."
field_identifier "SourceHash"
) ")"
expression_statement
call_expression
selector_expression
identifier "ci"
. "."
field_identifier "setTargetPath"
argument_list
( "("
identifier "targetPath"
) ")"
assignment_statement
expression_list
selector_expression
identifier "ci"
. "."
field_identifier "Format"
= "="
expression_list
selector_expression
identifier "conf"
. "."
field_identifier "TargetFormat"
expression_statement
call_expression
selector_expression
identifier "ci"
. "."
field_identifier "setMediaType"
argument_list
( "("
call_expression
selector_expression
selector_expression
identifier "conf"
. "."
field_identifier "TargetFormat"
. "."
field_identifier "MediaType"
argument_list
( "("
) ")"
) ")"
return_statement
return "return"
expression_list
identifier "ci"
, ","
identifier "converted"
, ","
nil "nil"
} "}"
) ")"
if_statement
if "if"
binary_expression
identifier "err"
!= "!="
nil "nil"
block
{ "{"
statement_list
return_statement
return "return"
expression_list
nil "nil"
, ","
identifier "err"
} "}"
return_statement
return "return"
expression_list
identifier "img"
, ","
nil "nil"
} "}"
comment "// DecodeImage decodes the image source into an Image."
comment "// This for internal use only."
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "DecodeImage"
parameter_list
( "("
) ")"
parameter_list
( "("
parameter_declaration
qualified_type
package_identifier "image"
. "."
type_identifier "Image"
, ","
parameter_declaration
type_identifier "error"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "f"
, ","
identifier "err"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "ReadSeekCloser"
argument_list
( "("
) ")"
if_statement (+29 nodes collapsed)
defer_statement
defer "defer"
call_expression
selector_expression
identifier "f"
. "."
field_identifier "Close"
argument_list
( "("
) ")"
return_statement
return "return"
expression_list
call_expression
selector_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "Imaging"
. "."
field_identifier "Codec"
. "."
field_identifier "DecodeFormat"
argument_list
( "("
selector_expression
identifier "i"
. "."
field_identifier "Format"
, ","
identifier "f"
) ")"
} "}"
method_declaration (+135 nodes collapsed)
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "i"
pointer_type
* "*"
type_identifier "imageResource"
) ")"
field_identifier "getImageMetaCacheTargetPath"
parameter_list
( "("
) ")"
type_identifier "string"
block
{ "{"
comment "// Increment to invalidate the meta cache"
comment "// Last increment: v0.130.0 when change to the new imagemeta"...
statement_list
const_declaration
const "const"
const_spec
identifier "imageMetaVersionNumber"
= "="
expression_list
int_literal "2"
short_var_declaration
expression_list
identifier "cfgHash"
:= ":="
expression_list
selector_expression
selector_expression
selector_expression
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getSpec"
argument_list
( "("
) ")"
. "."
field_identifier "Imaging"
. "."
field_identifier "Cfg"
. "."
field_identifier "SourceHash"
short_var_declaration
expression_list
identifier "df"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "getResourcePaths"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "p1"
, ","
identifier "_"
:= ":="
expression_list
call_expression
selector_expression
identifier "paths"
. "."
field_identifier "FileAndExt"
argument_list
( "("
selector_expression
identifier "df"
. "."
field_identifier "File"
) ")"
short_var_declaration
expression_list
identifier "h"
:= ":="
expression_list
call_expression
selector_expression
identifier "i"
. "."
field_identifier "hash"
argument_list
( "("
) ")"
short_var_declaration (+27 nodes collapsed)
assignment_statement (+24 nodes collapsed)
return_statement
return "return"
expression_list
call_expression
selector_expression
identifier "df"
. "."
field_identifier "TargetPath"
argument_list
( "("
) ")"
} "}"
method_declaration (+242 nodes collapsed)