holder_rails 2.0.0 → 2.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.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/lib/holder_rails/version.rb +1 -1
- data/vendor/assets/javascripts/holder.js +81 -96
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d02d01436ba84ee6c50bc35b0644f606abc33ed
|
4
|
+
data.tar.gz: f6554f74633cff281227b93bfb21a47c8659b204
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50202367d53117e067c6903ced20cd1b7770c8716b58e4cd6a9212a4d6eb3f36fc82f2c3393047853fe800e1de4465eb3023aadb18ae6243f143ae909fc14bed
|
7
|
+
data.tar.gz: bb32c417f69957e418875f2a54d02ab77b87eae23156e5bd5afab17c7e7aa3347fc8c87786016625982956aabbc4691185dfe2e7ea80ad138ae266e074ffb44c
|
data/README.md
CHANGED
@@ -27,6 +27,14 @@ Add to your JavaScript manifest file:
|
|
27
27
|
//= require holder
|
28
28
|
```
|
29
29
|
|
30
|
+
And if you're using [turbolinks](https://github.com/rails/turbolinks)
|
31
|
+
don't forget to run `Holder` after `page:change` event:
|
32
|
+
|
33
|
+
```coffee
|
34
|
+
$(document).bind 'page:change', ->
|
35
|
+
Holder.run()
|
36
|
+
```
|
37
|
+
|
30
38
|
You can use `holder_tag` helper in your views:
|
31
39
|
|
32
40
|
```ruby
|
data/lib/holder_rails/version.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
/*
|
2
2
|
|
3
|
-
Holder - 2.
|
3
|
+
Holder - 2.1 - client side image placeholders
|
4
4
|
(c) 2012-2013 Ivan Malopinsky / http://imsky.co
|
5
5
|
|
6
|
-
Provided under the
|
6
|
+
Provided under the MIT License.
|
7
7
|
Commercial use requires attribution.
|
8
8
|
|
9
9
|
*/
|
@@ -15,19 +15,40 @@ var preempted = false,
|
|
15
15
|
fallback = false,
|
16
16
|
canvas = document.createElement('canvas');
|
17
17
|
|
18
|
+
if (!canvas.getContext) {
|
19
|
+
fallback = true;
|
20
|
+
} else {
|
21
|
+
if (canvas.toDataURL("image/png")
|
22
|
+
.indexOf("data:image/png") < 0) {
|
23
|
+
//Android doesn't support data URI
|
24
|
+
fallback = true;
|
25
|
+
} else {
|
26
|
+
var ctx = canvas.getContext("2d");
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
var dpr = 1, bsr = 1;
|
31
|
+
|
32
|
+
if(!fallback){
|
33
|
+
dpr = window.devicePixelRatio || 1,
|
34
|
+
bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
|
35
|
+
}
|
36
|
+
|
37
|
+
var ratio = dpr / bsr;
|
38
|
+
|
18
39
|
//getElementsByClassName polyfill
|
19
40
|
document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s})
|
20
41
|
|
21
42
|
//getComputedStyle polyfill
|
22
|
-
window.getComputedStyle||(window.getComputedStyle=function(e
|
43
|
+
window.getComputedStyle||(window.getComputedStyle=function(e){return this.el=e,this.getPropertyValue=function(t){var n=/(\-([a-z]){1})/g;return t=="float"&&(t="styleFloat"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this})
|
23
44
|
|
24
45
|
//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
|
25
|
-
function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}}
|
46
|
+
function contentLoaded(n,t){var l="complete",s="readystatechange",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?"addEventListener":"attachEvent",v=i.addEventListener?"removeEventListener":"detachEvent",f=i.addEventListener?"":"on",r=function(e){(e.type!=s||i.readyState==l)&&((e.type=="load"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll("left")}catch(n){setTimeout(o,50);return}r("poll")};if(i.readyState==l)t.call(n,"lazy");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+"DOMContentLoaded",r,u),i[e](f+s,r,u),n[e](f+"load",r,u)}}
|
26
47
|
|
27
48
|
//https://gist.github.com/991057 by Jed Schmidt with modifications
|
28
49
|
function selector(a){
|
29
50
|
a=a.match(/^(\W)?(.*)/);var b=document["getElement"+(a[1]?a[1]=="#"?"ById":"sByClassName":"sByTagName")](a[2]);
|
30
|
-
var ret=[]; b
|
51
|
+
var ret=[]; b!==null&&(b.length?ret=b:b.length===0?ret=b:ret=[b]); return ret;
|
31
52
|
}
|
32
53
|
|
33
54
|
//shallow object property extend
|
@@ -35,14 +56,16 @@ function extend(a,b){var c={};for(var d in a)c[d]=a[d];for(var e in b)c[e]=b[e];
|
|
35
56
|
|
36
57
|
//hasOwnProperty polyfill
|
37
58
|
if (!Object.prototype.hasOwnProperty)
|
38
|
-
|
59
|
+
/*jshint -W001, -W103 */
|
60
|
+
Object.prototype.hasOwnProperty = function(prop) {
|
39
61
|
var proto = this.__proto__ || this.constructor.prototype;
|
40
62
|
return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
|
41
63
|
}
|
64
|
+
/*jshint +W001, +W103 */
|
42
65
|
|
43
66
|
function text_size(width, height, template) {
|
44
|
-
height = parseInt(height,10);
|
45
|
-
width = parseInt(width,10);
|
67
|
+
height = parseInt(height, 10);
|
68
|
+
width = parseInt(width, 10);
|
46
69
|
var bigSide = Math.max(height, width)
|
47
70
|
var smallSide = Math.min(height, width)
|
48
71
|
var scale = 1 / 12;
|
@@ -52,7 +75,7 @@ function text_size(width, height, template) {
|
|
52
75
|
}
|
53
76
|
}
|
54
77
|
|
55
|
-
function draw(ctx, dimensions, template, ratio) {
|
78
|
+
function draw(ctx, dimensions, template, ratio, literal) {
|
56
79
|
var ts = text_size(dimensions.width, dimensions.height, template);
|
57
80
|
var text_height = ts.height;
|
58
81
|
var width = dimensions.width * ratio,
|
@@ -67,9 +90,12 @@ function draw(ctx, dimensions, template, ratio) {
|
|
67
90
|
ctx.fillStyle = template.foreground;
|
68
91
|
ctx.font = "bold " + text_height + "px " + font;
|
69
92
|
var text = template.text ? template.text : (Math.floor(dimensions.width) + "x" + Math.floor(dimensions.height));
|
93
|
+
if (literal) {
|
94
|
+
text = template.literalText;
|
95
|
+
}
|
70
96
|
var text_width = ctx.measureText(text).width;
|
71
97
|
if (text_width / width >= 0.75) {
|
72
|
-
text_height = Math.floor(text_height * 0.75 * (width/text_width));
|
98
|
+
text_height = Math.floor(text_height * 0.75 * (width / text_width));
|
73
99
|
}
|
74
100
|
//Resetting font size if necessary
|
75
101
|
ctx.font = "bold " + (text_height * ratio) + "px " + font;
|
@@ -88,8 +114,12 @@ function render(mode, el, holder, src) {
|
|
88
114
|
theme = (holder.font ? extend(theme, {
|
89
115
|
font: holder.font
|
90
116
|
}) : theme);
|
117
|
+
el.setAttribute("data-src", src);
|
118
|
+
theme.literalText = dimensions_caption;
|
119
|
+
holder.originalTheme = holder.theme;
|
120
|
+
holder.theme = theme;
|
121
|
+
|
91
122
|
if (mode == "image") {
|
92
|
-
el.setAttribute("data-src", src);
|
93
123
|
el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
|
94
124
|
if (fallback || !holder.auto) {
|
95
125
|
el.style.width = dimensions.width + "px";
|
@@ -106,19 +136,18 @@ function render(mode, el, holder, src) {
|
|
106
136
|
el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px";
|
107
137
|
}
|
108
138
|
} else if (mode == "fluid") {
|
109
|
-
el.setAttribute("data-src", src);
|
110
139
|
el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
|
111
|
-
if (dimensions.height.
|
140
|
+
if (dimensions.height.slice(-1) == "%") {
|
112
141
|
el.style.height = dimensions.height
|
113
142
|
} else {
|
114
143
|
el.style.height = dimensions.height + "px"
|
115
144
|
}
|
116
|
-
if (dimensions.width.
|
145
|
+
if (dimensions.width.slice(-1) == "%") {
|
117
146
|
el.style.width = dimensions.width
|
118
147
|
} else {
|
119
148
|
el.style.width = dimensions.width + "px"
|
120
149
|
}
|
121
|
-
if (el.style.display == "inline" || el.style.display
|
150
|
+
if (el.style.display == "inline" || el.style.display === "") {
|
122
151
|
el.style.display = "block";
|
123
152
|
}
|
124
153
|
if (fallback) {
|
@@ -129,7 +158,7 @@ function render(mode, el, holder, src) {
|
|
129
158
|
fluid_update(el);
|
130
159
|
}
|
131
160
|
}
|
132
|
-
}
|
161
|
+
}
|
133
162
|
|
134
163
|
function fluid_update(element) {
|
135
164
|
var images;
|
@@ -138,24 +167,23 @@ function fluid_update(element) {
|
|
138
167
|
} else {
|
139
168
|
images = [element]
|
140
169
|
}
|
141
|
-
for (i in images) {
|
170
|
+
for (var i in images) {
|
142
171
|
var el = images[i]
|
143
172
|
if (el.holderData) {
|
144
173
|
var holder = el.holderData;
|
145
174
|
el.setAttribute("src", draw(ctx, {
|
146
175
|
height: el.clientHeight,
|
147
176
|
width: el.clientWidth
|
148
|
-
}, holder.theme, ratio));
|
177
|
+
}, holder.theme, ratio, !! holder.literal));
|
149
178
|
}
|
150
179
|
}
|
151
180
|
}
|
152
181
|
|
153
182
|
function parse_flags(flags, options) {
|
154
|
-
|
155
183
|
var ret = {
|
156
184
|
theme: settings.themes.gray
|
157
|
-
}
|
158
|
-
|
185
|
+
};
|
186
|
+
var render = false;
|
159
187
|
for (sl = flags.length, j = 0; j < sl; j++) {
|
160
188
|
var flag = flags[j];
|
161
189
|
if (app.flags.dimensions.match(flag)) {
|
@@ -165,49 +193,24 @@ function parse_flags(flags, options) {
|
|
165
193
|
render = true;
|
166
194
|
ret.dimensions = app.flags.fluid.output(flag);
|
167
195
|
ret.fluid = true;
|
196
|
+
} else if (app.flags.literal.match(flag)) {
|
197
|
+
ret.literal = true;
|
168
198
|
} else if (app.flags.colors.match(flag)) {
|
169
199
|
ret.theme = app.flags.colors.output(flag);
|
170
200
|
} else if (options.themes[flag]) {
|
171
201
|
//If a theme is specified, it will override custom colors
|
172
202
|
ret.theme = options.themes[flag];
|
173
|
-
} else if (app.flags.text.match(flag)) {
|
174
|
-
ret.text = app.flags.text.output(flag);
|
175
203
|
} else if (app.flags.font.match(flag)) {
|
176
204
|
ret.font = app.flags.font.output(flag);
|
177
205
|
} else if (app.flags.auto.match(flag)) {
|
178
206
|
ret.auto = true;
|
207
|
+
} else if (app.flags.text.match(flag)) {
|
208
|
+
ret.text = app.flags.text.output(flag);
|
179
209
|
}
|
180
210
|
}
|
181
|
-
|
182
211
|
return render ? ret : false;
|
183
|
-
|
184
|
-
};
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
if (!canvas.getContext) {
|
189
|
-
fallback = true;
|
190
|
-
} else {
|
191
|
-
if (canvas.toDataURL("image/png")
|
192
|
-
.indexOf("data:image/png") < 0) {
|
193
|
-
//Android doesn't support data URI
|
194
|
-
fallback = true;
|
195
|
-
} else {
|
196
|
-
var ctx = canvas.getContext("2d");
|
197
|
-
}
|
198
212
|
}
|
199
|
-
|
200
|
-
var dpr = 1, bsr = 1;
|
201
|
-
|
202
|
-
if(!fallback){
|
203
|
-
dpr = window.devicePixelRatio || 1,
|
204
|
-
bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
|
205
|
-
}
|
206
|
-
|
207
|
-
var ratio = dpr / bsr;
|
208
|
-
|
209
213
|
var fluid_images = [];
|
210
|
-
|
211
214
|
var settings = {
|
212
215
|
domain: "holder.js",
|
213
216
|
images: "img",
|
@@ -231,8 +234,6 @@ var settings = {
|
|
231
234
|
},
|
232
235
|
stylesheet: ""
|
233
236
|
};
|
234
|
-
|
235
|
-
|
236
237
|
app.flags = {
|
237
238
|
dimensions: {
|
238
239
|
regex: /^(\d+)x(\d+)$/,
|
@@ -279,21 +280,21 @@ app.flags = {
|
|
279
280
|
},
|
280
281
|
auto: {
|
281
282
|
regex: /^auto$/
|
283
|
+
},
|
284
|
+
literal: {
|
285
|
+
regex: /^literal$/
|
282
286
|
}
|
283
287
|
}
|
284
|
-
|
285
288
|
for (var flag in app.flags) {
|
286
289
|
if (!app.flags.hasOwnProperty(flag)) continue;
|
287
290
|
app.flags[flag].match = function (val) {
|
288
291
|
return val.match(this.regex)
|
289
292
|
}
|
290
293
|
}
|
291
|
-
|
292
294
|
app.add_theme = function (name, theme) {
|
293
295
|
name != null && theme != null && (settings.themes[name] = theme);
|
294
296
|
return app;
|
295
297
|
};
|
296
|
-
|
297
298
|
app.add_image = function (src, el) {
|
298
299
|
var node = selector(el);
|
299
300
|
if (node.length) {
|
@@ -305,32 +306,27 @@ app.add_image = function (src, el) {
|
|
305
306
|
}
|
306
307
|
return app;
|
307
308
|
};
|
308
|
-
|
309
309
|
app.run = function (o) {
|
310
310
|
var options = extend(settings, o),
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
else if (window.NodeList && options.images instanceof window.NodeList) {
|
311
|
+
images = [],
|
312
|
+
imageNodes = [],
|
313
|
+
bgnodes = [];
|
314
|
+
if (typeof (options.images) == "string") {
|
315
|
+
imageNodes = selector(options.images);
|
316
|
+
} else if (window.NodeList && options.images instanceof window.NodeList) {
|
317
317
|
imageNodes = options.images;
|
318
318
|
} else if (window.Node && options.images instanceof window.Node) {
|
319
319
|
imageNodes = [options.images];
|
320
320
|
}
|
321
|
-
|
322
|
-
|
323
|
-
bgnodes = selector(options.bgnodes);
|
321
|
+
if (typeof (options.bgnodes) == "string") {
|
322
|
+
bgnodes = selector(options.bgnodes);
|
324
323
|
} else if (window.NodeList && options.elements instanceof window.NodeList) {
|
325
324
|
bgnodes = options.bgnodes;
|
326
325
|
} else if (window.Node && options.bgnodes instanceof window.Node) {
|
327
326
|
bgnodes = [options.bgnodes];
|
328
327
|
}
|
329
|
-
|
330
328
|
preempted = true;
|
331
|
-
|
332
329
|
for (i = 0, l = imageNodes.length; i < l; i++) images.push(imageNodes[i]);
|
333
|
-
|
334
330
|
var holdercss = document.getElementById("holderjs-style");
|
335
331
|
if (!holdercss) {
|
336
332
|
holdercss = document.createElement("style");
|
@@ -338,53 +334,44 @@ app.run = function (o) {
|
|
338
334
|
holdercss.type = "text/css";
|
339
335
|
document.getElementsByTagName("head")[0].appendChild(holdercss);
|
340
336
|
}
|
341
|
-
|
342
337
|
if (!options.nocss) {
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
338
|
+
if (holdercss.styleSheet) {
|
339
|
+
holdercss.styleSheet.cssText += options.stylesheet;
|
340
|
+
} else {
|
341
|
+
holdercss.appendChild(document.createTextNode(options.stylesheet));
|
342
|
+
}
|
348
343
|
}
|
349
|
-
|
350
344
|
var cssregex = new RegExp(options.domain + "\/(.*?)\"?\\)");
|
351
|
-
|
352
345
|
for (var l = bgnodes.length, i = 0; i < l; i++) {
|
353
346
|
var src = window.getComputedStyle(bgnodes[i], null)
|
354
347
|
.getPropertyValue("background-image");
|
355
348
|
var flags = src.match(cssregex);
|
356
349
|
var bgsrc = bgnodes[i].getAttribute("data-background-src");
|
357
|
-
|
358
350
|
if (flags) {
|
359
351
|
var holder = parse_flags(flags[1].split("/"), options);
|
360
352
|
if (holder) {
|
361
353
|
render("background", bgnodes[i], holder, src);
|
362
354
|
}
|
363
|
-
}
|
364
|
-
|
365
|
-
var holder = parse_flags(bgsrc.substr(bgsrc.lastIndexOf(options.domain) + options.domain.length + 1)
|
355
|
+
} else if (bgsrc != null) {
|
356
|
+
var holder = parse_flags(bgsrc.substr(bgsrc.lastIndexOf(options.domain) + options.domain.length + 1)
|
366
357
|
.split("/"), options);
|
367
|
-
|
368
|
-
|
369
|
-
|
358
|
+
if (holder) {
|
359
|
+
render("background", bgnodes[i], holder, src);
|
360
|
+
}
|
370
361
|
}
|
371
362
|
}
|
372
|
-
|
373
363
|
for (l = images.length, i = 0; i < l; i++) {
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
}catch(e){}
|
381
|
-
|
364
|
+
var attr_data_src, attr_src;
|
365
|
+
attr_src = attr_data_src = src = null;
|
366
|
+
try {
|
367
|
+
attr_src = images[i].getAttribute("src");
|
368
|
+
attr_datasrc = images[i].getAttribute("data-src");
|
369
|
+
} catch (e) {}
|
382
370
|
if (attr_datasrc == null && !! attr_src && attr_src.indexOf(options.domain) >= 0) {
|
383
371
|
src = attr_src;
|
384
372
|
} else if ( !! attr_datasrc && attr_datasrc.indexOf(options.domain) >= 0) {
|
385
373
|
src = attr_datasrc;
|
386
374
|
}
|
387
|
-
|
388
375
|
if (src) {
|
389
376
|
var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1)
|
390
377
|
.split("/"), options);
|
@@ -399,7 +386,6 @@ app.run = function (o) {
|
|
399
386
|
}
|
400
387
|
return app;
|
401
388
|
};
|
402
|
-
|
403
389
|
contentLoaded(win, function () {
|
404
390
|
if (window.addEventListener) {
|
405
391
|
window.addEventListener("resize", fluid_update, false);
|
@@ -409,9 +395,8 @@ contentLoaded(win, function () {
|
|
409
395
|
}
|
410
396
|
preempted || app.run();
|
411
397
|
});
|
412
|
-
|
413
398
|
if (typeof define === "function" && define.amd) {
|
414
|
-
define(
|
399
|
+
define([], function () {
|
415
400
|
return app;
|
416
401
|
});
|
417
402
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: holder_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nihad Abbasov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
62
|
version: '0'
|
63
63
|
requirements: []
|
64
64
|
rubyforge_project:
|
65
|
-
rubygems_version: 2.0.
|
65
|
+
rubygems_version: 2.0.6
|
66
66
|
signing_key:
|
67
67
|
specification_version: 4
|
68
68
|
summary: Holder.js for Rails 3.1 asset pipeline
|