Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
bootstrap
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
bootstrap
Commits
1a0df1fb
Commit
1a0df1fb
authored
Oct 09, 2013
by
Chris Rebert
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
upgrade holder.js to v2.1
parent
a388b790
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
82 additions
and
97 deletions
+82
-97
docs-assets/js/holder.js
docs-assets/js/holder.js
+82
-97
No files found.
docs-assets/js/holder.js
100644 → 100755
View file @
1a0df1fb
/*
Holder - 2.
0
- client side image placeholders
Holder - 2.
1
- client side image placeholders
(c) 2012-2013 Ivan Malopinsky / http://imsky.co
Provided under the
Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
Provided under the
MIT License.
Commercial use requires attribution.
*/
...
...
@@ -15,19 +15,40 @@ var preempted = false,
fallback
=
false
,
canvas
=
document
.
createElement
(
'
canvas
'
);
if
(
!
canvas
.
getContext
)
{
fallback
=
true
;
}
else
{
if
(
canvas
.
toDataURL
(
"
image/png
"
)
.
indexOf
(
"
data:image/png
"
)
<
0
)
{
//Android doesn't support data URI
fallback
=
true
;
}
else
{
var
ctx
=
canvas
.
getContext
(
"
2d
"
);
}
}
var
dpr
=
1
,
bsr
=
1
;
if
(
!
fallback
){
dpr
=
window
.
devicePixelRatio
||
1
,
bsr
=
ctx
.
webkitBackingStorePixelRatio
||
ctx
.
mozBackingStorePixelRatio
||
ctx
.
msBackingStorePixelRatio
||
ctx
.
oBackingStorePixelRatio
||
ctx
.
backingStorePixelRatio
||
1
;
}
var
ratio
=
dpr
/
bsr
;
//getElementsByClassName polyfill
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
})
//getComputedStyle polyfill
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
})
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
})
//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications
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
)}}
;
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
)}}
//https://gist.github.com/991057 by Jed Schmidt with modifications
function
selector
(
a
){
a
=
a
.
match
(
/^
(\W)?(
.*
)
/
);
var
b
=
document
[
"
getElement
"
+
(
a
[
1
]?
a
[
1
]
==
"
#
"
?
"
ById
"
:
"
sByClassName
"
:
"
sByTagName
"
)](
a
[
2
]);
var
ret
=
[];
b
!=
null
&&
(
b
.
length
?
ret
=
b
:
b
.
length
==
0
?
ret
=
b
:
ret
=
[
b
]);
return
ret
;
var
ret
=
[];
b
!=
=
null
&&
(
b
.
length
?
ret
=
b
:
b
.
length
=
==
0
?
ret
=
b
:
ret
=
[
b
]);
return
ret
;
}
//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];
//hasOwnProperty polyfill
if
(
!
Object
.
prototype
.
hasOwnProperty
)
Object
.
prototype
.
hasOwnProperty
=
function
(
prop
)
{
/*jshint -W001, -W103 */
Object
.
prototype
.
hasOwnProperty
=
function
(
prop
)
{
var
proto
=
this
.
__proto__
||
this
.
constructor
.
prototype
;
return
(
prop
in
this
)
&&
(
!
(
prop
in
proto
)
||
proto
[
prop
]
!==
this
[
prop
]);
}
/*jshint +W001, +W103 */
function
text_size
(
width
,
height
,
template
)
{
height
=
parseInt
(
height
,
10
);
width
=
parseInt
(
width
,
10
);
height
=
parseInt
(
height
,
10
);
width
=
parseInt
(
width
,
10
);
var
bigSide
=
Math
.
max
(
height
,
width
)
var
smallSide
=
Math
.
min
(
height
,
width
)
var
scale
=
1
/
12
;
...
...
@@ -52,7 +75,7 @@ function text_size(width, height, template) {
}
}
function
draw
(
ctx
,
dimensions
,
template
,
ratio
)
{
function
draw
(
ctx
,
dimensions
,
template
,
ratio
,
literal
)
{
var
ts
=
text_size
(
dimensions
.
width
,
dimensions
.
height
,
template
);
var
text_height
=
ts
.
height
;
var
width
=
dimensions
.
width
*
ratio
,
...
...
@@ -67,9 +90,12 @@ function draw(ctx, dimensions, template, ratio) {
ctx
.
fillStyle
=
template
.
foreground
;
ctx
.
font
=
"
bold
"
+
text_height
+
"
px
"
+
font
;
var
text
=
template
.
text
?
template
.
text
:
(
Math
.
floor
(
dimensions
.
width
)
+
"
x
"
+
Math
.
floor
(
dimensions
.
height
));
if
(
literal
)
{
text
=
template
.
literalText
;
}
var
text_width
=
ctx
.
measureText
(
text
).
width
;
if
(
text_width
/
width
>=
0.75
)
{
text_height
=
Math
.
floor
(
text_height
*
0.75
*
(
width
/
text_width
));
text_height
=
Math
.
floor
(
text_height
*
0.75
*
(
width
/
text_width
));
}
//Resetting font size if necessary
ctx
.
font
=
"
bold
"
+
(
text_height
*
ratio
)
+
"
px
"
+
font
;
...
...
@@ -88,8 +114,12 @@ function render(mode, el, holder, src) {
theme
=
(
holder
.
font
?
extend
(
theme
,
{
font
:
holder
.
font
})
:
theme
);
el
.
setAttribute
(
"
data-src
"
,
src
);
theme
.
literalText
=
dimensions_caption
;
holder
.
originalTheme
=
holder
.
theme
;
holder
.
theme
=
theme
;
if
(
mode
==
"
image
"
)
{
el
.
setAttribute
(
"
data-src
"
,
src
);
el
.
setAttribute
(
"
alt
"
,
text
?
text
:
theme
.
text
?
theme
.
text
+
"
[
"
+
dimensions_caption
+
"
]
"
:
dimensions_caption
);
if
(
fallback
||
!
holder
.
auto
)
{
el
.
style
.
width
=
dimensions
.
width
+
"
px
"
;
...
...
@@ -106,19 +136,18 @@ function render(mode, el, holder, src) {
el
.
style
.
backgroundSize
=
dimensions
.
width
+
"
px
"
+
dimensions
.
height
+
"
px
"
;
}
}
else
if
(
mode
==
"
fluid
"
)
{
el
.
setAttribute
(
"
data-src
"
,
src
);
el
.
setAttribute
(
"
alt
"
,
text
?
text
:
theme
.
text
?
theme
.
text
+
"
[
"
+
dimensions_caption
+
"
]
"
:
dimensions_caption
);
if
(
dimensions
.
height
.
s
ubstr
(
-
1
)
==
"
%
"
)
{
if
(
dimensions
.
height
.
s
lice
(
-
1
)
==
"
%
"
)
{
el
.
style
.
height
=
dimensions
.
height
}
else
{
el
.
style
.
height
=
dimensions
.
height
+
"
px
"
}
if
(
dimensions
.
width
.
s
ubstr
(
-
1
)
==
"
%
"
)
{
if
(
dimensions
.
width
.
s
lice
(
-
1
)
==
"
%
"
)
{
el
.
style
.
width
=
dimensions
.
width
}
else
{
el
.
style
.
width
=
dimensions
.
width
+
"
px
"
}
if
(
el
.
style
.
display
==
"
inline
"
||
el
.
style
.
display
==
""
)
{
if
(
el
.
style
.
display
==
"
inline
"
||
el
.
style
.
display
==
=
""
)
{
el
.
style
.
display
=
"
block
"
;
}
if
(
fallback
)
{
...
...
@@ -129,7 +158,7 @@ function render(mode, el, holder, src) {
fluid_update
(
el
);
}
}
}
;
}
function
fluid_update
(
element
)
{
var
images
;
...
...
@@ -138,24 +167,23 @@ function fluid_update(element) {
}
else
{
images
=
[
element
]
}
for
(
i
in
images
)
{
for
(
var
i
in
images
)
{
var
el
=
images
[
i
]
if
(
el
.
holderData
)
{
var
holder
=
el
.
holderData
;
el
.
setAttribute
(
"
src
"
,
draw
(
ctx
,
{
height
:
el
.
clientHeight
,
width
:
el
.
clientWidth
},
holder
.
theme
,
ratio
));
},
holder
.
theme
,
ratio
,
!!
holder
.
literal
));
}
}
}
function
parse_flags
(
flags
,
options
)
{
var
ret
=
{
theme
:
settings
.
themes
.
gray
}
,
render
=
false
;
};
var
render
=
false
;
for
(
sl
=
flags
.
length
,
j
=
0
;
j
<
sl
;
j
++
)
{
var
flag
=
flags
[
j
];
if
(
app
.
flags
.
dimensions
.
match
(
flag
))
{
...
...
@@ -165,49 +193,24 @@ function parse_flags(flags, options) {
render
=
true
;
ret
.
dimensions
=
app
.
flags
.
fluid
.
output
(
flag
);
ret
.
fluid
=
true
;
}
else
if
(
app
.
flags
.
literal
.
match
(
flag
))
{
ret
.
literal
=
true
;
}
else
if
(
app
.
flags
.
colors
.
match
(
flag
))
{
ret
.
theme
=
app
.
flags
.
colors
.
output
(
flag
);
}
else
if
(
options
.
themes
[
flag
])
{
//If a theme is specified, it will override custom colors
ret
.
theme
=
options
.
themes
[
flag
];
}
else
if
(
app
.
flags
.
text
.
match
(
flag
))
{
ret
.
text
=
app
.
flags
.
text
.
output
(
flag
);
}
else
if
(
app
.
flags
.
font
.
match
(
flag
))
{
ret
.
font
=
app
.
flags
.
font
.
output
(
flag
);
}
else
if
(
app
.
flags
.
auto
.
match
(
flag
))
{
ret
.
auto
=
true
;
}
else
if
(
app
.
flags
.
text
.
match
(
flag
))
{
ret
.
text
=
app
.
flags
.
text
.
output
(
flag
);
}
}
return
render
?
ret
:
false
;
};
if
(
!
canvas
.
getContext
)
{
fallback
=
true
;
}
else
{
if
(
canvas
.
toDataURL
(
"
image/png
"
)
.
indexOf
(
"
data:image/png
"
)
<
0
)
{
//Android doesn't support data URI
fallback
=
true
;
}
else
{
var
ctx
=
canvas
.
getContext
(
"
2d
"
);
}
}
var
dpr
=
1
,
bsr
=
1
;
if
(
!
fallback
){
dpr
=
window
.
devicePixelRatio
||
1
,
bsr
=
ctx
.
webkitBackingStorePixelRatio
||
ctx
.
mozBackingStorePixelRatio
||
ctx
.
msBackingStorePixelRatio
||
ctx
.
oBackingStorePixelRatio
||
ctx
.
backingStorePixelRatio
||
1
;
}
var
ratio
=
dpr
/
bsr
;
var
fluid_images
=
[];
var
settings
=
{
domain
:
"
holder.js
"
,
images
:
"
img
"
,
...
...
@@ -229,10 +232,8 @@ var settings = {
size
:
12
}
},
stylesheet
:
"
.holderjs-fluid {font-size:16px;font-weight:bold;text-align:center;font-family:sans-serif;margin:0}
"
stylesheet
:
""
};
app
.
flags
=
{
dimensions
:
{
regex
:
/^
(\d
+
)
x
(\d
+
)
$/
,
...
...
@@ -279,21 +280,21 @@ app.flags = {
},
auto
:
{
regex
:
/^auto$/
},
literal
:
{
regex
:
/^literal$/
}
}
for
(
var
flag
in
app
.
flags
)
{
if
(
!
app
.
flags
.
hasOwnProperty
(
flag
))
continue
;
app
.
flags
[
flag
].
match
=
function
(
val
)
{
return
val
.
match
(
this
.
regex
)
}
}
app
.
add_theme
=
function
(
name
,
theme
)
{
name
!=
null
&&
theme
!=
null
&&
(
settings
.
themes
[
name
]
=
theme
);
return
app
;
};
app
.
add_image
=
function
(
src
,
el
)
{
var
node
=
selector
(
el
);
if
(
node
.
length
)
{
...
...
@@ -305,32 +306,27 @@ app.add_image = function (src, el) {
}
return
app
;
};
app
.
run
=
function
(
o
)
{
var
options
=
extend
(
settings
,
o
),
images
=
[],
imageNodes
=
[],
bgnodes
=
[];
if
(
typeof
(
options
.
images
)
==
"
string
"
){
imageNodes
=
selector
(
options
.
images
);
}
else
if
(
window
.
NodeList
&&
options
.
images
instanceof
window
.
NodeList
)
{
images
=
[],
imageNodes
=
[],
bgnodes
=
[];
if
(
typeof
(
options
.
images
)
==
"
string
"
)
{
imageNodes
=
selector
(
options
.
images
);
}
else
if
(
window
.
NodeList
&&
options
.
images
instanceof
window
.
NodeList
)
{
imageNodes
=
options
.
images
;
}
else
if
(
window
.
Node
&&
options
.
images
instanceof
window
.
Node
)
{
imageNodes
=
[
options
.
images
];
}
if
(
typeof
(
options
.
bgnodes
)
==
"
string
"
){
bgnodes
=
selector
(
options
.
bgnodes
);
if
(
typeof
(
options
.
bgnodes
)
==
"
string
"
)
{
bgnodes
=
selector
(
options
.
bgnodes
);
}
else
if
(
window
.
NodeList
&&
options
.
elements
instanceof
window
.
NodeList
)
{
bgnodes
=
options
.
bgnodes
;
}
else
if
(
window
.
Node
&&
options
.
bgnodes
instanceof
window
.
Node
)
{
bgnodes
=
[
options
.
bgnodes
];
}
preempted
=
true
;
for
(
i
=
0
,
l
=
imageNodes
.
length
;
i
<
l
;
i
++
)
images
.
push
(
imageNodes
[
i
]);
var
holdercss
=
document
.
getElementById
(
"
holderjs-style
"
);
if
(
!
holdercss
)
{
holdercss
=
document
.
createElement
(
"
style
"
);
...
...
@@ -338,53 +334,44 @@ app.run = function (o) {
holdercss
.
type
=
"
text/css
"
;
document
.
getElementsByTagName
(
"
head
"
)[
0
].
appendChild
(
holdercss
);
}
if
(
!
options
.
nocss
)
{
if
(
holdercss
.
styleSheet
)
{
holdercss
.
styleSheet
.
cssText
+=
options
.
stylesheet
;
}
else
{
holdercss
.
appendChild
(
document
.
createTextNode
(
options
.
stylesheet
));
}
if
(
holdercss
.
styleSheet
)
{
holdercss
.
styleSheet
.
cssText
+=
options
.
stylesheet
;
}
else
{
holdercss
.
appendChild
(
document
.
createTextNode
(
options
.
stylesheet
));
}
}
var
cssregex
=
new
RegExp
(
options
.
domain
+
"
\
/(.*?)
\"
?
\\
)
"
);
for
(
var
l
=
bgnodes
.
length
,
i
=
0
;
i
<
l
;
i
++
)
{
var
src
=
window
.
getComputedStyle
(
bgnodes
[
i
],
null
)
.
getPropertyValue
(
"
background-image
"
);
var
flags
=
src
.
match
(
cssregex
);
var
bgsrc
=
bgnodes
[
i
].
getAttribute
(
"
data-background-src
"
);
if
(
flags
)
{
var
holder
=
parse_flags
(
flags
[
1
].
split
(
"
/
"
),
options
);
if
(
holder
)
{
render
(
"
background
"
,
bgnodes
[
i
],
holder
,
src
);
}
}
else
if
(
bgsrc
!=
null
){
var
holder
=
parse_flags
(
bgsrc
.
substr
(
bgsrc
.
lastIndexOf
(
options
.
domain
)
+
options
.
domain
.
length
+
1
)
}
else
if
(
bgsrc
!=
null
)
{
var
holder
=
parse_flags
(
bgsrc
.
substr
(
bgsrc
.
lastIndexOf
(
options
.
domain
)
+
options
.
domain
.
length
+
1
)
.
split
(
"
/
"
),
options
);
if
(
holder
)
{
render
(
"
background
"
,
bgnodes
[
i
],
holder
,
src
);
}
if
(
holder
)
{
render
(
"
background
"
,
bgnodes
[
i
],
holder
,
src
);
}
}
}
for
(
l
=
images
.
length
,
i
=
0
;
i
<
l
;
i
++
)
{
var
attr_src
=
attr_data_src
=
src
=
null
;
try
{
attr_src
=
images
[
i
].
getAttribute
(
"
src
"
);
attr_datasrc
=
images
[
i
].
getAttribute
(
"
data-src
"
);
}
catch
(
e
){}
var
attr_data_src
,
attr_src
;
attr_src
=
attr_data_src
=
src
=
null
;
try
{
attr_src
=
images
[
i
].
getAttribute
(
"
src
"
);
attr_datasrc
=
images
[
i
].
getAttribute
(
"
data-src
"
);
}
catch
(
e
)
{}
if
(
attr_datasrc
==
null
&&
!!
attr_src
&&
attr_src
.
indexOf
(
options
.
domain
)
>=
0
)
{
src
=
attr_src
;
}
else
if
(
!!
attr_datasrc
&&
attr_datasrc
.
indexOf
(
options
.
domain
)
>=
0
)
{
src
=
attr_datasrc
;
}
if
(
src
)
{
var
holder
=
parse_flags
(
src
.
substr
(
src
.
lastIndexOf
(
options
.
domain
)
+
options
.
domain
.
length
+
1
)
.
split
(
"
/
"
),
options
);
...
...
@@ -399,7 +386,6 @@ app.run = function (o) {
}
return
app
;
};
contentLoaded
(
win
,
function
()
{
if
(
window
.
addEventListener
)
{
window
.
addEventListener
(
"
resize
"
,
fluid_update
,
false
);
...
...
@@ -409,9 +395,8 @@ contentLoaded(win, function () {
}
preempted
||
app
.
run
();
});
if
(
typeof
define
===
"
function
"
&&
define
.
amd
)
{
define
(
"
Holder
"
,
[],
function
()
{
define
([],
function
()
{
return
app
;
});
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment