Serge Bazanski | c7be4a1 | 2018-10-06 13:18:05 +0100 | [diff] [blame] | 1 | /* |
| 2 | Viz.js 2.0.0 (Graphviz 2.40.1, Expat 2.2.5, Emscripten 1.37.36) |
| 3 | Copyright (c) 2014-2018 Michael Daines |
| 4 | Licensed under MIT license |
| 5 | |
| 6 | This distribution contains other software in object code form: |
| 7 | |
| 8 | Graphviz |
| 9 | Licensed under Eclipse Public License - v 1.0 |
| 10 | http://www.graphviz.org |
| 11 | |
| 12 | Expat |
| 13 | Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper |
| 14 | Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. |
| 15 | Licensed under MIT license |
| 16 | http://www.libexpat.org |
| 17 | |
| 18 | zlib |
| 19 | Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler |
| 20 | http://www.zlib.net/zlib_license.html |
| 21 | */ |
| 22 | (function (global, factory) { |
| 23 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : |
| 24 | typeof define === 'function' && define.amd ? define(factory) : |
| 25 | (global.Viz = factory()); |
| 26 | }(this, (function () { 'use strict'; |
| 27 | |
| 28 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { |
| 29 | return typeof obj; |
| 30 | } : function (obj) { |
| 31 | return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; |
| 32 | }; |
| 33 | |
| 34 | var classCallCheck = function (instance, Constructor) { |
| 35 | if (!(instance instanceof Constructor)) { |
| 36 | throw new TypeError("Cannot call a class as a function"); |
| 37 | } |
| 38 | }; |
| 39 | |
| 40 | var createClass = function () { |
| 41 | function defineProperties(target, props) { |
| 42 | for (var i = 0; i < props.length; i++) { |
| 43 | var descriptor = props[i]; |
| 44 | descriptor.enumerable = descriptor.enumerable || false; |
| 45 | descriptor.configurable = true; |
| 46 | if ("value" in descriptor) descriptor.writable = true; |
| 47 | Object.defineProperty(target, descriptor.key, descriptor); |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | return function (Constructor, protoProps, staticProps) { |
| 52 | if (protoProps) defineProperties(Constructor.prototype, protoProps); |
| 53 | if (staticProps) defineProperties(Constructor, staticProps); |
| 54 | return Constructor; |
| 55 | }; |
| 56 | }(); |
| 57 | |
| 58 | var _extends = Object.assign || function (target) { |
| 59 | for (var i = 1; i < arguments.length; i++) { |
| 60 | var source = arguments[i]; |
| 61 | |
| 62 | for (var key in source) { |
| 63 | if (Object.prototype.hasOwnProperty.call(source, key)) { |
| 64 | target[key] = source[key]; |
| 65 | } |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | return target; |
| 70 | }; |
| 71 | |
| 72 | var WorkerWrapper = function () { |
| 73 | function WorkerWrapper(worker) { |
| 74 | var _this = this; |
| 75 | |
| 76 | classCallCheck(this, WorkerWrapper); |
| 77 | |
| 78 | this.worker = worker; |
| 79 | this.listeners = []; |
| 80 | this.nextId = 0; |
| 81 | |
| 82 | this.worker.addEventListener('message', function (event) { |
| 83 | var id = event.data.id; |
| 84 | var error = event.data.error; |
| 85 | var result = event.data.result; |
| 86 | |
| 87 | _this.listeners[id](error, result); |
| 88 | delete _this.listeners[id]; |
| 89 | }); |
| 90 | } |
| 91 | |
| 92 | createClass(WorkerWrapper, [{ |
| 93 | key: 'render', |
| 94 | value: function render(src, options) { |
| 95 | var _this2 = this; |
| 96 | |
| 97 | return new Promise(function (resolve, reject) { |
| 98 | var id = _this2.nextId++; |
| 99 | |
| 100 | _this2.listeners[id] = function (error, result) { |
| 101 | if (error) { |
| 102 | reject(new Error(error.message, error.fileName, error.lineNumber)); |
| 103 | return; |
| 104 | } |
| 105 | resolve(result); |
| 106 | }; |
| 107 | |
| 108 | _this2.worker.postMessage({ id: id, src: src, options: options }); |
| 109 | }); |
| 110 | } |
| 111 | }]); |
| 112 | return WorkerWrapper; |
| 113 | }(); |
| 114 | |
| 115 | var ModuleWrapper = function ModuleWrapper(module, render) { |
| 116 | classCallCheck(this, ModuleWrapper); |
| 117 | |
| 118 | var instance = module(); |
| 119 | this.render = function (src, options) { |
| 120 | return new Promise(function (resolve, reject) { |
| 121 | try { |
| 122 | resolve(render(instance, src, options)); |
| 123 | } catch (error) { |
| 124 | reject(error); |
| 125 | } |
| 126 | }); |
| 127 | }; |
| 128 | }; |
| 129 | |
| 130 | // https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding |
| 131 | |
| 132 | |
| 133 | function b64EncodeUnicode(str) { |
| 134 | return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { |
| 135 | return String.fromCharCode('0x' + p1); |
| 136 | })); |
| 137 | } |
| 138 | |
| 139 | function defaultScale() { |
| 140 | if ('devicePixelRatio' in window && window.devicePixelRatio > 1) { |
| 141 | return window.devicePixelRatio; |
| 142 | } else { |
| 143 | return 1; |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | function svgXmlToImageElement(svgXml) { |
| 148 | var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, |
| 149 | _ref$scale = _ref.scale, |
| 150 | scale = _ref$scale === undefined ? defaultScale() : _ref$scale, |
| 151 | _ref$mimeType = _ref.mimeType, |
| 152 | mimeType = _ref$mimeType === undefined ? "image/png" : _ref$mimeType, |
| 153 | _ref$quality = _ref.quality, |
| 154 | quality = _ref$quality === undefined ? 1 : _ref$quality; |
| 155 | |
| 156 | return new Promise(function (resolve, reject) { |
| 157 | var svgImage = new Image(); |
| 158 | |
| 159 | svgImage.onload = function () { |
| 160 | var canvas = document.createElement('canvas'); |
| 161 | canvas.width = svgImage.width * scale; |
| 162 | canvas.height = svgImage.height * scale; |
| 163 | |
| 164 | var context = canvas.getContext("2d"); |
| 165 | context.drawImage(svgImage, 0, 0, canvas.width, canvas.height); |
| 166 | |
| 167 | canvas.toBlob(function (blob) { |
| 168 | var image = new Image(); |
| 169 | image.src = URL.createObjectURL(blob); |
| 170 | image.width = svgImage.width; |
| 171 | image.height = svgImage.height; |
| 172 | |
| 173 | resolve(image); |
| 174 | }, mimeType, quality); |
| 175 | }; |
| 176 | |
| 177 | svgImage.onerror = function (e) { |
| 178 | var error; |
| 179 | |
| 180 | if ('error' in e) { |
| 181 | error = e.error; |
| 182 | } else { |
| 183 | error = new Error('Error loading SVG'); |
| 184 | } |
| 185 | |
| 186 | reject(error); |
| 187 | }; |
| 188 | |
| 189 | svgImage.src = 'data:image/svg+xml;base64,' + b64EncodeUnicode(svgXml); |
| 190 | }); |
| 191 | } |
| 192 | |
| 193 | function svgXmlToImageElementFabric(svgXml) { |
| 194 | var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, |
| 195 | _ref2$scale = _ref2.scale, |
| 196 | scale = _ref2$scale === undefined ? defaultScale() : _ref2$scale, |
| 197 | _ref2$mimeType = _ref2.mimeType, |
| 198 | mimeType = _ref2$mimeType === undefined ? 'image/png' : _ref2$mimeType, |
| 199 | _ref2$quality = _ref2.quality, |
| 200 | quality = _ref2$quality === undefined ? 1 : _ref2$quality; |
| 201 | |
| 202 | var multiplier = scale; |
| 203 | |
| 204 | var format = void 0; |
| 205 | if (mimeType == 'image/jpeg') { |
| 206 | format = 'jpeg'; |
| 207 | } else if (mimeType == 'image/png') { |
| 208 | format = 'png'; |
| 209 | } |
| 210 | |
| 211 | return new Promise(function (resolve, reject) { |
| 212 | fabric.loadSVGFromString(svgXml, function (objects, options) { |
| 213 | // If there's something wrong with the SVG, Fabric may return an empty array of objects. Graphviz appears to give us at least one <g> element back even given an empty graph, so we will assume an error in this case. |
| 214 | if (objects.length == 0) { |
| 215 | reject(new Error('Error loading SVG with Fabric')); |
| 216 | } |
| 217 | |
| 218 | var element = document.createElement("canvas"); |
| 219 | element.width = options.width; |
| 220 | element.height = options.height; |
| 221 | |
| 222 | var canvas = new fabric.Canvas(element, { enableRetinaScaling: false }); |
| 223 | var obj = fabric.util.groupSVGElements(objects, options); |
| 224 | canvas.add(obj).renderAll(); |
| 225 | |
| 226 | var image = new Image(); |
| 227 | image.src = canvas.toDataURL({ format: format, multiplier: multiplier, quality: quality }); |
| 228 | image.width = options.width; |
| 229 | image.height = options.height; |
| 230 | |
| 231 | resolve(image); |
| 232 | }); |
| 233 | }); |
| 234 | } |
| 235 | |
| 236 | var Viz = function () { |
| 237 | function Viz() { |
| 238 | var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, |
| 239 | workerURL = _ref3.workerURL, |
| 240 | worker = _ref3.worker, |
| 241 | Module = _ref3.Module, |
| 242 | render = _ref3.render; |
| 243 | |
| 244 | classCallCheck(this, Viz); |
| 245 | |
| 246 | if (typeof workerURL !== 'undefined') { |
| 247 | this.wrapper = new WorkerWrapper(new Worker(workerURL)); |
| 248 | } else if (typeof worker !== 'undefined') { |
| 249 | this.wrapper = new WorkerWrapper(worker); |
| 250 | } else if (typeof Module !== 'undefined' && typeof render !== 'undefined') { |
| 251 | this.wrapper = new ModuleWrapper(Module, render); |
| 252 | } else if (typeof Viz.Module !== 'undefined' && typeof Viz.render !== 'undefined') { |
| 253 | this.wrapper = new ModuleWrapper(Viz.Module, Viz.render); |
| 254 | } else { |
| 255 | throw new Error('Must specify workerURL or worker option, Module and render options, or include one of full.render.js or lite.render.js after viz.js.'); |
| 256 | } |
| 257 | } |
| 258 | |
| 259 | createClass(Viz, [{ |
| 260 | key: 'renderString', |
| 261 | value: function renderString(src) { |
| 262 | var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, |
| 263 | _ref4$format = _ref4.format, |
| 264 | format = _ref4$format === undefined ? 'svg' : _ref4$format, |
| 265 | _ref4$engine = _ref4.engine, |
| 266 | engine = _ref4$engine === undefined ? 'dot' : _ref4$engine, |
| 267 | _ref4$files = _ref4.files, |
| 268 | files = _ref4$files === undefined ? [] : _ref4$files, |
| 269 | _ref4$images = _ref4.images, |
| 270 | images = _ref4$images === undefined ? [] : _ref4$images, |
| 271 | _ref4$yInvert = _ref4.yInvert, |
| 272 | yInvert = _ref4$yInvert === undefined ? false : _ref4$yInvert; |
| 273 | |
| 274 | for (var i = 0; i < images.length; i++) { |
| 275 | files.push({ |
| 276 | path: images[i].path, |
| 277 | data: '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n<svg width="' + images[i].width + '" height="' + images[i].height + '"></svg>' |
| 278 | }); |
| 279 | } |
| 280 | |
| 281 | return this.wrapper.render(src, { format: format, engine: engine, files: files, images: images, yInvert: yInvert }); |
| 282 | } |
| 283 | }, { |
| 284 | key: 'renderSVGElement', |
| 285 | value: function renderSVGElement(src) { |
| 286 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| 287 | |
| 288 | return this.renderString(src, _extends({}, options, { format: 'svg' })).then(function (str) { |
| 289 | var parser = new DOMParser(); |
| 290 | return parser.parseFromString(str, 'image/svg+xml').documentElement; |
| 291 | }); |
| 292 | } |
| 293 | }, { |
| 294 | key: 'renderImageElement', |
| 295 | value: function renderImageElement(src) { |
| 296 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| 297 | var scale = options.scale, |
| 298 | mimeType = options.mimeType, |
| 299 | quality = options.quality; |
| 300 | |
| 301 | |
| 302 | return this.renderString(src, _extends({}, options, { format: 'svg' })).then(function (str) { |
| 303 | if ((typeof fabric === 'undefined' ? 'undefined' : _typeof(fabric)) === "object" && fabric.loadSVGFromString) { |
| 304 | return svgXmlToImageElementFabric(str, { scale: scale, mimeType: mimeType, quality: quality }); |
| 305 | } else { |
| 306 | return svgXmlToImageElement(str, { scale: scale, mimeType: mimeType, quality: quality }); |
| 307 | } |
| 308 | }); |
| 309 | } |
| 310 | }, { |
| 311 | key: 'renderJSONObject', |
| 312 | value: function renderJSONObject(src) { |
| 313 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| 314 | var format = options.format; |
| 315 | |
| 316 | |
| 317 | if (format !== 'json' || format !== 'json0') { |
| 318 | format = 'json'; |
| 319 | } |
| 320 | |
| 321 | return this.renderString(src, _extends({}, options, { format: format })).then(function (str) { |
| 322 | return JSON.parse(str); |
| 323 | }); |
| 324 | } |
| 325 | }]); |
| 326 | return Viz; |
| 327 | }(); |
| 328 | |
| 329 | return Viz; |
| 330 | |
| 331 | }))); |