jekyll-image_optimizer 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e1976646dd0f9304e27a9ff4ce3e6bc93af56a67
|
4
|
+
data.tar.gz: b620a1968b3c3b0cdb8ad2270ea7be8db07bfb8d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: decbd20e523daffcd47e273c85530c6b07e3e8e9fea91b55ad33e42c184eed6d80ac3054d1b0922419482a3c408c1be1ad61d3ba09d23b7c6acba4a1af32de6e
|
7
|
+
data.tar.gz: ca85d2bc1b365f382f8ea77dc1090f087b9955068d4a144999f59892e8fc07a088b9ee90270ebeda5cb86c251742b3a2c695171137e26ff464b57feb8aebb95c
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'image_optimizer/image_optimizer'
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
|
5
|
+
class JekyllImageOptimizer < Generator
|
6
|
+
safe true
|
7
|
+
|
8
|
+
def initialize(config)
|
9
|
+
@raw=config['raw_images'] || 'img/raw'
|
10
|
+
@opt=config['opt_images'] || 'img/opt'
|
11
|
+
@symlink=config['images_link'] || 'images'
|
12
|
+
@geometry=config['image_geometry'] || '800x800>'
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate(site)
|
16
|
+
io=ImageOptimizer.new(@raw, @opt)
|
17
|
+
io.optimize_images(@geometry)
|
18
|
+
io.create_symlink(@symlink, @geometry)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'synchronizer.rb'
|
2
|
+
require 'RMagick'
|
3
|
+
|
4
|
+
class ImageOptimizer < Synchronizer
|
5
|
+
def initialize(source_path, target_path)
|
6
|
+
super(source_path, target_path)
|
7
|
+
end
|
8
|
+
|
9
|
+
def optimize_images(geometry)
|
10
|
+
synchronize(geometry)
|
11
|
+
end
|
12
|
+
|
13
|
+
def target_name(path, geometry)
|
14
|
+
path+geometry.gsub('>', 'max').gsub('<', 'min').gsub('@', 'area')
|
15
|
+
end
|
16
|
+
|
17
|
+
def do_synchronize_file(source, target, param)
|
18
|
+
if process? source
|
19
|
+
puts "optimizing #{source} -> #{target}"
|
20
|
+
optimize_image(source, target, param)
|
21
|
+
else
|
22
|
+
puts "copying #{source} -> #{target}"
|
23
|
+
copy_file(source, target)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def optimize_image(source, target, geometry)
|
28
|
+
image = Magick::Image.read(source).first
|
29
|
+
image.change_geometry!(geometry) { |cols, rows, img|
|
30
|
+
img.resize!(cols, rows)
|
31
|
+
img.strip!
|
32
|
+
img.write('jpeg:'+target)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def process?(file)
|
37
|
+
file.downcase.end_with? '.jpg' or file.downcase.end_with? '.jpeg'
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
# io=ImageOptimizer.new('img/a', 'img/opt')
|
43
|
+
# io.optimize_images('300x300>')
|
44
|
+
# io.create_symlink('images', '300x300>')
|
@@ -0,0 +1,80 @@
|
|
1
|
+
class Synchronizer
|
2
|
+
def initialize(source_path, target_path)
|
3
|
+
@source_path=source_path
|
4
|
+
@target_path=target_path
|
5
|
+
end
|
6
|
+
|
7
|
+
def create_symlink(name, param)
|
8
|
+
target=target_name(@target_path, param)
|
9
|
+
if File::symlink? name
|
10
|
+
return if File::readlink(name)==File::expand_path(target)
|
11
|
+
File::delete name
|
12
|
+
else
|
13
|
+
raise "File #{name} already exists" if File::exist? name
|
14
|
+
end
|
15
|
+
puts "creating symlink (#{name}->#{target})"
|
16
|
+
File::symlink(File::expand_path(target), name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def target_name(path, param)
|
20
|
+
path+param
|
21
|
+
end
|
22
|
+
|
23
|
+
def synchronize(param)
|
24
|
+
target_path=target_name(@target_path, param)
|
25
|
+
for source in Dir["#{@source_path}/**/*"]
|
26
|
+
target=source.sub(@source_path, target_path)
|
27
|
+
synchronize_file(source, target, param) if File::file? source
|
28
|
+
end
|
29
|
+
delete_targets_without_source(target_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def synchronize_file(source, target, param)
|
33
|
+
source_time = File.mtime(source)
|
34
|
+
if !File.file?(target) or File.mtime(target) != source_time
|
35
|
+
target_dir=File.dirname(target)
|
36
|
+
Dir.mkdir(target_dir) unless File.directory? target_dir
|
37
|
+
do_synchronize_file(source, target, param)
|
38
|
+
File.utime(source_time, source_time, target) if File.file?(target)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def do_synchronize_file(source, target, param)
|
43
|
+
puts "copying #{source} -> #{target}"
|
44
|
+
copy_file(source, target)
|
45
|
+
end
|
46
|
+
|
47
|
+
def copy_file(src, dest)
|
48
|
+
File.open(src, 'rb') { |r|
|
49
|
+
File.open(dest, 'wb') { |w|
|
50
|
+
while true
|
51
|
+
w.syswrite r.sysread(1024)
|
52
|
+
end
|
53
|
+
}
|
54
|
+
}
|
55
|
+
rescue IOError
|
56
|
+
# ignored
|
57
|
+
end
|
58
|
+
|
59
|
+
def delete_targets_without_source(target_path)
|
60
|
+
files_and_dirs_by_length=Dir["#{target_path}/**/*"].sort_by { |dir| File.file?(dir) ? ('a'+dir) : ('b'+(1000-dir.size).to_s) }
|
61
|
+
for target in files_and_dirs_by_length
|
62
|
+
source=target.sub(target_path, @source_path)
|
63
|
+
if File.directory? target
|
64
|
+
delete_dir(target) unless Dir.exists? source
|
65
|
+
else
|
66
|
+
delete_file(target) unless File.file? source
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def delete_dir(dir)
|
72
|
+
puts "deleting #{dir}"
|
73
|
+
Dir.delete(dir)
|
74
|
+
end
|
75
|
+
|
76
|
+
def delete_file(file)
|
77
|
+
puts "deleting #{file}"
|
78
|
+
File.delete(file)
|
79
|
+
end
|
80
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll-image_optimizer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Stefan Niederhauser
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rmagick
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.13'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.13'
|
27
|
+
description: The plugin reads all images in a directory and saves optimized versions
|
28
|
+
of them in another directory.
|
29
|
+
email: ich@nidi.guru
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/jekyll/image_optimizer.rb
|
35
|
+
- lib/jekyll/image_optimizer/image_optimizer.rb
|
36
|
+
- lib/jekyll/image_optimizer/synchronizer.rb
|
37
|
+
homepage: http://rubygems.org/gems/jekyll-image_optimizer
|
38
|
+
licenses:
|
39
|
+
- Apache
|
40
|
+
metadata: {}
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 2.2.2
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: A jekyll plugin to optimize images for the web
|
61
|
+
test_files: []
|