mirror of
https://github.com/niklasvh/html2canvas.git
synced 2023-08-10 21:13:10 +03:00
53 lines
1.8 KiB
JavaScript
53 lines
1.8 KiB
JavaScript
var XHR = require('./xhr');
|
|
var decode64 = require('./utils').decode64;
|
|
|
|
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) {
|
|
window.html2canvas.svg.fabric.loadSVGFromString(svg, self.createCanvas.call(self, resolve));
|
|
});
|
|
});
|
|
}
|
|
|
|
SVGContainer.prototype.hasFabric = function() {
|
|
return !window.html2canvas.svg || !window.html2canvas.svg.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 window.html2canvas.svg.fabric.StaticCanvas('c');
|
|
self.image = canvas.lowerCanvasEl;
|
|
canvas
|
|
.setWidth(options.width)
|
|
.setHeight(options.height)
|
|
.add(window.html2canvas.svg.fabric.util.groupSVGElements(objects, options))
|
|
.renderAll();
|
|
resolve(canvas.lowerCanvasEl);
|
|
};
|
|
};
|
|
|
|
SVGContainer.prototype.decode64 = function(str) {
|
|
return (typeof(window.atob) === "function") ? window.atob(str) : decode64(str);
|
|
};
|
|
|
|
module.exports = SVGContainer;
|