middleman-images 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,68 @@
1
+ module Middleman
2
+ module Images
3
+ class Image
4
+ attr_reader :destination, :source
5
+
6
+ IGNORE_RESIZING = {
7
+ ".svg" => "WARNING: We did not resize %{file}. Resizing SVG files will lead to ImageMagick creating an SVG with an embedded binary image thus making the file way bigger.",
8
+ ".gif" => "WARNING: We did not resize %{file}. Resizing GIF files will remove the animation. If your GIF file is not animated, use JPG or PNG instead.",
9
+ }.freeze
10
+
11
+ def initialize(app, source, destination, options = {})
12
+ @app = app
13
+ @source = source
14
+ @destination = destination
15
+ @options = options
16
+ @cache = File.join(app.root, options[:cache_dir], destination).to_s
17
+ FileUtils.mkdir_p File.dirname(cache)
18
+ end
19
+
20
+ def process
21
+ return if File.exist?(cache) && File.mtime(source) < File.mtime(cache)
22
+
23
+ app.logger.info "== Images: Processing #{destination}"
24
+ FileUtils.copy(source, cache)
25
+ resize(cache, options[:resize]) unless options[:resize].nil?
26
+ optimize(cache, options[:image_optim]) if options[:optimize]
27
+ end
28
+
29
+ def resource
30
+ @resource ||= ::Middleman::Sitemap::Resource.new(app.sitemap, destination, cache)
31
+ end
32
+
33
+ private
34
+
35
+ def resize(image_path, options)
36
+ begin
37
+ require 'mini_magick'
38
+ rescue LoadError
39
+ raise 'The gem "mini_magick" is required for image resizing. Please install "mini_magick" or remove the resize option.'
40
+ end
41
+
42
+ image_ext = File.extname(image_path)
43
+ if IGNORE_RESIZING.keys.include? image_ext
44
+ app.logger.warn("== Images: " + (IGNORE_RESIZING[image_ext] % { file: image_path }))
45
+ return
46
+ end
47
+
48
+ image = MiniMagick::Image.new(image_path) do |i|
49
+ i.resize(options)
50
+ i.define('jpeg:preserve-settings')
51
+ end
52
+ image.write image_path
53
+ end
54
+
55
+ def optimize(image_path, options)
56
+ begin
57
+ require 'image_optim'
58
+ rescue LoadError
59
+ raise "The gem 'image_option' is required for image optimization. Please install the gem 'image_optim' or set the option optimize: false."
60
+ end
61
+
62
+ ImageOptim.new(options).optimize_image!(image_path)
63
+ end
64
+
65
+ attr_accessor :app, :cache, :options
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,49 @@
1
+ module Middleman
2
+ module Images
3
+ class Manipulator
4
+ def initialize(app, ignore_original)
5
+ @app = app
6
+ @images = []
7
+ @required_originals = []
8
+ @ignore_original = ignore_original
9
+ end
10
+
11
+ def add(image)
12
+ unless images.collect(&:destination).include? image.destination
13
+ images << image
14
+ end
15
+ end
16
+
17
+ def preserve_original(resource)
18
+ required_originals << resource.source_file
19
+ end
20
+
21
+ def manipulate_resource_list(resources)
22
+ ignore_orginal_resources(resources) if ignore_original
23
+ resources + processed_images
24
+ end
25
+
26
+ private
27
+
28
+ attr_accessor :app, :images, :ignore_original, :required_originals
29
+
30
+ def processed_images
31
+ images.each(&:process)
32
+ images.collect(&:resource)
33
+ end
34
+
35
+ def ignore_orginal_resources(resources)
36
+ originals = images.map(&:source)
37
+ unused_originals = originals - required_originals
38
+
39
+ resources.each do |resource|
40
+ if unused_originals.include? resource.source_file
41
+ resource.ignore!
42
+ elsif required_originals.include? resource.source_file
43
+ resource.ignored = false
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module MiddlemanImages
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "middleman-images/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "middleman-images"
7
+ s.version = MiddlemanImages::VERSION.dup
8
+ s.platform = Gem::Platform::RUBY
9
+ s.licenses = ["MIT"]
10
+ s.authors = ["Ruben Grimm", "Julian Schneider"]
11
+ s.email = ["ruben.grimm@zweitag.de", "julian.schneider@zweitag.de"]
12
+ s.homepage = "https://www.github.com/zweitag/middleman-images"
13
+ s.summary = "Resize and optimize images for Middleman"
14
+ s.description = "Resize and optimize images for Middleman"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+ s.required_ruby_version = '>= 2.5.0'
21
+
22
+ s.add_runtime_dependency("middleman-core", [">= 4.1.14"])
23
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: middleman-images
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ruben Grimm
8
+ - Julian Schneider
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2020-02-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: middleman-core
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 4.1.14
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 4.1.14
28
+ description: Resize and optimize images for Middleman
29
+ email:
30
+ - ruben.grimm@zweitag.de
31
+ - julian.schneider@zweitag.de
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - ".gitignore"
37
+ - ".travis.yml"
38
+ - CHANGELOG.md
39
+ - Gemfile
40
+ - Gemfile.lock
41
+ - LICENSE
42
+ - README.md
43
+ - Rakefile
44
+ - features/building.feature
45
+ - features/ignore_original.feature
46
+ - features/image_path.feature
47
+ - features/optimization.feature
48
+ - features/relative_path.feature
49
+ - features/resize.feature
50
+ - features/support/env.rb
51
+ - features/support/middleman_images_steps.rb
52
+ - fixtures/image/source/images/fox.jpg
53
+ - gemfiles/Gemfile.middleman-4.1
54
+ - gemfiles/Gemfile.middleman-4.1.lock
55
+ - gemfiles/Gemfile.middleman-4.2
56
+ - gemfiles/Gemfile.middleman-4.2.lock
57
+ - gemfiles/Gemfile.middleman-4.3
58
+ - gemfiles/Gemfile.middleman-4.3.lock
59
+ - gemfiles/Gemfile.middleman-5.0-rc
60
+ - gemfiles/Gemfile.middleman-5.0-rc.lock
61
+ - lib/middleman-images.rb
62
+ - lib/middleman-images/extension.rb
63
+ - lib/middleman-images/image.rb
64
+ - lib/middleman-images/manipulator.rb
65
+ - lib/middleman-images/version.rb
66
+ - middleman-images.gemspec
67
+ homepage: https://www.github.com/zweitag/middleman-images
68
+ licenses:
69
+ - MIT
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 2.5.0
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubygems_version: 3.0.3
87
+ signing_key:
88
+ specification_version: 4
89
+ summary: Resize and optimize images for Middleman
90
+ test_files:
91
+ - features/building.feature
92
+ - features/ignore_original.feature
93
+ - features/image_path.feature
94
+ - features/optimization.feature
95
+ - features/relative_path.feature
96
+ - features/resize.feature
97
+ - features/support/env.rb
98
+ - features/support/middleman_images_steps.rb