mirror of
https://github.com/niklasvh/html2canvas.git
synced 2023-08-10 21:13:10 +03:00
removed last jQuery dependencies
should be fully jQuery free now!
This commit is contained in:
parent
9f76f94a82
commit
343b86705f
503
src/Core.js
503
src/Core.js
@ -1,233 +1,270 @@
|
|||||||
/*
|
/*
|
||||||
html2canvas @VERSION@ <http://html2canvas.hertzen.com>
|
html2canvas @VERSION@ <http://html2canvas.hertzen.com>
|
||||||
Copyright (c) 2011 Niklas von Hertzen. All rights reserved.
|
Copyright (c) 2011 Niklas von Hertzen. All rights reserved.
|
||||||
http://www.twitter.com/niklasvh
|
http://www.twitter.com/niklasvh
|
||||||
|
|
||||||
Released under MIT License
|
Released under MIT License
|
||||||
*/
|
*/
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var _html2canvas = {},
|
var _html2canvas = {},
|
||||||
previousElement,
|
previousElement,
|
||||||
computedCSS,
|
computedCSS,
|
||||||
html2canvas;
|
html2canvas;
|
||||||
|
|
||||||
|
|
||||||
function h2clog(a) {
|
function h2clog(a) {
|
||||||
if (_html2canvas.logging && window.console && window.console.log) {
|
if (_html2canvas.logging && window.console && window.console.log) {
|
||||||
window.console.log(a);
|
window.console.log(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_html2canvas.Util = {};
|
_html2canvas.Util = {};
|
||||||
|
|
||||||
_html2canvas.Util.backgroundImage = function (src) {
|
_html2canvas.Util.backgroundImage = function (src) {
|
||||||
|
|
||||||
if (/data:image\/.*;base64,/i.test( src ) || /^(-webkit|-moz|linear-gradient|-o-)/.test( src )) {
|
if (/data:image\/.*;base64,/i.test( src ) || /^(-webkit|-moz|linear-gradient|-o-)/.test( src )) {
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src.toLowerCase().substr( 0, 5 ) === 'url("') {
|
if (src.toLowerCase().substr( 0, 5 ) === 'url("') {
|
||||||
src = src.substr( 5 );
|
src = src.substr( 5 );
|
||||||
src = src.substr( 0, src.length - 2 );
|
src = src.substr( 0, src.length - 2 );
|
||||||
} else {
|
} else {
|
||||||
src = src.substr( 4 );
|
src = src.substr( 4 );
|
||||||
src = src.substr( 0, src.length - 1 );
|
src = src.substr( 0, src.length - 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
return src;
|
return src;
|
||||||
};
|
};
|
||||||
|
|
||||||
_html2canvas.Util.Bounds = function getBounds (el) {
|
_html2canvas.Util.Bounds = function getBounds (el) {
|
||||||
var clientRect,
|
var clientRect,
|
||||||
bounds = {};
|
bounds = {};
|
||||||
|
|
||||||
if (el.getBoundingClientRect){
|
if (el.getBoundingClientRect){
|
||||||
clientRect = el.getBoundingClientRect();
|
clientRect = el.getBoundingClientRect();
|
||||||
|
|
||||||
|
|
||||||
// TODO add scroll position to bounds, so no scrolling of window necessary
|
// TODO add scroll position to bounds, so no scrolling of window necessary
|
||||||
bounds.top = clientRect.top;
|
bounds.top = clientRect.top;
|
||||||
bounds.bottom = clientRect.bottom || (clientRect.top + clientRect.height);
|
bounds.bottom = clientRect.bottom || (clientRect.top + clientRect.height);
|
||||||
bounds.left = clientRect.left;
|
bounds.left = clientRect.left;
|
||||||
|
|
||||||
// older IE doesn't have width/height, but top/bottom instead
|
// older IE doesn't have width/height, but top/bottom instead
|
||||||
bounds.width = clientRect.width || (clientRect.right - clientRect.left);
|
bounds.width = clientRect.width || (clientRect.right - clientRect.left);
|
||||||
bounds.height = clientRect.height || (clientRect.bottom - clientRect.top);
|
bounds.height = clientRect.height || (clientRect.bottom - clientRect.top);
|
||||||
|
|
||||||
return bounds;
|
return bounds;
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_html2canvas.Util.getCSS = function (el, attribute) {
|
_html2canvas.Util.getCSS = function (el, attribute) {
|
||||||
// return $(el).css(attribute);
|
// return $(el).css(attribute);
|
||||||
|
|
||||||
var val;
|
var val;
|
||||||
|
|
||||||
function toPX( attribute, val ) {
|
function toPX( attribute, val ) {
|
||||||
var rsLeft = el.runtimeStyle && el.runtimeStyle[ attribute ],
|
var rsLeft = el.runtimeStyle && el.runtimeStyle[ attribute ],
|
||||||
left,
|
left,
|
||||||
style = el.style;
|
style = el.style;
|
||||||
|
|
||||||
// Check if we are not dealing with pixels, (Opera has issues with this)
|
// Check if we are not dealing with pixels, (Opera has issues with this)
|
||||||
// Ported from jQuery css.js
|
// Ported from jQuery css.js
|
||||||
// From the awesome hack by Dean Edwards
|
// From the awesome hack by Dean Edwards
|
||||||
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
|
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
|
||||||
|
|
||||||
// If we're not dealing with a regular pixel number
|
// If we're not dealing with a regular pixel number
|
||||||
// but a number that has a weird ending, we need to convert it to pixels
|
// but a number that has a weird ending, we need to convert it to pixels
|
||||||
|
|
||||||
if ( !/^-?[0-9]+\.?[0-9]*(?:px)?$/i.test( val ) && /^-?\d/.test( val ) ) {
|
if ( !/^-?[0-9]+\.?[0-9]*(?:px)?$/i.test( val ) && /^-?\d/.test( val ) ) {
|
||||||
|
|
||||||
// Remember the original values
|
// Remember the original values
|
||||||
left = style.left;
|
left = style.left;
|
||||||
|
|
||||||
// Put in the new values to get a computed value out
|
// Put in the new values to get a computed value out
|
||||||
if ( rsLeft ) {
|
if ( rsLeft ) {
|
||||||
el.runtimeStyle.left = el.currentStyle.left;
|
el.runtimeStyle.left = el.currentStyle.left;
|
||||||
}
|
}
|
||||||
style.left = attribute === "fontSize" ? "1em" : (val || 0);
|
style.left = attribute === "fontSize" ? "1em" : (val || 0);
|
||||||
val = style.pixelLeft + "px";
|
val = style.pixelLeft + "px";
|
||||||
|
|
||||||
// Revert the changed values
|
// Revert the changed values
|
||||||
style.left = left;
|
style.left = left;
|
||||||
if ( rsLeft ) {
|
if ( rsLeft ) {
|
||||||
el.runtimeStyle.left = rsLeft;
|
el.runtimeStyle.left = rsLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!/^(thin|medium|thick)$/i.test( val )) {
|
if (!/^(thin|medium|thick)$/i.test( val )) {
|
||||||
return Math.round(parseFloat( val )) + "px";
|
return Math.round(parseFloat( val )) + "px";
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ( window.getComputedStyle ) {
|
if ( window.getComputedStyle ) {
|
||||||
if ( previousElement !== el ) {
|
if ( previousElement !== el ) {
|
||||||
computedCSS = document.defaultView.getComputedStyle(el, null);
|
computedCSS = document.defaultView.getComputedStyle(el, null);
|
||||||
}
|
}
|
||||||
val = computedCSS[ attribute ];
|
val = computedCSS[ attribute ];
|
||||||
|
|
||||||
if ( attribute === "backgroundPosition" ) {
|
if ( attribute === "backgroundPosition" ) {
|
||||||
|
|
||||||
val = (val.split(",")[0] || "0 0").split(" ");
|
val = (val.split(",")[0] || "0 0").split(" ");
|
||||||
|
|
||||||
val[ 0 ] = ( val[0].indexOf( "%" ) === -1 ) ? toPX( attribute + "X", val[ 0 ] ) : val[ 0 ];
|
val[ 0 ] = ( val[0].indexOf( "%" ) === -1 ) ? toPX( attribute + "X", val[ 0 ] ) : val[ 0 ];
|
||||||
val[ 1 ] = ( val[1] === undefined ) ? val[0] : val[1]; // IE 9 doesn't return double digit always
|
val[ 1 ] = ( val[1] === undefined ) ? val[0] : val[1]; // IE 9 doesn't return double digit always
|
||||||
val[ 1 ] = ( val[1].indexOf( "%" ) === -1 ) ? toPX( attribute + "Y", val[ 1 ] ) : val[ 1 ];
|
val[ 1 ] = ( val[1].indexOf( "%" ) === -1 ) ? toPX( attribute + "Y", val[ 1 ] ) : val[ 1 ];
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ( el.currentStyle ) {
|
} else if ( el.currentStyle ) {
|
||||||
// IE 9>
|
// IE 9>
|
||||||
if (attribute === "backgroundPosition") {
|
if (attribute === "backgroundPosition") {
|
||||||
// Older IE uses -x and -y
|
// Older IE uses -x and -y
|
||||||
val = [ toPX( attribute + "X", el.currentStyle[ attribute + "X" ] ), toPX( attribute + "Y", el.currentStyle[ attribute + "Y" ] ) ];
|
val = [ toPX( attribute + "X", el.currentStyle[ attribute + "X" ] ), toPX( attribute + "Y", el.currentStyle[ attribute + "Y" ] ) ];
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
val = toPX( attribute, el.currentStyle[ attribute ] );
|
val = toPX( attribute, el.currentStyle[ attribute ] );
|
||||||
|
|
||||||
if (/^(border)/i.test( attribute ) && /^(medium|thin|thick)$/i.test( val )) {
|
if (/^(border)/i.test( attribute ) && /^(medium|thin|thick)$/i.test( val )) {
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case "thin":
|
case "thin":
|
||||||
val = "1px";
|
val = "1px";
|
||||||
break;
|
break;
|
||||||
case "medium":
|
case "medium":
|
||||||
val = "0px"; // this is wrong, it should be 3px but IE uses medium for no border as well.. TODO find a work around
|
val = "0px"; // this is wrong, it should be 3px but IE uses medium for no border as well.. TODO find a work around
|
||||||
break;
|
break;
|
||||||
case "thick":
|
case "thick":
|
||||||
val = "5px";
|
val = "5px";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//return $(el).css(attribute);
|
//return $(el).css(attribute);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
_html2canvas.Util.BackgroundPosition = function ( el, bounds, image ) {
|
_html2canvas.Util.BackgroundPosition = function ( el, bounds, image ) {
|
||||||
// TODO add support for multi image backgrounds
|
// TODO add support for multi image backgrounds
|
||||||
|
|
||||||
var bgposition = _html2canvas.Util.getCSS( el, "backgroundPosition" ) ,
|
var bgposition = _html2canvas.Util.getCSS( el, "backgroundPosition" ) ,
|
||||||
topPos,
|
topPos,
|
||||||
left,
|
left,
|
||||||
percentage,
|
percentage,
|
||||||
val;
|
val;
|
||||||
|
|
||||||
if (bgposition.length === 1){
|
if (bgposition.length === 1){
|
||||||
val = bgposition;
|
val = bgposition;
|
||||||
|
|
||||||
bgposition = [];
|
bgposition = [];
|
||||||
|
|
||||||
bgposition[0] = val;
|
bgposition[0] = val;
|
||||||
bgposition[1] = val;
|
bgposition[1] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (bgposition[0].toString().indexOf("%") !== -1){
|
if (bgposition[0].toString().indexOf("%") !== -1){
|
||||||
percentage = (parseFloat(bgposition[0])/100);
|
percentage = (parseFloat(bgposition[0])/100);
|
||||||
left = ((bounds.width * percentage)-(image.width*percentage));
|
left = ((bounds.width * percentage)-(image.width*percentage));
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
left = parseInt(bgposition[0],10);
|
left = parseInt(bgposition[0],10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bgposition[1].toString().indexOf("%") !== -1){
|
if (bgposition[1].toString().indexOf("%") !== -1){
|
||||||
|
|
||||||
percentage = (parseFloat(bgposition[1])/100);
|
percentage = (parseFloat(bgposition[1])/100);
|
||||||
topPos = ((bounds.height * percentage)-(image.height*percentage));
|
topPos = ((bounds.height * percentage)-(image.height*percentage));
|
||||||
}else{
|
}else{
|
||||||
topPos = parseInt(bgposition[1],10);
|
topPos = parseInt(bgposition[1],10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
top: topPos,
|
top: topPos,
|
||||||
left: left
|
left: left
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
_html2canvas.Util.Extend = function (options, defaults) {
|
_html2canvas.Util.Extend = function (options, defaults) {
|
||||||
for (var key in options) {
|
for (var key in options) {
|
||||||
if (options.hasOwnProperty(key)) {
|
if (options.hasOwnProperty(key)) {
|
||||||
defaults[key] = options[key];
|
defaults[key] = options[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return defaults;
|
return defaults;
|
||||||
};
|
};
|
||||||
|
|
||||||
_html2canvas.Util.Children = function(el) {
|
|
||||||
// $(el).contents() !== el.childNodes, Opera / IE have issues with that
|
/*
|
||||||
var children;
|
* Derived from jQuery.contents()
|
||||||
try {
|
* Copyright 2010, John Resig
|
||||||
children = $(el).contents();
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
//children = (el.nodeName && el.nodeName.toUpperCase() === "IFRAME") ? el.contentDocument || el.contentWindow.document : el.childNodes ;
|
* http://jquery.org/license
|
||||||
|
*/
|
||||||
} catch (ex) {
|
_html2canvas.Util.Children = function( elem ) {
|
||||||
h2clog("html2canvas.Util.Children failed with exception: " + ex.message);
|
|
||||||
children = [];
|
|
||||||
}
|
var children;
|
||||||
return children;
|
try {
|
||||||
};
|
|
||||||
|
children = (elem.nodeName && elem.nodeName.toUpperCase() === "IFRAME") ?
|
||||||
|
elem.contentDocument || elem.contentWindow.document : (function( array ){
|
||||||
|
var ret = [];
|
||||||
|
|
||||||
|
if ( array !== null ) {
|
||||||
|
|
||||||
|
(function( first, second ) {
|
||||||
|
var i = first.length,
|
||||||
|
j = 0;
|
||||||
|
|
||||||
|
if ( typeof second.length === "number" ) {
|
||||||
|
for ( var l = second.length; j < l; j++ ) {
|
||||||
|
first[ i++ ] = second[ j ];
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
while ( second[j] !== undefined ) {
|
||||||
|
first[ i++ ] = second[ j++ ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
first.length = i;
|
||||||
|
|
||||||
|
return first;
|
||||||
|
})( ret, array );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
})( elem.childNodes );
|
||||||
|
|
||||||
|
} catch (ex) {
|
||||||
|
h2clog("html2canvas.Util.Children failed with exception: " + ex.message);
|
||||||
|
children = [];
|
||||||
|
}
|
||||||
|
return children;
|
||||||
|
};
|
||||||
|
24
src/Parse.js
24
src/Parse.js
@ -440,7 +440,26 @@ _html2canvas.Parse = function ( images, options ) {
|
|||||||
return bounds;
|
return bounds;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function elementIndex( el ) {
|
||||||
|
var i = -1,
|
||||||
|
count = 1,
|
||||||
|
childs = el.parentNode.childNodes;
|
||||||
|
|
||||||
|
if ( el.parentNode ) {
|
||||||
|
while( childs[ ++i ] !== el ) {
|
||||||
|
if ( childs[ i ].nodeType === 1 ) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function renderListItem(element, stack, elBounds) {
|
function renderListItem(element, stack, elBounds) {
|
||||||
|
|
||||||
@ -456,8 +475,7 @@ _html2canvas.Parse = function ( images, options ) {
|
|||||||
|
|
||||||
if (/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(type)) {
|
if (/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(type)) {
|
||||||
|
|
||||||
// TODO remove jQuery dependency
|
currentIndex = elementIndex( element );
|
||||||
currentIndex = $(element).index()+1;
|
|
||||||
|
|
||||||
switch(type){
|
switch(type){
|
||||||
case "decimal":
|
case "decimal":
|
||||||
@ -879,7 +897,7 @@ _html2canvas.Parse = function ( images, options ) {
|
|||||||
);*/
|
);*/
|
||||||
|
|
||||||
|
|
||||||
// console.log($(el).css('background-image'));
|
|
||||||
bgw = bounds.width - bgp.left;
|
bgw = bounds.width - bgp.left;
|
||||||
bgh = bounds.height - bgp.top;
|
bgh = bounds.height - bgp.top;
|
||||||
bgsx = bgp.left;
|
bgsx = bgp.left;
|
||||||
|
Loading…
Reference in New Issue
Block a user