middleman-images 0.1.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.
@@ -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