Fix .Width and .Height for animated gifs - hugo - [fork] hugo port for 9front
 (HTM) git clone git@git.drkhsh.at/hugo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 21d17566a3c21a33e78a6aa0bec9c82687eea6fb
 (DIR) parent 35e9b3ed1ef96452fc6c721c6022862d2cf3bc70
 (HTM) Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Wed, 14 Jun 2023 08:14:39 +0200
       
       Fix .Width and .Height for animated gifs
       
       Fixes #11079
       
       Diffstat:
         M hugolib/integrationtest_builder.go  |      12 +++++++++++-
         M resources/image_test.go             |       5 +++--
         M resources/images/image.go           |       3 +++
         M resources/integration_test.go       |      20 +++++++++++++-------
       
       4 files changed, 30 insertions(+), 10 deletions(-)
       ---
 (DIR) diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go
       @@ -299,10 +299,20 @@ func (s *IntegrationTestBuilder) initBuilder() error {
        
                        isBinaryRe := regexp.MustCompile(`^(.*)(\.png|\.jpg)$`)
        
       +                const dataSourceFilenamePrefix = "sourcefilename:"
       +
                        for _, f := range s.data.Files {
                                filename := filepath.Join(s.Cfg.WorkingDir, f.Name)
                                data := bytes.TrimSuffix(f.Data, []byte("\n"))
       -                        if isBinaryRe.MatchString(filename) {
       +                        datastr := strings.TrimSpace(string(data))
       +                        if strings.HasPrefix(datastr, dataSourceFilenamePrefix) {
       +                                // Read from file relative to tue current dir.
       +                                var err error
       +                                wd, _ := os.Getwd()
       +                                filename := filepath.Join(wd, strings.TrimSpace(strings.TrimPrefix(datastr, dataSourceFilenamePrefix)))
       +                                data, err = os.ReadFile(filename)
       +                                s.Assert(err, qt.IsNil)
       +                        } else if isBinaryRe.MatchString(filename) {
                                        var err error
                                        data, err = base64.StdEncoding.DecodeString(string(data))
                                        s.Assert(err, qt.IsNil)
 (DIR) diff --git a/resources/image_test.go b/resources/image_test.go
       @@ -658,11 +658,12 @@ func TestImageOperationsGolden(t *testing.T) {
        
                // A simple Gif file (no animation).
                orig := fetchImageForSpec(spec, c, "gohugoio-card.gif")
       -        for _, resizeSpec := range []string{"100x", "220x"} {
       -                resized, err := orig.Resize(resizeSpec)
       +        for _, width := range []int{100, 220} {
       +                resized, err := orig.Resize(fmt.Sprintf("%dx", width))
                        c.Assert(err, qt.IsNil)
                        rel := resized.RelPermalink()
                        c.Assert(rel, qt.Not(qt.Equals), "")
       +                c.Assert(resized.Width(), qt.Equals, width)
                }
        
                // Animated GIF
 (DIR) diff --git a/resources/images/image.go b/resources/images/image.go
       @@ -377,6 +377,9 @@ type imageConfig struct {
        }
        
        func imageConfigFromImage(img image.Image) image.Config {
       +        if giphy, ok := img.(Giphy); ok {
       +                return giphy.GIF().Config
       +        }
                b := img.Bounds()
                return image.Config{Width: b.Max.X, Height: b.Max.Y}
        }
 (DIR) diff --git a/resources/integration_test.go b/resources/integration_test.go
       @@ -34,15 +34,21 @@ title: "My Bundle"
        ---
        -- content/mybundle/pixel.png --
        iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==
       +-- content/mybundle/giphy.gif --
       +sourcefilename: testdata/giphy.gif
        -- layouts/foo.html --
        -- layouts/index.html --
        {{ $p := site.GetPage "mybundle"}}
        {{ $img := $p.Resources.Get "pixel.png" }}
       -{{ $gif := $img.Resize "1x1 gif" }}
       -{{ $bmp := $img.Resize "1x1 bmp" }}
       +{{ $giphy := $p.Resources.Get "giphy.gif" }}
       +{{ $gif := $img.Resize "1x2 gif" }}
       +{{ $bmp := $img.Resize "2x3 bmp" }}
       +{{ $anigif := $giphy.Resize "4x5" }}
        
       -gif: {{ $gif.RelPermalink }}|{{ $gif.MediaType }}|
       -bmp: {{ $bmp.RelPermalink }}|{{ $bmp.MediaType }}|        
       +
       +gif: {{ $gif.RelPermalink }}|}|{{ $gif.Width }}|{{ $gif.Height }}|{{ $gif.MediaType }}|
       +bmp: {{ $bmp.RelPermalink }}|}|{{ $bmp.Width }}|{{ $bmp.Height }}|{{ $bmp.MediaType }}|
       +anigif: {{ $anigif.RelPermalink }}|{{ $anigif.Width }}|{{ $anigif.Height }}|{{ $anigif.MediaType }}|
        `
        
                b := hugolib.NewIntegrationTestBuilder(
       @@ -55,9 +61,9 @@ bmp: {{ $bmp.RelPermalink }}|{{ $bmp.MediaType }}|
        
                assertImages := func() {
                        b.AssertFileContent("public/index.html", `
       -                gif: /mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_1x1_resize_box_3.gif|image/gif|
       -                bmp: /mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_1x1_resize_box_3.bmp|image/bmp|
       -                
       +                gif: /mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_1x2_resize_box_3.gif|}|1|2|image/gif|
       +                bmp: /mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_2x3_resize_box_3.bmp|}|2|3|image/bmp|
       +                anigif: /mybundle/giphy_hu3eafc418e52414ace6236bf1d31f82e1_52213_4x5_resize_box_1.gif|4|5|image/gif|
                        `)
                }