d3-graphviz
Version:
Graphviz DOT rendering and animated transitions for D3
1 lines • 30.2 kB
JavaScript
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("d3-selection"),require("d3-dispatch"),require("d3-transition"),require("d3-timer"),require("d3-interpolate"),require("d3-zoom"),require("viz.js/viz"),require("d3-format"),require("d3-path")):"function"==typeof define&&define.amd?define(["exports","d3-selection","d3-dispatch","d3-transition","d3-timer","d3-interpolate","d3-zoom","viz.js/viz","d3-format","d3-path"],e):e(t["d3-graphviz"]={},t.d3,t.d3,t.d3,t.d3,t.d3,t.d3,t.Viz,t.d3,t.d3)}(this,function(t,e,n,r,i,a,o,s,l,h){"use strict";function c(t){var e={},n=t.node().nodeName;e.tag=n,"#text"==n?e.text=t.text():"#comment"==n&&(e.comment=t.text()),e.attributes={};var r=t.node().attributes;if(r)for(var i=0;i<r.length;i++){var a=r[i],o=a.name,s=a.value;e.attributes[o]=s}var l=t.node().transform;if(l&&0!=l.baseVal.numberOfItems){var h=l.baseVal.consolidate().matrix;e.translation={x:h.e,y:h.f}}if("ellipse"==n&&(e.center={x:e.attributes.cx,y:e.attributes.cy}),"polygon"==n){var c=(g=t.attr("points").split(" ")).map(function(t){return t.split(",")[0]}),d=g.map(function(t){return t.split(",")[1]}),u=Math.min.apply(null,c),f=Math.max.apply(null,c),p={x:u,y:v=Math.min.apply(null,d),width:f-u,height:(y=Math.max.apply(null,d))-v};e.bbox=p,e.center={x:(u+f)/2,y:(v+y)/2}}if("path"==n){var g;(g=t.attr("d").split(/[A-Z ]/)).shift();var v,y;c=g.map(function(t){return+t.split(",")[0]}),d=g.map(function(t){return+t.split(",")[1]}),u=Math.min.apply(null,c),f=Math.max.apply(null,c),p={x:u,y:v=Math.min.apply(null,d),width:f-u,height:(y=Math.max.apply(null,d))-v};e.bbox=p,e.center={x:(u+f)/2,y:(v+y)/2},e.totalLength=t.node().getTotalLength()}return"#text"==n?e.text=t.text():"#comment"==n&&(e.comment=t.text()),e}function d(t){var n=c(t);return n.children=[],e.selectAll(t.node().childNodes).each(function(){var t=d(e.select(this));t.parent=n,n.children.push(t)}),n}function u(t){return"#text"==t.tag?document.createTextNode(""):"#comment"==t.tag?document.createComment(t.comment):document.createElementNS("http://www.w3.org/2000/svg",t.tag)}function f(t){var n=u(t),r=e.select(n),i=t.attributes,a=!0,o=!1,s=void 0;try{for(var l,h=Object.keys(i)[Symbol.iterator]();!(a=(l=h.next()).done);a=!0){var c=l.value,d=i[c];r.attr(c,d)}}catch(t){o=!0,s=t}finally{try{!a&&h.return&&h.return()}finally{if(o)throw s}}return n}function p(t,n){var r=e.select(t.node().parentNode),i=f(n),a=r.insert(function(){return i},function(){return t.node()});return t.remove(),a}function g(t){return Object.assign({},t)}function v(t){return Math.round(1e4*t)/1e4}s=s&&s.hasOwnProperty("default")?s.default:s;function y(){var t=this._selection,n=e.select(t.node().querySelector("svg"));if(0==n.size())return this;this._zoomSelection=n;var r=o.zoom().scaleExtent([.1,10]).interpolate(a.interpolate).on("zoom",function(){e.select(n.node().querySelector("g")).attr("transform",e.event.transform)});this._zoomBehavior=r;var i=e.select(n.node().querySelector("g"));return n.call(r),this._active||_.call(this,i),this._originalTransform=o.zoomTransform(n.node()),this}function m(t){var e=this._translation,n=t.datum().translation,r=o.zoomTransform(this._zoomSelection.node());return e&&(r=r.translate(-e.x,-e.y)),r=r.translate(n.x,n.y)}function _(t){this._zoomBehavior.transform(this._zoomSelection,m.call(this,t)),this._translation=t.datum().translation,this._originalTransform=o.zoomIdentity.translate(t.datum().translation.x,t.datum().translation.y)}function w(t,e){return function(){var n=t.map(function(t){return a.interpolate([t[0][0],t[0][1]],[t[1][0],t[1][1]])});return function(t){return t<1?"M"+n.map(function(e){return e(t)}).join("L"):e}}}function x(t){return"edge"==t.attributes.class||"a"==t.tag&&"g"==t.parent.tag&&"edge"==t.parent.parent.attributes.class}function b(t){return t.parent&&x(t.parent)}function E(t){var n=this._transition,r=this._options.fade&&null!=n,i=this._options.tweenPaths,s=this._options.tweenShapes,l=this._options.convertEqualSidedPolygons,h=(this._options.tweenPrecision,this._options.growEnteringEdges&&null!=n),d=this._attributer,f=this;function g(t){var v=e.select(this);if("svg"==t.tag){var y=f._options;if(null!=y.width||null!=y.height){var E=y.width,P=y.height;null==E?E=4*t.attributes.width.replace("pt","")/3:(v.attr("width",E),t.attributes.width=E),null==P?P=4*t.attributes.height.replace("pt","")/3:(v.attr("height",P),t.attributes.height=P),y.fit||(v.attr("viewBox","0 0 "+3*E/4/y.scale+" "+3*P/4/y.scale),t.attributes.viewBox="0 0 "+3*E/4/y.scale+" "+3*P/4/y.scale)}1!=y.scale&&(y.fit||null==y.width&&null==y.height)&&(E=t.attributes.viewBox.split(" ")[2],P=t.attributes.viewBox.split(" ")[3],v.attr("viewBox","0 0 "+E/y.scale+" "+P/y.scale),t.attributes.viewBox="0 0 "+E/y.scale+" "+P/y.scale)}d&&v.each(d);var k=t.tag,z=t.attributes,D=v.node().attributes;if(D)for(var N=0;N<D.length;N++){var M=D[N],S=M.name;if("xmlns"!=S.split(":")[0]&&M.namespaceURI){var W=M.namespaceURI.split("/");S=W[W.length-1]+":"+S}S in z||(z[S]=null)}var L=!1,j=!1;if(s&&n){if("polygon"!=this.nodeName&&"ellipse"!=this.nodeName||!t.alternativeOld||(j=!0),"polygon"!=k&&"ellipse"!=k||!t.alternativeNew||(L=!0),"polygon"==this.nodeName&&"polygon"==k){var O=c(v).attributes.points;if(!l){var q=O.split(" ").length;(et=t.attributes.points).split(" ").length==q&&(L=!1,j=!1)}}if(j){var A=t.alternativeOld,R=p(v,A);R.data([t],function(){return t.key}),v=R}if(L)k="path",z=t.alternativeNew.attributes}var U=v;if(n&&(U=U.transition(n),r&&U.filter(function(t){return"#"==t.tag[0]?null:this}).style("opacity",1),U.filter(function(t){return"#"==t.tag[0]?null:this}).on("end",function(){e.select(this).attr("style",null)})),h&&"path"==k&&t.offset){var T=t.totalLength;v.attr("stroke-dasharray",T+" "+T).attr("stroke-dashoffset",T).attr("transform","translate("+t.offset.x+","+t.offset.y+")"),z["stroke-dashoffset"]=0,z.transform="translate(0,0)",U.attr("stroke-dashoffset",z["stroke-dashoffset"]).attr("transform",z.transform).on("start",function(){e.select(this).style("opacity",null)}).on("end",function(){e.select(this).attr("stroke-dashoffset",null).attr("stroke-dasharray",null).attr("transform",null)})}if(h&&"polygon"==k&&b(t)&&t.offset){var B=e.select(v.node().parentNode.querySelector("path")),I=B.node().getPointAtLength(0),F=B.node().getPointAtLength(t.totalLength),V=B.node().getPointAtLength(t.totalLength-1),Z=180*Math.atan2(F.y-V.y,F.x-V.x)/Math.PI,C=I.x-F.x+t.offset.x,$=I.y-F.y+t.offset.y;v.attr("transform","translate("+C+","+$+")"),U.attrTween("transform",function(){return function(e){var n=B.node().getPointAtLength(t.totalLength*e),r=B.node().getPointAtLength(t.totalLength*e+1),i=180*Math.atan2(r.y-n.y,r.x-n.x)/Math.PI-Z;return C=n.x-F.x+t.offset.x*(1-e),$=n.y-F.y+t.offset.y*(1-e),"translate("+C+","+$+") rotate("+i+" "+F.x+" "+F.y+")"}}).on("start",function(){e.select(this).style("opacity",null)}).on("end",function(){e.select(this).attr("transform",null)})}var G=i&&n&&"path"==k&&null!=v.attr("d"),H=!0,J=!1,K=void 0;try{for(var Q,X=Object.keys(z)[Symbol.iterator]();!(H=(Q=X.next()).done);H=!0){var Y=Q.value,tt=z[Y];if(G&&"d"==Y){var et;(et=(t.alternativeOld||t).points)&&U.attrTween("d",w(et,tt))}else{if("transform"==Y&&t.translation){var nt=U.on("end");U.on("start",function(){f._zoomBehavior&&U.tween("attr.transform",function(){var t=this;return function(e){t.setAttribute("transform",a.interpolateTransformSvg(o.zoomTransform(f._zoomSelection.node()).toString(),m.call(f,v).toString())(e))}})}).on("end",function(){nt.call(this),f._zoomBehavior&&_.call(f,v)})}U.attr(Y,tt)}}}catch(t){J=!0,K=t}finally{try{!H&&X.return&&X.return()}finally{if(J)throw K}}L&&U.on("end",function(t,n,r){p(R=e.select(this),t).data([t],function(){return t.key})}),t.text&&U.text(t.text),function(t){var i=t.selectAll(function(){return t.node().childNodes}),a=(i=i.data(function(t){return t.children},function(t){return t.key})).enter().append(function(t){var e=u(t);return"#text"==t.tag&&r&&(e.nodeValue=t.text),e});(r||h&&x(t.datum()))&&a.filter(function(t){return"#"==t.tag[0]?null:this}).each(function(t){var n=e.select(this),r=!0,i=!1,a=void 0;try{for(var o,s=Object.keys(t.attributes)[Symbol.iterator]();!(r=(o=s.next()).done);r=!0){var l=o.value,h=t.attributes[l];n.attr(l,h)}}catch(t){i=!0,a=t}finally{try{!r&&s.return&&s.return()}finally{if(i)throw a}}}).filter(function(t){return"svg"==t.tag||"g"==t.tag?null:this}).style("opacity",0);var o=i.exit();d&&o.each(d),n&&(o=o.transition(n),r&&o.filter(function(t){return"#"==t.tag[0]?null:this}).style("opacity",0)),o=o.remove(),(i=a.merge(i)).each(g)}(v)}var v=this._selection;if(null!=n){var E=this._jobs;if(f._active)return E.push(null),this;v.transition(n).transition().duration(0).on("end",function(){f._active=!1,0!=E.length&&(E.shift(),f.render())}),this._active=!0}null!=n&&v.transition(n).on("start",function(){f._dispatch.call("transitionStart",f)}).on("end",function(){f._dispatch.call("transitionEnd",f)}).transition().duration(0).on("start",function(){f._dispatch.call("restoreEnd",f),f._dispatch.call("end",f),t&&t.call(f)});var P=this._data,k=v.selectAll("svg").data([P],function(t){return t.key});return k=k.enter().append("svg").merge(k),g.call(k.node(),P),this._options.zoom&&!this._zoomBehavior&&y.call(this),f._dispatch.call("renderEnd",f),null==n&&(this._dispatch.call("end",this),t&&t.call(this)),this}function P(t,e){if("polygon"==t.tag){(d=g(t)).tag="path";var n=g(u=t.attributes),r=u.points;if("polygon"==e.tag){(m=t.bbox).cx=m.x+m.width/2,m.cy=m.y+m.height/2;for(var i=u.points.split(" "),a=i.map(function(t){var e=t.split(",");return[e[0]-m.cx,e[1]-m.cy]}),o=a[a.length-1][0],s=a[a.length-1][1],l=0;l<a.length;l++,o=z,s=D){var h=(z=a[l][0])-o;if(0!=(b=(D=a[l][1])-s))if(0<=(N=o-s*h/b)&&N<1/0&&(o<=N&&N<=z||z<=N&&N<=o))break}var c=[[m.cx+N,m.cy+0].join(",")];r=(c=(c=c.concat(i.slice(l))).concat(i.slice(0,l))).join(" ")}n.d="M"+r+"z",delete n.points,d.attributes=n}else{var d;(d=g(t)).tag="path";n=g(u=t.attributes);var u,f=u.cx,p=u.cy,v=u.rx,y=u.ry;if("polygon"==e.tag){var m;(m=e.bbox).cx=m.x+m.width/2,m.cy=m.y+m.height/2;var _=e.attributes.points.split(" ")[0].split(","),w=_[0],x=_[1],b=(h=w-m.cx,x-m.cy),E=Math.sqrt(Math.pow(h,2)+Math.pow(b,2)),P=h/E,k=-b/E}else P=1,k=0;var z,D,N;h=(N=v*-P)-(z=v*P),b=-y*-k-(D=-y*k);n.d="M "+f+" "+p+" m "+z+","+D+" a "+v+","+y+" 0 1,0 "+h+","+b+" a "+v+","+y+" 0 1,0 "+-h+","+-b+"z",delete n.cx,delete n.cy,delete n.rx,delete n.ry,d.attributes=n}return d}var k=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},z=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)};function D(t,e,n,r){var i=[t*n-(e=-e)*(r=-r),t*r+e*n];return[t=i[0],e=-(e=i[1])]}var N={id:null,fillcolor:"black",color:"black",penwidth:1,URL:null,tooltip:null};function M(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N;for(var n in e)void 0===t[n]&&(t[n]=e[n])}function S(t,e,n,r,i,a,o){var s=a.id,l=a.fillcolor,c=a.color,d=a.penwidth,u=o.shortening||0,f=[[0,-3.5],[10,0],[0,3.5],[0,-3.5]],p=r-e,g=i-n,v=Math.sqrt(p*p+g*g),y=p/v,m=g/v;if(r=e+(v-u-10-.174)*y,i=n+(v-u-10-.174)*m,a.URL||a.tooltip)var _=t.selectWithoutDataPropagation("g").selectWithoutDataPropagation("a"),w=_.selectWithoutDataPropagation("path"),x=_.selectWithoutDataPropagation("polygon");else w=t.selectWithoutDataPropagation("path"),x=t.selectWithoutDataPropagation("polygon");t.attr("id",s);var b=h.path();b.moveTo(e,n),b.lineTo(r,i),w.attr("d",b).attr("fill",l).attr("stroke",c).attr("strokeWidth",d),r=e+(v-u-10)*y,i=n+(v-u-10)*m;for(var E=0;E<f.length;E++){var P=f[E];f[E]=D(P[0],P[1],y,m)}for(E=0;E<f.length;E++){P=f[E];f[E]=[r+P[0],i+P[1]]}var k=[];for(E=0;E<f.length;E++){P=f[E];k.push(P.join(","))}var z=k.join(" ");return x.attr("points",z).attr("fill",l).attr("stroke",c).attr("strokeWidth",d),this}function W(){return this._drawnEdge?(this._drawnEdge.g.remove(),this._drawnEdge=null,this):this}var L,j={id:null,fillcolor:"none",color:"#000000",penwidth:null,URL:null,tooltip:null,labeljust:null,fontname:null,fontsize:null,fontcolor:null},O=["fivepoverhang","threepoverhang","noverhang","assembly"],q=["none","plain","plaintext"];function A(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:j;for(var n in"filled"!=t.style||t.fillcolor||(t.color?t.fillcolor=t.color:t.fillcolor="#d3d3d3"),"filled"==t.style&&(q.includes(t.shape)?t.color="transparent":t.color||(t.color="#000000")),"point"!=t.shape||t.fillcolor||(t.fillcolor="#000000"),e)void 0===t[n]&&(t[n]=e[n])}function R(t,n,r,i,a,o){var s=a.id,l=a.fillcolor,h=a.color,c=a.penwidth;if("l"==a.labeljust)var d="start";else if("r"==a.labeljust)d="end";else if("c"==a.labeljust)d="middle";else d=null;var u=a.fontname,f=a.fontsize,p=a.fontcolor;if("label"in a)var g=a.label;else g=i;var y=t.selectWithoutDataPropagation("title");if(a.URL||a.tooltip)var m=t.selectWithoutDataPropagation("g").selectWithoutDataPropagation("a");else m=t;var _=m.selectAll("ellipse,polygon,path,polyline"),w=t.selectWithoutDataPropagation("text");if(t.attr("id",s),y.text(i),0!=_.size()){var x=_.node().getBBox();x.cx=x.x+x.width/2,x.cy=x.y+x.height/2}else 0!=w.size()&&(x={x:+w.attr("x"),y:+w.attr("y"),width:0,height:0,cx:+w.attr("x"),cy:+w.attr("y")});return _.each(function(t,i){var o=e.select(this);if(o.attr("cx"))o.attr("cx",v(n)).attr("cy",v(r));else if(o.attr("points")){var s=o.attr("points");o.attr("points",function(t,e,n){var r;return(r=t.split(" ")).map(function(t){return t.split(",")}),t=(t=(r=r.map(function(t){return[v(+e+ +t.split(",")[0]),v(+n+ +t.split(",")[1])]}).map(function(t){return t.join(",")})).join(" ")).replace(/-0\./g,"-.").replace(/ 0\./g," .")}(s,n-x.cx,r-x.cy))}else{var d=o.attr("d");o.attr("d",function(t,e,n){(i=t.split(/[A-Z ]/)).shift();var r=t.split(/[^[A-Z ]+/),i=(i.map(function(t){return t.split(",")}),i.map(function(t){return[v(+e+ +t.split(",")[0]),v(+n+ +t.split(",")[1])]}).map(function(t){return t.join(",")}));return t=(t=r.reduce(function(t,e,n){return t.concat(e,i[n])},[]).join("")).replace(/-0\./g,"-.").replace(/ 0\./g," .")}(d,n-x.cx,r-x.cy))}(0==i||O.includes(a.shape))&&(o.attr("fill",l).attr("stroke",h),c&&o.attr("strokeWidth",c))}),0!=w.size()&&(d&&w.attr("text-anchor",d),w.attr("x",v(+w.attr("x")+n-x.cx)).attr("y",v(+w.attr("y")+r-x.cy)),u&&w.attr("font-family",u),f&&w.attr("font-size",f),p&&w.attr("fill",p),w.text(g)),this}function U(){return this._drawnNode?(this._drawnNode.g.remove(),this._drawnNode=null,this):this}function T(t,r){if(this._options={useWorker:!0,engine:"dot",totalMemory:void 0,keyMode:"title",fade:!0,tweenPaths:!0,tweenShapes:!0,convertEqualSidedPolygons:!0,tweenPrecision:1,growEnteringEdges:!0,zoom:!0,width:null,height:null,scale:1,fit:!1},r instanceof Object){var i=!0,a=!1,o=void 0;try{for(var l,h=Object.keys(r)[Symbol.iterator]();!(i=(l=h.next()).done);i=!0){var c=l.value;this._options[c]=r[c]}}catch(t){a=!0,o=t}finally{try{!i&&h.return&&h.return()}finally{if(a)throw o}}}else"boolean"==typeof r&&(this._options.useWorker=r);var d=this._options.useWorker;if("undefined"==typeof Worker&&(d=!1),d){var u=e.selectAll("script").filter(function(){return"javascript/worker"==e.select(this).attr("type")||e.select(this).attr("src")&&e.select(this).attr("src").match(/.*\/viz.js$/)});0==u.size()?(console.warn('No script tag of type "javascript/worker" was found and "useWorker" is true. Not using web worker.'),d=!1):(this._vizURL=u.attr("src"),this._vizURL||(console.warn('No "src" attribute of was found on the "javascript/worker" script tag and "useWorker" is true. Not using web worker.'),d=!1))}if(d){var f=new Blob(['\n onmessage = function(event) {\n if (event.data.vizURL) {\n importScripts(event.data.vizURL);\n }\n try {\n var svg = Viz(event.data.dot, event.data.options);\n }\n catch(error) {\n postMessage({\n type: "error",\n error: error.message,\n });\n return;\n }\n if (svg) {\n postMessage({\n type: "done",\n svg: svg,\n });\n } else {\n postMessage({\n type: "skip",\n });\n }\n }\n ']),p=window.URL.createObjectURL(f);this._worker=new Worker(p)}this._selection=t,this._active=!1,this._busy=!1,this._jobs=[],this._queue=[],this._keyModes=new Set(["title","id","tag-index","index"]),this._images=[],this._translation=void 0,this._eventTypes=["initEnd","start","layoutStart","layoutEnd","dataExtractEnd","dataProcessPass1End","dataProcessPass2End","dataProcessEnd","renderStart","renderEnd","transitionStart","transitionEnd","restoreEnd","end"],this._dispatch=n.dispatch.apply(void 0,z(this._eventTypes)),function(){if(null==this._worker)s(""),this._dispatch.call("initEnd",this);else{var t=this._vizURL,e=this;this._worker.onmessage=function(t){e._dispatch.call("initEnd",this)},t.match(/^https?:\/\/|^\/\//i)||(t=new window.URL(t,document.location.href).href),this._worker.postMessage({dot:"",vizURL:t})}}.call(this),t.node().__graphviz__=this}function B(t,n){return e.select(t).graphviz(n)}T.prototype=B.prototype=(k(L={constructor:T,engine:function(t){if(t!=this._options.engine&&null!=this._data)throw Error("Too late to change engine");return this._options.engine=t,this},addImage:function(t,e,n){return this._images.push({path:t,width:e,height:n}),this},totalMemory:function(t){return this._options.totalMemory=t,this},keyMode:function(t){if(!this._keyModes.has(t))throw Error("Illegal keyMode: "+t);if(t!=this._options.keyMode&&null!=this._data)throw Error("Too late to change keyMode");return this._options.keyMode=t,this},fade:function(t){return this._options.fade=t,this},tweenPaths:function(t){return this._options.tweenPaths=t,this},tweenShapes:function(t){return this._options.tweenShapes=t,t&&(this._options.tweenPaths=!0),this},convertEqualSidedPolygons:function(t){return this._options.convertEqualSidedPolygons=t,this},tweenPrecision:function(t){return this._options.tweenPrecision=t,this},growEnteringEdges:function(t){return this._options.growEnteringEdges=t,this},zoom:function(t){return this._options.zoom=t,this._options.zoom&&!this._zoomBehavior&&y.call(this),this},resetZoom:function(t){var e=this._zoomSelection;return t&&(e=e.transition(t)),e.call(this._zoomBehavior.transform,this._originalTransform),this},render:function(t){return this._busy?(this._queue.push(this.render.bind(this,t)),this):(this._dispatch.call("renderStart",this),this._transitionFactory?i.timeout(function(){this._transition=r.transition(this._transitionFactory()),E.call(this,t)}.bind(this),0):E.call(this,t),this)},dot:function(t,n){var r=this,i=this._worker,a=this._options.engine,o=this._images,l=this._options.totalMemory,h=this._options.keyMode,c=this._options.tweenPaths,u=this._options.tweenShapes,p=this._options.tweenPrecision,g=this._options.growEnteringEdges,v={},y=this._dictionary||{},m={},_=this._nodeDictionary||{};function w(t,e){if(c&&e&&("path"==e.tag||t.alternativeOld&&"path"==t.alternativeOld.tag)){var n=(t.alternativeNew||t).attributes.d;if(t.alternativeOld)var r=f(t.alternativeOld);else r=f(e);(t.alternativeOld||(t.alternativeOld={})).points=function(t,e,n){for(var r=t,i=r.cloneNode(),a=r.getTotalLength(),o=(i.setAttribute("d",e),i).getTotalLength(),s=[0],l=0,h=n/Math.max(a,o);(l+=h)<1;)s.push(l);return s.push(1),s.map(function(t){var e=r.getPointAtLength(t*a),n=i.getPointAtLength(t*o);return[[e.x,e.y],[n.x,n.y]]})}(r,n,p)}}function x(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments[2];!function(t,e){var n=t.tag;if("index"==h)t.key=e;else if("#"!=n[0])if("id"==h)t.key=t.attributes.id;else if("title"==h){var r=t.children.find(function(t){return"title"==t.tag});r&&(t.key=r.children[0].text)}null==t.key&&(u&&("ellipse"!=n&&"polygon"!=n||(n="path")),t.key=n+"-"+e)}(t,e),function(t,e){var n=(e?e.id+".":"")+t.key;t.id=n}(t,n);var r=t.id,i=y[r];!function(t){v[t.id]=t}(t),function(t,e){u&&t.id in y&&("polygon"!=e.tag&&"ellipse"!=e.tag&&"path"!=e.tag||e.tag==t.tag&&"polygon"!=t.tag||("path"!=e.tag&&(t.alternativeOld=P(e,t)),"path"!=t.tag&&(t.alternativeNew=P(t,e))))}(t,i),w(t,i);var a={};t.children.forEach(function(e){var n=e.tag;"ellipse"!=n&&"polygon"!=n||(n="path"),null==a[n]&&(a[n]=0),x(e,a[n]++,t)})}function E(t){!function(t){var e=t.tag;if(g&&t.parent&&"node"==t.parent.attributes.class&&"title"==e){var n=t.children[0].text;m[n]=t.parent}}(t),function(t){var e=t.id,n=t.tag,r=y[e];if(g&&!r&&t.parent&&b(t)&&("path"==n||"polygon"==n)){if("polygon"==n){var i=t.parent.children.find(function(t){return"path"==t.tag});t.totalLength=i.totalLength}var a=function(t){return function(t){return"edge"==t.parent.attributes.class?t.parent:t.parent.parent.parent}(t).children.find(function(t){return"title"==t.tag})}(t).children[0],o=a.text.split("->");2!=o.length&&(o=a.text.split("--"));var s=o[0],l=m[s],h=_[s];if(h){if((u=l.children.findIndex(function(t,e){return"g"==t.tag}))>=0){var c=l.children[u].children.findIndex(function(t,e){return"a"==t.tag});l=l.children[u].children[c]}(u=h.children.findIndex(function(t,e){return"g"==t.tag}))>=0&&(c=h.children[u].children.findIndex(function(t,e){return"a"==t.tag}),h=h.children[u].children[c]);for(var d=l.children,u=0;u<d.length;u++)if("polygon"==d[u].tag||"ellipse"==d[u].tag||"path"==d[u].tag){var f=d[u];break}var p=h.children;for(u=0;u<p.length;u++)if("polygon"==p[u].tag||"ellipse"==p[u].tag||"path"==p[u].tag){var v=p[u];break}t.offset={x:v.center.x-f.center.x,y:v.center.y-f.center.y}}}}(t),t.children.forEach(function(t){E(t)})}this._dispatch.call("start",this),this._busy=!0,this._dispatch.call("layoutStart",this);var k={format:"svg",engine:a,images:o,totalMemory:l};if(this._worker)i.postMessage({dot:t,options:k}),i.onmessage=function(t){switch(t.data.type){case"done":return D.call(r,t.data.svg);case"error":if(!r._onerror)throw t.data.error;r._onerror(t.data.error)}};else{try{var z=s(t,k)}catch(t){if(r._onerror)return r._onerror(t.message),this;throw t.message}D.call(this,z)}function D(t){this._dispatch.call("layoutEnd",this);var r=e.select(document.createDocumentFragment()).append("div"),i=(new window.DOMParser).parseFromString(t,"image/svg+xml");r.append(function(){return i.documentElement});var a=d(r.select("svg"));this._dispatch.call("dataExtractEnd",this),x(a),this._dispatch.call("dataProcessPass1End",this),E(a),this._dispatch.call("dataProcessPass2End",this),this._data=a,this._dictionary=v,this._nodeDictionary=m,this._extractData=function(t,e,n){var r=d(t);return x(r,e,n),E(r),r},this._busy=!1,this._dispatch.call("dataProcessEnd",this),n&&n.call(this),this._queue.length>0&&this._queue.shift().call(this)}return this},renderDot:function(t,e){var n=this;return this.dot(t,function(){n.render(e)}),this},transition:function(t){return t instanceof Function?this._transitionFactory=t:this._transition=r.transition(t),this},active:function(t){var e=this._selection.selectWithoutDataPropagation("svg");return 0!=e.size()?r.active(e.node(),t):null},options:function(t){if(void 0===t)return Object.assign({},this._options);var e=!0,n=!1,r=void 0;try{for(var i,a=Object.keys(t)[Symbol.iterator]();!(e=(i=a.next()).done);e=!0){var o=i.value;this._options[o]=t[o]}}catch(t){n=!0,r=t}finally{try{!e&&a.return&&a.return()}finally{if(n)throw r}}return this},width:function(t){return this._options.width=t,this},height:function(t){return this._options.height=t,this},scale:function(t){return this._options.scale=t,this},fit:function(t){return this._options.fit=t,this},attributer:function(t){return this._attributer=t,this},on:function(t,e){return this._dispatch.on(t,e),this},onerror:function(t){return this._onerror=t,this},logEvents:function(t){var e=this,n=Date.now(),r={},i=this._eventTypes,a=Math.max.apply(Math,z(i.map(function(t){return t.length}))),o=function(o){var s=i[o];r[s]=[],h=e,e.on(s+".log",t?function(){var t=Date.now(),e=r[s].length;r[s].push(t);var i="";if(i+="Event ",i+=l.format(" >2")(o)+" ",i+=s+" ".repeat(a-s.length),i+=l.format(" >5")(t-n)+" ","initEnd"!=s&&(i+=l.format(" >5")(t-r.start[e])),"dataProcessEnd"==s&&(i+=" prepare "+l.format(" >5")(t-r.layoutEnd[e])),"renderEnd"==s&&h._transition&&(i+=" transition start margin "+l.format(" >5")(h._transition.delay()-(t-r.renderStart[e])),c=h._transition.delay(),d=h._transition.duration()),"transitionStart"==s){var u=t-r.renderStart[e];i+=" transition delay "+l.format(" >5")(t-r.renderStart[e]),i+=" expected "+l.format(" >5")(c),i+=" diff "+l.format(" >5")(u-c)}if("transitionEnd"==s){var f=t-r.transitionStart[e];i+=" transition duration "+l.format(" >5")(f),i+=" expected "+l.format(" >5")(d),i+=" diff "+l.format(" >5")(f-d)}console.log(i),n=t}:null)};for(var s in i){var h,c,d;o(s)}return this},drawEdge:function(t,e,n,r,i){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};M(i=i||{});var o=this._selection.selectWithoutDataPropagation("svg").selectWithoutDataPropagation("g").append("g").datum(null).attr("class","edge");if(o.insert("title",":first-child").text(""),i.URL||i.tooltip){var s=o.append("g").append("a");i.URL&&s.attr("href",i.URL),i.tooltip&&s.attr("title",i.tooltip),s.append("path"),s.append("polygon")}else o.append("path"),o.append("polygon");return this._drawnEdge={g:o,x1:t,y1:e,x2:n,y2:r,attributes:i},S(o,t,e,n,r,i,a),this},updateDrawnEdge:function(t,e,n,r,i){var a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};if(!this._drawnEdge)throw Error("No edge has been drawn");var o=this._drawnEdge.g;return M(i=i||{},this._drawnEdge.attributes),this._drawnEdge.x1=t,this._drawnEdge.y1=e,this._drawnEdge.x2=n,this._drawnEdge.y2=r,this._drawnEdge.attributes=i,S(o,t,e,n,r,i,a),this},moveDrawnEdgeEndPoint:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!this._drawnEdge)throw Error("No edge has been drawn");var r=this._drawnEdge.g,i=this._drawnEdge.x1,a=this._drawnEdge.y1,o=this._drawnEdge.attributes;return this._drawnEdge.x2=t,this._drawnEdge.y2=e,S(r,i,a,t,e,o,n),this},insertDrawnEdge:function(t){if(!this._drawnEdge)throw Error("No edge has been drawn");var e=this._drawnEdge.g,n=this._drawnEdge.attributes,r=e.selectWithoutDataPropagation("title");r.text(t);var i=r.selectAll(function(){return r.node().childNodes});if(n.URL||n.tooltip)var a=e.selectWithoutDataPropagation("g"),o=a.selectWithoutDataPropagation("a"),s=o.selectWithoutDataPropagation("path"),l=o.selectWithoutDataPropagation("polygon");else s=e.selectWithoutDataPropagation("path"),l=e.selectWithoutDataPropagation("polygon");var h=this._selection.selectWithoutDataPropagation("svg").selectWithoutDataPropagation("g"),c=h.datum(),d=this._extractData(e,c.children.length,h.datum()),u=d.children[0],f=u.children[0];if(n.URL||n.tooltip)var p=d.children[1],g=p.children[0],v=g.children[0],y=g.children[1];else v=d.children[1],y=d.children[2];return c.children.push(d),e.datum(d),e.data([d],function(t){return t.key}),r.datum(u),r.data([u],function(t){return[t.key]}),i.datum(f),i.data([f],function(t){return[t.key]}),(n.URL||n.tooltip)&&(a.datum(p),a.data([p],function(t){return[t.key]}),o.datum(g),o.data([g],function(t){return[t.key]})),s.datum(v),s.data([v],function(t){return[t.key]}),l.datum(y),l.data([y],function(t){return[t.key]}),this._drawnEdge=null,this},removeDrawnEdge:W},"removeDrawnEdge",W),k(L,"drawNode",function(t,n,r){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};arguments.length>4&&void 0!==arguments[4]&&arguments[4];A(i);var a=this._selection.selectWithoutDataPropagation("svg").selectWithoutDataPropagation("g").append(function(){return function(t,n){var r="",i=!0,a=!1,o=void 0;try{for(var l,h=Object.keys(n)[Symbol.iterator]();!(i=(l=h.next()).done);i=!0){var c=l.value;null!=n[c]&&(r+=' "'+c+'"="'+n[c]+'"')}}catch(t){a=!0,o=t}finally{try{!i&&h.return&&h.return()}finally{if(a)throw o}}var d=s('graph {"'+t+'" ['+r+"]}",{format:"svg"}),u=(new window.DOMParser).parseFromString(d,"image/svg+xml");return e.select(document.createDocumentFragment()).append(function(){return u.documentElement}).select(".node")}(r,i).node()});return a.datum(null),this._drawnNode={g:a,nodeId:r,x:t,y:n,attributes:i},R(a,t,n,r,i),this}),k(L,"updateDrawnNode",function(t,e,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(!this._drawnNode)throw Error("No node has been drawn");var i=this._drawnNode.g;return null==n&&(n=this._drawnNode.nodeId),A(r,this._drawnNode.attributes),this._drawnNode.nodeId=n,this._drawnNode.x=t,this._drawnNode.y=e,this._drawnNode.attributes=r,R(i,t,e,n,r),this}),k(L,"insertDrawnNode",function(t){if(!this._drawnNode)throw Error("No node has been drawn");null==t&&(t=this._drawnNode.nodeId);var n=this._drawnNode.g,r=this._drawnNode.attributes;if(n.selectWithoutDataPropagation("title").text(t),r.URL||r.tooltip)var i=n.selectWithoutDataPropagation("g").selectWithoutDataPropagation("a"),a=(i.selectWithoutDataPropagation("ellipse,polygon,path,polyline"),i.selectWithoutDataPropagation("text"));else n.selectWithoutDataPropagation("ellipse,polygon,path,polyline"),a=n.selectWithoutDataPropagation("text");a.text(r.label||t);var o=this._selection.selectWithoutDataPropagation("svg").selectWithoutDataPropagation("g"),s=o.datum(),l=this._extractData(n,s.children.length,o.datum());return s.children.push(l),function t(n,r){!function(t,e){t.datum(e),t.data([e],function(t){return t.key})}(n,r),e.selectAll(n.node().childNodes).each(function(n,i){t(e.select(this),r.children[i])})}(n,l),this}),k(L,"removeDrawnNode",U),k(L,"removeDrawnNode",U),L);e.selection.prototype.graphviz=function(t){var e=this.node().__graphviz__;return e?(e.options(t),e._dispatch.call("initEnd",this)):e=new T(this,t),e},e.selection.prototype.selectWithoutDataPropagation=function(t){return e.select(this.size()>0?this.node().querySelector(t):null)},t.graphviz=B,Object.defineProperty(t,"__esModule",{value:!0})});