ires 0.1.4 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/ext/ires/image.go +27 -27
- data/ext/ires/ires.go +26 -26
- data/ext/ires/uri.go +17 -17
- data/ext/main.go +13 -42
- data/lib/ires.rb +1 -2
- data/lib/ires/core.rb +14 -0
- data/lib/ires/{util.rb → os.rb} +12 -11
- data/lib/ires/service.rb +76 -15
- data/lib/ires/version.rb +1 -1
- data/lib/ires/view_helper.rb +6 -54
- data/lib/tasks/ires.rake +2 -3
- data/shared/darwin/ires.h +1 -5
- data/shared/darwin/ires.so +0 -0
- data/shared/linux/ires.h +1 -5
- data/shared/linux/ires.so +0 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b257d1482a34c83c67287636a7370c3531aba5f2
|
4
|
+
data.tar.gz: 55d3577bf53d61dd0e1fa9084f1b0fe5889b96a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2aea5907a83563bf3cb4513ab58b8da397e40364e2b3048eb81171c5dbaed1fe48623d61bf21e4f12759161346a65de1d1efca10d0659afe6b0be798d39bd63e
|
7
|
+
data.tar.gz: 14471ef705b607b8277cccf03b68fa47a7b11de6c37cd9ac5b9d424525779c786eb3309451fd5ff361cd720932d99b0a046e038a97ef69d70a12f9495c883e29
|
data/README.md
CHANGED
@@ -7,6 +7,8 @@
|
|
7
7
|
|
8
8
|
## Usage
|
9
9
|
|
10
|
+
### View
|
11
|
+
|
10
12
|
```erb
|
11
13
|
<!-- Usually -->
|
12
14
|
<%= ires_tag( path: "image_01.jpg", width: 90, height: 120 ) %>
|
@@ -15,6 +17,13 @@
|
|
15
17
|
<%= ires_tag( path: "http://example.com/image_02.jpg", width: 200, height: 200, mode: "crop", alt: "example image" ) %>
|
16
18
|
```
|
17
19
|
|
20
|
+
### Get resize path
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
Ires::Service.path( path: "<FULL IMAGE PATH>", width: 400, height: 300)
|
24
|
+
=> /ires/<resize image path>
|
25
|
+
```
|
26
|
+
|
18
27
|
### Select mode
|
19
28
|
|
20
29
|
| info | mode |
|
data/ext/ires/image.go
CHANGED
@@ -19,36 +19,36 @@ import (
|
|
19
19
|
|
20
20
|
|
21
21
|
// Input image
|
22
|
-
func
|
22
|
+
func inputImage(i *Ires) (image.Image, string, bool) {
|
23
23
|
if i.IsLocal {
|
24
|
-
img, format :=
|
24
|
+
img, format := localImage(i.Uri)
|
25
25
|
return img, format, true
|
26
26
|
} else {
|
27
|
-
return
|
27
|
+
return downloadImage(i)
|
28
28
|
}
|
29
29
|
}
|
30
30
|
|
31
31
|
|
32
32
|
// Save http image
|
33
|
-
func
|
33
|
+
func downloadImage(i *Ires) (image.Image, string, bool) {
|
34
34
|
res, err := http.Get(i.Uri)
|
35
35
|
if err != nil {
|
36
36
|
panic(err)
|
37
37
|
}
|
38
38
|
defer res.Body.Close()
|
39
39
|
|
40
|
-
header, r :=
|
41
|
-
format :=
|
40
|
+
header, r := copyReader(res.Body)
|
41
|
+
format := formatSearch(r)
|
42
42
|
|
43
43
|
img, _, err := image.Decode(io.MultiReader(header, res.Body))
|
44
44
|
if err != nil {
|
45
45
|
return nil, "", false
|
46
46
|
}
|
47
|
-
return
|
47
|
+
return createImage(img, i.imagePath(IMAGE_MODE_ORIGINAL), format), format, true
|
48
48
|
}
|
49
49
|
|
50
50
|
|
51
|
-
func
|
51
|
+
func createImage(img image.Image, path, format string) image.Image {
|
52
52
|
file, err := os.Create(path)
|
53
53
|
if err != nil {
|
54
54
|
panic(err)
|
@@ -70,7 +70,7 @@ func CreateImage(img image.Image, path, format string) image.Image {
|
|
70
70
|
|
71
71
|
|
72
72
|
// Load image
|
73
|
-
func
|
73
|
+
func localImage(uri string) (image.Image, string) {
|
74
74
|
file, err := os.Open(uri)
|
75
75
|
if err != nil{
|
76
76
|
panic(err)
|
@@ -78,8 +78,8 @@ func LocalImage(uri string) (image.Image, string) {
|
|
78
78
|
defer file.Close()
|
79
79
|
|
80
80
|
// Decode jpeg into image.Image
|
81
|
-
header, r :=
|
82
|
-
format :=
|
81
|
+
header, r := copyReader(file)
|
82
|
+
format := formatSearch(r)
|
83
83
|
|
84
84
|
img, _, err := image.Decode(io.MultiReader(header, file))
|
85
85
|
if err != nil {
|
@@ -90,15 +90,15 @@ func LocalImage(uri string) (image.Image, string) {
|
|
90
90
|
|
91
91
|
|
92
92
|
// Resizing & Cropping
|
93
|
-
func
|
93
|
+
func resizeToCrop(i *Ires, inputImg image.Image) image.Image {
|
94
94
|
var outputImg image.Image
|
95
95
|
var imagePath string
|
96
96
|
if i.IsLocal {
|
97
97
|
imagePath = i.Uri
|
98
98
|
} else {
|
99
|
-
imagePath = i.
|
99
|
+
imagePath = i.imagePath(IMAGE_MODE_ORIGINAL)
|
100
100
|
}
|
101
|
-
isAsp, conf :=
|
101
|
+
isAsp, conf := isValidAspectRatio(imagePath, i.Size)
|
102
102
|
|
103
103
|
width := i.Size.Width
|
104
104
|
height := i.Size.Height
|
@@ -109,11 +109,11 @@ func ResizeToCrop(i *Ires, inputImg image.Image) image.Image {
|
|
109
109
|
var resizeImg image.Image
|
110
110
|
|
111
111
|
// Resize
|
112
|
-
mode :=
|
112
|
+
mode := resizeMode(conf, i.Size)
|
113
113
|
switch mode {
|
114
|
-
case
|
114
|
+
case 3, 4:
|
115
115
|
resizeImg = resize.Resize(uint(width), 0, inputImg, resize.Lanczos3)
|
116
|
-
case
|
116
|
+
case 1, 2:
|
117
117
|
resizeImg = resize.Resize(0, uint(height), inputImg, resize.Lanczos3)
|
118
118
|
default:
|
119
119
|
resizeImg = inputImg
|
@@ -133,9 +133,9 @@ func ResizeToCrop(i *Ires, inputImg image.Image) image.Image {
|
|
133
133
|
|
134
134
|
|
135
135
|
// Check expiration date
|
136
|
-
func (i *Ires)
|
136
|
+
func (i *Ires) deleteExpireImage(mode int) {
|
137
137
|
today := time.Now().Format("20060102")
|
138
|
-
dir := i.
|
138
|
+
dir := i.readImageDir(mode)
|
139
139
|
files, err := ioutil.ReadDir(dir)
|
140
140
|
if err != nil {
|
141
141
|
return
|
@@ -145,14 +145,14 @@ func (i *Ires) DeleteExpireImage(mode int) {
|
|
145
145
|
findName := file.Name()
|
146
146
|
matched,_ := path.Match(today + "_*", findName)
|
147
147
|
if matched {
|
148
|
-
|
148
|
+
deleteImage(path.Join(dir, findName))
|
149
149
|
}
|
150
150
|
}
|
151
151
|
}
|
152
152
|
|
153
153
|
|
154
154
|
// Delete image
|
155
|
-
func
|
155
|
+
func deleteImage(path string) {
|
156
156
|
_, err := os.Stat(path)
|
157
157
|
if err == nil {
|
158
158
|
if err := os.Remove(path); err != nil {
|
@@ -163,8 +163,8 @@ func DeleteImage(path string) {
|
|
163
163
|
|
164
164
|
|
165
165
|
// Verify aspect ratio
|
166
|
-
func
|
167
|
-
conf :=
|
166
|
+
func isValidAspectRatio(path string, s Size) (bool, image.Config) {
|
167
|
+
conf := imageConfig(path)
|
168
168
|
aspH := (conf.Height * s.Width) / conf.Width
|
169
169
|
if aspH == s.Height {
|
170
170
|
return true, conf
|
@@ -175,7 +175,7 @@ func IsValidAspectRatio(path string, s Size) (bool, image.Config) {
|
|
175
175
|
|
176
176
|
|
177
177
|
// Image config
|
178
|
-
func
|
178
|
+
func imageConfig(path string) image.Config {
|
179
179
|
file, err := os.Open(path)
|
180
180
|
if err != nil {
|
181
181
|
panic(err)
|
@@ -191,7 +191,7 @@ func ImageConfig(path string) image.Config {
|
|
191
191
|
|
192
192
|
|
193
193
|
// Select image resize mode
|
194
|
-
func
|
194
|
+
func resizeMode(conf image.Config, s Size) int {
|
195
195
|
srcWidth := s.Width
|
196
196
|
srcHeight := s.Height
|
197
197
|
|
@@ -210,7 +210,7 @@ func ResizeMode(conf image.Config, s Size) int {
|
|
210
210
|
|
211
211
|
// Search image format
|
212
212
|
// if defined, return "jpeg"
|
213
|
-
func
|
213
|
+
func formatSearch(r io.Reader) string{
|
214
214
|
_, format, err := image.DecodeConfig(r)
|
215
215
|
if err != nil {
|
216
216
|
return "jpeg"
|
@@ -220,7 +220,7 @@ func FormatSearch(r io.Reader) string{
|
|
220
220
|
|
221
221
|
|
222
222
|
// Copy Reader
|
223
|
-
func
|
223
|
+
func copyReader(body io.Reader) (io.Reader, io.Reader) {
|
224
224
|
header := bytes.NewBuffer(nil)
|
225
225
|
r := io.TeeReader(body, header)
|
226
226
|
return header, r
|
data/ext/ires/ires.go
CHANGED
@@ -27,41 +27,41 @@ type Ires struct {
|
|
27
27
|
|
28
28
|
func (i *Ires) Resize() string {
|
29
29
|
// Check image type
|
30
|
-
i.
|
30
|
+
i.isLocalFile()
|
31
31
|
|
32
32
|
// Delete the expiration date image
|
33
|
-
i.
|
33
|
+
i.deleteExpireImage(IMAGE_MODE_RESIZE)
|
34
34
|
|
35
|
-
distPath := i.
|
35
|
+
distPath := i.imagePath(IMAGE_MODE_RESIZE)
|
36
36
|
// When the image exists, return the image path
|
37
|
-
if
|
38
|
-
return i.
|
37
|
+
if isExistsImage(distPath) {
|
38
|
+
return i.targetImagePath(distPath)
|
39
39
|
}
|
40
40
|
|
41
|
-
inputImg, format, isImageExist :=
|
41
|
+
inputImg, format, isImageExist := inputImage(i)
|
42
42
|
if !isImageExist {
|
43
43
|
return i.Uri
|
44
44
|
}
|
45
45
|
|
46
|
-
outputImg
|
47
|
-
|
48
|
-
return i.
|
46
|
+
outputImg := resize.Resize(uint(i.Width), uint(i.Height), inputImg, resize.Lanczos3)
|
47
|
+
createImage(outputImg, distPath, format)
|
48
|
+
return i.targetImagePath(distPath)
|
49
49
|
}
|
50
50
|
|
51
51
|
func (i *Ires) Crop() string {
|
52
52
|
// Check image type
|
53
|
-
i.
|
53
|
+
i.isLocalFile()
|
54
54
|
|
55
55
|
// Delete the expiration date image
|
56
|
-
i.
|
56
|
+
i.deleteExpireImage(IMAGE_MODE_CROP)
|
57
57
|
|
58
|
-
distPath := i.
|
58
|
+
distPath := i.imagePath(IMAGE_MODE_CROP)
|
59
59
|
// When the image exists, return the image path
|
60
|
-
if
|
61
|
-
return i.
|
60
|
+
if isExistsImage(distPath) {
|
61
|
+
return i.targetImagePath(distPath)
|
62
62
|
}
|
63
63
|
|
64
|
-
inputImg, format, isImageExist :=
|
64
|
+
inputImg, format, isImageExist := inputImage(i)
|
65
65
|
if !isImageExist {
|
66
66
|
return i.Uri
|
67
67
|
}
|
@@ -72,31 +72,31 @@ func (i *Ires) Crop() string {
|
|
72
72
|
Mode: cutter.Centered,
|
73
73
|
Options: cutter.Copy,
|
74
74
|
})
|
75
|
-
|
75
|
+
createImage(outputImg, distPath, format)
|
76
76
|
|
77
|
-
return i.
|
77
|
+
return i.targetImagePath(distPath)
|
78
78
|
}
|
79
79
|
|
80
80
|
func (i *Ires) ResizeToCrop() string {
|
81
81
|
// Check image type
|
82
|
-
i.
|
82
|
+
i.isLocalFile()
|
83
83
|
|
84
84
|
// Delete the expiration date image
|
85
|
-
i.
|
85
|
+
i.deleteExpireImage(IMAGE_MODE_RESIZE_TO_CROP)
|
86
86
|
|
87
|
-
distPath := i.
|
87
|
+
distPath := i.imagePath(IMAGE_MODE_RESIZE_TO_CROP)
|
88
88
|
// When the image exists, return the image path
|
89
|
-
if
|
90
|
-
return i.
|
89
|
+
if isExistsImage(distPath) {
|
90
|
+
return i.targetImagePath(distPath)
|
91
91
|
}
|
92
92
|
|
93
|
-
inputImg, format, isImageExist :=
|
93
|
+
inputImg, format, isImageExist := inputImage(i)
|
94
94
|
if !isImageExist {
|
95
95
|
return i.Uri
|
96
96
|
}
|
97
97
|
|
98
|
-
outputImg :=
|
99
|
-
|
98
|
+
outputImg := resizeToCrop(i ,inputImg)
|
99
|
+
createImage(outputImg, distPath, format)
|
100
100
|
|
101
|
-
return i.
|
101
|
+
return i.targetImagePath(distPath)
|
102
102
|
}
|
data/ext/ires/uri.go
CHANGED
@@ -11,7 +11,7 @@ import (
|
|
11
11
|
|
12
12
|
|
13
13
|
// Input image type is Local or HTTP
|
14
|
-
func (i *Ires)
|
14
|
+
func (i *Ires) isLocalFile() {
|
15
15
|
if strings.Index(i.Uri, "http") == -1 {
|
16
16
|
i.IsLocal = true
|
17
17
|
} else {
|
@@ -21,7 +21,7 @@ func (i *Ires) IsLocalFile() {
|
|
21
21
|
|
22
22
|
|
23
23
|
// Generate image name
|
24
|
-
func
|
24
|
+
func imageName(i *Ires, mode int) string {
|
25
25
|
splitPath := strings.Split(i.Uri, "/")
|
26
26
|
|
27
27
|
// ex. sample.jpg
|
@@ -39,9 +39,9 @@ func ImageName(i *Ires, mode int) string {
|
|
39
39
|
|
40
40
|
var prefix string
|
41
41
|
switch mode {
|
42
|
-
case 0: prefix =
|
43
|
-
case 1: prefix =
|
44
|
-
case 2: prefix =
|
42
|
+
case 0: prefix = prefixSize(i.Size) + "_resize"
|
43
|
+
case 1: prefix = prefixSize(i.Size) + "_crop"
|
44
|
+
case 2: prefix = prefixSize(i.Size) + "_resize_to_crop"
|
45
45
|
case 3: prefix = "original"
|
46
46
|
}
|
47
47
|
|
@@ -50,7 +50,7 @@ func ImageName(i *Ires, mode int) string {
|
|
50
50
|
|
51
51
|
|
52
52
|
// Generate image path
|
53
|
-
func (i *Ires)
|
53
|
+
func (i *Ires) imagePath(mode int) string {
|
54
54
|
paths := []rune(i.Dir)
|
55
55
|
pathsLastIndex := len(paths) - 1
|
56
56
|
lastChar := string(paths[pathsLastIndex])
|
@@ -61,9 +61,9 @@ func (i *Ires) ImagePath(mode int) string {
|
|
61
61
|
|
62
62
|
var oDir string
|
63
63
|
if i.IsLocal {
|
64
|
-
oDir =
|
64
|
+
oDir = localPath(mode)
|
65
65
|
} else {
|
66
|
-
oDir =
|
66
|
+
oDir = remotePath(i)
|
67
67
|
}
|
68
68
|
|
69
69
|
// Create directory
|
@@ -74,20 +74,20 @@ func (i *Ires) ImagePath(mode int) string {
|
|
74
74
|
}
|
75
75
|
}
|
76
76
|
|
77
|
-
name :=
|
77
|
+
name := imageName(i, mode)
|
78
78
|
return filepath.Join(oPath, name)
|
79
79
|
}
|
80
80
|
|
81
81
|
|
82
82
|
// Create prefix by size
|
83
83
|
// ex. 640x480
|
84
|
-
func
|
84
|
+
func prefixSize(s Size) string {
|
85
85
|
return strconv.Itoa(s.Width) + "x" + strconv.Itoa(s.Height)
|
86
86
|
}
|
87
87
|
|
88
88
|
|
89
89
|
// リサイズ済みのファイルがあれば、処理せず返す
|
90
|
-
func
|
90
|
+
func isExistsImage(path string) bool {
|
91
91
|
_, err := os.Stat(path)
|
92
92
|
if err == nil {
|
93
93
|
return true
|
@@ -98,19 +98,19 @@ func IsExistsImage(path string) bool {
|
|
98
98
|
|
99
99
|
|
100
100
|
// Read directory
|
101
|
-
func (i *Ires)
|
101
|
+
func (i *Ires) readImageDir(mode int) string {
|
102
102
|
var dir string
|
103
103
|
if i.IsLocal {
|
104
|
-
dir =
|
104
|
+
dir = localPath(mode)
|
105
105
|
} else {
|
106
|
-
dir =
|
106
|
+
dir = remotePath(i)
|
107
107
|
}
|
108
108
|
return filepath.Join(i.Dir, dir)
|
109
109
|
}
|
110
110
|
|
111
111
|
|
112
112
|
// if local image, create ires directory
|
113
|
-
func
|
113
|
+
func localPath(mode int) string {
|
114
114
|
var dir string
|
115
115
|
switch mode {
|
116
116
|
case 0: dir = "ires/resize"
|
@@ -122,7 +122,7 @@ func LocalPath(mode int) string {
|
|
122
122
|
|
123
123
|
|
124
124
|
// if http image, parse URL & make directory
|
125
|
-
func
|
125
|
+
func remotePath(i *Ires) string {
|
126
126
|
u, err := urlx.Parse(i.Uri)
|
127
127
|
dir := []string{"ires"}
|
128
128
|
if err != nil {
|
@@ -138,6 +138,6 @@ func RemotePath(i *Ires) string {
|
|
138
138
|
|
139
139
|
|
140
140
|
// Optimize image path
|
141
|
-
func (i *Ires)
|
141
|
+
func (i *Ires) targetImagePath(path string) string {
|
142
142
|
return strings.Replace(path, i.Dir, "", -1)
|
143
143
|
}
|
data/ext/main.go
CHANGED
@@ -9,9 +9,10 @@ import (
|
|
9
9
|
func init() {}
|
10
10
|
func main() {}
|
11
11
|
|
12
|
-
//export
|
13
|
-
func
|
12
|
+
//export iresImagePath
|
13
|
+
func iresImagePath(Uri *C.char, width, height int, Mode, Dir, Expire *C.char) *C.char {
|
14
14
|
uri := C.GoString(Uri)
|
15
|
+
mode := C.GoString(Mode)
|
15
16
|
dir := C.GoString(Dir)
|
16
17
|
expire := C.GoString(Expire)
|
17
18
|
|
@@ -26,45 +27,15 @@ func resizeImage(Uri *C.char, width, height int, Dir, Expire *C.char) *C.char {
|
|
26
27
|
IsLocal: false,
|
27
28
|
}
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
r := &ires.Ires{
|
39
|
-
Uri: uri,
|
40
|
-
Size: ires.Size{
|
41
|
-
Width: width,
|
42
|
-
Height: height,
|
43
|
-
},
|
44
|
-
Dir: dir,
|
45
|
-
Expire: expire,
|
46
|
-
IsLocal: false,
|
47
|
-
}
|
48
|
-
|
49
|
-
return C.CString(r.Crop())
|
50
|
-
}
|
51
|
-
|
52
|
-
//export resizeToCropImage
|
53
|
-
func resizeToCropImage(Uri *C.char, width, height int, Dir, Expire *C.char) *C.char {
|
54
|
-
uri := C.GoString(Uri)
|
55
|
-
dir := C.GoString(Dir)
|
56
|
-
expire := C.GoString(Expire)
|
57
|
-
|
58
|
-
r := &ires.Ires{
|
59
|
-
Uri: uri,
|
60
|
-
Size: ires.Size{
|
61
|
-
Width: width,
|
62
|
-
Height: height,
|
63
|
-
},
|
64
|
-
Dir: dir,
|
65
|
-
Expire: expire,
|
66
|
-
IsLocal: false,
|
30
|
+
var imagePath string
|
31
|
+
switch mode {
|
32
|
+
case "resize":
|
33
|
+
imagePath = r.Resize()
|
34
|
+
case "crop":
|
35
|
+
imagePath = r.Crop()
|
36
|
+
case "resize_to_crop":
|
37
|
+
imagePath = r.ResizeToCrop()
|
67
38
|
}
|
68
39
|
|
69
|
-
return C.CString(
|
70
|
-
}
|
40
|
+
return C.CString(imagePath)
|
41
|
+
}
|
data/lib/ires.rb
CHANGED
data/lib/ires/core.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
require 'ires/os'
|
3
|
+
|
4
|
+
module Ires
|
5
|
+
module Core
|
6
|
+
extend FFI::Library
|
7
|
+
|
8
|
+
# NOTE: ires.so is golang object
|
9
|
+
ffi_lib File.expand_path("../../shared/#{Ires::Os.current}/ires.so", File.dirname(__FILE__))
|
10
|
+
|
11
|
+
# resize func
|
12
|
+
attach_function :iresImagePath, [:string, :int, :int, :string, :string, :string], :string
|
13
|
+
end
|
14
|
+
end
|
data/lib/ires/{util.rb → os.rb}
RENAMED
@@ -1,11 +1,10 @@
|
|
1
|
-
require 'rbconfig'
|
2
|
-
|
3
1
|
module Ires
|
4
|
-
module
|
2
|
+
module Os
|
5
3
|
class << self
|
4
|
+
|
6
5
|
# Reszie image directory
|
7
|
-
# return [none(ffi)]
|
8
|
-
def
|
6
|
+
# @return [none(ffi)]
|
7
|
+
def current
|
9
8
|
if ['darwin', 'linux'].include?(os)
|
10
9
|
os
|
11
10
|
else
|
@@ -13,13 +12,15 @@ module Ires
|
|
13
12
|
nil
|
14
13
|
end
|
15
14
|
end
|
16
|
-
|
15
|
+
|
16
|
+
private
|
17
|
+
|
17
18
|
# Search OS
|
18
|
-
# return [String]
|
19
|
+
# @return [String]
|
19
20
|
def os
|
20
21
|
@os ||= (
|
21
|
-
|
22
|
-
|
22
|
+
host_os = RbConfig::CONFIG['host_os']
|
23
|
+
case host_os
|
23
24
|
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
|
24
25
|
'windows'
|
25
26
|
when /darwin|mac os/
|
@@ -30,10 +31,10 @@ module Ires
|
|
30
31
|
'unix'
|
31
32
|
else
|
32
33
|
'unknown'
|
33
|
-
|
34
|
+
end
|
34
35
|
)
|
35
36
|
end
|
36
37
|
|
37
38
|
end
|
38
39
|
end
|
39
|
-
end
|
40
|
+
end
|
data/lib/ires/service.rb
CHANGED
@@ -1,19 +1,80 @@
|
|
1
|
-
require '
|
2
|
-
require 'ires/
|
1
|
+
require 'ires/core'
|
2
|
+
require 'ires/os'
|
3
3
|
|
4
4
|
module Ires
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
5
|
+
class Service
|
6
|
+
class << self
|
7
|
+
|
8
|
+
# Resize image path
|
9
|
+
# @return [String]
|
10
|
+
def path(path:, width:, height:, mode: 'resize', expire: 30.days)
|
11
|
+
|
12
|
+
os = Ires::Os.current
|
13
|
+
return nil if os.nil?
|
14
|
+
|
15
|
+
full_path = image_full_path(path.to_s)
|
16
|
+
|
17
|
+
# if no image or could not find file path then perform the same action as 'image_tag'
|
18
|
+
return nil if invalid_path?(full_path)
|
19
|
+
|
20
|
+
expiration_date = expiration_date(expire)
|
21
|
+
dir = image_dir
|
22
|
+
|
23
|
+
ires_element = {
|
24
|
+
path: full_path,
|
25
|
+
width: width,
|
26
|
+
height: height,
|
27
|
+
mode: mode,
|
28
|
+
dir: dir,
|
29
|
+
expire: expiration_date
|
30
|
+
}
|
31
|
+
ires_image_path(ires_element)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# Image full path or HTTP URL
|
37
|
+
# @return [String]
|
38
|
+
def image_full_path(path)
|
39
|
+
root = Rails.root.to_s
|
40
|
+
if path.include?(root) || path.include?('http')
|
41
|
+
path
|
42
|
+
else
|
43
|
+
File.join(image_dir, path)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Reszie image directory
|
48
|
+
# @return [String]
|
49
|
+
def image_dir
|
50
|
+
@image_dir ||= Pathname.new(Rails.root).join('public').to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
# Check file or URI
|
54
|
+
# @return [Bool]
|
55
|
+
def invalid_path?(path)
|
56
|
+
!File.exist?(path) && !path.include?("http")
|
57
|
+
end
|
58
|
+
|
59
|
+
# Expiration date (default: 7.days)
|
60
|
+
# ex. "20170101"
|
61
|
+
# @return [String]
|
62
|
+
def expiration_date(expire)
|
63
|
+
(Date.today + expire).strftime('%Y%m%d')
|
64
|
+
end
|
65
|
+
|
66
|
+
# Image path
|
67
|
+
# @return [String]
|
68
|
+
def ires_image_path(ires_element)
|
69
|
+
Ires::Core.iresImagePath(
|
70
|
+
ires_element[:path],
|
71
|
+
ires_element[:width],
|
72
|
+
ires_element[:height],
|
73
|
+
ires_element[:mode],
|
74
|
+
ires_element[:dir],
|
75
|
+
ires_element[:expire])
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
18
79
|
end
|
19
80
|
end
|
data/lib/ires/version.rb
CHANGED
data/lib/ires/view_helper.rb
CHANGED
@@ -1,66 +1,18 @@
|
|
1
|
-
require '
|
1
|
+
require 'ires/core'
|
2
|
+
require 'ires/service'
|
2
3
|
require 'action_view/helpers'
|
3
4
|
|
4
5
|
module Ires
|
5
6
|
module ViewHelper
|
6
7
|
|
7
8
|
# Image resize
|
8
|
-
# return [image_tag]
|
9
|
+
# @return [image_tag]
|
9
10
|
def ires_tag(path:, width:, height:, mode: 'resize', expire: 30.days, **option)
|
10
|
-
|
11
|
-
|
12
|
-
# if no image or could not find file path then perform the same action as 'image_tag'
|
13
|
-
return image_tag(path, option) if !File.exist?(full_path) && !full_path.include?("http")
|
14
|
-
|
15
|
-
# Expiration date (default: 7.days)
|
16
|
-
# ex. "20170101"
|
17
|
-
expiration_date = (Date.today + expire).strftime('%Y%m%d')
|
18
|
-
|
19
|
-
# Reszie image
|
20
|
-
case mode
|
21
|
-
when 'resize'
|
22
|
-
@image = Ires::Service.resizeImage(
|
23
|
-
full_path,
|
24
|
-
width,
|
25
|
-
height,
|
26
|
-
image_dir,
|
27
|
-
expiration_date)
|
28
|
-
when 'crop'
|
29
|
-
@image = Ires::Service.cropImage(
|
30
|
-
full_path,
|
31
|
-
width,
|
32
|
-
height,
|
33
|
-
image_dir,
|
34
|
-
expiration_date)
|
35
|
-
when 'resize_to_crop'
|
36
|
-
@image = Ires::Service.resizeToCropImage(
|
37
|
-
full_path,
|
38
|
-
width,
|
39
|
-
height,
|
40
|
-
image_dir,
|
41
|
-
expiration_date)
|
42
|
-
end
|
43
|
-
|
44
|
-
return nil if @image.nil?
|
11
|
+
image = Ires::Service.path(path: path, width: width, height: height, mode: mode, expire: expire)
|
12
|
+
return nil if image.nil?
|
45
13
|
|
46
14
|
# Set image_tag
|
47
|
-
image_tag(
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
# Reszie image directory
|
52
|
-
# return [String]
|
53
|
-
def image_dir
|
54
|
-
@image_dir ||= Pathname.new(Rails.root).join('public').to_s
|
55
|
-
end
|
56
|
-
|
57
|
-
def image_full_path(path)
|
58
|
-
root = Rails.root.to_s
|
59
|
-
if path.include?(root) || path.include?('http')
|
60
|
-
path
|
61
|
-
else
|
62
|
-
File.join(image_dir, path)
|
63
|
-
end
|
15
|
+
image_tag(image, option)
|
64
16
|
end
|
65
17
|
|
66
18
|
end
|
data/lib/tasks/ires.rake
CHANGED
@@ -1,10 +1,9 @@
|
|
1
|
-
require '
|
2
|
-
require 'ires/util'
|
1
|
+
require 'ires/os'
|
3
2
|
|
4
3
|
desc "Build shared object"
|
5
4
|
namespace :ires do
|
6
5
|
task :build do
|
7
|
-
os = Ires::
|
6
|
+
os = Ires::Os.current
|
8
7
|
return if os.nil?
|
9
8
|
exec "CGO_ENABLED=1 GOOS=\"#{os}\" go build -v -buildmode=c-shared -o shared/\"#{os}\"/ires.so ext/main.go"
|
10
9
|
end
|
data/shared/darwin/ires.h
CHANGED
@@ -53,11 +53,7 @@ extern "C" {
|
|
53
53
|
#endif
|
54
54
|
|
55
55
|
|
56
|
-
extern char*
|
57
|
-
|
58
|
-
extern char* cropImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
59
|
-
|
60
|
-
extern char* resizeToCropImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
56
|
+
extern char* iresImagePath(char* p0, GoInt p1, GoInt p2, char* p3, char* p4, char* p5);
|
61
57
|
|
62
58
|
#ifdef __cplusplus
|
63
59
|
}
|
data/shared/darwin/ires.so
CHANGED
Binary file
|
data/shared/linux/ires.h
CHANGED
@@ -53,11 +53,7 @@ extern "C" {
|
|
53
53
|
#endif
|
54
54
|
|
55
55
|
|
56
|
-
extern char*
|
57
|
-
|
58
|
-
extern char* cropImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
59
|
-
|
60
|
-
extern char* resizeToCropImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
56
|
+
extern char* iresImagePath(char* p0, GoInt p1, GoInt p2, char* p3, char* p4, char* p5);
|
61
57
|
|
62
58
|
#ifdef __cplusplus
|
63
59
|
}
|
data/shared/linux/ires.so
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ires
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- enta0701
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -1111,8 +1111,9 @@ files:
|
|
1111
1111
|
- ext/vendor/golang.org/x/text/width/trieval.go
|
1112
1112
|
- ext/vendor/golang.org/x/text/width/width.go
|
1113
1113
|
- lib/ires.rb
|
1114
|
+
- lib/ires/core.rb
|
1115
|
+
- lib/ires/os.rb
|
1114
1116
|
- lib/ires/service.rb
|
1115
|
-
- lib/ires/util.rb
|
1116
1117
|
- lib/ires/version.rb
|
1117
1118
|
- lib/ires/view_helper.rb
|
1118
1119
|
- lib/tasks/ires.rake
|