holder_rails 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module HolderRails
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  /*
2
2
 
3
- Holder - 1.3 - client side image placeholders
3
+ Holder - 1.4 - client side image placeholders
4
4
  (c) 2012 Ivan Malopinsky / http://imsky.co
5
5
 
6
6
  Provided under the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
@@ -10,11 +10,17 @@ Commercial use requires attribution.
10
10
 
11
11
  var Holder = Holder || {};
12
12
  (function (app, win) {
13
-
13
+
14
14
  var preempted = false,
15
15
  fallback = false,
16
16
  canvas = document.createElement('canvas');
17
17
 
18
+ //getElementsByClassName polyfill
19
+ 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
+
21
+ //getComputedStyle polyfill
22
+ window.getComputedStyle||(window.getComputedStyle=function(e,t){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
+
18
24
  //http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
19
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)}};
20
26
 
@@ -60,9 +66,59 @@ if (!canvas.getContext) {
60
66
  }
61
67
  }
62
68
 
69
+ function render(mode, el, holder, src){
70
+
71
+ var dimensions = holder.dimensions, theme = holder.theme, text = holder.text;
72
+ var dimensions_caption = dimensions.width + "x" + dimensions.height;
73
+ theme = (text ? extend(theme, { text: text }) : theme);
74
+
75
+ if(mode == "image"){
76
+ el.setAttribute("data-src", src);
77
+ el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
78
+ el.style.width = dimensions.width + "px";
79
+ el.style.height = dimensions.height + "px";
80
+ el.style.backgroundColor = theme.background;
81
+
82
+ if(!fallback){
83
+ el.setAttribute("src", draw(ctx, dimensions, theme));
84
+ }
85
+ }
86
+ else {
87
+ if(!fallback){
88
+ el.style.backgroundImage = "url("+draw(ctx, dimensions, theme)+")";
89
+ }
90
+ }
91
+
92
+ };
93
+
94
+ function parse_flags(flags, options){
95
+
96
+ var ret = {
97
+ theme: settings.themes.gray
98
+ }, render = false;
99
+
100
+ for (sl = flags.length, j = 0; j < sl; j++) {
101
+ if (app.flags.dimensions.match(flags[j])) {
102
+ render = true;
103
+ ret.dimensions = app.flags.dimensions.output(flags[j]);
104
+ } else if (app.flags.colors.match(flags[j])) {
105
+ ret.theme = app.flags.colors.output(flags[j]);
106
+ } else if (options.themes[flags[j]]) {
107
+ //If a theme is specified, it will override custom colors
108
+ ret.theme = options.themes[flags[j]];
109
+ } else if (app.flags.text.match(flags[j])) {
110
+ ret.text = app.flags.text.output(flags[j]);
111
+ }
112
+ }
113
+
114
+ return render ? ret : false;
115
+
116
+ };
117
+
63
118
  var settings = {
64
119
  domain: "holder.js",
65
120
  images: "img",
121
+ elements: ".holderjs",
66
122
  themes: {
67
123
  "gray": {
68
124
  background: "#eee",
@@ -83,7 +139,6 @@ var settings = {
83
139
  };
84
140
 
85
141
 
86
-
87
142
  app.flags = {
88
143
  dimensions: {
89
144
  regex: /([0-9]+)x([0-9]+)/,
@@ -140,53 +195,36 @@ app.add_image = function (src, el) {
140
195
  app.run = function (o) {
141
196
  var options = extend(settings, o),
142
197
  images = selector(options.images),
198
+ elements = selector(options.elements),
143
199
  preempted = true;
144
-
200
+
201
+ var cssregex = new RegExp(options.domain+"\/(.*?)\"?\\)");
202
+
203
+ for(var l = elements.length, i = 0; i < l; i++){
204
+ var src = window.getComputedStyle(elements[i],null).getPropertyValue("background-image");
205
+ var flags = src.match(cssregex);
206
+ if(flags){
207
+ var holder = parse_flags(flags[1].split("/"), options);
208
+ if(holder){
209
+ render("background", elements[i], holder, src);
210
+ }
211
+ }
212
+ }
213
+
145
214
  for (var l = images.length, i = 0; i < l; i++) {
146
- var theme = settings.themes.gray;
147
215
  var src = images[i].getAttribute("data-src") || images[i].getAttribute("src");
148
- if ( !! ~src.indexOf(options.domain)) {
149
- var render = false,
150
- dimensions = null,
151
- text = null;
152
- var flags = src.substr(src.indexOf(options.domain) + options.domain.length + 1).split("/");
153
- for (sl = flags.length, j = 0; j < sl; j++) {
154
- if (app.flags.dimensions.match(flags[j])) {
155
- render = true;
156
- dimensions = app.flags.dimensions.output(flags[j]);
157
- } else if (app.flags.colors.match(flags[j])) {
158
- theme = app.flags.colors.output(flags[j]);
159
- } else if (options.themes[flags[j]]) {
160
- //If a theme is specified, it will override custom colors
161
- theme = options.themes[flags[j]];
162
- } else if (app.flags.text.match(flags[j])) {
163
- text = app.flags.text.output(flags[j]);
164
- }
165
- }
166
- if (render) {
167
- images[i].setAttribute("data-src", src);
168
- var dimensions_caption = dimensions.width + "x" + dimensions.height;
169
- images[i].setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption);
170
-
171
- //Fallback
172
- images[i].style.width = dimensions.width + "px";
173
- images[i].style.height = dimensions.height + "px";
174
- images[i].style.backgroundColor = theme.background;
175
-
176
- var theme = (text ? extend(theme, {
177
- text: text
178
- }) : theme);
179
-
180
- if (!fallback) {
181
- images[i].setAttribute("src", draw(ctx, dimensions, theme));
182
- }
216
+ if (src.indexOf(options.domain)>=0) {
217
+ var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1).split("/"), options);
218
+ if (holder) {
219
+ render("image", images[i], holder, src);
183
220
  }
184
221
  }
185
222
  }
186
223
  return app;
187
224
  };
225
+
188
226
  contentLoaded(win, function () {
189
227
  preempted || app.run()
190
- })
228
+ });
191
229
 
192
- })(Holder, window);
230
+ })(Holder, window);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: holder_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-13 00:00:00.000000000 Z
12
+ date: 2012-10-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -59,7 +59,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
59
59
  version: '0'
60
60
  segments:
61
61
  - 0
62
- hash: -451430194701671382
62
+ hash: 4343872938476998461
63
63
  required_rubygems_version: !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
@@ -68,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
68
  version: '0'
69
69
  segments:
70
70
  - 0
71
- hash: -451430194701671382
71
+ hash: 4343872938476998461
72
72
  requirements: []
73
73
  rubyforge_project:
74
74
  rubygems_version: 1.8.24