@antv/x6
Version:
JavaScript diagramming library that uses SVG and HTML for rendering.
185 lines • 7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataUri = void 0;
var DataUri;
(function (DataUri) {
function isDataUrl(url) {
var prefix = 'data:';
return url.substr(0, prefix.length) === prefix;
}
DataUri.isDataUrl = isDataUrl;
/**
* Converts an image at `url` to base64-encoded data uri.
* The mime type of the image is inferred from the `url` file extension.
*/
function imageToDataUri(url, callback) {
// No need to convert to data uri if it is already in data uri.
if (!url || isDataUrl(url)) {
// Keep the async nature of the function.
setTimeout(function () { return callback(null, url); });
return;
}
var onError = function () {
callback(new Error("Failed to load image: " + url));
};
var onLoad = window.FileReader
? // chrome, IE10+
function (xhr) {
if (xhr.status === 200) {
var reader = new FileReader();
reader.onload = function (evt) {
var dataUri = evt.target.result;
callback(null, dataUri);
};
reader.onerror = onError;
reader.readAsDataURL(xhr.response);
}
else {
onError();
}
}
: function (xhr) {
var toString = function (u8a) {
var CHUNK_SZ = 0x8000;
var c = [];
for (var i = 0; i < u8a.length; i += CHUNK_SZ) {
c.push(String.fromCharCode.apply(null, u8a.subarray(i, i + CHUNK_SZ)));
}
return c.join('');
};
if (xhr.status === 200) {
var suffix = url.split('.').pop() || 'png';
if (suffix === 'svg') {
suffix = 'svg+xml';
}
var meta = "data:image/" + suffix + ";base64,";
var bytes = new Uint8Array(xhr.response);
var base64 = meta + btoa(toString(bytes));
callback(null, base64);
}
else {
onError();
}
};
var xhr = new XMLHttpRequest();
xhr.responseType = window.FileReader ? 'blob' : 'arraybuffer';
xhr.open('GET', url, true);
xhr.addEventListener('error', onError);
xhr.addEventListener('load', function () { return onLoad(xhr); });
xhr.send();
}
DataUri.imageToDataUri = imageToDataUri;
function dataUriToBlob(dataUrl) {
var uri = dataUrl.replace(/\s/g, '');
uri = decodeURIComponent(uri);
var index = uri.indexOf(',');
var dataType = uri.slice(0, index); // e.g. 'data:image/jpeg;base64'
var mime = dataType.split(':')[1].split(';')[0]; // e.g. 'image/jpeg'
var data = uri.slice(index + 1);
var decodedString;
if (dataType.indexOf('base64') >= 0) {
// data may be encoded in base64
decodedString = atob(data);
}
else {
// convert the decoded string to UTF-8
decodedString = unescape(encodeURIComponent(data));
}
// write the bytes of the string to a typed array
var ia = new Uint8Array(decodedString.length);
for (var i = 0; i < decodedString.length; i += 1) {
ia[i] = decodedString.charCodeAt(i);
}
return new Blob([ia], { type: mime });
}
DataUri.dataUriToBlob = dataUriToBlob;
function downloadBlob(blob, fileName) {
var msSaveBlob = window.navigator.msSaveBlob;
if (msSaveBlob) {
// requires IE 10+
// pulls up a save dialog
msSaveBlob(blob, fileName);
}
else {
// other browsers
// downloads directly in Chrome and Safari
// presents a save/open dialog in Firefox
// Firefox bug: `from` field in save dialog always shows `from:blob:`
// https://bugzilla.mozilla.org/show_bug.cgi?id=1053327
var url = window.URL.createObjectURL(blob);
var link = document.createElement('a');
link.href = url;
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// mark the url for garbage collection
window.URL.revokeObjectURL(url);
}
}
DataUri.downloadBlob = downloadBlob;
function downloadDataUri(dataUrl, fileName) {
var blob = dataUriToBlob(dataUrl);
downloadBlob(blob, fileName);
}
DataUri.downloadDataUri = downloadDataUri;
function parseViewBox(svg) {
var matches = svg.match(/<svg[^>]*viewBox\s*=\s*(["']?)(.+?)\1[^>]*>/i);
if (matches && matches[2]) {
return matches[2].replace(/\s+/, ' ').split(' ');
}
return null;
}
function getNumber(str) {
var ret = parseFloat(str);
return Number.isNaN(ret) ? null : ret;
}
function svgToDataUrl(svg, options) {
if (options === void 0) { options = {}; }
var viewBox = null;
var getNumberFromViewBox = function (index) {
if (viewBox == null) {
viewBox = parseViewBox(svg);
}
if (viewBox != null) {
return getNumber(viewBox[index]);
}
return null;
};
var getNumberFromMatches = function (reg) {
var matches = svg.match(reg);
if (matches && matches[2]) {
return getNumber(matches[2]);
}
return null;
};
var w = options.width;
if (w == null) {
w = getNumberFromMatches(/<svg[^>]*width\s*=\s*(["']?)(.+?)\1[^>]*>/i);
}
if (w == null) {
w = getNumberFromViewBox(2);
}
if (w == null) {
throw new Error('Can not parse width from svg string');
}
var h = options.height;
if (h == null) {
h = getNumberFromMatches(/<svg[^>]*height\s*=\s*(["']?)(.+?)\1[^>]*>/i);
}
if (h == null) {
h = getNumberFromViewBox(3);
}
if (h == null) {
throw new Error('Can not parse height from svg string');
}
var decoded = encodeURIComponent(svg)
.replace(/'/g, '%27')
.replace(/"/g, '%22');
var header = 'data:image/svg+xml';
var dataUrl = header + "," + decoded;
return dataUrl;
}
DataUri.svgToDataUrl = svgToDataUrl;
})(DataUri = exports.DataUri || (exports.DataUri = {}));
//# sourceMappingURL=index.js.map