svg_creator.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * DevExtreme (exporter/svg_creator.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var $ = require("../core/renderer");
  11. var ajax = require("../core/utils/ajax");
  12. var window = require("../core/utils/window").getWindow();
  13. var isFunction = require("../core/utils/type").isFunction;
  14. var each = require("../core/utils/iterator").each;
  15. var svgUtils = require("../core/utils/svg");
  16. var deferredUtils = require("../core/utils/deferred");
  17. var when = deferredUtils.when;
  18. var Deferred = deferredUtils.Deferred;
  19. exports.svgCreator = {
  20. _markup: "",
  21. _imageArray: {},
  22. _imageDeferreds: [],
  23. _getBinaryFile: function(src, callback) {
  24. ajax.sendRequest({
  25. url: src,
  26. method: "GET",
  27. responseType: "arraybuffer"
  28. }).done(callback).fail(function() {
  29. callback(false)
  30. })
  31. },
  32. _loadImages: function() {
  33. var that = this;
  34. each(that._imageArray, function(src) {
  35. var deferred = new Deferred;
  36. that._imageDeferreds.push(deferred);
  37. that._getBinaryFile(src, function(response) {
  38. if (!response) {
  39. delete that._imageArray[src];
  40. deferred.resolve();
  41. return
  42. }
  43. var i;
  44. var binary = "";
  45. var bytes = new Uint8Array(response);
  46. var length = bytes.byteLength;
  47. for (i = 0; i < length; i++) {
  48. binary += String.fromCharCode(bytes[i])
  49. }
  50. that._imageArray[src] = "data:image/png;base64," + window.btoa(binary);
  51. deferred.resolve()
  52. })
  53. })
  54. },
  55. _parseImages: function(element) {
  56. var href;
  57. var that = this;
  58. if ("image" === element.tagName) {
  59. href = $(element).attr("href") || $(element).attr("xlink:href");
  60. if (!that._imageArray[href]) {
  61. that._imageArray[href] = ""
  62. }
  63. }
  64. each(element.childNodes, function(_, element) {
  65. that._parseImages(element)
  66. })
  67. },
  68. _prepareImages: function(svgElem) {
  69. this._parseImages(svgElem);
  70. this._loadImages();
  71. return when.apply($, this._imageDeferreds)
  72. },
  73. getData: function(data, options) {
  74. var markup;
  75. var that = this;
  76. var xmlVersion = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
  77. var blob = new Deferred;
  78. var svgElem = svgUtils.getSvgElement(data);
  79. var $svgObject = $(svgElem);
  80. markup = xmlVersion + svgUtils.getSvgMarkup($svgObject.get(0), options.backgroundColor);
  81. that._prepareImages(svgElem).done(function() {
  82. each(that._imageArray, function(href, dataURI) {
  83. var regexpString = "href=['|\"]".concat(href, "['|\"]");
  84. markup = markup.replace(new RegExp(regexpString, "gi"), 'href="'.concat(dataURI, '"'))
  85. });
  86. blob.resolve(isFunction(window.Blob) ? that._getBlob(markup) : that._getBase64(markup))
  87. });
  88. return blob
  89. },
  90. _getBlob: function(markup) {
  91. return new window.Blob([markup], {
  92. type: "image/svg+xml"
  93. })
  94. },
  95. _getBase64: function(markup) {
  96. return window.btoa(markup)
  97. }
  98. };
  99. exports.getData = function(data, options, callback) {
  100. return exports.svgCreator.getData(data, options).done(callback)
  101. };