jekyll-image_optimizer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []
|