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