jekyll_pig 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jekyll_pig.rb +270 -269
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2fde6bb62e619909125906add217fe087f2e24668c340797dca8f3ce15787147
4
- data.tar.gz: 7fe81995ba545a52cfceb8354a9930a553327ad5eb1c16a336aeba2268ff891c
3
+ metadata.gz: f45a05b71296a3fa8faca731001efdd56b78929bb0c2ec8df0c3749bab9835e3
4
+ data.tar.gz: aa32d34750210ab22a393521b6a5d3c1f2926a9e6794747fd82657f1c1a80f6d
5
5
  SHA512:
6
- metadata.gz: 7e67b67216c2c160f1f5eaec07240ec83d2e5c24022b5c0e47b3a8f84732293c66541ed095cf75457ca231fe46a3cae53c3ede2b579e47e984f01c5f36599109
7
- data.tar.gz: c4e4d1c647920672b58109288c62d43c2f90dff97aa4adc7a4fc271a77b713e4f55c3eb29d84a40692bf0808d75933503b9dd61006bd701b6bfd9999908e3ea6
6
+ metadata.gz: 4e74f692c38d7c7c5e0eababda87a7827f91fcc2a904859165071f2f4bfb19f373da9b89b474f85be412060cd561e12c4a070d7c6a892231dbfb544bf22e22b9
7
+ data.tar.gz: 9e5994fd8a588c44349cd39057f9828d77589e1231a9367d9eb4414b4830da863852fc3691a4d86f0cc47a9ecaa0966ed1c4fb62246cf1a56ca13f6ed1c9332e
data/lib/jekyll_pig.rb CHANGED
@@ -1,269 +1,270 @@
1
-
2
- #install ImageMagick
3
- #add gem "mini_magick" to your site's Gemfile
4
- #run gem install mini_magick
5
- #add <site source>/gallery folder with images
6
- #use {% include gallery.html %} anywhere you want the gallery to appear
7
- #add gallery.rb to your site's _plugins folder
8
- #run jekyll build
9
-
10
- require 'fileutils'
11
- require 'json'
12
- require 'mini_magick'
13
-
14
- module JekyllPig
15
-
16
- class SourceGallery
17
- def initialize(path, name)
18
- @path = path
19
- @name = name
20
- end
21
- def to_s
22
- "gallery #{@name} at #{@path}"
23
- end
24
- def path
25
- @path
26
- end
27
- def name
28
- @name
29
- end
30
- end
31
-
32
- class JekyllPig < Jekyll::Generator
33
-
34
- @@image_cache = {}
35
-
36
- @@pig_min_js = '!function(t){"use strict";var i,e,s=(e=!(i=[]),{add:function(t){i.length||window.addEventListener("resize",n),i.push(t)},disable:function(){window.removeEventListener("resize",n)},reEnable:function(){window.addEventListener("resize",n)}});function n(){e||(e=!0,window.requestAnimationFrame?window.requestAnimationFrame(o):setTimeout(o,66))}function o(){i.forEach(function(t){t()}),e=!1}function a(t,i){return this.inRAF=!1,this.isTransitioning=!1,this.minAspectRatioRequiresTransition=!1,this.minAspectRatio=null,this.latestYOffset=0,this.lastWindowWidth=window.innerWidth,this.scrollDirection="down",this.visibleImages=[],this.settings={containerId:"pig",scroller:window,classPrefix:"pig",figureTagName:"figure",spaceBetweenImages:8,transitionSpeed:500,primaryImageBufferHeight:1e3,secondaryImageBufferHeight:300,thumbnailSize:20,urlForSize:function(t,i){return"/img/"+i+"/"+t},onClickHandler:function(t){},getMinAspectRatio:function(t){return t<=640?2:t<=1280?4:t<=1920?5:6},getImageSize:function(t){return t<=640?100:t<=1920?250:500}},function(t,i){for(var e in i)i.hasOwnProperty(e)&&(t[e]=i[e])}(this.settings,i||{}),this.container=document.getElementById(this.settings.containerId),this.container||console.error("Could not find element with ID "+this.settings.containerId),this.scroller=this.settings.scroller,this.images=this._parseImageData(t),function(t,i,e){var s="#"+t+" { position: relative;}."+i+"-figure { background-color: #D5D5D5; overflow: hidden; left: 0; position: absolute; top: 0; margin: 0;}."+i+"-figure img { left: 0; position: absolute; top: 0; height: 100%; width: 100%; opacity: 0; transition: "+e/1e3+"s ease opacity; -webkit-transition: "+e/1e3+"s ease opacity;}."+i+"-figure img."+i+"-thumbnail { -webkit-filter: blur(30px); filter: blur(30px); left: auto; position: relative; width: auto;}."+i+"-figure img."+i+"-loaded { opacity: 1;}",n=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",o.styleSheet?o.styleSheet.cssText=s:o.appendChild(document.createTextNode(s)),n.appendChild(o)}(this.settings.containerId,this.settings.classPrefix,this.settings.transitionSpeed),this}function r(t,i,e){return this.existsOnPage=!1,this.aspectRatio=t.aspectRatio,this.filename=t.filename,this.index=i,this.pig=e,this.classNames={figure:e.settings.classPrefix+"-figure",thumbnail:e.settings.classPrefix+"-thumbnail",loaded:e.settings.classPrefix+"-loaded"},this}a.prototype._getTransitionTimeout=function(){return 1.5*this.settings.transitionSpeed},a.prototype._getTransitionString=function(){return this.isTransitioning?this.settings.transitionSpeed/1e3+"s transform ease":"none"},a.prototype._recomputeMinAspectRatio=function(){var t=this.minAspectRatio;this.minAspectRatio=this.settings.getMinAspectRatio(this.lastWindowWidth),null!==t&&t!==this.minAspectRatio?this.minAspectRatioRequiresTransition=!0:this.minAspectRatioRequiresTransition=!1},a.prototype._parseImageData=function(t){var s=[];return t.forEach(function(t,i){var e=new r(t,i,this);s.push(e)}.bind(this)),s},a.prototype._computeLayout=function(){var s=parseInt(this.container.clientWidth),n=[],o=0,a=0,r=0;this._recomputeMinAspectRatio(),!this.isTransitioning&&this.minAspectRatioRequiresTransition&&(this.isTransitioning=!0,setTimeout(function(){this.isTransitioning=!1},this._getTransitionTimeout()));var h=this._getTransitionString();[].forEach.call(this.images,function(t,i){if(r+=parseFloat(t.aspectRatio),n.push(t),r>=this.minAspectRatio||i+1===this.images.length){r=Math.max(r,this.minAspectRatio);var e=(s-this.settings.spaceBetweenImages*(n.length-1))/r;n.forEach(function(t){var i=e*t.aspectRatio;t.style={width:parseInt(i),height:parseInt(e),translateX:o,translateY:a,transition:h},o+=i+this.settings.spaceBetweenImages}.bind(this)),n=[],r=0,a+=parseInt(e)+this.settings.spaceBetweenImages,o=0}}.bind(this)),this.totalHeight=a-this.settings.spaceBetweenImages},a.prototype._doLayout=function(){this.container.style.height=this.totalHeight+"px";var t="up"===this.scrollDirection?this.settings.primaryImageBufferHeight:this.settings.secondaryImageBufferHeight,i="down"===this.scrollDirection?this.settings.secondaryImageBufferHeight:this.settings.primaryImageBufferHeight,e=function(t){for(var i=0;isNaN(t.offsetTop)||(i+=t.offsetTop),t=t.offsetParent;);return i}(this.container),s=this.scroller===window?window.innerHeight:this.scroller.offsetHeight,n=this.latestYOffset-e-t,o=this.latestYOffset-e+s+i;this.images.forEach(function(t){t.style.translateY+t.style.height<n||t.style.translateY>o?t.hide():t.load()}.bind(this))},a.prototype._getOnScroll=function(){var i=this;return function(){var t=i.scroller===window?window.pageYOffset:i.scroller.scrollTop;i.previousYOffset=i.latestYOffset||t,i.latestYOffset=t,i.scrollDirection=i.latestYOffset>i.previousYOffset?"down":"up",i.inRAF||(i.inRAF=!0,window.requestAnimationFrame(function(){i._doLayout(),i.inRAF=!1}))}},a.prototype.enable=function(){return this.onScroll=this._getOnScroll(),this.scroller.addEventListener("scroll",this.onScroll),this.onScroll(),this._computeLayout(),this._doLayout(),s.add(function(){this.lastWindowWidth=this.scroller===window?window.innerWidth:this.scroller.offsetWidth,this._computeLayout(),this._doLayout()}.bind(this)),this},a.prototype.disable=function(){return this.scroller.removeEventListener("scroll",this.onScroll),s.disable(),this},r.prototype.load=function(){this.existsOnPage=!0,this._updateStyles(),this.pig.container.appendChild(this.getElement()),setTimeout(function(){this.existsOnPage&&(this.thumbnail||(this.thumbnail=new Image,this.thumbnail.src=this.pig.settings.urlForSize(this.filename,this.pig.settings.thumbnailSize),this.thumbnail.className=this.classNames.thumbnail,this.thumbnail.onload=function(){this.thumbnail&&(this.thumbnail.className+=" "+this.classNames.loaded)}.bind(this),this.getElement().appendChild(this.thumbnail)),this.fullImage||(this.fullImage=new Image,this.fullImage.src=this.pig.settings.urlForSize(this.filename,this.pig.settings.getImageSize(this.pig.lastWindowWidth)),this.fullImage.onload=function(){this.fullImage&&(this.fullImage.className+=" "+this.classNames.loaded)}.bind(this),this.getElement().appendChild(this.fullImage)))}.bind(this),100)},r.prototype.hide=function(){this.getElement()&&(this.thumbnail&&(this.thumbnail.src="",this.getElement().removeChild(this.thumbnail),delete this.thumbnail),this.fullImage&&(this.fullImage.src="",this.getElement().removeChild(this.fullImage),delete this.fullImage)),this.existsOnPage&&this.pig.container.removeChild(this.getElement()),this.existsOnPage=!1},r.prototype.getElement=function(){return this.element||(this.element=document.createElement(this.pig.settings.figureTagName),this.element.className=this.classNames.figure,this.element.addEventListener("click",function(){this.pig.settings.onClickHandler(this.filename)}.bind(this)),this._updateStyles()),this.element},r.prototype._updateStyles=function(){this.getElement().style.transition=this.style.transition,this.getElement().style.width=this.style.width+"px",this.getElement().style.height=this.style.height+"px",this.getElement().style.transform="translate3d("+this.style.translateX+"px,"+this.style.translateY+"px, 0)"},"function"==typeof define&&define.amd?define([],function(){return a}):"undefined"!=typeof module&&module.exports?module.exports=a:t.Pig=a}("undefined"!=typeof window?window:this);'
37
-
38
- def full_size_html(gallery_name, name, date, prev_url, next_url)
39
- "---\n" \
40
- "layout: post\n" \
41
- "title: #{name}\n" \
42
- "date: #{date.strftime("%Y-%m-%d %H:%M:%S")}\n" \
43
- "permalink: /assets/html/#{gallery_name}/#{name}.html\n" \
44
- "exclude: true\n" \
45
- "---\n" \
46
- "<div><a href=\"#{prev_url}\" style=\"display:inline;\">prev</a><a href=\"#{next_url}\" style=\"display:inline; float:right\">next</a></div>\n" \
47
- "<img src=\"{{site.baseurl}}/assets/img/#{gallery_name}/1024/#{name}\"/>\n"
48
- end
49
-
50
- def gallery_html(id, image_data)
51
- "<div id='#{id}_pig'></div>\n" \
52
- "<script src='{{site.baseurl}}/assets/js/pig.min.js'></script>\n" \
53
- "<script>\n" \
54
- "var #{id}_pig = new Pig(\n" \
55
- " #{image_data.to_json()},\n" \
56
- " {\n" \
57
- " containerId: '#{id}_pig',\n" \
58
- " classPrefix: '#{id}_pig',\n" \
59
- " urlForSize: function(filename, size) {\n" \
60
- " return '{{site.baseurl}}/assets/img/#{id}/' + size + '/' + filename;\n" \
61
- " },\n" \
62
- " onClickHandler: function(filename) {\n" \
63
- " window.location.href = '{{site.baseurl}}/assets/html/#{id}/' + filename + '.html';\n" \
64
- " }\n" \
65
- " }\n" \
66
- ").enable();\n" \
67
- "</script>"
68
- end
69
-
70
- def image_html_url(gallery_name, image_name)
71
- "/assets/html/#{gallery_name}/#{image_name}.html"
72
- end
73
-
74
- #read the image data from the _includes folder
75
- def get_image_data(gallery_name)
76
- image_data = []
77
- #read image_data if existing
78
- if File.exists?(File.join(@data_path, "#{gallery_name}.json"))
79
- File.open(File.join(@data_path, "#{gallery_name}.json"), 'r') { |file|
80
- #get array of image data (drop 'var imageData = ' and ';')
81
- image_data = JSON.parse(file.read)
82
- }
83
- end
84
- image_data
85
- end
86
-
87
- #read images that require processing from gallery
88
- def get_images(gallery_path)
89
- patterns = ['*.jpg', '*.jpeg', '*.png'].map { |ext| File.join(gallery_path, ext) }
90
- Dir.glob(patterns).map { |path| File.basename(path) }
91
- end
92
-
93
- def get_image(gallery_path, image_name)
94
- image = @@image_cache[File.join(gallery_path, image_name)]
95
- if image == nil
96
- image = MiniMagick::Image.open(File.join(gallery_path, image_name))
97
- @@image_cache[File.join(gallery_path, image_name)] = image
98
- end
99
- image
100
- end
101
-
102
- def get_image_date(gallery_path, image_name)
103
- image_date = nil
104
- begin
105
- image = get_image(gallery_path, image_name)
106
- exif_date = image.exif['DateTimeOriginal']
107
- if exif_date == nil
108
- #no exif date, try to get from file name
109
- image_date = Time.strptime(image_name, "%Y-%m-%d")
110
- else
111
- #try to get the image date from exif
112
- image_date = Time.strptime(exif_date, "%Y:%m:%d %H:%M:%S")
113
- end
114
- rescue
115
- #get the date from file if possible
116
- image_date = File.mtime(File.join(gallery_path, image_name))
117
- end
118
- image_date
119
- end
120
-
121
- def get_previous_url(image_data, gallery_name, image_name)
122
- index = image_data.index { |data| data['filename'] == image_name }
123
- index = index - 1
124
- if index < 0
125
- index = image_data.length - 1
126
- end
127
- image_html_url(gallery_name, image_data[index]['filename'])
128
- end
129
-
130
- def get_next_url(image_data, gallery_name, image_name)
131
- index = image_data.index { |data| data['filename'] == image_name }
132
- index = index + 1
133
- if index >= image_data.length
134
- index = 0
135
- end
136
- image_html_url(gallery_name, image_data[index]['filename'])
137
- end
138
-
139
- #create thumbnails and fullsize image assets, and create full size html page for a given image
140
- def process_image(image_data, gallery_id, gallery_path, image_name)
141
- #puts "jekyll-pig: processing " << image_name
142
- #create thumbs
143
- [1024, 500, 250, 100, 20].each { |size|
144
- size_out_path = File.join(@img_path, gallery_id, size.to_s)
145
- resized_img_path = File.join(size_out_path, image_name)
146
- if not File.exists? resized_img_path
147
- image = get_image(gallery_path, image_name)
148
- image.resize("x" + size.to_s)
149
- FileUtils.mkdir_p size_out_path unless File.exists? size_out_path
150
- image.write(resized_img_path)
151
- end
152
- }
153
- full_size_html_path = File.join(@html_path, gallery_id, image_name + ".html")
154
- #create full size html if it doesn't exist
155
- if not File.exists? full_size_html_path
156
- #get image date
157
- image_date = get_image_date(gallery_path, image_name)
158
- #create full size html text
159
- full_size_html = full_size_html(gallery_id, image_name, image_date,
160
- get_previous_url(image_data, gallery_id, image_name),
161
- get_next_url(image_data, gallery_id, image_name))
162
- File.open(full_size_html_path, 'w') { |file|
163
- file.write(full_size_html)
164
- }
165
- end
166
- end
167
-
168
- def get_paths
169
- @assets_path = File.join(@site.source, "assets")
170
- @js_path = File.join(@assets_path, "js")
171
- @data_path = File.join(@site.source, "_data")
172
- @img_path = File.join(@assets_path, "img")
173
- @html_path = File.join(@assets_path, "html")
174
- @includes_path = File.join(@site.source, "_includes")
175
- end
176
-
177
- def get_galleries
178
- galleries = []
179
- config_galleries = Jekyll.configuration({})['galleries']
180
- if config_galleries != nil
181
- config_galleries.each do |gallery|
182
- full_path = File.join(@site.source, gallery['path'])
183
- if File.directory?(full_path)
184
- galleries << SourceGallery.new(full_path, gallery['name'])
185
- end
186
- end
187
- else
188
- default_gallery_path = File.join(@site.source, 'gallery')
189
- if File.directory?(default_gallery_path)
190
- galleries << SourceGallery.new(default_gallery_path, 'gallery')
191
- end
192
- end
193
- galleries
194
- end
195
-
196
- def make_output_paths
197
- FileUtils.mkdir_p @assets_path unless File.exists? @assets_path
198
- FileUtils.mkdir_p @js_path unless File.exists? @js_path
199
- FileUtils.mkdir_p @img_path unless File.exists? @img_path
200
- FileUtils.mkdir_p @html_path unless File.exists? @html_path
201
- FileUtils.mkdir_p @includes_path unless File.exists? @includes_path
202
- end
203
-
204
- def augment_image_data(gallery, image_data, images)
205
- images.each do |image_name|
206
- #append data to image_data array if it's not already there
207
- if not image_data.any? { |data| data['filename'] == image_name }
208
- #get image date
209
- image_date = get_image_date(gallery.path, image_name)
210
- image = get_image(gallery.path, image_name)
211
- image_data <<
212
- {
213
- 'datetime' => image_date.to_s,
214
- 'filename' => image_name,
215
- 'aspectRatio' => image.width.to_f / image.height
216
- }
217
- end
218
- end
219
- end
220
-
221
- def generate(site)
222
- @site = site
223
- get_paths()
224
- make_output_paths()
225
- galleries = get_galleries()
226
- galleries.each do |gallery|
227
-
228
- #make gallery specific html and image output paths
229
- html_output_path = File.join(@html_path, gallery.name)
230
- FileUtils.mkdir_p html_output_path unless File.exists? html_output_path
231
- img_output_path = File.join(@img_path, gallery.name)
232
- FileUtils.mkdir_p img_output_path unless File.exists? img_output_path
233
-
234
- #write pig.min.js to js path
235
- if not File.exists? File.join(@js_path, 'pig.min.js')
236
- File.open(File.join(@js_path, 'pig.min.js'), 'w') { |file| file.write(@@pig_min_js) }
237
- end
238
-
239
- #get image data from _data
240
- image_data = get_image_data(gallery.name)
241
-
242
- #get images from gallery
243
- images = get_images(gallery.path)
244
-
245
- #add any additional images to image_data
246
- augment_image_data(gallery, image_data, images)
247
-
248
- #sort image data
249
- image_data = image_data.sort_by { |data| data['datetime'] }
250
-
251
- #process images
252
- images.each do |image_name|
253
- #create thumbs, full size, and html assets for each image
254
- process_image(image_data, gallery.name, gallery.path, image_name)
255
- end
256
-
257
- #write image_data
258
- File.open(File.join(@data_path, "#{gallery.name}.json"), 'w') { |file|
259
- file.write(image_data.to_json)
260
- }
261
-
262
- #save this gallery's includable content
263
- File.open(File.join(@includes_path, "#{gallery.name}.html"), 'w') { |file|
264
- file.write(gallery_html(gallery.name, image_data))
265
- }
266
- end
267
- end
268
- end
269
- end
1
+
2
+ #install ImageMagick
3
+ #add gem "mini_magick" to your site's Gemfile
4
+ #run gem install mini_magick
5
+ #add <site source>/gallery folder with images
6
+ #use {% include gallery.html %} anywhere you want the gallery to appear
7
+ #add gallery.rb to your site's _plugins folder
8
+ #run jekyll build
9
+
10
+ require 'fileutils'
11
+ require 'json'
12
+ require 'mini_magick'
13
+
14
+ module JekyllPig
15
+
16
+ class SourceGallery
17
+ def initialize(path, name)
18
+ @path = path
19
+ @name = name
20
+ end
21
+ def to_s
22
+ "gallery #{@name} at #{@path}"
23
+ end
24
+ def path
25
+ @path
26
+ end
27
+ def name
28
+ @name
29
+ end
30
+ end
31
+
32
+ class JekyllPig < Jekyll::Generator
33
+
34
+ @@image_cache = {}
35
+
36
+ @@pig_min_js = '!function(t){"use strict";var i,e,s=(e=!(i=[]),{add:function(t){i.length||window.addEventListener("resize",n),i.push(t)},disable:function(){window.removeEventListener("resize",n)},reEnable:function(){window.addEventListener("resize",n)}});function n(){e||(e=!0,window.requestAnimationFrame?window.requestAnimationFrame(o):setTimeout(o,66))}function o(){i.forEach(function(t){t()}),e=!1}function a(t,i){return this.inRAF=!1,this.isTransitioning=!1,this.minAspectRatioRequiresTransition=!1,this.minAspectRatio=null,this.latestYOffset=0,this.lastWindowWidth=window.innerWidth,this.scrollDirection="down",this.visibleImages=[],this.settings={containerId:"pig",scroller:window,classPrefix:"pig",figureTagName:"figure",spaceBetweenImages:8,transitionSpeed:500,primaryImageBufferHeight:1e3,secondaryImageBufferHeight:300,thumbnailSize:20,urlForSize:function(t,i){return"/img/"+i+"/"+t},onClickHandler:function(t){},getMinAspectRatio:function(t){return t<=640?2:t<=1280?4:t<=1920?5:6},getImageSize:function(t){return t<=640?100:t<=1920?250:500}},function(t,i){for(var e in i)i.hasOwnProperty(e)&&(t[e]=i[e])}(this.settings,i||{}),this.container=document.getElementById(this.settings.containerId),this.container||console.error("Could not find element with ID "+this.settings.containerId),this.scroller=this.settings.scroller,this.images=this._parseImageData(t),function(t,i,e){var s="#"+t+" { position: relative;}."+i+"-figure { background-color: #D5D5D5; overflow: hidden; left: 0; position: absolute; top: 0; margin: 0;}."+i+"-figure img { left: 0; position: absolute; top: 0; height: 100%; width: 100%; opacity: 0; transition: "+e/1e3+"s ease opacity; -webkit-transition: "+e/1e3+"s ease opacity;}."+i+"-figure img."+i+"-thumbnail { -webkit-filter: blur(30px); filter: blur(30px); left: auto; position: relative; width: auto;}."+i+"-figure img."+i+"-loaded { opacity: 1;}",n=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",o.styleSheet?o.styleSheet.cssText=s:o.appendChild(document.createTextNode(s)),n.appendChild(o)}(this.settings.containerId,this.settings.classPrefix,this.settings.transitionSpeed),this}function r(t,i,e){return this.existsOnPage=!1,this.aspectRatio=t.aspectRatio,this.filename=t.filename,this.index=i,this.pig=e,this.classNames={figure:e.settings.classPrefix+"-figure",thumbnail:e.settings.classPrefix+"-thumbnail",loaded:e.settings.classPrefix+"-loaded"},this}a.prototype._getTransitionTimeout=function(){return 1.5*this.settings.transitionSpeed},a.prototype._getTransitionString=function(){return this.isTransitioning?this.settings.transitionSpeed/1e3+"s transform ease":"none"},a.prototype._recomputeMinAspectRatio=function(){var t=this.minAspectRatio;this.minAspectRatio=this.settings.getMinAspectRatio(this.lastWindowWidth),null!==t&&t!==this.minAspectRatio?this.minAspectRatioRequiresTransition=!0:this.minAspectRatioRequiresTransition=!1},a.prototype._parseImageData=function(t){var s=[];return t.forEach(function(t,i){var e=new r(t,i,this);s.push(e)}.bind(this)),s},a.prototype._computeLayout=function(){var s=parseInt(this.container.clientWidth),n=[],o=0,a=0,r=0;this._recomputeMinAspectRatio(),!this.isTransitioning&&this.minAspectRatioRequiresTransition&&(this.isTransitioning=!0,setTimeout(function(){this.isTransitioning=!1},this._getTransitionTimeout()));var h=this._getTransitionString();[].forEach.call(this.images,function(t,i){if(r+=parseFloat(t.aspectRatio),n.push(t),r>=this.minAspectRatio||i+1===this.images.length){r=Math.max(r,this.minAspectRatio);var e=(s-this.settings.spaceBetweenImages*(n.length-1))/r;n.forEach(function(t){var i=e*t.aspectRatio;t.style={width:parseInt(i),height:parseInt(e),translateX:o,translateY:a,transition:h},o+=i+this.settings.spaceBetweenImages}.bind(this)),n=[],r=0,a+=parseInt(e)+this.settings.spaceBetweenImages,o=0}}.bind(this)),this.totalHeight=a-this.settings.spaceBetweenImages},a.prototype._doLayout=function(){this.container.style.height=this.totalHeight+"px";var t="up"===this.scrollDirection?this.settings.primaryImageBufferHeight:this.settings.secondaryImageBufferHeight,i="down"===this.scrollDirection?this.settings.secondaryImageBufferHeight:this.settings.primaryImageBufferHeight,e=function(t){for(var i=0;isNaN(t.offsetTop)||(i+=t.offsetTop),t=t.offsetParent;);return i}(this.container),s=this.scroller===window?window.innerHeight:this.scroller.offsetHeight,n=this.latestYOffset-e-t,o=this.latestYOffset-e+s+i;this.images.forEach(function(t){t.style.translateY+t.style.height<n||t.style.translateY>o?t.hide():t.load()}.bind(this))},a.prototype._getOnScroll=function(){var i=this;return function(){var t=i.scroller===window?window.pageYOffset:i.scroller.scrollTop;i.previousYOffset=i.latestYOffset||t,i.latestYOffset=t,i.scrollDirection=i.latestYOffset>i.previousYOffset?"down":"up",i.inRAF||(i.inRAF=!0,window.requestAnimationFrame(function(){i._doLayout(),i.inRAF=!1}))}},a.prototype.enable=function(){return this.onScroll=this._getOnScroll(),this.scroller.addEventListener("scroll",this.onScroll),this.onScroll(),this._computeLayout(),this._doLayout(),s.add(function(){this.lastWindowWidth=this.scroller===window?window.innerWidth:this.scroller.offsetWidth,this._computeLayout(),this._doLayout()}.bind(this)),this},a.prototype.disable=function(){return this.scroller.removeEventListener("scroll",this.onScroll),s.disable(),this},r.prototype.load=function(){this.existsOnPage=!0,this._updateStyles(),this.pig.container.appendChild(this.getElement()),setTimeout(function(){this.existsOnPage&&(this.thumbnail||(this.thumbnail=new Image,this.thumbnail.src=this.pig.settings.urlForSize(this.filename,this.pig.settings.thumbnailSize),this.thumbnail.className=this.classNames.thumbnail,this.thumbnail.onload=function(){this.thumbnail&&(this.thumbnail.className+=" "+this.classNames.loaded)}.bind(this),this.getElement().appendChild(this.thumbnail)),this.fullImage||(this.fullImage=new Image,this.fullImage.src=this.pig.settings.urlForSize(this.filename,this.pig.settings.getImageSize(this.pig.lastWindowWidth)),this.fullImage.onload=function(){this.fullImage&&(this.fullImage.className+=" "+this.classNames.loaded)}.bind(this),this.getElement().appendChild(this.fullImage)))}.bind(this),100)},r.prototype.hide=function(){this.getElement()&&(this.thumbnail&&(this.thumbnail.src="",this.getElement().removeChild(this.thumbnail),delete this.thumbnail),this.fullImage&&(this.fullImage.src="",this.getElement().removeChild(this.fullImage),delete this.fullImage)),this.existsOnPage&&this.pig.container.removeChild(this.getElement()),this.existsOnPage=!1},r.prototype.getElement=function(){return this.element||(this.element=document.createElement(this.pig.settings.figureTagName),this.element.className=this.classNames.figure,this.element.addEventListener("click",function(){this.pig.settings.onClickHandler(this.filename)}.bind(this)),this._updateStyles()),this.element},r.prototype._updateStyles=function(){this.getElement().style.transition=this.style.transition,this.getElement().style.width=this.style.width+"px",this.getElement().style.height=this.style.height+"px",this.getElement().style.transform="translate3d("+this.style.translateX+"px,"+this.style.translateY+"px, 0)"},"function"==typeof define&&define.amd?define([],function(){return a}):"undefined"!=typeof module&&module.exports?module.exports=a:t.Pig=a}("undefined"!=typeof window?window:this);'
37
+
38
+ def full_size_html(gallery_name, name, date, prev_url, next_url)
39
+ "---\n" \
40
+ "layout: post\n" \
41
+ "title: #{name}\n" \
42
+ "date: #{date.strftime("%Y-%m-%d %H:%M:%S")}\n" \
43
+ "permalink: /assets/html/#{gallery_name}/#{name}.html\n" \
44
+ "exclude: true\n" \
45
+ "---\n" \
46
+ "<div><a href=\"#{prev_url}\" style=\"display:inline;\">prev</a><a href=\"#{next_url}\" style=\"display:inline; float:right\">next</a></div>\n" \
47
+ "<img src=\"{{site.baseurl}}/assets/img/#{gallery_name}/1024/#{name}\"/>\n"
48
+ end
49
+
50
+ def gallery_html(id, image_data)
51
+ "<div id='#{id}_pig'></div>\n" \
52
+ "<script src='{{site.baseurl}}/assets/js/pig.min.js'></script>\n" \
53
+ "<script>\n" \
54
+ "var #{id}_pig = new Pig(\n" \
55
+ " #{image_data.to_json()},\n" \
56
+ " {\n" \
57
+ " containerId: '#{id}_pig',\n" \
58
+ " classPrefix: '#{id}_pig',\n" \
59
+ " urlForSize: function(filename, size) {\n" \
60
+ " return '{{site.baseurl}}/assets/img/#{id}/' + size + '/' + filename;\n" \
61
+ " },\n" \
62
+ " onClickHandler: function(filename) {\n" \
63
+ " window.location.href = '{{site.baseurl}}/assets/html/#{id}/' + filename + '.html';\n" \
64
+ " }\n" \
65
+ " }\n" \
66
+ ").enable();\n" \
67
+ "</script>"
68
+ end
69
+
70
+ def image_html_url(gallery_name, image_name)
71
+ "/assets/html/#{gallery_name}/#{image_name}.html"
72
+ end
73
+
74
+ #read the image data from the _includes folder
75
+ def get_image_data(gallery_name)
76
+ image_data = []
77
+ #read image_data if existing
78
+ if File.exists?(File.join(@data_path, "#{gallery_name}.json"))
79
+ File.open(File.join(@data_path, "#{gallery_name}.json"), 'r') { |file|
80
+ #get array of image data (drop 'var imageData = ' and ';')
81
+ image_data = JSON.parse(file.read)
82
+ }
83
+ end
84
+ image_data
85
+ end
86
+
87
+ #read images that require processing from gallery
88
+ def get_images(gallery_path)
89
+ patterns = ['*.jpg', '*.jpeg', '*.png'].map { |ext| File.join(gallery_path, ext) }
90
+ Dir.glob(patterns).map { |path| File.basename(path) }
91
+ end
92
+
93
+ def get_image(gallery_path, image_name)
94
+ image = @@image_cache[File.join(gallery_path, image_name)]
95
+ if image == nil
96
+ image = MiniMagick::Image.open(File.join(gallery_path, image_name))
97
+ @@image_cache[File.join(gallery_path, image_name)] = image
98
+ end
99
+ image
100
+ end
101
+
102
+ def get_image_date(gallery_path, image_name)
103
+ image_date = nil
104
+ begin
105
+ image = get_image(gallery_path, image_name)
106
+ exif_date = image.exif['DateTimeOriginal']
107
+ if exif_date == nil
108
+ #no exif date, try to get from file name
109
+ image_date = Time.strptime(image_name, "%Y-%m-%d")
110
+ else
111
+ #try to get the image date from exif
112
+ image_date = Time.strptime(exif_date, "%Y:%m:%d %H:%M:%S")
113
+ end
114
+ rescue
115
+ #get the date from file if possible
116
+ image_date = File.mtime(File.join(gallery_path, image_name))
117
+ end
118
+ image_date
119
+ end
120
+
121
+ def get_previous_url(image_data, gallery_name, image_name)
122
+ index = image_data.index { |data| data['filename'] == image_name }
123
+ index = index - 1
124
+ if index < 0
125
+ index = image_data.length - 1
126
+ end
127
+ image_html_url(gallery_name, image_data[index]['filename'])
128
+ end
129
+
130
+ def get_next_url(image_data, gallery_name, image_name)
131
+ index = image_data.index { |data| data['filename'] == image_name }
132
+ index = index + 1
133
+ if index >= image_data.length
134
+ index = 0
135
+ end
136
+ image_html_url(gallery_name, image_data[index]['filename'])
137
+ end
138
+
139
+ #create thumbnails and fullsize image assets, and create full size html page for a given image
140
+ def process_image(image_data, gallery_id, gallery_path, image_name)
141
+ #puts "jekyll-pig: processing " << image_name
142
+ #create thumbs
143
+ [1024, 500, 250, 100, 20].each { |size|
144
+ size_out_path = File.join(@img_path, gallery_id, size.to_s)
145
+ resized_img_path = File.join(size_out_path, image_name)
146
+ if not File.exists? resized_img_path
147
+ image = get_image(gallery_path, image_name)
148
+ image.resize("x" + size.to_s)
149
+ FileUtils.mkdir_p size_out_path unless File.exists? size_out_path
150
+ image.write(resized_img_path)
151
+ end
152
+ }
153
+ full_size_html_path = File.join(@html_path, gallery_id, image_name + ".html")
154
+ #create full size html if it doesn't exist
155
+ if not File.exists? full_size_html_path
156
+ #get image date
157
+ image_date = get_image_date(gallery_path, image_name)
158
+ #create full size html text
159
+ full_size_html = full_size_html(gallery_id, image_name, image_date,
160
+ get_previous_url(image_data, gallery_id, image_name),
161
+ get_next_url(image_data, gallery_id, image_name))
162
+ File.open(full_size_html_path, 'w') { |file|
163
+ file.write(full_size_html)
164
+ }
165
+ end
166
+ end
167
+
168
+ def get_paths
169
+ @assets_path = File.join(@site.source, "assets")
170
+ @js_path = File.join(@assets_path, "js")
171
+ @data_path = File.join(@site.source, "_data")
172
+ @img_path = File.join(@assets_path, "img")
173
+ @html_path = File.join(@assets_path, "html")
174
+ @includes_path = File.join(@site.source, "_includes")
175
+ end
176
+
177
+ def get_galleries
178
+ galleries = []
179
+ config_galleries = Jekyll.configuration({})['galleries']
180
+ if config_galleries != nil
181
+ config_galleries.each do |gallery|
182
+ full_path = File.join(@site.source, gallery['path'])
183
+ if File.directory?(full_path)
184
+ galleries << SourceGallery.new(full_path, gallery['name'])
185
+ end
186
+ end
187
+ else
188
+ default_gallery_path = File.join(@site.source, 'gallery')
189
+ if File.directory?(default_gallery_path)
190
+ galleries << SourceGallery.new(default_gallery_path, 'gallery')
191
+ end
192
+ end
193
+ galleries
194
+ end
195
+
196
+ def make_output_paths
197
+ FileUtils.mkdir_p @assets_path unless File.exists? @assets_path
198
+ FileUtils.mkdir_p @js_path unless File.exists? @js_path
199
+ FileUtils.mkdir_p @img_path unless File.exists? @img_path
200
+ FileUtils.mkdir_p @html_path unless File.exists? @html_path
201
+ FileUtils.mkdir_p @includes_path unless File.exists? @includes_path
202
+ FileUtils.mkdir_p @data_path unless File.exists? @data_path
203
+ end
204
+
205
+ def augment_image_data(gallery, image_data, images)
206
+ images.each do |image_name|
207
+ #append data to image_data array if it's not already there
208
+ if not image_data.any? { |data| data['filename'] == image_name }
209
+ #get image date
210
+ image_date = get_image_date(gallery.path, image_name)
211
+ image = get_image(gallery.path, image_name)
212
+ image_data <<
213
+ {
214
+ 'datetime' => image_date.to_s,
215
+ 'filename' => image_name,
216
+ 'aspectRatio' => image.width.to_f / image.height
217
+ }
218
+ end
219
+ end
220
+ end
221
+
222
+ def generate(site)
223
+ @site = site
224
+ get_paths()
225
+ make_output_paths()
226
+ galleries = get_galleries()
227
+ galleries.each do |gallery|
228
+
229
+ #make gallery specific html and image output paths
230
+ html_output_path = File.join(@html_path, gallery.name)
231
+ FileUtils.mkdir_p html_output_path unless File.exists? html_output_path
232
+ img_output_path = File.join(@img_path, gallery.name)
233
+ FileUtils.mkdir_p img_output_path unless File.exists? img_output_path
234
+
235
+ #write pig.min.js to js path
236
+ if not File.exists? File.join(@js_path, 'pig.min.js')
237
+ File.open(File.join(@js_path, 'pig.min.js'), 'w') { |file| file.write(@@pig_min_js) }
238
+ end
239
+
240
+ #get image data from _data
241
+ image_data = get_image_data(gallery.name)
242
+
243
+ #get images from gallery
244
+ images = get_images(gallery.path)
245
+
246
+ #add any additional images to image_data
247
+ augment_image_data(gallery, image_data, images)
248
+
249
+ #sort image data
250
+ image_data = image_data.sort_by { |data| data['datetime'] }
251
+
252
+ #process images
253
+ images.each do |image_name|
254
+ #create thumbs, full size, and html assets for each image
255
+ process_image(image_data, gallery.name, gallery.path, image_name)
256
+ end
257
+
258
+ #write image_data
259
+ File.open(File.join(@data_path, "#{gallery.name}.json"), 'w') { |file|
260
+ file.write(image_data.to_json)
261
+ }
262
+
263
+ #save this gallery's includable content
264
+ File.open(File.join(@includes_path, "#{gallery.name}.html"), 'w') { |file|
265
+ file.write(gallery_html(gallery.name, image_data))
266
+ }
267
+ end
268
+ end
269
+ end
270
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_pig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Colin Holzman