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: []