jekyll-plugin-gkimagetag 0.1.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
+ SHA256:
3
+ metadata.gz: dcf88c75c5436d9060efed6a34dd20a4f8821e08443bd020cadefec3a72bf152
4
+ data.tar.gz: a8dd487dec48b1f58280c9a5454df60d5a13287b4b43d7722964d629be2f5e5b
5
+ SHA512:
6
+ metadata.gz: a786d26ca1eda843ab1694d8bd2873321ab6819481bc7e447cc8b60d0c5f1143327138eda884767c7504c471503c4a4745310f79e757e346ef7d75b5666096f3
7
+ data.tar.gz: 0a228630bd79b2d3d8172f26bf99e859c796ec360bde2e53dadee827e946f6ef7705794192005f58c0609c2df2f237f11bf92d4ebf89cd3b2563cc91e176299e
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,12 @@
1
+ Copyright (c) 2018 glueckkanja.com
2
+
3
+ The above copyright notice and this permission notice shall be included in
4
+ all copies or substantial portions of the Software.
5
+
6
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
8
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
9
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
10
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
11
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
12
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # jekyll-plugin-gkimagetag
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jekyll-plugin-gkimagetag/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "jekyll-plugin-gkimagetag"
8
+ spec.version = Jekyll::Image::VERSION
9
+ spec.authors = ["@glueckkanja"]
10
+ spec.email = ["info@glueckkanja.com"]
11
+
12
+ spec.summary = "GK Jekyll Image Tag"
13
+ spec.homepage = "https://glueckkanja.com"
14
+ spec.license = "Nonstandard"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_dependency 'jekyll', '~> 3.7'
20
+ spec.add_dependency 'fastimage', '~> 2.1'
21
+ spec.add_dependency 'mini_magick', '~> 4.8'
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.12"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ end
@@ -0,0 +1,224 @@
1
+ # Title: Jekyll Image Tag // changed by GK
2
+ # Downloaded 2018-01-18 last changed Rob Wierzbowski committed on Nov 22, 2014
3
+ # Original Authors: Rob Wierzbowski : @robwierzbowski
4
+ #
5
+ # Description: Better images for Jekyll.
6
+ #
7
+ # Download: https://github.com/robwierzbowski/jekyll-image-tag
8
+ # Documentation: https://github.com/robwierzbowski/jekyll-image-tag/readme.md
9
+ # Issues: https://github.com/robwierzbowski/jekyll-image-tag/issues
10
+ #
11
+ # Syntax: {% image [preset or WxH] path/to/img.jpg [attr="value"] %}
12
+ # Example: {% image poster.jpg alt="The strange case of Dr. Jekyll" %}
13
+ # {% image gallery poster.jpg alt="The strange case of Dr. Jekyll" class="gal-img" data-selected %}
14
+ # {% image 350xAUTO poster.jpg alt="The strange case of Dr. Jekyll" class="gal-img" data-selected %}
15
+ #
16
+ # See the documentation for full configuration and usage instructions.
17
+
18
+ require 'fileutils'
19
+ require 'pathname'
20
+ require 'digest/md5'
21
+ require 'mini_magick'
22
+ require 'fastimage'
23
+
24
+ module Jekyll
25
+
26
+ class Image < Liquid::Tag
27
+
28
+ def initialize(tag_name, markup, tokens)
29
+ @markup = markup
30
+ super
31
+ end
32
+
33
+ def render(context)
34
+
35
+ # Render any liquid variables in tag arguments and unescape template code
36
+ render_markup = Liquid::Template.parse(@markup).render(context).gsub(/\\\{\\\{|\\\{\\%/, '\{\{' => '{{', '\{\%' => '{%')
37
+
38
+ warn "Info (Image-Tag): ".yellow + "" + render_markup.to_s
39
+
40
+ # Gather settings
41
+ site = context.registers[:site]
42
+ debug = site.config['debug']
43
+ settings = site.config['image']
44
+ markup = /^(?:(?<preset>[^\s.:\/]+)\s+)?(?<image_src>[^\s]+\.[a-zA-Z0-9]{3,4})\s*(?<html_attr>[\s\S]+)?$/.match(render_markup)
45
+ preset = settings['presets'][ markup[:preset] ]
46
+
47
+ raise "Image Tag can't read this tag. Try {% image [preset or WxH] path/to/img.jpg [attr=\"value\"] %}." unless markup
48
+
49
+ # Assign defaults
50
+ settings['source'] ||= '.'
51
+ settings['output'] ||= 'generated'
52
+
53
+ # Prevent Jekyll from erasing our generated files
54
+ site.config['keep_files'] << settings['output'] unless site.config['keep_files'].include?(settings['output'])
55
+
56
+ # Process instance
57
+ instance = if preset
58
+ {
59
+ :width => preset['width'],
60
+ :height => preset['height'],
61
+ :src => markup[:image_src]
62
+ }
63
+ elsif dim = /^(?:(?<width>\d+)|auto)(?:x)(?:(?<height>\d+)|auto)$/i.match(markup[:preset])
64
+ {
65
+ :width => dim['width'],
66
+ :height => dim['height'],
67
+ :src => markup[:image_src]
68
+ }
69
+ else
70
+ { :src => markup[:image_src] }
71
+ end
72
+
73
+ # Process html attributes
74
+ html_attr = if markup[:html_attr]
75
+ Hash[ *markup[:html_attr].scan(/(?<attr>[^\s="]+)(?:="(?<value>[^"]+)")?\s?/).flatten ]
76
+ else
77
+ {}
78
+ end
79
+
80
+ if preset && preset['attr']
81
+ html_attr = preset['attr'].merge(html_attr)
82
+ end
83
+
84
+ html_attr_string = html_attr.inject('') { |string, attrs|
85
+ if attrs[1]
86
+ string << "#{attrs[0]}=\"#{attrs[1]}\" "
87
+ else
88
+ string << "#{attrs[0]} "
89
+ end
90
+ }
91
+
92
+ # Raise some exceptions before we start expensive processing
93
+ raise "Image Tag can't find the \"#{markup[:preset]}\" preset. Check image: presets in _config.yml for a list of presets." unless preset || dim || markup[:preset].nil?
94
+
95
+ # Generate resized images
96
+ generated_src = generate_image(instance, site.source, site.dest, settings['source'], settings['output'], debug)
97
+ unless generated_src
98
+ return
99
+ end
100
+ # Generate resized images 2x
101
+ generated2x_src = File.join(generated_src.dirname.to_s + "/" + File.basename(generated_src, ".*") + "@2x" + generated_src.extname)
102
+
103
+ warn "Info (Image-Tag): ".yellow + "" + generated_src.to_s.green + "\n | ".yellow + generated2x_src.to_s.blue if debug
104
+
105
+ generated_src = File.join(site.baseurl, generated_src) unless site.baseurl.empty?
106
+ generated2x_src = File.join(site.baseurl, generated2x_src) unless site.baseurl.empty?
107
+
108
+ markup_width = if instance[:width]
109
+ "width=\"#{instance[:width]}\""
110
+ end
111
+ # Return the markup!
112
+ "<img src=\"#{generated_src}\" srcset=\"#{generated_src} 1x, #{generated2x_src} 2x\" #{markup_width} #{html_attr_string}>"
113
+ end
114
+
115
+ def generate_image(instance, site_source, site_dest, image_source, image_dest, debug)
116
+
117
+ MiniMagick.configure do |config|
118
+ config.whiny = false
119
+ end
120
+ image_source_path = File.join(site_source, image_source, instance[:src])
121
+ unless File.exists?image_source_path
122
+ puts "Missing: #{image_source_path}"
123
+ return false
124
+ end
125
+
126
+ image = MiniMagick::Image.open(image_source_path)
127
+ digest = Digest::MD5.hexdigest(image.to_blob).slice!(0..5)
128
+
129
+ image_dir = File.dirname(instance[:src])
130
+ ext = File.extname(instance[:src])
131
+ basename = File.basename(instance[:src], ext)
132
+
133
+ orig_width = image[:width].to_f
134
+ orig_height = image[:height].to_f
135
+ orig_ratio = orig_width/orig_height
136
+
137
+ gen_width = if instance[:width]
138
+ instance[:width].to_f * 2
139
+ elsif instance[:height]
140
+ orig_ratio * instance[:height].to_f * 2
141
+ else
142
+ orig_width
143
+ end
144
+ gen_height = if instance[:height]
145
+ instance[:height].to_f * 2
146
+ elsif instance[:width]
147
+ instance[:width].to_f / orig_ratio * 2
148
+ else
149
+ orig_height
150
+ end
151
+ gen_ratio = gen_width/gen_height
152
+
153
+ # Don't allow upscaling. If the image is smaller than the requested dimensions, recalculate.
154
+ if orig_width < gen_width || orig_height < gen_height
155
+ undersize = true
156
+ gen_width = if orig_ratio < gen_ratio then orig_width else orig_height * gen_ratio end
157
+ gen_height = if orig_ratio > gen_ratio then orig_height else orig_width/gen_ratio end
158
+ end
159
+
160
+ #2x
161
+ gen_name = "#{basename}-#{gen_width.round}x#{gen_height.round}-#{digest}@2x#{ext}"
162
+ gen_dest_dir = File.join(site_dest, image_dest, image_dir)
163
+ gen_dest_file = File.join(gen_dest_dir, gen_name)
164
+
165
+ # Generate resized files
166
+ unless File.exists?(gen_dest_file)
167
+
168
+ warn "Warning:".yellow + " #{instance[:src]} is smaller than the requested output file. It will be resized without upscaling." if undersize
169
+
170
+ # If the destination directory doesn't exist, create it
171
+ FileUtils.mkdir_p(gen_dest_dir) unless File.exist?(gen_dest_dir)
172
+
173
+ # Let people know their images are being generated
174
+ puts "Generating #{gen_name}" if !debug
175
+
176
+ # Scale and crop
177
+ image.combine_options do |i|
178
+ i.resize "#{gen_width}x#{gen_height}^"
179
+ i.gravity "center"
180
+ i.crop "#{gen_width}x#{gen_height}+0+0"
181
+ #i.layers "Optimize"
182
+ end
183
+
184
+ image.write gen_dest_file
185
+ end
186
+
187
+ #1x
188
+ gen_name = "#{basename}-#{gen_width.round}x#{gen_height.round}-#{digest}#{ext}"
189
+ gen_dest_dir = File.join(site_dest, image_dest, image_dir)
190
+ gen_dest_file = File.join(gen_dest_dir, gen_name)
191
+
192
+ gen_width = gen_width / 2
193
+ gen_height = gen_height / 2
194
+
195
+ # Generate resized files
196
+ unless File.exists?(gen_dest_file)
197
+
198
+ warn "Warning:".yellow + " #{instance[:src]} is smaller than the requested output file. It will be resized without upscaling." if undersize
199
+
200
+ # If the destination directory doesn't exist, create it
201
+ FileUtils.mkdir_p(gen_dest_dir) unless File.exist?(gen_dest_dir)
202
+
203
+ # Let people know their images are being generated
204
+ puts "Generating #{gen_name}" if !debug
205
+
206
+ # Scale and crop
207
+ image.combine_options do |i|
208
+ i.resize "#{gen_width}x#{gen_height}^"
209
+ i.gravity "center"
210
+ i.crop "#{gen_width}x#{gen_height}+0+0"
211
+ #i.layers "Optimize"
212
+ end
213
+
214
+ image.write gen_dest_file
215
+ end
216
+
217
+ # Return path relative to the site root for html
218
+ Pathname.new(File.join('/', image_dest, image_dir, gen_name)).cleanpath
219
+ end
220
+
221
+ end
222
+ end
223
+
224
+ Liquid::Template.register_tag('image', Jekyll::Image)
@@ -0,0 +1,6 @@
1
+ module Jekyll
2
+ module Image
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
6
+
data/screenshot.png ADDED
Binary file
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-plugin-gkimagetag
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - "@glueckkanja"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-02-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: fastimage
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mini_magick
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.8'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.12'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.12'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ description:
84
+ email:
85
+ - info@glueckkanja.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - Gemfile
91
+ - LICENSE.txt
92
+ - README.md
93
+ - Rakefile
94
+ - jekyll-plugin-gkimagetag.gemspec
95
+ - lib/jekyll-plugin-gkimagetag.rb
96
+ - lib/jekyll-plugin-gkimagetag/version.rb
97
+ - screenshot.png
98
+ homepage: https://glueckkanja.com
99
+ licenses:
100
+ - Nonstandard
101
+ metadata: {}
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 2.7.2
119
+ signing_key:
120
+ specification_version: 4
121
+ summary: GK Jekyll Image Tag
122
+ test_files: []