-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathfilters.go
118 lines (99 loc) · 2.18 KB
/
filters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package goform
import (
"fmt"
"image"
"image/gif"
_ "image/gif"
"image/jpeg"
_ "image/jpeg"
"image/png"
_ "image/png"
"os"
"strings"
"math/rand"
"strconv"
"github.com/nfnt/resize"
"github.com/semihs/goform/slugify"
)
type FilterInterface interface {
Apply() error
SetValue(string)
SetValues([]string)
SetFile(file *File)
}
type Filter struct {
Options map[string]interface{}
Value string
Values []string
File *File
}
func (filter *Filter) SetValue(s string) {
filter.Value = s
}
func (filter *Filter) SetValues(s []string) {
filter.Values = s
}
func (filter *Filter) SetFile(f *File) {
filter.File = f
}
func (filter *Filter) SetOptions(o map[string]interface{}) {
filter.Options = o
}
type RenameFilter struct {
Filter
}
func (filter *RenameFilter) Apply() error {
if filter.File == nil {
return nil
}
path := filter.Options["path"].(string)
randomize := filter.Options["randomize"].(bool)
fileName := path + strings.Replace(strings.ToLower(slugify.Marshal(filter.File.Name)), "."+filter.File.Extension, "", -1)
if randomize {
uid := rand.Intn(9999999999)
fileName = fileName + "-" + strconv.Itoa(uid)
}
fileName = strings.ToLower(fileName)
filter.File.Location = fileName
return nil
}
type ResizeConversion struct {
Width int
Height int
Layout string
}
type ImageResizeFilter struct {
Filter
}
func (filter *ImageResizeFilter) Apply() error {
if filter.File == nil {
return nil
}
conversions := filter.Options["conversions"].([]ResizeConversion)
filter.File.Binary.Seek(0, 0)
img, format, err := image.Decode(filter.File.Binary)
if err != nil {
fmt.Println(err)
return err
}
for _, conversion := range conversions {
location := fmt.Sprintf(conversion.Layout, filter.File.Location, conversion.Width, conversion.Height, filter.File.Extension)
fmt.Println("Resizing to", location)
m := resize.Resize(uint(conversion.Width), uint(conversion.Height), img, resize.Lanczos3)
out, err := os.Create(location)
if err != nil {
return err
}
defer out.Close()
if format == "jpeg" {
jpeg.Encode(out, m, nil)
}
if format == "png" {
png.Encode(out, m)
}
if format == "gif" {
gif.Encode(out, m, nil)
}
}
return nil
}