resource: Fix SVG and similar resource handling
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 27 Feb 2018 17:29:15 +0000 (18:29 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 27 Feb 2018 17:29:15 +0000 (18:29 +0100)
The validation of if we could process the image (resize etc.) was moved up in Hugo 0.37, which meant SVG and other "non-processable" images would fail.

This commit fixes that by creating a regular resource for these image formats. They will not have `.Resize` or any of the other image methods.

Fixes #4455

resource/image_test.go
resource/resource.go
resource/testdata/circle.svg [new file with mode: 0644]
resource/testhelpers_test.go

index 7906f4fbca25e7bff2382bfc3b49c7cd0cb182f2..1e5b3d531d01f25cc8d6b5082b6d2d03a263e6a2 100644 (file)
@@ -278,6 +278,13 @@ func TestImageResize8BitPNG(t *testing.T) {
 
 }
 
+func TestSVGImage(t *testing.T) {
+       assert := require.New(t)
+       spec := newTestResourceSpec(assert)
+       svg := fetchResourceForSpec(spec, assert, "circle.svg")
+       assert.NotNil(svg)
+}
+
 func BenchmarkResizeParallel(b *testing.B) {
        assert := require.New(b)
        img := fetchSunset(assert)
index 67aed39c221c6c9abd59cca20285fbf40b242767..828b03da1037328fb6b6bddf01452037633ea925 100644 (file)
@@ -23,8 +23,6 @@ import (
        "strings"
        "sync"
 
-       "github.com/disintegration/imaging"
-
        "github.com/spf13/cast"
 
        "github.com/gobwas/glob"
@@ -288,6 +286,15 @@ func (r *Spec) newResource(
        gr := r.newGenericResource(targetPathBuilder, fi, absPublishDir, absSourceFilename, filepath.ToSlash(relTargetFilename), mimeType)
 
        if mimeType == "image" {
+               ext := strings.ToLower(helpers.Ext(absSourceFilename))
+
+               imgFormat, ok := imageFormats[ext]
+               if !ok {
+                       // This allows SVG etc. to be used as resources. They will not have the methods of the Image, but
+                       // that would not (currently) have worked.
+                       return gr, nil
+               }
+
                f, err := r.Fs.Source.Open(absSourceFilename)
                if err != nil {
                        return nil, err
@@ -299,13 +306,6 @@ func (r *Spec) newResource(
                        return nil, err
                }
 
-               ext := strings.ToLower(helpers.Ext(absSourceFilename))
-
-               imgFormat, ok := imageFormats[ext]
-               if !ok {
-                       return nil, imaging.ErrUnsupportedFormat
-               }
-
                return &Image{
                        hash:            hash,
                        format:          imgFormat,
diff --git a/resource/testdata/circle.svg b/resource/testdata/circle.svg
new file mode 100644 (file)
index 0000000..2759ae7
--- /dev/null
@@ -0,0 +1,5 @@
+<svg height="100" width="100">
+  <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
+  Sorry, your browser does not support inline SVG.  
+</svg> 
\ No newline at end of file
index 7f6d4f3076db757fe4fe0e20d2717693b14c575f..89653ce11920651db6e92e074c256321939b449d 100644 (file)
@@ -88,6 +88,12 @@ func fetchImage(assert *require.Assertions, name string) *Image {
 }
 
 func fetchImageForSpec(spec *Spec, assert *require.Assertions, name string) *Image {
+       r := fetchResourceForSpec(spec, assert, name)
+       assert.IsType(&Image{}, r)
+       return r.(*Image)
+}
+
+func fetchResourceForSpec(spec *Spec, assert *require.Assertions, name string) Resource {
        src, err := os.Open("testdata/" + name)
        assert.NoError(err)
 
@@ -107,10 +113,9 @@ func fetchImageForSpec(spec *Spec, assert *require.Assertions, name string) *Ima
 
        r, err := spec.NewResourceFromFilename(factory, "/public", f, name)
        assert.NoError(err)
-       assert.IsType(&Image{}, r)
-       return r.(*Image)
-}
 
+       return r
+}
 func assertFileCache(assert *require.Assertions, fs *hugofs.Fs, filename string, width, height int) {
        f, err := fs.Source.Open(filepath.Join("/res/_gen/images", filename))
        assert.NoError(err)