mirror of
https://github.com/niklasvh/html2canvas.git
synced 2023-08-10 21:13:10 +03:00
83 lines
2.7 KiB
JavaScript
83 lines
2.7 KiB
JavaScript
function SVGContainer(src) {
|
|
this.src = src;
|
|
this.image = null;
|
|
var self = this;
|
|
|
|
this.promise = this.hasFabric().then(function() {
|
|
return (self.isInline(src) ? Promise.resolve(self.inlineFormatting(src)) : XHR(src));
|
|
}).then(function(svg) {
|
|
return new Promise(function(resolve) {
|
|
html2canvas.fabric.loadSVGFromString(svg, self.createCanvas.call(self, resolve));
|
|
});
|
|
});
|
|
}
|
|
|
|
SVGContainer.prototype.hasFabric = function() {
|
|
return !html2canvas.fabric ? Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")) : Promise.resolve();
|
|
};
|
|
|
|
SVGContainer.prototype.inlineFormatting = function(src) {
|
|
return (/^data:image\/svg\+xml;base64,/.test(src)) ? this.decode64(this.removeContentType(src)) : this.removeContentType(src);
|
|
};
|
|
|
|
SVGContainer.prototype.removeContentType = function(src) {
|
|
return src.replace(/^data:image\/svg\+xml(;base64)?,/,'');
|
|
};
|
|
|
|
SVGContainer.prototype.isInline = function(src) {
|
|
return (/^data:image\/svg\+xml/i.test(src));
|
|
};
|
|
|
|
SVGContainer.prototype.createCanvas = function(resolve) {
|
|
var self = this;
|
|
return function (objects, options) {
|
|
var canvas = new html2canvas.fabric.StaticCanvas('c');
|
|
self.image = canvas.lowerCanvasEl;
|
|
canvas
|
|
.setWidth(options.width)
|
|
.setHeight(options.height)
|
|
.add(html2canvas.fabric.util.groupSVGElements(objects, options))
|
|
.renderAll();
|
|
resolve(canvas.lowerCanvasEl);
|
|
};
|
|
};
|
|
|
|
SVGContainer.prototype.decode64 = function(str) {
|
|
return (typeof(window.atob) === "function") ? window.atob(str) : decode64(str);
|
|
};
|
|
|
|
/*
|
|
* base64-arraybuffer
|
|
* https://github.com/niklasvh/base64-arraybuffer
|
|
*
|
|
* Copyright (c) 2012 Niklas von Hertzen
|
|
* Licensed under the MIT license.
|
|
*/
|
|
|
|
function decode64(base64) {
|
|
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
var len = base64.length, i, encoded1, encoded2, encoded3, encoded4, byte1, byte2, byte3;
|
|
|
|
var output = "";
|
|
|
|
for (i = 0; i < len; i+=4) {
|
|
encoded1 = chars.indexOf(base64[i]);
|
|
encoded2 = chars.indexOf(base64[i+1]);
|
|
encoded3 = chars.indexOf(base64[i+2]);
|
|
encoded4 = chars.indexOf(base64[i+3]);
|
|
|
|
byte1 = (encoded1 << 2) | (encoded2 >> 4);
|
|
byte2 = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
byte3 = ((encoded3 & 3) << 6) | encoded4;
|
|
if (encoded3 === 64) {
|
|
output += String.fromCharCode(byte1);
|
|
} else if (encoded4 === 64 || encoded4 === -1) {
|
|
output += String.fromCharCode(byte1, byte2);
|
|
} else{
|
|
output += String.fromCharCode(byte1, byte2, byte3);
|
|
}
|
|
}
|
|
|
|
return output;
|
|
}
|