diff --git a/go.sum b/go.sum index 33b3e55..85fd015 100644 --- a/go.sum +++ b/go.sum @@ -33,8 +33,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -42,8 +40,6 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/wormi4ok/godown v0.4.0 h1:baxURAO0WuaEd06fo5WkgosHUwjQSJuV3wnnx28G0zs= github.com/wormi4ok/godown v0.4.0/go.mod h1:LPSYhfL9Q6QZXNyT43NPdZzY3Yb7qKsbjM9ke/SR4+A= -golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -51,14 +47,11 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/internal/resource.go b/internal/resource.go index 5ede377..f66a335 100644 --- a/internal/resource.go +++ b/internal/resource.go @@ -17,14 +17,20 @@ var reImg = regexp.MustCompile(`^image/[\w]+`) var reFileAndExt = regexp.MustCompile(`(.*)(\.[\w\d]+)`) +var reBase64 = regexp.MustCompile(`^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$`) + func decoder(d enex.Data) io.Reader { - if d.Encoding == "base64" { + if d.Encoding == "base64" || isBase64Encoded(d.Content) { return base64.NewDecoder(base64.StdEncoding, bytes.NewReader(bytes.TrimSpace(d.Content))) } return bytes.NewReader(d.Content) } +func isBase64Encoded(content []byte) bool { + return reBase64.Match(content) +} + func isImage(mimeType string) bool { return reImg.MatchString(mimeType) } diff --git a/internal/resource_test.go b/internal/resource_test.go index f23eeaa..9ce046e 100644 --- a/internal/resource_test.go +++ b/internal/resource_test.go @@ -1,6 +1,9 @@ package internal import ( + "bytes" + "encoding/base64" + "io" "testing" "github.com/wormi4ok/evernote2md/encoding/enex" @@ -48,3 +51,54 @@ func Test_guessName(t *testing.T) { }) } } + +func Test_decoder(t *testing.T) { + want := []byte("sample text") + encoded := new(bytes.Buffer) + b64encoder := base64.NewEncoder(base64.StdEncoding, encoded) + + if _, err := b64encoder.Write(want); err != nil { + t.Error(err) + } + if err := b64encoder.Close(); err != nil { + t.Error(err) + } + + tests := []struct { + name string + data enex.Data + }{ + { + name: "not encoded", + data: enex.Data{ + Encoding: "", + Content: want, + }, + }, + { + name: "base64 encoded", + data: enex.Data{ + Encoding: "base64", + Content: encoded.Bytes(), + }, + }, + { + name: "base64 encoded - encoding value missing", + data: enex.Data{ + Encoding: "", + Content: encoded.Bytes(), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := io.ReadAll(decoder(tt.data)) + if err != nil { + t.Error(err) + } + if !bytes.Equal(got, want) { + t.Errorf("decoder() = %s, want %s", got, want) + } + }) + } +}