devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
107 lines (104 loc) • 4.06 kB
JavaScript
/**
* DevExtreme (cjs/exporter/svg_creator.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
exports.getData = getData;
exports.svgCreator = void 0;
var _renderer = _interopRequireDefault(require("../core/renderer"));
var _ajax = _interopRequireDefault(require("../core/utils/ajax"));
var _window = require("../core/utils/window");
var _type = require("../core/utils/type");
var _iterator = require("../core/utils/iterator");
var _m_svg = _interopRequireDefault(require("../__internal/core/utils/m_svg"));
var _deferred = require("../core/utils/deferred");
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const window = (0, _window.getWindow)();
const svgCreator = exports.svgCreator = {
_markup: "",
_imageArray: {},
_imageDeferreds: [],
_getBinaryFile: function(src, callback) {
_ajax.default.sendRequest({
url: src,
method: "GET",
responseType: "arraybuffer"
}).done(callback).fail((function() {
callback(false)
}))
},
_loadImages: function() {
const that = this;
(0, _iterator.each)(that._imageArray, (function(src) {
const deferred = new _deferred.Deferred;
that._imageDeferreds.push(deferred);
that._getBinaryFile(src, (function(response) {
if (!response) {
delete that._imageArray[src];
deferred.resolve();
return
}
let i;
let binary = "";
const bytes = new Uint8Array(response);
const length = bytes.byteLength;
for (i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i])
}
that._imageArray[src] = "data:image/png;base64," + window.btoa(binary);
deferred.resolve()
}))
}))
},
_parseImages: function(element) {
let href;
const that = this;
if ("image" === element.tagName) {
href = (0, _renderer.default)(element).attr("href") || (0, _renderer.default)(element).attr("xlink:href");
if (!that._imageArray[href]) {
that._imageArray[href] = ""
}
}(0, _iterator.each)(element.childNodes, (function(_, element) {
that._parseImages(element)
}))
},
_prepareImages: function(svgElem) {
this._parseImages(svgElem);
this._loadImages();
return _deferred.when.apply(_renderer.default, this._imageDeferreds)
},
getData: function(data, options) {
let markup;
const that = this;
const svgElem = _m_svg.default.getSvgElement(data);
const $svgObject = (0, _renderer.default)(svgElem);
$svgObject.find(`[${_m_svg.default.HIDDEN_FOR_EXPORT}]`).remove();
markup = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>' + _m_svg.default.getSvgMarkup($svgObject.get(0), options.backgroundColor);
return that._prepareImages(svgElem).then((() => {
(0, _iterator.each)(that._imageArray, (function(href, dataURI) {
const regexpString = `href=['|"]${href}['|"]`;
markup = markup.replace(new RegExp(regexpString, "gi"), `href="${dataURI}"`)
}));
return (0, _type.isFunction)(window.Blob) ? that._getBlob(markup) : that._getBase64(markup)
}))
},
_getBlob: function(markup) {
return new window.Blob([markup], {
type: "image/svg+xml"
})
},
_getBase64: function(markup) {
return window.btoa(markup)
}
};
function getData(data, options) {
return svgCreator.getData(data, options)
}