jekyll-image_optimizer 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ede44b92874642f51ae35e6040f96c58ad0717cf
4
- data.tar.gz: b6256615bd5e2984cb727435d2b306eb6abfa61c
3
+ metadata.gz: 3695bb55dbb989f9f054a6441e485e8261b5aacb
4
+ data.tar.gz: 17c68e09b4fa2361de2a76c84ba5e227e0c1e237
5
5
  SHA512:
6
- metadata.gz: 9622b082d933826853f17f24f03dd039b04a91f97ab021a89f213f4b0510e4063d4ea2b70e6c2627215b0d5f442f7ea81dc1a18da959f4837712e75d0982cde1
7
- data.tar.gz: 7c6f8aa33b750b9f36d0525d75b98c9730676cb61d308c7e2965a6a90f3747994dad4f25bbc3d1320fb727b590b600d47be7ada2e3ebc33ba8769fbd0be00447
6
+ metadata.gz: e34e3c0a8ef34e18d9b9ac70197011ba150245fe60409e71d5901fa095d79c53c677b550e51cf7452ec935d3ed06ea9a067c8e765bbe8a47e838f0e5a1714eb2
7
+ data.tar.gz: a2cd559dee33fe01591e5a16ff2c7ef6be8218505e1067942a873da387dd5e93611a255f90a18e00ca055309e5529ce3e300ec7f6f894a7dffc102851ce8a217
@@ -0,0 +1,39 @@
1
+ class ImageHash
2
+ def initialize(use_hash)
3
+ @use_hash=use_hash
4
+ end
5
+
6
+ def file_search_pattern(file)
7
+ pos=file.rindex('/')
8
+ self.dir_search_pattern(file[0..pos-1], file[pos+1..-1])
9
+ end
10
+
11
+ def dir_search_pattern(dir, file)
12
+ if @use_hash
13
+ pos=file.rindex('.')
14
+ dir+'/'+file[0..pos-1]+'-*'+file[pos..-1]
15
+ else
16
+ dir+'/'+file
17
+ end
18
+ end
19
+
20
+ def name_with_hash(file)
21
+ pos=file.rindex('.')
22
+ file[0..pos-1]+'-'+Digest::MD5.file(file).hexdigest+file[pos..-1]
23
+ end
24
+
25
+ def with_hash(file)
26
+ return file unless @use_hash
27
+ new_file=self.name_with_hash(file)
28
+ File.rename(file, new_file)
29
+ new_file
30
+ end
31
+
32
+ def without_hash(file)
33
+ @use_hash ? file.sub(/-[0-9a-f]{32}\./, '.') : file
34
+ end
35
+
36
+ def hash?(file)
37
+ @use_hash ? file.match(/-[0-9a-f]{32}\./)!=nil : true
38
+ end
39
+ end
@@ -2,8 +2,8 @@ require_relative 'synchronizer.rb'
2
2
  require 'RMagick'
3
3
 
4
4
  class ImageOptimizer < Synchronizer
5
- def initialize(source_path, target_path)
6
- super(source_path, target_path)
5
+ def initialize(source_path, target_path, use_hash)
6
+ super(source_path, target_path, use_hash)
7
7
  end
8
8
 
9
9
  def optimize_images(geometry)
@@ -1,7 +1,8 @@
1
1
  class Synchronizer
2
- def initialize(source_path, target_path)
2
+ def initialize(source_path, target_path, use_hash)
3
3
  @source_path=source_path
4
4
  @target_path=target_path
5
+ @hash=ImageHash.new(use_hash)
5
6
  end
6
7
 
7
8
  def create_symlink(name, param)
@@ -31,11 +32,17 @@ class Synchronizer
31
32
 
32
33
  def synchronize_file(source, target, param)
33
34
  source_time = File.mtime(source)
34
- if !File.file?(target) or File.mtime(target) != source_time
35
+ target_found=Dir[@hash.file_search_pattern(target)]
36
+ target=target_found[0] unless target_found.empty?
37
+ if !File.file?(target) or File.mtime(target) != source_time or !@hash.hash?(target)
38
+ target=@hash.without_hash(target)
35
39
  target_dir=File.dirname(target)
36
40
  Dir.mkdir(target_dir) unless File.directory? target_dir
37
41
  do_synchronize_file(source, target, param)
38
- File.utime(source_time, source_time, target) if File.file?(target)
42
+ if File.file?(target)
43
+ target=@hash.with_hash(target)
44
+ File.utime(source_time, source_time, target)
45
+ end
39
46
  end
40
47
  end
41
48
 
@@ -60,10 +67,13 @@ class Synchronizer
60
67
  files_and_dirs_by_length=Dir["#{target_path}/**/*"].sort_by { |dir| File.file?(dir) ? ('a'+dir) : ('b'+(1000-dir.size).to_s) }
61
68
  for target in files_and_dirs_by_length
62
69
  source=target.sub(target_path, @source_path)
70
+ source=@hash.without_hash(source)
63
71
  if File.directory? target
64
72
  delete_dir(target) unless Dir.exists? source
65
73
  else
66
- delete_file(target) unless File.file? source
74
+ unless File.file? source and File.mtime(source)==File.mtime(target)
75
+ delete_file(target)
76
+ end
67
77
  end
68
78
  end
69
79
  end
@@ -77,4 +87,5 @@ class Synchronizer
77
87
  puts "deleting #{file}"
78
88
  File.delete(file)
79
89
  end
90
+
80
91
  end
@@ -1,10 +1,16 @@
1
1
  require_relative 'image_optimizer/image_optimizer'
2
+ require_relative 'image_optimizer/synchronizer'
3
+ require_relative 'image_optimizer/image_hash'
2
4
  require 'RMagick'
3
5
 
4
6
  def opt_dir(config)
5
7
  config['opt_images'] || 'img/opt'
6
8
  end
7
9
 
10
+ def use_hash(config)
11
+ (config['image_hash'] || 'true')=='true'
12
+ end
13
+
8
14
  module Jekyll
9
15
 
10
16
  class JekyllImageOptimizer < Generator
@@ -15,10 +21,11 @@ module Jekyll
15
21
  @opt=opt_dir(config)
16
22
  @symlink=config['images_link'] || 'images'
17
23
  @geometry=config['image_geometry'] || '800x800>'
24
+ @hash=use_hash(config)
18
25
  end
19
26
 
20
27
  def generate(site)
21
- io=ImageOptimizer.new(@raw, @opt)
28
+ io=ImageOptimizer.new(@raw, @opt, @hash)
22
29
  if @geometry.is_a? Enumerable
23
30
  @geometry.each { |geom| io.optimize_images(geom) }
24
31
  else
@@ -32,7 +39,6 @@ module Jekyll
32
39
 
33
40
  def initialize(tag_name, markup, tokens)
34
41
  super
35
- @markup
36
42
  end
37
43
 
38
44
  def render(context)
@@ -40,10 +46,10 @@ module Jekyll
40
46
  base_url=context['site']['baseurl']
41
47
  index=Liquid::Template.parse(@markup).render(context).to_i
42
48
  src=context['page']['image'][index]['url']
43
- for dir in Dir[opt_dir(context['site'])+'*']
44
- file = dir+'/'+src
45
- if File.file? file
46
- img=Magick::Image::read(file).first
49
+ hash=ImageHash.new(use_hash(context['site']))
50
+ for file in Dir[hash.dir_search_pattern(opt_dir(context['site'])+'*', src)]
51
+ if File.file? file and hash.hash? file
52
+ img=Magick::Image.ping(file).first
47
53
  s+=base_url+'/'+file+' '+img.columns.to_s+'w,'
48
54
  end
49
55
  end
@@ -51,6 +57,29 @@ module Jekyll
51
57
  end
52
58
  end
53
59
 
60
+ class SrcTag < Liquid::Tag
61
+
62
+ def initialize(tag_name, markup, tokens)
63
+ super
64
+ if markup =~ /\s*(.*?)\s+(.*?)\s*/
65
+ @dir = $1
66
+ @index = $2
67
+ end
68
+ end
69
+
70
+ def render(context)
71
+ base_url=context['site']['baseurl']
72
+ index=Liquid::Template.parse(@index).render(context).to_i
73
+ src=context['page']['image'][index]['url']
74
+ hash=ImageHash.new(use_hash(context['site']))
75
+ for file in Dir[hash.dir_search_pattern(opt_dir(context['site'])+@dir, src)]
76
+ if File.file? file and hash.hash? file
77
+ return base_url+'/'+file
78
+ end
79
+ end
80
+ end
81
+ end
82
+
54
83
  class ImageTag < Liquid::Tag
55
84
 
56
85
  def initialize(tag_name, markup, tokens)
@@ -74,4 +103,5 @@ end
74
103
 
75
104
 
76
105
  Liquid::Template.register_tag('srcset', Jekyll::SrcsetTag)
106
+ Liquid::Template.register_tag('src', Jekyll::SrcTag)
77
107
  Liquid::Template.register_tag('image', Jekyll::ImageTag)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-image_optimizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Niederhauser
@@ -32,6 +32,7 @@ extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
34
  - lib/jekyll/image_optimizer.rb
35
+ - lib/jekyll/image_optimizer/image_hash.rb
35
36
  - lib/jekyll/image_optimizer/image_optimizer.rb
36
37
  - lib/jekyll/image_optimizer/synchronizer.rb
37
38
  homepage: https://github.com/nidi3/jekyll-image_optimizer