@antv/hierarchy 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/hierarchy.es.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function t(t,e,i,n="height"){const h=t[n],r=e[n];return"center"===i?(h+r)/2:t.height}const e=Object.assign,i={getId:t=>t.id||t.name,getPreH:t=>t.preH||0,getPreV:t=>t.preV||0,getHGap:t=>t.hgap||18,getVGap:t=>t.vgap||18,getChildren:t=>t.children,getHeight:t=>t.height||36,getWidth(t){const e=t.label||" ";return t.width||18*e.split("").length}};class n{constructor(t,e){if(this.x=0,this.y=0,this.depth=0,this.children=[],this.hgap=0,this.vgap=0,t instanceof n||"x"in t&&"y"in t&&"children"in t){const e=t;return this.data=e.data,this.id=e.id,this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.depth=e.depth,this.children=e.children,this.parent=e.parent,this.hgap=e.hgap,this.vgap=e.vgap,this.preH=e.preH,void(this.preV=e.preV)}this.data=t;const i=e.getHGap(t),h=e.getVGap(t);this.preH=e.getPreH(t),this.preV=e.getPreV(t),this.width=e.getWidth(t),this.height=e.getHeight(t),this.width+=this.preH,this.height+=this.preV,this.id=e.getId(t),this.addGap(i,h)}isRoot(){return 0===this.depth}isLeaf(){return 0===this.children.length}addGap(t,e){this.hgap+=t,this.vgap+=e,this.width+=2*t,this.height+=2*e}eachNode(t){let e,i=[this];for(;e=i.shift();)t(e),i=e.children.concat(i)}DFTraverse(t){this.eachNode(t)}BFTraverse(t){let e,i=[this];for(;e=i.shift();)t(e),i=i.concat(e.children)}getBoundingBox(){const t={left:Number.MAX_VALUE,top:Number.MAX_VALUE,width:0,height:0};return this.eachNode(e=>{t.left=Math.min(t.left,e.x),t.top=Math.min(t.top,e.y),t.width=Math.max(t.width,e.x+e.width),t.height=Math.max(t.height,e.y+e.height)}),t}translate(t=0,e=0){this.eachNode(i=>{i.x+=t,i.y+=e,i.x+=i.preH,i.y+=i.preV})}right2left(){const t=this.getBoundingBox();this.eachNode(e=>{e.x=e.x-2*(e.x-t.left)-e.width}),this.translate(t.width,0)}bottom2top(){const t=this.getBoundingBox();this.eachNode(e=>{e.y=e.y-2*(e.y-t.top)-e.height}),this.translate(0,t.height)}}function h(t,h={},r){h=e({},i,h);const o=new n(t,h),s=[o];let c;if(!r&&!t.collapsed)for(;c=s.shift();)if(!c.data.collapsed){const t=h.getChildren(c.data),e=t?t.length:0;if(c.children=new Array(e),t&&e)for(let i=0;i<e;i++){const e=new n(t[i],h);c.children[i]=e,s.push(e),e.parent=c,e.depth=c.depth+1}}return o}class r{constructor(t,e={}){this.options=e,this.rootNode=h(t,e)}execute(){throw new Error("please override this method")}}let o=class t{constructor(t=0,e=0,i=0,n=[]){this.x=0,this.prelim=0,this.mod=0,this.shift=0,this.change=0,this.tl=null,this.tr=null,this.el=null,this.er=null,this.msel=0,this.mser=0,this.w=t||0,this.h=e||0,this.y=i||0,this.c=n||[],this.cs=n.length}static fromNode(e,i){if(!e)return null;const n=[];return e.children.forEach(e=>{const h=t.fromNode(e,i);h&&n.push(h)}),i?new t(e.height,e.width,e.x,n):new t(e.width,e.height,e.y,n)}};function s(t,e,i){i?t.y+=e:t.x+=e,t.children.forEach(t=>{s(t,e,i)})}function c(t,e){let i=e?t.y:t.x;return t.children.forEach(t=>{i=Math.min(c(t,e),i)}),i}function l(t,e){s(t,-c(t,e),e)}function a(t,e,i){i?e.y=t.x:e.x=t.x,t.c.forEach((t,n)=>{a(t,e.children[n],i)})}function d(t,e,i=0){e?(t.x=i,i+=t.width):(t.y=i,i+=t.height),t.children.forEach(t=>{d(t,e,i)})}function f(t,e={}){const i=e.isHorizontal;function n(t){0===t.cs?(t.el=t,t.er=t,t.msel=t.mser=0):(t.el=t.c[0].el,t.msel=t.c[0].msel,t.er=t.c[t.cs-1].er,t.mser=t.c[t.cs-1].mser)}function h(t,e,i){let n=t.c[e-1],h=n.mod,o=t.c[e],l=o.mod;for(;null!==n&&null!==o;){i&&f(n)>i.low&&(i=i.nxt);const a=h+n.prelim+n.w-(l+o.prelim);a>0&&(l+=a,i&&r(t,e,i.index,a));const d=f(n),g=f(o);d<=g&&(n=c(n),null!==n&&(h+=n.mod)),d>=g&&(o=s(o),null!==o&&(l+=o.mod))}!n&&o?function(t,e,i,n){const h=t.c[0].el;h.tl=i;const r=n-i.mod-t.c[0].msel;h.mod+=r,h.prelim-=r,t.c[0].el=t.c[e].el,t.c[0].msel=t.c[e].msel}(t,e,o,l):n&&!o&&function(t,e,i,n){const h=t.c[e].er;h.tr=i;const r=n-i.mod-t.c[e].mser;h.mod+=r,h.prelim-=r,t.c[e].er=t.c[e-1].er,t.c[e].mser=t.c[e-1].mser}(t,e,n,h)}function r(t,e,i,n){t.c[e].mod+=n,t.c[e].msel+=n,t.c[e].mser+=n,function(t,e,i,n){if(i!==e-1){const h=e-i;t.c[i+1].shift+=n/h,t.c[e].shift-=n/h,t.c[e].change-=n-n/h}}(t,e,i,n)}function s(t){return 0===t.cs?t.tl:t.c[0]}function c(t){return 0===t.cs?t.tr:t.c[t.cs-1]}function f(t){return t.y+t.h}function g(t,e,i){for(;null!==i&&t>=i.low;)i=i.nxt;return{low:t,index:e,nxt:i}}d(t,i);const u=o.fromNode(t,i);return u&&(!function t(e){if(0===e.cs)return void n(e);t(e.c[0]);let i=g(f(e.c[0].el),0,null);for(let n=1;n<e.cs;++n){t(e.c[n]);const r=f(e.c[n].er);h(e,n,i),i=g(r,n,i)}!function(t){t.prelim=(t.c[0].prelim+t.c[0].mod+t.c[t.cs-1].mod+t.c[t.cs-1].prelim+t.c[t.cs-1].w)/2-t.w/2}(e),n(e)}(u),function t(e,i){i+=e.mod,e.x=e.prelim+i,function(t){let e=0,i=0;for(let n=0;n<t.cs;n++)e+=t.c[n].shift,i+=e+t.c[n].change,t.c[n].mod+=i}(e);for(let n=0;n<e.cs;n++)t(e.c[n],i)}(u,0),a(u,t,i),l(t,i)),t}function g(t,e){const i=h(t.data,e,!0),n=h(t.data,e,!0),r=t.children.length,o=Math.round(r/2),s=e.getSide||function(t,e){return e<o?"right":"left"};for(let h=0;h<r;h++){const e=t.children[h];"right"===s(e,h)?n.children.push(e):i.children.push(e)}return i.eachNode(t=>{t.isRoot()||(t.side="left")}),n.eachNode(t=>{t.isRoot()||(t.side="right")}),{left:i,right:n}}const u=["LR","RL","TB","BT","H","V"],p=["LR","RL","H"],x=u[0];function y(t,e,i){const n=e.direction||x;if(e.isHorizontal=(t=>p.indexOf(t)>-1)(n),n&&-1===u.indexOf(n))throw new TypeError(`Invalid direction: ${n}`);if(n===u[0])i(t,e);else if(n===u[1])i(t,e),t.right2left();else if(n===u[2])i(t,e);else if(n===u[3])i(t,e),t.bottom2top();else if(n===u[4]||n===u[5]){const{left:n,right:h}=g(t,e);i(n,e),i(h,e),e.isHorizontal?n.right2left():n.bottom2top(),h.translate(n.x-h.x,n.y-h.y),t.x=n.x,t.y=h.y;const r=t.getBoundingBox();e.isHorizontal?r.top<0&&t.translate(0,-r.top):r.left<0&&t.translate(-r.left,0)}let h=e.fixedRoot;return void 0===h&&(h=!0),h&&t.translate(-(t.x+t.width/2+t.hgap),-(t.y+t.height/2+t.vgap)),function(t,e){if(e.radial){const[i,n]=e.isHorizontal?["x","y"]:["y","x"],h={x:1/0,y:1/0},r={x:-1/0,y:-1/0};let o=0;t.DFTraverse(t=>{o++;const{x:e,y:i}=t;h.x=Math.min(h.x,e),h.y=Math.min(h.y,i),r.x=Math.max(r.x,e),r.y=Math.max(r.y,i)});const s=r[n]-h[n];if(0===s)return;const c=2*Math.PI/o;t.DFTraverse(e=>{const r=e[n],o=h[n],l=e[i],a=t[i],d=(r-o)/s*(2*Math.PI-c)+c,f=l-a;e.x=Math.cos(d)*f,e.y=Math.sin(d)*f})}}(t,e),t}class m extends r{execute(){return y(this.rootNode,this.options,f)}}const w={};function H(t,i){const n=e({},w,i);return new m(t,n).execute()}class N{constructor(t=0,e=[]){this.x=0,this.y=0,this.leftChild=null,this.rightChild=null,this.isLeaf=!1,this.height=t,this.children=e}}const v={isHorizontal:!0,nodeSep:20,nodeSize:20,rankSep:200,subTreeSep:10};function M(t,e,i){i?(e.x=t.x,e.y=t.y):(e.x=t.y,e.y=t.x),t.children.forEach((t,n)=>{M(t,e.children[n],i)})}function E(t,i={}){const n=e({},v,i);let h=0;let r=null;const o=function t(e){e.width=0,e.depth&&e.depth>h&&(h=e.depth);const i=e.children,n=i.length,r=new N(
|
|
1
|
+
function t(t,e,i,n="height"){const h=t[n],r=e[n];return"center"===i?(h+r)/2:t.height}const e=Object.assign,i={getId:t=>t.id||t.name,getPreH:t=>t.preH||0,getPreV:t=>t.preV||0,getHGap:t=>t.hgap||18,getVGap:t=>t.vgap||18,getChildren:t=>t.children,getHeight:t=>t.height||36,getWidth(t){const e=t.label||" ";return t.width||18*e.split("").length}};class n{constructor(t,e){if(this.x=0,this.y=0,this.depth=0,this.children=[],this.hgap=0,this.vgap=0,t instanceof n||"x"in t&&"y"in t&&"children"in t){const e=t;return this.data=e.data,this.id=e.id,this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.depth=e.depth,this.children=e.children,this.parent=e.parent,this.hgap=e.hgap,this.vgap=e.vgap,this.preH=e.preH,void(this.preV=e.preV)}this.data=t;const i=e.getHGap(t),h=e.getVGap(t);this.preH=e.getPreH(t),this.preV=e.getPreV(t),this.width=e.getWidth(t),this.height=e.getHeight(t),this.width+=this.preH,this.height+=this.preV,this.id=e.getId(t),this.addGap(i,h)}isRoot(){return 0===this.depth}isLeaf(){return 0===this.children.length}addGap(t,e){this.hgap+=t,this.vgap+=e,this.width+=2*t,this.height+=2*e}eachNode(t){let e,i=[this];for(;e=i.shift();)t(e),i=e.children.concat(i)}DFTraverse(t){this.eachNode(t)}BFTraverse(t){let e,i=[this];for(;e=i.shift();)t(e),i=i.concat(e.children)}getBoundingBox(){const t={left:Number.MAX_VALUE,top:Number.MAX_VALUE,width:0,height:0};return this.eachNode(e=>{t.left=Math.min(t.left,e.x),t.top=Math.min(t.top,e.y),t.width=Math.max(t.width,e.x+e.width),t.height=Math.max(t.height,e.y+e.height)}),t}translate(t=0,e=0){this.eachNode(i=>{i.x+=t,i.y+=e,i.x+=i.preH,i.y+=i.preV})}right2left(){const t=this.getBoundingBox();this.eachNode(e=>{e.x=e.x-2*(e.x-t.left)-e.width}),this.translate(t.width,0)}bottom2top(){const t=this.getBoundingBox();this.eachNode(e=>{e.y=e.y-2*(e.y-t.top)-e.height}),this.translate(0,t.height)}}function h(t,h={},r){h=e({},i,h);const o=new n(t,h),s=[o];let c;if(!r&&!t.collapsed)for(;c=s.shift();)if(!c.data.collapsed){const t=h.getChildren(c.data),e=t?t.length:0;if(c.children=new Array(e),t&&e)for(let i=0;i<e;i++){const e=new n(t[i],h);c.children[i]=e,s.push(e),e.parent=c,e.depth=c.depth+1}}return o}class r{constructor(t,e={}){this.options=e,this.rootNode=h(t,e)}execute(){throw new Error("please override this method")}}let o=class t{constructor(t=0,e=0,i=0,n=[]){this.x=0,this.prelim=0,this.mod=0,this.shift=0,this.change=0,this.tl=null,this.tr=null,this.el=null,this.er=null,this.msel=0,this.mser=0,this.w=t||0,this.h=e||0,this.y=i||0,this.c=n||[],this.cs=n.length}static fromNode(e,i){if(!e)return null;const n=[];return e.children.forEach(e=>{const h=t.fromNode(e,i);h&&n.push(h)}),i?new t(e.height,e.width,e.x,n):new t(e.width,e.height,e.y,n)}};function s(t,e,i){i?t.y+=e:t.x+=e,t.children.forEach(t=>{s(t,e,i)})}function c(t,e){let i=e?t.y:t.x;return t.children.forEach(t=>{i=Math.min(c(t,e),i)}),i}function l(t,e){s(t,-c(t,e),e)}function a(t,e,i){i?e.y=t.x:e.x=t.x,t.c.forEach((t,n)=>{a(t,e.children[n],i)})}function d(t,e,i=0){e?(t.x=i,i+=t.width):(t.y=i,i+=t.height),t.children.forEach(t=>{d(t,e,i)})}function f(t,e={}){const i=e.isHorizontal;function n(t){0===t.cs?(t.el=t,t.er=t,t.msel=t.mser=0):(t.el=t.c[0].el,t.msel=t.c[0].msel,t.er=t.c[t.cs-1].er,t.mser=t.c[t.cs-1].mser)}function h(t,e,i){let n=t.c[e-1],h=n.mod,o=t.c[e],l=o.mod;for(;null!==n&&null!==o;){i&&f(n)>i.low&&(i=i.nxt);const a=h+n.prelim+n.w-(l+o.prelim);a>0&&(l+=a,i&&r(t,e,i.index,a));const d=f(n),g=f(o);d<=g&&(n=c(n),null!==n&&(h+=n.mod)),d>=g&&(o=s(o),null!==o&&(l+=o.mod))}!n&&o?function(t,e,i,n){const h=t.c[0].el;h.tl=i;const r=n-i.mod-t.c[0].msel;h.mod+=r,h.prelim-=r,t.c[0].el=t.c[e].el,t.c[0].msel=t.c[e].msel}(t,e,o,l):n&&!o&&function(t,e,i,n){const h=t.c[e].er;h.tr=i;const r=n-i.mod-t.c[e].mser;h.mod+=r,h.prelim-=r,t.c[e].er=t.c[e-1].er,t.c[e].mser=t.c[e-1].mser}(t,e,n,h)}function r(t,e,i,n){t.c[e].mod+=n,t.c[e].msel+=n,t.c[e].mser+=n,function(t,e,i,n){if(i!==e-1){const h=e-i;t.c[i+1].shift+=n/h,t.c[e].shift-=n/h,t.c[e].change-=n-n/h}}(t,e,i,n)}function s(t){return 0===t.cs?t.tl:t.c[0]}function c(t){return 0===t.cs?t.tr:t.c[t.cs-1]}function f(t){return t.y+t.h}function g(t,e,i){for(;null!==i&&t>=i.low;)i=i.nxt;return{low:t,index:e,nxt:i}}d(t,i);const u=o.fromNode(t,i);return u&&(!function t(e){if(0===e.cs)return void n(e);t(e.c[0]);let i=g(f(e.c[0].el),0,null);for(let n=1;n<e.cs;++n){t(e.c[n]);const r=f(e.c[n].er);h(e,n,i),i=g(r,n,i)}!function(t){t.prelim=(t.c[0].prelim+t.c[0].mod+t.c[t.cs-1].mod+t.c[t.cs-1].prelim+t.c[t.cs-1].w)/2-t.w/2}(e),n(e)}(u),function t(e,i){i+=e.mod,e.x=e.prelim+i,function(t){let e=0,i=0;for(let n=0;n<t.cs;n++)e+=t.c[n].shift,i+=e+t.c[n].change,t.c[n].mod+=i}(e);for(let n=0;n<e.cs;n++)t(e.c[n],i)}(u,0),a(u,t,i),l(t,i)),t}function g(t,e){const i=h(t.data,e,!0),n=h(t.data,e,!0),r=t.children.length,o=Math.round(r/2),s=e.getSide||function(t,e){return e<o?"right":"left"};for(let h=0;h<r;h++){const e=t.children[h];"right"===s(e,h)?n.children.push(e):i.children.push(e)}return i.eachNode(t=>{t.isRoot()||(t.side="left")}),n.eachNode(t=>{t.isRoot()||(t.side="right")}),{left:i,right:n}}const u=["LR","RL","TB","BT","H","V"],p=["LR","RL","H"],x=u[0];function y(t,e,i){const n=e.direction||x;if(e.isHorizontal=(t=>p.indexOf(t)>-1)(n),n&&-1===u.indexOf(n))throw new TypeError(`Invalid direction: ${n}`);if(n===u[0])i(t,e);else if(n===u[1])i(t,e),t.right2left();else if(n===u[2])i(t,e);else if(n===u[3])i(t,e),t.bottom2top();else if(n===u[4]||n===u[5]){const{left:n,right:h}=g(t,e);i(n,e),i(h,e),e.isHorizontal?n.right2left():n.bottom2top(),h.translate(n.x-h.x,n.y-h.y),t.x=n.x,t.y=h.y;const r=t.getBoundingBox();e.isHorizontal?r.top<0&&t.translate(0,-r.top):r.left<0&&t.translate(-r.left,0)}let h=e.fixedRoot;return void 0===h&&(h=!0),h&&t.translate(-(t.x+t.width/2+t.hgap),-(t.y+t.height/2+t.vgap)),function(t,e){if(e.radial){const[i,n]=e.isHorizontal?["x","y"]:["y","x"],h={x:1/0,y:1/0},r={x:-1/0,y:-1/0};let o=0;t.DFTraverse(t=>{o++;const{x:e,y:i}=t;h.x=Math.min(h.x,e),h.y=Math.min(h.y,i),r.x=Math.max(r.x,e),r.y=Math.max(r.y,i)});const s=r[n]-h[n];if(0===s)return;const c=2*Math.PI/o;t.DFTraverse(e=>{const r=e[n],o=h[n],l=e[i],a=t[i],d=(r-o)/s*(2*Math.PI-c)+c,f=l-a;e.x=Math.cos(d)*f,e.y=Math.sin(d)*f})}}(t,e),t}class m extends r{execute(){return y(this.rootNode,this.options,f)}}const w={};function H(t,i){const n=e({},w,i);return new m(t,n).execute()}class N{constructor(t=0,e=[]){this.x=0,this.y=0,this.leftChild=null,this.rightChild=null,this.isLeaf=!1,this.height=t,this.children=e}}const v={isHorizontal:!0,nodeSep:20,nodeSize:20,rankSep:200,subTreeSep:10};function M(t,e,i){i?(e.x=t.x,e.y=t.y):(e.x=t.y,e.y=t.x),t.children.forEach((t,n)=>{M(t,e.children[n],i)})}function E(t,i={}){const n=e({},v,i);let h=0;let r=null;const o=function t(e){e.width=0,e.depth&&e.depth>h&&(h=e.depth);const i=e.children,n=i.length,r=new N(0,[]);return i.forEach((e,i)=>{const h=t(e);r.children.push(h),0===i&&(r.leftChild=h),i===n-1&&(r.rightChild=h)}),r.originNode=e,r.isLeaf=e.isLeaf(),r}(t);return function t(e){if(e.isLeaf||0===e.children.length)e.drawingDepth=h;else{const i=e.children.map(e=>t(e)),n=Math.min(...i);e.drawingDepth=n-1}return e.drawingDepth}(o),function t(e){e.x=e.drawingDepth*n.rankSep,e.isLeaf?(e.y=0,r&&(e.y=r.y+r.height+n.nodeSep,e.originNode.parent!==r.originNode.parent&&(e.y+=n.subTreeSep)),r=e):(e.children.forEach(e=>{t(e)}),e.y=(e.leftChild.y+e.rightChild.y)/2)}(o),M(o,t,n.isHorizontal),t}class B extends r{execute(){return this.rootNode.width=0,y(this.rootNode,this.options,E)}}const T={};function S(t,i){const n=e({},T,i);return new B(t,n).execute()}function b(e,i,n,h){let r=null;e.eachNode(e=>{!function(e,i,n,h,r){const o=("function"==typeof n?n(e):n)*e.depth;if(!h)try{if(e.parent&&e.id===e.parent.children[0].id)return e.x+=o,void(e.y=i?i.y:0)}catch{}if(e.x+=o,i){if(e.y=i.y+t(i,e,r),i.parent&&e.parent&&e.parent.id!==i.parent.id){const n=i.parent,h=n.y+t(n,e,r);e.y=h>e.y?h:e.y}}else e.y=0}(e,r,i,n,h),r=e})}const L=["LR","RL","H"],V=L[0];class R extends r{execute(){const t=this.options,e=this.rootNode;t.isHorizontal=!0;const{indent:i=20,dropCap:n=!0,direction:h=V,align:r}=t;if(h&&-1===L.indexOf(h))throw new TypeError(`Invalid direction: ${h}`);if(h===L[0])b(e,i,n,r);else if(h===L[1])b(e,i,n,r),e.right2left();else if(h===L[2]){const{left:h,right:o}=g(e,t);b(h,i,n,r),h.right2left(),b(o,i,n,r);const s=h.getBoundingBox();o.translate(s.width,0),e.x=o.x-e.width/2}return e}}const z={};function C(t,i){const n=e({},z,i);return new R(t,n).execute()}function D(t,e){let i=0;return t.children.length?t.children.forEach(t=>{i+=D(t,e)}):i=t.height,t._subTreeSep=e.getSubTreeSep(t.data),t.totalHeight=Math.max(t.height,i)+2*t._subTreeSep,t.totalHeight}function Y(t){const e=t.children,i=e.length;if(i){e.forEach(t=>{Y(t)});const n=e[0],h=e[i-1],r=h.y-n.y+h.height;let o=0;if(e.forEach(t=>{o+=t.totalHeight}),r>t.height)t.y=n.y+r/2-t.height/2;else if(1!==e.length||t.height>o){const i=t.y+(t.height-r)/2-n.y;e.forEach(t=>{t.translate(0,i)})}else t.y=(n.y+n.height/2+h.y+h.height/2)/2-t.height/2}}const G={getSubTreeSep:()=>0};function I(t,i={}){return i=e({},G,i),t.parent={x:0,width:0,height:0,y:0},t.BFTraverse(t=>{t.x=t.parent.x+t.parent.width}),t.parent=void 0,D(t,i),t.startY=0,t.y=t.totalHeight/2-t.height/2,t.eachNode(t=>{const e=t.children,i=e.length;if(i){const n=e[0];if(n.startY=t.startY+t._subTreeSep,1===i)n.y=t.y+t.height/2-n.height/2;else{n.y=n.startY+n.totalHeight/2-n.height/2;for(let t=1;t<i;t++){const i=e[t];i.startY=e[t-1].startY+e[t-1].totalHeight,i.y=i.startY+i.totalHeight/2-i.height/2}}}}),Y(t),t}class P extends r{execute(){return y(this.rootNode,this.options,I)}}const A={};function F(t,i){const n=e({},A,i);return new P(t,n).execute()}const _={compactBox:H,dendrogram:S,indented:C,mindmap:F},O="0.7.0";export{H as compactBox,_ as default,S as dendrogram,C as indented,F as mindmap,O as version};
|
|
2
2
|
//# sourceMappingURL=hierarchy.es.js.map
|
package/dist/hierarchy.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.es.js","sources":["../src/util.ts","../src/layout/hierarchy.ts","../src/layout/base.ts","../src/layout/non-layered-tidy.ts","../src/layout/separate-root.ts","../src/layout/do-layout.ts","../src/compact-box.ts","../src/layout/dendrogram.ts","../src/dendrogram.ts","../src/layout/indented.ts","../src/indented.ts","../src/layout/mindmap.ts","../src/mindmap.ts","../src/index.ts"],"sourcesContent":["import type { HierarchyNode } from './types';\n\n/**\n * Get average height or height for node's position calculation, according to align.\n * @param preNode previous node\n * @param node current node, whose position is going to be calculated\n * @param align 'center' means nodes align at the center, other value means align at the left-top\n * @param heightField field name for height value on preNode and node\n * @return the height for calculation\n */\nexport function getHeight(\n preNode: HierarchyNode,\n node: HierarchyNode,\n align?: 'center' | undefined,\n heightField: keyof HierarchyNode = 'height',\n): number {\n const preNodeHeight = preNode[heightField] as number;\n const nodeHeight = node[heightField] as number;\n return align === 'center' ? (preNodeHeight + nodeHeight) / 2 : preNode.height;\n}\n\nexport const assign = Object.assign;\n","import { assign } from '../util';\nimport type { HierarchyData, HierarchyNode, HierarchyOptions, BoundingBox } from '../types';\n\nconst PEM = 18;\nconst DEFAULT_HEIGHT = PEM * 2;\nconst DEFAULT_GAP = PEM;\n\nconst DEFAULT_OPTIONS: Required<\n Pick<\n HierarchyOptions,\n | 'getId'\n | 'getPreH'\n | 'getPreV'\n | 'getHGap'\n | 'getVGap'\n | 'getChildren'\n | 'getHeight'\n | 'getWidth'\n >\n> = {\n getId(d: HierarchyData): string {\n return (d.id || d.name) as string;\n },\n getPreH(d: HierarchyData): number {\n return d.preH || 0;\n },\n getPreV(d: HierarchyData): number {\n return d.preV || 0;\n },\n getHGap(d: HierarchyData): number {\n return d.hgap || DEFAULT_GAP;\n },\n getVGap(d: HierarchyData): number {\n return d.vgap || DEFAULT_GAP;\n },\n getChildren(d: HierarchyData): HierarchyData[] | undefined {\n return d.children;\n },\n getHeight(d: HierarchyData): number {\n return d.height || DEFAULT_HEIGHT;\n },\n getWidth(d: HierarchyData): number {\n const label = d.label || ' ';\n return d.width || label.split('').length * PEM; // FIXME DO NOT get width like this\n },\n};\n\nclass Node implements HierarchyNode {\n data: HierarchyData;\n id: string;\n x: number = 0;\n y: number = 0;\n width: number;\n height: number;\n depth: number = 0;\n children: HierarchyNode[] = [];\n parent?: HierarchyNode;\n hgap: number = 0;\n vgap: number = 0;\n preH: number;\n preV: number;\n\n constructor(data: HierarchyData | HierarchyNode, options: HierarchyOptions) {\n if (data instanceof Node || ('x' in data && 'y' in data && 'children' in data)) {\n // If it's already a Node, cast and return\n const node = data as Node;\n this.data = node.data;\n this.id = node.id;\n this.x = node.x;\n this.y = node.y;\n this.width = node.width;\n this.height = node.height;\n this.depth = node.depth;\n this.children = node.children;\n this.parent = node.parent;\n this.hgap = node.hgap;\n this.vgap = node.vgap;\n this.preH = node.preH;\n this.preV = node.preV;\n return;\n }\n\n this.data = data as HierarchyData;\n\n /*\n * Gaps: filling space between nodes\n * (x, y) ----------------------\n * | vgap |\n * | -------------------- h\n * | h | | e\n * | g | | i\n * | a | | g\n * | p | | h\n * | --------------------- t\n * | |\n * -----------width------------\n */\n const hgap = options.getHGap!(data);\n const vgap = options.getVGap!(data);\n this.preH = options.getPreH!(data);\n this.preV = options.getPreV!(data);\n this.width = options.getWidth!(data);\n this.height = options.getHeight!(data);\n this.width += this.preH;\n this.height += this.preV;\n this.id = options.getId!(data);\n\n this.addGap(hgap, vgap);\n }\n\n isRoot(): boolean {\n return this.depth === 0;\n }\n\n isLeaf(): boolean {\n return this.children.length === 0;\n }\n\n addGap(hgap: number, vgap: number): void {\n this.hgap += hgap;\n this.vgap += vgap;\n this.width += 2 * hgap;\n this.height += 2 * vgap;\n }\n\n eachNode(callback: (node: HierarchyNode) => void): void {\n let nodes: HierarchyNode[] = [this];\n let current: HierarchyNode | undefined;\n while ((current = nodes.shift())) {\n callback(current);\n nodes = current.children.concat(nodes);\n }\n }\n\n DFTraverse(callback: (node: HierarchyNode) => void): void {\n this.eachNode(callback);\n }\n\n BFTraverse(callback: (node: HierarchyNode) => void): void {\n let nodes: HierarchyNode[] = [this];\n let current: HierarchyNode | undefined;\n while ((current = nodes.shift())) {\n callback(current);\n nodes = nodes.concat(current.children);\n }\n }\n\n getBoundingBox(): BoundingBox {\n const bb: BoundingBox = {\n left: Number.MAX_VALUE,\n top: Number.MAX_VALUE,\n width: 0,\n height: 0,\n };\n this.eachNode((node) => {\n bb.left = Math.min(bb.left, node.x);\n bb.top = Math.min(bb.top, node.y);\n bb.width = Math.max(bb.width, node.x + node.width);\n bb.height = Math.max(bb.height, node.y + node.height);\n });\n return bb;\n }\n\n translate(tx: number = 0, ty: number = 0): void {\n this.eachNode((node) => {\n node.x += tx;\n node.y += ty;\n node.x += node.preH;\n node.y += node.preV;\n });\n }\n\n right2left(): void {\n const bb = this.getBoundingBox();\n this.eachNode((node) => {\n node.x = node.x - (node.x - bb.left) * 2 - node.width;\n });\n this.translate(bb.width, 0);\n }\n\n bottom2top(): void {\n const bb = this.getBoundingBox();\n this.eachNode((node) => {\n node.y = node.y - (node.y - bb.top) * 2 - node.height;\n });\n this.translate(0, bb.height);\n }\n}\n\nexport default function hierarchy(\n data: HierarchyData,\n options: HierarchyOptions = {},\n isolated?: boolean,\n): HierarchyNode {\n options = assign({}, DEFAULT_OPTIONS, options);\n const root = new Node(data, options);\n const nodes: HierarchyNode[] = [root];\n let node: HierarchyNode | undefined;\n\n if (!isolated && !data.collapsed) {\n while ((node = nodes.shift())) {\n if (!node.data.collapsed) {\n const children = options.getChildren!(node.data);\n const length = children ? children.length : 0;\n node.children = new Array(length);\n if (children && length) {\n for (let i = 0; i < length; i++) {\n const child = new Node(children[i], options);\n node.children[i] = child;\n nodes.push(child);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n }\n }\n\n return root;\n}\n","import hierarchy from './hierarchy';\nimport type { HierarchyData, HierarchyNode, HierarchyOptions } from '../types';\n\nexport default class Layout {\n options: HierarchyOptions;\n rootNode: HierarchyNode;\n\n constructor(root: HierarchyData, options: HierarchyOptions = {}) {\n this.options = options;\n this.rootNode = hierarchy(root, options);\n }\n\n execute(): HierarchyNode {\n throw new Error('please override this method');\n }\n}\n","import type { HierarchyNode, HierarchyOptions } from '../types';\n\ninterface WrappedTreeNode {\n w: number;\n h: number;\n y: number;\n x: number;\n c: WrappedTreeNode[];\n cs: number;\n prelim: number;\n mod: number;\n shift: number;\n change: number;\n tl: WrappedTreeNode | null;\n tr: WrappedTreeNode | null;\n el: WrappedTreeNode | null;\n er: WrappedTreeNode | null;\n msel: number;\n mser: number;\n}\n\nclass WrappedTree implements WrappedTreeNode {\n w: number;\n h: number;\n y: number;\n x: number = 0;\n c: WrappedTreeNode[];\n cs: number;\n prelim: number = 0;\n mod: number = 0;\n shift: number = 0;\n change: number = 0;\n tl: WrappedTreeNode | null = null;\n tr: WrappedTreeNode | null = null;\n el: WrappedTreeNode | null = null;\n er: WrappedTreeNode | null = null;\n msel: number = 0;\n mser: number = 0;\n\n constructor(w: number = 0, h: number = 0, y: number = 0, c: WrappedTreeNode[] = []) {\n this.w = w || 0;\n this.h = h || 0;\n this.y = y || 0;\n this.c = c || [];\n this.cs = c.length;\n }\n\n static fromNode(root: HierarchyNode | null, isHorizontal?: boolean): WrappedTreeNode | null {\n if (!root) return null;\n const children: WrappedTreeNode[] = [];\n root.children.forEach((child) => {\n const wrappedChild = WrappedTree.fromNode(child, isHorizontal);\n if (wrappedChild) children.push(wrappedChild);\n });\n if (isHorizontal) {\n return new WrappedTree(root.height, root.width, root.x, children);\n }\n return new WrappedTree(root.width, root.height, root.y, children);\n }\n}\n\nfunction moveRight(node: HierarchyNode, move: number, isHorizontal?: boolean): void {\n if (isHorizontal) {\n node.y += move;\n } else {\n node.x += move;\n }\n node.children.forEach((child) => {\n moveRight(child, move, isHorizontal);\n });\n}\n\nfunction getMin(node: HierarchyNode, isHorizontal?: boolean): number {\n let res = isHorizontal ? node.y : node.x;\n node.children.forEach((child) => {\n res = Math.min(getMin(child, isHorizontal), res);\n });\n return res;\n}\n\nfunction normalize(node: HierarchyNode, isHorizontal?: boolean): void {\n const min = getMin(node, isHorizontal);\n moveRight(node, -min, isHorizontal);\n}\n\nfunction convertBack(\n converted: WrappedTreeNode,\n root: HierarchyNode,\n isHorizontal?: boolean,\n): void {\n if (isHorizontal) {\n root.y = converted.x;\n } else {\n root.x = converted.x;\n }\n converted.c.forEach((child, i) => {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nfunction layer(node: HierarchyNode, isHorizontal?: boolean, d: number = 0): void {\n if (isHorizontal) {\n node.x = d;\n d += node.width;\n } else {\n node.y = d;\n d += node.height;\n }\n node.children.forEach((child) => {\n layer(child, isHorizontal, d);\n });\n}\n\ninterface IYL {\n low: number;\n index: number;\n nxt: IYL | null;\n}\n\nexport default function nonLayeredTidy(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n const isHorizontal = options.isHorizontal;\n\n function firstWalk(t: WrappedTreeNode): void {\n if (t.cs === 0) {\n setExtremes(t);\n return;\n }\n firstWalk(t.c[0]);\n let ih: IYL | null = updateIYL(bottom(t.c[0].el!), 0, null);\n for (let i = 1; i < t.cs; ++i) {\n firstWalk(t.c[i]);\n const min = bottom(t.c[i].er!);\n separate(t, i, ih);\n ih = updateIYL(min, i, ih);\n }\n positionRoot(t);\n setExtremes(t);\n }\n\n function setExtremes(t: WrappedTreeNode): void {\n if (t.cs === 0) {\n t.el = t;\n t.er = t;\n t.msel = t.mser = 0;\n } else {\n t.el = t.c[0].el;\n t.msel = t.c[0].msel;\n t.er = t.c[t.cs - 1].er;\n t.mser = t.c[t.cs - 1].mser;\n }\n }\n\n function separate(t: WrappedTreeNode, i: number, ih: IYL | null): void {\n let sr: WrappedTreeNode | null = t.c[i - 1];\n let mssr = sr.mod;\n let cl: WrappedTreeNode | null = t.c[i];\n let mscl = cl.mod;\n while (sr !== null && cl !== null) {\n if (ih && bottom(sr) > ih.low) ih = ih.nxt;\n const dist = mssr + sr.prelim + sr.w - (mscl + cl.prelim);\n if (dist > 0) {\n mscl += dist;\n if (ih) moveSubtree(t, i, ih.index, dist);\n }\n const sy = bottom(sr);\n const cy = bottom(cl);\n if (sy <= cy) {\n sr = nextRightContour(sr);\n if (sr !== null) mssr += sr.mod;\n }\n if (sy >= cy) {\n cl = nextLeftContour(cl);\n if (cl !== null) mscl += cl.mod;\n }\n }\n if (!sr && !!cl) {\n setLeftThread(t, i, cl, mscl);\n } else if (!!sr && !cl) {\n setRightThread(t, i, sr, mssr);\n }\n }\n\n function moveSubtree(t: WrappedTreeNode, i: number, si: number, dist: number): void {\n t.c[i].mod += dist;\n t.c[i].msel += dist;\n t.c[i].mser += dist;\n distributeExtra(t, i, si, dist);\n }\n\n function nextLeftContour(t: WrappedTreeNode): WrappedTreeNode | null {\n return t.cs === 0 ? t.tl : t.c[0];\n }\n\n function nextRightContour(t: WrappedTreeNode): WrappedTreeNode | null {\n return t.cs === 0 ? t.tr : t.c[t.cs - 1];\n }\n\n function bottom(t: WrappedTreeNode): number {\n return t.y + t.h;\n }\n\n function setLeftThread(\n t: WrappedTreeNode,\n i: number,\n cl: WrappedTreeNode,\n modsumcl: number,\n ): void {\n const li = t.c[0].el!;\n li.tl = cl;\n const diff = modsumcl - cl.mod - t.c[0].msel;\n li.mod += diff;\n li.prelim -= diff;\n t.c[0].el = t.c[i].el;\n t.c[0].msel = t.c[i].msel;\n }\n\n function setRightThread(\n t: WrappedTreeNode,\n i: number,\n sr: WrappedTreeNode,\n modsumsr: number,\n ): void {\n const ri = t.c[i].er!;\n ri.tr = sr;\n const diff = modsumsr - sr.mod - t.c[i].mser;\n ri.mod += diff;\n ri.prelim -= diff;\n t.c[i].er = t.c[i - 1].er;\n t.c[i].mser = t.c[i - 1].mser;\n }\n\n function positionRoot(t: WrappedTreeNode): void {\n t.prelim =\n (t.c[0].prelim + t.c[0].mod + t.c[t.cs - 1].mod + t.c[t.cs - 1].prelim + t.c[t.cs - 1].w) /\n 2 -\n t.w / 2;\n }\n\n function secondWalk(t: WrappedTreeNode, modsum: number): void {\n modsum += t.mod;\n t.x = t.prelim + modsum;\n addChildSpacing(t);\n for (let i = 0; i < t.cs; i++) {\n secondWalk(t.c[i], modsum);\n }\n }\n\n function distributeExtra(t: WrappedTreeNode, i: number, si: number, dist: number): void {\n if (si !== i - 1) {\n const nr = i - si;\n t.c[si + 1].shift += dist / nr;\n t.c[i].shift -= dist / nr;\n t.c[i].change -= dist - dist / nr;\n }\n }\n\n function addChildSpacing(t: WrappedTreeNode): void {\n let d = 0;\n let modsumdelta = 0;\n for (let i = 0; i < t.cs; i++) {\n d += t.c[i].shift;\n modsumdelta += d + t.c[i].change;\n t.c[i].mod += modsumdelta;\n }\n }\n\n function updateIYL(low: number, index: number, ih: IYL | null): IYL {\n while (ih !== null && low >= ih.low) {\n ih = ih.nxt;\n }\n return {\n low,\n index,\n nxt: ih,\n };\n }\n\n // do layout\n layer(root, isHorizontal);\n const wt = WrappedTree.fromNode(root, isHorizontal);\n if (wt) {\n firstWalk(wt);\n secondWalk(wt, 0);\n convertBack(wt, root, isHorizontal);\n normalize(root, isHorizontal);\n }\n\n return root;\n}\n","import hierarchy from './hierarchy';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\nexport default function separateRoot(\n root: HierarchyNode,\n options: HierarchyOptions,\n): { left: HierarchyNode; right: HierarchyNode } {\n // separate into left and right trees\n const left = hierarchy(root.data, options, true); // root only\n const right = hierarchy(root.data, options, true); // root only\n\n // automatically\n const treeSize = root.children.length;\n const rightTreeSize = Math.round(treeSize / 2);\n\n // separate left and right tree by meta data\n const getSide =\n options.getSide ||\n function (_child: HierarchyNode, index: number): 'left' | 'right' {\n if (index < rightTreeSize) {\n return 'right';\n }\n return 'left';\n };\n\n for (let i = 0; i < treeSize; i++) {\n const child = root.children[i];\n const side = getSide(child, i);\n if (side === 'right') {\n right.children.push(child);\n } else {\n left.children.push(child);\n }\n }\n\n left.eachNode((node) => {\n if (!node.isRoot()) {\n node.side = 'left';\n }\n });\n\n right.eachNode((node) => {\n if (!node.isRoot()) {\n node.side = 'right';\n }\n });\n\n return {\n left,\n right,\n };\n}\n","import separateTree from './separate-root';\nimport type { HierarchyNode, HierarchyOptions, Direction } from '../types';\n\nconst VALID_DIRECTIONS: Direction[] = [\n 'LR', // left to right\n 'RL', // right to left\n 'TB', // top to bottom\n 'BT', // bottom to top\n 'H', // horizontal\n 'V', // vertical\n];\n\nconst HORIZONTAL_DIRECTIONS: Direction[] = ['LR', 'RL', 'H'];\n\nconst isHorizontal = (direction: Direction): boolean =>\n HORIZONTAL_DIRECTIONS.indexOf(direction) > -1;\n\nconst DEFAULT_DIRECTION: Direction = VALID_DIRECTIONS[0];\n\ntype LayoutAlgorithm = (root: HierarchyNode, options: HierarchyOptions) => HierarchyNode;\n\nexport default function doLayout(\n root: HierarchyNode,\n options: HierarchyOptions,\n layoutAlgorithm: LayoutAlgorithm,\n): HierarchyNode {\n const direction = options.direction || DEFAULT_DIRECTION;\n options.isHorizontal = isHorizontal(direction);\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError(`Invalid direction: ${direction}`);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n layoutAlgorithm(root, options);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n layoutAlgorithm(root, options);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // TB\n layoutAlgorithm(root, options);\n } else if (direction === VALID_DIRECTIONS[3]) {\n // BT\n layoutAlgorithm(root, options);\n root.bottom2top();\n } else if (direction === VALID_DIRECTIONS[4] || direction === VALID_DIRECTIONS[5]) {\n // H or V\n // separate into left and right trees\n const { left, right } = separateTree(root, options);\n // do layout for left and right trees\n layoutAlgorithm(left, options);\n layoutAlgorithm(right, options);\n if (options.isHorizontal) {\n left.right2left();\n } else {\n left.bottom2top();\n }\n // combine left and right trees\n right.translate(left.x - right.x, left.y - right.y);\n // translate root\n root.x = left.x;\n root.y = right.y;\n const bb = root.getBoundingBox();\n if (options.isHorizontal) {\n if (bb.top < 0) {\n root.translate(0, -bb.top);\n }\n } else {\n if (bb.left < 0) {\n root.translate(-bb.left, 0);\n }\n }\n }\n\n // fixed root position, default value is true\n let fixedRoot = options.fixedRoot;\n if (fixedRoot === undefined) fixedRoot = true;\n if (fixedRoot) {\n root.translate(-(root.x + root.width / 2 + root.hgap), -(root.y + root.height / 2 + root.vgap));\n }\n\n reassignXYIfRadial(root, options);\n\n return root;\n}\n\nfunction reassignXYIfRadial(root: HierarchyNode, options: HierarchyOptions): void {\n if (options.radial) {\n const [rScale, radScale] = options.isHorizontal ? ['x', 'y'] : ['y', 'x'];\n\n const min = { x: Infinity, y: Infinity };\n const max = { x: -Infinity, y: -Infinity };\n\n let count = 0;\n root.DFTraverse((node) => {\n count++;\n const { x, y } = node;\n min.x = Math.min(min.x, x);\n min.y = Math.min(min.y, y);\n max.x = Math.max(max.x, x);\n max.y = Math.max(max.y, y);\n });\n\n const radDiff = max[radScale as 'x' | 'y'] - min[radScale as 'x' | 'y'];\n if (radDiff === 0) return;\n\n const avgRad = (Math.PI * 2) / count;\n root.DFTraverse((node) => {\n const nodeRadScale = node[radScale as 'x' | 'y'];\n const minRadScale = min[radScale as 'x' | 'y'];\n const nodeRScale = node[rScale as 'x' | 'y'];\n const rootRScale = root[rScale as 'x' | 'y'];\n\n const rad = ((nodeRadScale - minRadScale) / radDiff) * (Math.PI * 2 - avgRad) + avgRad;\n const r = nodeRScale - rootRScale;\n node.x = Math.cos(rad) * r;\n node.y = Math.sin(rad) * r;\n });\n }\n}\n","import TreeLayout from './layout/base';\nimport nonLayeredTidyTree from './layout/non-layered-tidy';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, CompactBoxOptions } from './types';\n\nclass CompactBoxTreeLayout extends TreeLayout {\n execute(): HierarchyNode {\n return doTreeLayout(this.rootNode, this.options, nonLayeredTidyTree);\n }\n}\n\nconst DEFAULT_OPTIONS: CompactBoxOptions = {};\n\nexport default function compactBoxLayout(\n root: HierarchyData,\n options?: CompactBoxOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new CompactBoxTreeLayout(root, mergedOptions).execute();\n}\n","import { assign } from '../util';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\ninterface WrappedTreeNode {\n x: number;\n y: number;\n height: number;\n leftChild: WrappedTreeNode | null;\n rightChild: WrappedTreeNode | null;\n children: WrappedTreeNode[];\n originNode: HierarchyNode;\n isLeaf: boolean;\n drawingDepth?: number;\n}\n\nclass WrappedTree implements WrappedTreeNode {\n x: number = 0;\n y: number = 0;\n height: number;\n leftChild: WrappedTreeNode | null = null;\n rightChild: WrappedTreeNode | null = null;\n children: WrappedTreeNode[];\n originNode!: HierarchyNode;\n isLeaf: boolean = false;\n\n constructor(height: number = 0, children: WrappedTreeNode[] = []) {\n this.height = height;\n this.children = children;\n }\n}\n\nconst DEFAULT_OPTIONS = {\n isHorizontal: true,\n nodeSep: 20,\n nodeSize: 20,\n rankSep: 200,\n subTreeSep: 10,\n};\n\nfunction convertBack(converted: WrappedTreeNode, root: HierarchyNode, isHorizontal: boolean): void {\n if (isHorizontal) {\n root.x = converted.x;\n root.y = converted.y;\n } else {\n root.x = converted.y;\n root.y = converted.x;\n }\n converted.children.forEach((child, i) => {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nexport default function dendrogram(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n\n let maxDepth = 0;\n\n function wrappedTreeFromNode(n: HierarchyNode): WrappedTreeNode {\n n.width = 0;\n if (n.depth && n.depth > maxDepth) {\n maxDepth = n.depth;\n }\n const children = n.children;\n const childrenCount = children.length;\n const t = new WrappedTree(n.height, []);\n children.forEach((child, i) => {\n const childWT = wrappedTreeFromNode(child);\n t.children.push(childWT);\n if (i === 0) {\n t.leftChild = childWT;\n }\n if (i === childrenCount - 1) {\n t.rightChild = childWT;\n }\n });\n t.originNode = n;\n t.isLeaf = n.isLeaf();\n return t;\n }\n\n function getDrawingDepth(t: WrappedTreeNode): number {\n if (t.isLeaf || t.children.length === 0) {\n t.drawingDepth = maxDepth;\n } else {\n const depths = t.children.map((child) => getDrawingDepth(child));\n const minChildDepth = Math.min(...depths);\n t.drawingDepth = minChildDepth - 1;\n }\n return t.drawingDepth;\n }\n\n let prevLeaf: WrappedTreeNode | null = null;\n\n function position(t: WrappedTreeNode): void {\n t.x = t.drawingDepth! * mergedOptions.rankSep;\n if (t.isLeaf) {\n t.y = 0;\n if (prevLeaf) {\n t.y = prevLeaf.y + prevLeaf.height + mergedOptions.nodeSep;\n if (t.originNode.parent !== prevLeaf.originNode.parent) {\n t.y += mergedOptions.subTreeSep;\n }\n }\n prevLeaf = t;\n } else {\n t.children.forEach((child) => {\n position(child);\n });\n t.y = (t.leftChild!.y + t.rightChild!.y) / 2;\n }\n }\n\n const wt = wrappedTreeFromNode(root);\n getDrawingDepth(wt);\n position(wt);\n convertBack(wt, root, mergedOptions.isHorizontal);\n\n return root;\n}\n","import TreeLayout from './layout/base';\nimport dendrogram from './layout/dendrogram';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, DendrogramOptions } from './types';\n\nclass DendrogramLayout extends TreeLayout {\n execute(): HierarchyNode {\n this.rootNode.width = 0;\n return doTreeLayout(this.rootNode, this.options, dendrogram);\n }\n}\n\nconst DEFAULT_OPTIONS: DendrogramOptions = {};\n\nexport default function dendrogramLayout(\n root: HierarchyData,\n options?: DendrogramOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new DendrogramLayout(root, mergedOptions).execute();\n}\n","import { getHeight } from '../util';\nimport type { HierarchyNode } from '../types';\n\nfunction positionNode(\n node: HierarchyNode,\n previousNode: HierarchyNode | null,\n indent: number | ((node: HierarchyNode) => number),\n dropCap: boolean,\n align?: 'center' | undefined,\n): void {\n // calculate the node's horizontal offset DX, dx's type might be number or function\n const displacementX = (typeof indent === 'function' ? indent(node) : indent) * node.depth;\n\n if (!dropCap) {\n try {\n if (node.parent && node.id === node.parent.children[0].id) {\n node.x += displacementX;\n node.y = previousNode ? previousNode.y : 0;\n return;\n }\n } catch {\n // skip to normal when a node has no parent\n }\n }\n\n node.x += displacementX;\n if (previousNode) {\n node.y = previousNode.y + getHeight(previousNode, node, align);\n if (previousNode.parent && node.parent && node.parent.id !== previousNode.parent.id) {\n // previous node has different parent\n const prevParent = previousNode.parent;\n const preY = prevParent.y + getHeight(prevParent, node, align);\n node.y = preY > node.y ? preY : node.y;\n }\n } else {\n node.y = 0;\n }\n}\n\nexport default function indented(\n root: HierarchyNode,\n indent: number | ((node: HierarchyNode) => number),\n dropCap: boolean,\n align?: 'center' | undefined,\n): void {\n let previousNode: HierarchyNode | null = null;\n root.eachNode((node) => {\n positionNode(node, previousNode, indent, dropCap, align);\n previousNode = node;\n });\n}\n","import TreeLayout from './layout/base';\nimport indentedTree from './layout/indented';\nimport separateTree from './layout/separate-root';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, IndentedOptions, Direction } from './types';\n\nconst VALID_DIRECTIONS: Direction[] = [\n 'LR', // left to right\n 'RL', // right to left\n 'H', // horizontal\n];\nconst DEFAULT_DIRECTION: Direction = VALID_DIRECTIONS[0];\n\nclass IndentedLayout extends TreeLayout {\n execute(): HierarchyNode {\n const options = this.options as IndentedOptions;\n const root = this.rootNode;\n options.isHorizontal = true;\n\n // default indent 20 and sink first children;\n const { indent = 20, dropCap = true, direction = DEFAULT_DIRECTION, align } = options;\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError(`Invalid direction: ${direction}`);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n indentedTree(root, indent, dropCap, align);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n indentedTree(root, indent, dropCap, align);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // H\n // separate into left and right trees\n const { left, right } = separateTree(root, options);\n indentedTree(left, indent, dropCap, align);\n left.right2left();\n indentedTree(right, indent, dropCap, align);\n const bbox = left.getBoundingBox();\n right.translate(bbox.width, 0);\n root.x = right.x - root.width / 2;\n }\n\n return root;\n }\n}\n\nconst DEFAULT_OPTIONS: IndentedOptions = {};\n\nexport default function indentedLayout(\n root: HierarchyData,\n options?: IndentedOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new IndentedLayout(root, mergedOptions).execute();\n}\n","import { assign } from '../util';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\nfunction secondWalk(node: HierarchyNode, options: HierarchyOptions): number {\n let totalHeight = 0;\n if (!node.children.length) {\n totalHeight = node.height;\n } else {\n node.children.forEach((c) => {\n totalHeight += secondWalk(c, options);\n });\n }\n node._subTreeSep = options.getSubTreeSep!(node.data);\n node.totalHeight = Math.max(node.height, totalHeight) + 2 * node._subTreeSep;\n return node.totalHeight;\n}\n\nfunction thirdWalk(node: HierarchyNode): void {\n const children = node.children;\n const len = children.length;\n if (len) {\n children.forEach((c) => {\n thirdWalk(c);\n });\n const first = children[0];\n const last = children[len - 1];\n const childrenHeight = last.y - first.y + last.height;\n let childrenTotalHeight = 0;\n children.forEach((child) => {\n childrenTotalHeight += child.totalHeight!;\n });\n if (childrenHeight > node.height) {\n // 当子节点总高度大于父节点高度\n node.y = first.y + childrenHeight / 2 - node.height / 2;\n } else if (children.length !== 1 || node.height > childrenTotalHeight) {\n // 多于一个子节点或者父节点大于所有子节点的总高度\n const offset = node.y + (node.height - childrenHeight) / 2 - first.y;\n children.forEach((c) => {\n c.translate(0, offset);\n });\n } else {\n // 只有一个子节点\n node.y = (first.y + first.height / 2 + last.y + last.height / 2) / 2 - node.height / 2;\n }\n }\n}\n\nconst DEFAULT_OPTIONS: HierarchyOptions = {\n getSubTreeSep() {\n return 0;\n },\n};\n\nexport default function mindmap(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n options = assign({}, DEFAULT_OPTIONS, options);\n\n root.parent = {\n x: 0,\n width: 0,\n height: 0,\n y: 0,\n } as HierarchyNode;\n\n // first walk\n root.BFTraverse((node) => {\n node.x = node.parent!.x + node.parent!.width;\n });\n\n root.parent = undefined;\n\n // second walk\n secondWalk(root, options);\n\n // adjusting\n // separating nodes\n root.startY = 0;\n root.y = root.totalHeight! / 2 - root.height / 2;\n root.eachNode((node) => {\n const children = node.children;\n const len = children.length;\n if (len) {\n const first = children[0];\n first.startY = node.startY! + node._subTreeSep!;\n if (len === 1) {\n first.y = node.y + node.height / 2 - first.height / 2;\n } else {\n first.y = first.startY + first.totalHeight! / 2 - first.height / 2;\n for (let i = 1; i < len; i++) {\n const c = children[i];\n c.startY = children[i - 1].startY! + children[i - 1].totalHeight!;\n c.y = c.startY + c.totalHeight! / 2 - c.height / 2;\n }\n }\n }\n });\n\n // third walk\n thirdWalk(root);\n\n return root;\n}\n","import TreeLayout from './layout/base';\nimport mindmap from './layout/mindmap';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, MindmapOptions } from './types';\n\nclass MindmapLayout extends TreeLayout {\n execute(): HierarchyNode {\n return doTreeLayout(this.rootNode, this.options, mindmap);\n }\n}\n\nconst DEFAULT_OPTIONS: MindmapOptions = {};\n\nexport default function mindmapLayout(\n root: HierarchyData,\n options?: MindmapOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new MindmapLayout(root, mergedOptions).execute();\n}\n","import compactBox from './compact-box';\nimport dendrogram from './dendrogram';\nimport indented from './indented';\nimport mindmap from './mindmap';\n\nexport { compactBox, dendrogram, indented, mindmap };\n\nexport * from './types';\n\nexport default {\n compactBox,\n dendrogram,\n indented,\n mindmap,\n};\n\nexport const version = '0.7.0';\n"],"names":["getHeight","preNode","node","align","heightField","preNodeHeight","nodeHeight","height","assign","Object","DEFAULT_OPTIONS","getId","d","id","name","getPreH","preH","getPreV","preV","getHGap","hgap","getVGap","vgap","getChildren","children","PEM","getWidth","label","width","split","length","Node","constructor","data","options","this","x","y","depth","parent","addGap","isRoot","isLeaf","eachNode","callback","current","nodes","shift","concat","DFTraverse","BFTraverse","getBoundingBox","bb","left","Number","MAX_VALUE","top","Math","min","max","translate","tx","ty","right2left","bottom2top","hierarchy","isolated","root","collapsed","Array","i","child","push","Layout","rootNode","execute","Error","WrappedTree$1","WrappedTree","w","h","c","prelim","mod","change","tl","tr","el","er","msel","mser","cs","fromNode","isHorizontal","forEach","wrappedChild","moveRight","move","getMin","res","normalize","convertBack","converted","layer","nonLayeredTidy","setExtremes","t","separate","ih","sr","mssr","cl","mscl","bottom","low","nxt","dist","moveSubtree","index","sy","cy","nextRightContour","nextLeftContour","modsumcl","li","diff","setLeftThread","modsumsr","ri","setRightThread","si","nr","distributeExtra","updateIYL","wt","firstWalk","positionRoot","secondWalk","modsum","modsumdelta","addChildSpacing","separateRoot","right","treeSize","rightTreeSize","round","getSide","_child","side","VALID_DIRECTIONS","HORIZONTAL_DIRECTIONS","DEFAULT_DIRECTION","doLayout","layoutAlgorithm","direction","indexOf","TypeError","separateTree","fixedRoot","radial","rScale","radScale","Infinity","count","radDiff","avgRad","PI","nodeRadScale","minRadScale","nodeRScale","rootRScale","rad","r","cos","sin","reassignXYIfRadial","CompactBoxTreeLayout","TreeLayout","doTreeLayout","nonLayeredTidyTree","compactBoxLayout","mergedOptions","leftChild","rightChild","nodeSep","nodeSize","rankSep","subTreeSep","dendrogram","maxDepth","prevLeaf","wrappedTreeFromNode","n","childrenCount","childWT","originNode","getDrawingDepth","drawingDepth","depths","map","minChildDepth","position","DendrogramLayout","dendrogramLayout","indented","indent","dropCap","previousNode","displacementX","prevParent","preY","positionNode","IndentedLayout","indentedTree","bbox","indentedLayout","totalHeight","_subTreeSep","getSubTreeSep","thirdWalk","len","first","last","childrenHeight","childrenTotalHeight","offset","mindmap","startY","MindmapLayout","mindmapLayout","compactBox","version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hierarchy.es.js","sources":["../src/util.ts","../src/layout/hierarchy.ts","../src/layout/base.ts","../src/layout/non-layered-tidy.ts","../src/layout/separate-root.ts","../src/layout/do-layout.ts","../src/compact-box.ts","../src/layout/dendrogram.ts","../src/dendrogram.ts","../src/layout/indented.ts","../src/indented.ts","../src/layout/mindmap.ts","../src/mindmap.ts","../src/index.ts"],"sourcesContent":["import type { HierarchyNode } from './types';\n\n/**\n * Get average height or height for node's position calculation, according to align.\n * @param preNode previous node\n * @param node current node, whose position is going to be calculated\n * @param align 'center' means nodes align at the center, other value means align at the left-top\n * @param heightField field name for height value on preNode and node\n * @return the height for calculation\n */\nexport function getHeight(\n preNode: HierarchyNode,\n node: HierarchyNode,\n align?: 'center' | undefined,\n heightField: keyof HierarchyNode = 'height',\n): number {\n const preNodeHeight = preNode[heightField] as number;\n const nodeHeight = node[heightField] as number;\n return align === 'center' ? (preNodeHeight + nodeHeight) / 2 : preNode.height;\n}\n\nexport const assign = Object.assign;\n","import { assign } from '../util';\nimport type { HierarchyData, HierarchyNode, HierarchyOptions, BoundingBox } from '../types';\n\nconst PEM = 18;\nconst DEFAULT_HEIGHT = PEM * 2;\nconst DEFAULT_GAP = PEM;\n\nconst DEFAULT_OPTIONS: Required<\n Pick<\n HierarchyOptions,\n | 'getId'\n | 'getPreH'\n | 'getPreV'\n | 'getHGap'\n | 'getVGap'\n | 'getChildren'\n | 'getHeight'\n | 'getWidth'\n >\n> = {\n getId(d: HierarchyData): string {\n return (d.id || d.name) as string;\n },\n getPreH(d: HierarchyData): number {\n return d.preH || 0;\n },\n getPreV(d: HierarchyData): number {\n return d.preV || 0;\n },\n getHGap(d: HierarchyData): number {\n return d.hgap || DEFAULT_GAP;\n },\n getVGap(d: HierarchyData): number {\n return d.vgap || DEFAULT_GAP;\n },\n getChildren(d: HierarchyData): HierarchyData[] | undefined {\n return d.children;\n },\n getHeight(d: HierarchyData): number {\n return d.height || DEFAULT_HEIGHT;\n },\n getWidth(d: HierarchyData): number {\n const label = d.label || ' ';\n return d.width || label.split('').length * PEM; // FIXME DO NOT get width like this\n },\n};\n\nclass Node implements HierarchyNode {\n data: HierarchyData;\n id: string;\n x: number = 0;\n y: number = 0;\n width: number;\n height: number;\n depth: number = 0;\n children: HierarchyNode[] = [];\n parent?: HierarchyNode;\n hgap: number = 0;\n vgap: number = 0;\n preH: number;\n preV: number;\n\n constructor(data: HierarchyData | HierarchyNode, options: HierarchyOptions) {\n if (data instanceof Node || ('x' in data && 'y' in data && 'children' in data)) {\n // If it's already a Node, cast and return\n const node = data as Node;\n this.data = node.data;\n this.id = node.id;\n this.x = node.x;\n this.y = node.y;\n this.width = node.width;\n this.height = node.height;\n this.depth = node.depth;\n this.children = node.children;\n this.parent = node.parent;\n this.hgap = node.hgap;\n this.vgap = node.vgap;\n this.preH = node.preH;\n this.preV = node.preV;\n return;\n }\n\n this.data = data as HierarchyData;\n\n /*\n * Gaps: filling space between nodes\n * (x, y) ----------------------\n * | vgap |\n * | -------------------- h\n * | h | | e\n * | g | | i\n * | a | | g\n * | p | | h\n * | --------------------- t\n * | |\n * -----------width------------\n */\n const hgap = options.getHGap!(data);\n const vgap = options.getVGap!(data);\n this.preH = options.getPreH!(data);\n this.preV = options.getPreV!(data);\n this.width = options.getWidth!(data);\n this.height = options.getHeight!(data);\n this.width += this.preH;\n this.height += this.preV;\n this.id = options.getId!(data);\n\n this.addGap(hgap, vgap);\n }\n\n isRoot(): boolean {\n return this.depth === 0;\n }\n\n isLeaf(): boolean {\n return this.children.length === 0;\n }\n\n addGap(hgap: number, vgap: number): void {\n this.hgap += hgap;\n this.vgap += vgap;\n this.width += 2 * hgap;\n this.height += 2 * vgap;\n }\n\n eachNode(callback: (node: HierarchyNode) => void): void {\n let nodes: HierarchyNode[] = [this];\n let current: HierarchyNode | undefined;\n while ((current = nodes.shift())) {\n callback(current);\n nodes = current.children.concat(nodes);\n }\n }\n\n DFTraverse(callback: (node: HierarchyNode) => void): void {\n this.eachNode(callback);\n }\n\n BFTraverse(callback: (node: HierarchyNode) => void): void {\n let nodes: HierarchyNode[] = [this];\n let current: HierarchyNode | undefined;\n while ((current = nodes.shift())) {\n callback(current);\n nodes = nodes.concat(current.children);\n }\n }\n\n getBoundingBox(): BoundingBox {\n const bb: BoundingBox = {\n left: Number.MAX_VALUE,\n top: Number.MAX_VALUE,\n width: 0,\n height: 0,\n };\n this.eachNode((node) => {\n bb.left = Math.min(bb.left, node.x);\n bb.top = Math.min(bb.top, node.y);\n bb.width = Math.max(bb.width, node.x + node.width);\n bb.height = Math.max(bb.height, node.y + node.height);\n });\n return bb;\n }\n\n translate(tx: number = 0, ty: number = 0): void {\n this.eachNode((node) => {\n node.x += tx;\n node.y += ty;\n node.x += node.preH;\n node.y += node.preV;\n });\n }\n\n right2left(): void {\n const bb = this.getBoundingBox();\n this.eachNode((node) => {\n node.x = node.x - (node.x - bb.left) * 2 - node.width;\n });\n this.translate(bb.width, 0);\n }\n\n bottom2top(): void {\n const bb = this.getBoundingBox();\n this.eachNode((node) => {\n node.y = node.y - (node.y - bb.top) * 2 - node.height;\n });\n this.translate(0, bb.height);\n }\n}\n\nexport default function hierarchy(\n data: HierarchyData,\n options: HierarchyOptions = {},\n isolated?: boolean,\n): HierarchyNode {\n options = assign({}, DEFAULT_OPTIONS, options);\n const root = new Node(data, options);\n const nodes: HierarchyNode[] = [root];\n let node: HierarchyNode | undefined;\n\n if (!isolated && !data.collapsed) {\n while ((node = nodes.shift())) {\n if (!node.data.collapsed) {\n const children = options.getChildren!(node.data);\n const length = children ? children.length : 0;\n node.children = new Array(length);\n if (children && length) {\n for (let i = 0; i < length; i++) {\n const child = new Node(children[i], options);\n node.children[i] = child;\n nodes.push(child);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n }\n }\n\n return root;\n}\n","import hierarchy from './hierarchy';\nimport type { HierarchyData, HierarchyNode, HierarchyOptions } from '../types';\n\nexport default class Layout {\n options: HierarchyOptions;\n rootNode: HierarchyNode;\n\n constructor(root: HierarchyData, options: HierarchyOptions = {}) {\n this.options = options;\n this.rootNode = hierarchy(root, options);\n }\n\n execute(): HierarchyNode {\n throw new Error('please override this method');\n }\n}\n","import type { HierarchyNode, HierarchyOptions } from '../types';\n\ninterface WrappedTreeNode {\n w: number;\n h: number;\n y: number;\n x: number;\n c: WrappedTreeNode[];\n cs: number;\n prelim: number;\n mod: number;\n shift: number;\n change: number;\n tl: WrappedTreeNode | null;\n tr: WrappedTreeNode | null;\n el: WrappedTreeNode | null;\n er: WrappedTreeNode | null;\n msel: number;\n mser: number;\n}\n\nclass WrappedTree implements WrappedTreeNode {\n w: number;\n h: number;\n y: number;\n x: number = 0;\n c: WrappedTreeNode[];\n cs: number;\n prelim: number = 0;\n mod: number = 0;\n shift: number = 0;\n change: number = 0;\n tl: WrappedTreeNode | null = null;\n tr: WrappedTreeNode | null = null;\n el: WrappedTreeNode | null = null;\n er: WrappedTreeNode | null = null;\n msel: number = 0;\n mser: number = 0;\n\n constructor(w: number = 0, h: number = 0, y: number = 0, c: WrappedTreeNode[] = []) {\n this.w = w || 0;\n this.h = h || 0;\n this.y = y || 0;\n this.c = c || [];\n this.cs = c.length;\n }\n\n static fromNode(root: HierarchyNode | null, isHorizontal?: boolean): WrappedTreeNode | null {\n if (!root) return null;\n const children: WrappedTreeNode[] = [];\n root.children.forEach((child) => {\n const wrappedChild = WrappedTree.fromNode(child, isHorizontal);\n if (wrappedChild) children.push(wrappedChild);\n });\n if (isHorizontal) {\n return new WrappedTree(root.height, root.width, root.x, children);\n }\n return new WrappedTree(root.width, root.height, root.y, children);\n }\n}\n\nfunction moveRight(node: HierarchyNode, move: number, isHorizontal?: boolean): void {\n if (isHorizontal) {\n node.y += move;\n } else {\n node.x += move;\n }\n node.children.forEach((child) => {\n moveRight(child, move, isHorizontal);\n });\n}\n\nfunction getMin(node: HierarchyNode, isHorizontal?: boolean): number {\n let res = isHorizontal ? node.y : node.x;\n node.children.forEach((child) => {\n res = Math.min(getMin(child, isHorizontal), res);\n });\n return res;\n}\n\nfunction normalize(node: HierarchyNode, isHorizontal?: boolean): void {\n const min = getMin(node, isHorizontal);\n moveRight(node, -min, isHorizontal);\n}\n\nfunction convertBack(\n converted: WrappedTreeNode,\n root: HierarchyNode,\n isHorizontal?: boolean,\n): void {\n if (isHorizontal) {\n root.y = converted.x;\n } else {\n root.x = converted.x;\n }\n converted.c.forEach((child, i) => {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nfunction layer(node: HierarchyNode, isHorizontal?: boolean, d: number = 0): void {\n if (isHorizontal) {\n node.x = d;\n d += node.width;\n } else {\n node.y = d;\n d += node.height;\n }\n node.children.forEach((child) => {\n layer(child, isHorizontal, d);\n });\n}\n\ninterface IYL {\n low: number;\n index: number;\n nxt: IYL | null;\n}\n\nexport default function nonLayeredTidy(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n const isHorizontal = options.isHorizontal;\n\n function firstWalk(t: WrappedTreeNode): void {\n if (t.cs === 0) {\n setExtremes(t);\n return;\n }\n firstWalk(t.c[0]);\n let ih: IYL | null = updateIYL(bottom(t.c[0].el!), 0, null);\n for (let i = 1; i < t.cs; ++i) {\n firstWalk(t.c[i]);\n const min = bottom(t.c[i].er!);\n separate(t, i, ih);\n ih = updateIYL(min, i, ih);\n }\n positionRoot(t);\n setExtremes(t);\n }\n\n function setExtremes(t: WrappedTreeNode): void {\n if (t.cs === 0) {\n t.el = t;\n t.er = t;\n t.msel = t.mser = 0;\n } else {\n t.el = t.c[0].el;\n t.msel = t.c[0].msel;\n t.er = t.c[t.cs - 1].er;\n t.mser = t.c[t.cs - 1].mser;\n }\n }\n\n function separate(t: WrappedTreeNode, i: number, ih: IYL | null): void {\n let sr: WrappedTreeNode | null = t.c[i - 1];\n let mssr = sr.mod;\n let cl: WrappedTreeNode | null = t.c[i];\n let mscl = cl.mod;\n while (sr !== null && cl !== null) {\n if (ih && bottom(sr) > ih.low) ih = ih.nxt;\n const dist = mssr + sr.prelim + sr.w - (mscl + cl.prelim);\n if (dist > 0) {\n mscl += dist;\n if (ih) moveSubtree(t, i, ih.index, dist);\n }\n const sy = bottom(sr);\n const cy = bottom(cl);\n if (sy <= cy) {\n sr = nextRightContour(sr);\n if (sr !== null) mssr += sr.mod;\n }\n if (sy >= cy) {\n cl = nextLeftContour(cl);\n if (cl !== null) mscl += cl.mod;\n }\n }\n if (!sr && !!cl) {\n setLeftThread(t, i, cl, mscl);\n } else if (!!sr && !cl) {\n setRightThread(t, i, sr, mssr);\n }\n }\n\n function moveSubtree(t: WrappedTreeNode, i: number, si: number, dist: number): void {\n t.c[i].mod += dist;\n t.c[i].msel += dist;\n t.c[i].mser += dist;\n distributeExtra(t, i, si, dist);\n }\n\n function nextLeftContour(t: WrappedTreeNode): WrappedTreeNode | null {\n return t.cs === 0 ? t.tl : t.c[0];\n }\n\n function nextRightContour(t: WrappedTreeNode): WrappedTreeNode | null {\n return t.cs === 0 ? t.tr : t.c[t.cs - 1];\n }\n\n function bottom(t: WrappedTreeNode): number {\n return t.y + t.h;\n }\n\n function setLeftThread(\n t: WrappedTreeNode,\n i: number,\n cl: WrappedTreeNode,\n modsumcl: number,\n ): void {\n const li = t.c[0].el!;\n li.tl = cl;\n const diff = modsumcl - cl.mod - t.c[0].msel;\n li.mod += diff;\n li.prelim -= diff;\n t.c[0].el = t.c[i].el;\n t.c[0].msel = t.c[i].msel;\n }\n\n function setRightThread(\n t: WrappedTreeNode,\n i: number,\n sr: WrappedTreeNode,\n modsumsr: number,\n ): void {\n const ri = t.c[i].er!;\n ri.tr = sr;\n const diff = modsumsr - sr.mod - t.c[i].mser;\n ri.mod += diff;\n ri.prelim -= diff;\n t.c[i].er = t.c[i - 1].er;\n t.c[i].mser = t.c[i - 1].mser;\n }\n\n function positionRoot(t: WrappedTreeNode): void {\n t.prelim =\n (t.c[0].prelim + t.c[0].mod + t.c[t.cs - 1].mod + t.c[t.cs - 1].prelim + t.c[t.cs - 1].w) /\n 2 -\n t.w / 2;\n }\n\n function secondWalk(t: WrappedTreeNode, modsum: number): void {\n modsum += t.mod;\n t.x = t.prelim + modsum;\n addChildSpacing(t);\n for (let i = 0; i < t.cs; i++) {\n secondWalk(t.c[i], modsum);\n }\n }\n\n function distributeExtra(t: WrappedTreeNode, i: number, si: number, dist: number): void {\n if (si !== i - 1) {\n const nr = i - si;\n t.c[si + 1].shift += dist / nr;\n t.c[i].shift -= dist / nr;\n t.c[i].change -= dist - dist / nr;\n }\n }\n\n function addChildSpacing(t: WrappedTreeNode): void {\n let d = 0;\n let modsumdelta = 0;\n for (let i = 0; i < t.cs; i++) {\n d += t.c[i].shift;\n modsumdelta += d + t.c[i].change;\n t.c[i].mod += modsumdelta;\n }\n }\n\n function updateIYL(low: number, index: number, ih: IYL | null): IYL {\n while (ih !== null && low >= ih.low) {\n ih = ih.nxt;\n }\n return {\n low,\n index,\n nxt: ih,\n };\n }\n\n // do layout\n layer(root, isHorizontal);\n const wt = WrappedTree.fromNode(root, isHorizontal);\n if (wt) {\n firstWalk(wt);\n secondWalk(wt, 0);\n convertBack(wt, root, isHorizontal);\n normalize(root, isHorizontal);\n }\n\n return root;\n}\n","import hierarchy from './hierarchy';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\nexport default function separateRoot(\n root: HierarchyNode,\n options: HierarchyOptions,\n): { left: HierarchyNode; right: HierarchyNode } {\n // separate into left and right trees\n const left = hierarchy(root.data, options, true); // root only\n const right = hierarchy(root.data, options, true); // root only\n\n // automatically\n const treeSize = root.children.length;\n const rightTreeSize = Math.round(treeSize / 2);\n\n // separate left and right tree by meta data\n const getSide =\n options.getSide ||\n function (_child: HierarchyNode, index: number): 'left' | 'right' {\n if (index < rightTreeSize) {\n return 'right';\n }\n return 'left';\n };\n\n for (let i = 0; i < treeSize; i++) {\n const child = root.children[i];\n const side = getSide(child, i);\n if (side === 'right') {\n right.children.push(child);\n } else {\n left.children.push(child);\n }\n }\n\n left.eachNode((node) => {\n if (!node.isRoot()) {\n node.side = 'left';\n }\n });\n\n right.eachNode((node) => {\n if (!node.isRoot()) {\n node.side = 'right';\n }\n });\n\n return {\n left,\n right,\n };\n}\n","import separateTree from './separate-root';\nimport type { HierarchyNode, HierarchyOptions, Direction } from '../types';\n\nconst VALID_DIRECTIONS: Direction[] = [\n 'LR', // left to right\n 'RL', // right to left\n 'TB', // top to bottom\n 'BT', // bottom to top\n 'H', // horizontal\n 'V', // vertical\n];\n\nconst HORIZONTAL_DIRECTIONS: Direction[] = ['LR', 'RL', 'H'];\n\nconst isHorizontal = (direction: Direction): boolean =>\n HORIZONTAL_DIRECTIONS.indexOf(direction) > -1;\n\nconst DEFAULT_DIRECTION: Direction = VALID_DIRECTIONS[0];\n\ntype LayoutAlgorithm = (root: HierarchyNode, options: HierarchyOptions) => HierarchyNode;\n\nexport default function doLayout(\n root: HierarchyNode,\n options: HierarchyOptions,\n layoutAlgorithm: LayoutAlgorithm,\n): HierarchyNode {\n const direction = options.direction || DEFAULT_DIRECTION;\n options.isHorizontal = isHorizontal(direction);\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError(`Invalid direction: ${direction}`);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n layoutAlgorithm(root, options);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n layoutAlgorithm(root, options);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // TB\n layoutAlgorithm(root, options);\n } else if (direction === VALID_DIRECTIONS[3]) {\n // BT\n layoutAlgorithm(root, options);\n root.bottom2top();\n } else if (direction === VALID_DIRECTIONS[4] || direction === VALID_DIRECTIONS[5]) {\n // H or V\n // separate into left and right trees\n const { left, right } = separateTree(root, options);\n // do layout for left and right trees\n layoutAlgorithm(left, options);\n layoutAlgorithm(right, options);\n if (options.isHorizontal) {\n left.right2left();\n } else {\n left.bottom2top();\n }\n // combine left and right trees\n right.translate(left.x - right.x, left.y - right.y);\n // translate root\n root.x = left.x;\n root.y = right.y;\n const bb = root.getBoundingBox();\n if (options.isHorizontal) {\n if (bb.top < 0) {\n root.translate(0, -bb.top);\n }\n } else {\n if (bb.left < 0) {\n root.translate(-bb.left, 0);\n }\n }\n }\n\n // fixed root position, default value is true\n let fixedRoot = options.fixedRoot;\n if (fixedRoot === undefined) fixedRoot = true;\n if (fixedRoot) {\n root.translate(-(root.x + root.width / 2 + root.hgap), -(root.y + root.height / 2 + root.vgap));\n }\n\n reassignXYIfRadial(root, options);\n\n return root;\n}\n\nfunction reassignXYIfRadial(root: HierarchyNode, options: HierarchyOptions): void {\n if (options.radial) {\n const [rScale, radScale] = options.isHorizontal ? ['x', 'y'] : ['y', 'x'];\n\n const min = { x: Infinity, y: Infinity };\n const max = { x: -Infinity, y: -Infinity };\n\n let count = 0;\n root.DFTraverse((node) => {\n count++;\n const { x, y } = node;\n min.x = Math.min(min.x, x);\n min.y = Math.min(min.y, y);\n max.x = Math.max(max.x, x);\n max.y = Math.max(max.y, y);\n });\n\n const radDiff = max[radScale as 'x' | 'y'] - min[radScale as 'x' | 'y'];\n if (radDiff === 0) return;\n\n const avgRad = (Math.PI * 2) / count;\n root.DFTraverse((node) => {\n const nodeRadScale = node[radScale as 'x' | 'y'];\n const minRadScale = min[radScale as 'x' | 'y'];\n const nodeRScale = node[rScale as 'x' | 'y'];\n const rootRScale = root[rScale as 'x' | 'y'];\n\n const rad = ((nodeRadScale - minRadScale) / radDiff) * (Math.PI * 2 - avgRad) + avgRad;\n const r = nodeRScale - rootRScale;\n node.x = Math.cos(rad) * r;\n node.y = Math.sin(rad) * r;\n });\n }\n}\n","import TreeLayout from './layout/base';\nimport nonLayeredTidyTree from './layout/non-layered-tidy';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, CompactBoxOptions } from './types';\n\nclass CompactBoxTreeLayout extends TreeLayout {\n execute(): HierarchyNode {\n return doTreeLayout(this.rootNode, this.options, nonLayeredTidyTree);\n }\n}\n\nconst DEFAULT_OPTIONS: CompactBoxOptions = {};\n\nexport default function compactBoxLayout(\n root: HierarchyData,\n options?: CompactBoxOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new CompactBoxTreeLayout(root, mergedOptions).execute();\n}\n","import { assign } from '../util';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\ninterface WrappedTreeNode {\n x: number;\n y: number;\n height: number;\n leftChild: WrappedTreeNode | null;\n rightChild: WrappedTreeNode | null;\n children: WrappedTreeNode[];\n originNode: HierarchyNode;\n isLeaf: boolean;\n drawingDepth?: number;\n}\n\nclass WrappedTree implements WrappedTreeNode {\n x: number = 0;\n y: number = 0;\n height: number;\n leftChild: WrappedTreeNode | null = null;\n rightChild: WrappedTreeNode | null = null;\n children: WrappedTreeNode[];\n originNode!: HierarchyNode;\n isLeaf: boolean = false;\n\n constructor(height: number = 0, children: WrappedTreeNode[] = []) {\n this.height = height;\n this.children = children;\n }\n}\n\nconst DEFAULT_OPTIONS = {\n isHorizontal: true,\n nodeSep: 20,\n nodeSize: 20,\n rankSep: 200,\n subTreeSep: 10,\n};\n\nfunction convertBack(converted: WrappedTreeNode, root: HierarchyNode, isHorizontal: boolean): void {\n if (isHorizontal) {\n root.x = converted.x;\n root.y = converted.y;\n } else {\n root.x = converted.y;\n root.y = converted.x;\n }\n converted.children.forEach((child, i) => {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nexport default function dendrogram(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n\n let maxDepth = 0;\n\n function wrappedTreeFromNode(n: HierarchyNode): WrappedTreeNode {\n n.width = 0;\n if (n.depth && n.depth > maxDepth) {\n maxDepth = n.depth;\n }\n const children = n.children;\n const childrenCount = children.length;\n const t = new WrappedTree(0, []);\n children.forEach((child, i) => {\n const childWT = wrappedTreeFromNode(child);\n t.children.push(childWT);\n if (i === 0) {\n t.leftChild = childWT;\n }\n if (i === childrenCount - 1) {\n t.rightChild = childWT;\n }\n });\n t.originNode = n;\n t.isLeaf = n.isLeaf();\n return t;\n }\n\n function getDrawingDepth(t: WrappedTreeNode): number {\n if (t.isLeaf || t.children.length === 0) {\n t.drawingDepth = maxDepth;\n } else {\n const depths = t.children.map((child) => getDrawingDepth(child));\n const minChildDepth = Math.min(...depths);\n t.drawingDepth = minChildDepth - 1;\n }\n return t.drawingDepth;\n }\n\n let prevLeaf: WrappedTreeNode | null = null;\n\n function position(t: WrappedTreeNode): void {\n t.x = t.drawingDepth! * mergedOptions.rankSep;\n if (t.isLeaf) {\n t.y = 0;\n if (prevLeaf) {\n t.y = prevLeaf.y + prevLeaf.height + mergedOptions.nodeSep;\n if (t.originNode.parent !== prevLeaf.originNode.parent) {\n t.y += mergedOptions.subTreeSep;\n }\n }\n prevLeaf = t;\n } else {\n t.children.forEach((child) => {\n position(child);\n });\n t.y = (t.leftChild!.y + t.rightChild!.y) / 2;\n }\n }\n\n const wt = wrappedTreeFromNode(root);\n getDrawingDepth(wt);\n position(wt);\n convertBack(wt, root, mergedOptions.isHorizontal);\n\n return root;\n}\n","import TreeLayout from './layout/base';\nimport dendrogram from './layout/dendrogram';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, DendrogramOptions } from './types';\n\nclass DendrogramLayout extends TreeLayout {\n execute(): HierarchyNode {\n this.rootNode.width = 0;\n return doTreeLayout(this.rootNode, this.options, dendrogram);\n }\n}\n\nconst DEFAULT_OPTIONS: DendrogramOptions = {};\n\nexport default function dendrogramLayout(\n root: HierarchyData,\n options?: DendrogramOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new DendrogramLayout(root, mergedOptions).execute();\n}\n","import { getHeight } from '../util';\nimport type { HierarchyNode } from '../types';\n\nfunction positionNode(\n node: HierarchyNode,\n previousNode: HierarchyNode | null,\n indent: number | ((node: HierarchyNode) => number),\n dropCap: boolean,\n align?: 'center' | undefined,\n): void {\n // calculate the node's horizontal offset DX, dx's type might be number or function\n const displacementX = (typeof indent === 'function' ? indent(node) : indent) * node.depth;\n\n if (!dropCap) {\n try {\n if (node.parent && node.id === node.parent.children[0].id) {\n node.x += displacementX;\n node.y = previousNode ? previousNode.y : 0;\n return;\n }\n } catch {\n // skip to normal when a node has no parent\n }\n }\n\n node.x += displacementX;\n if (previousNode) {\n node.y = previousNode.y + getHeight(previousNode, node, align);\n if (previousNode.parent && node.parent && node.parent.id !== previousNode.parent.id) {\n // previous node has different parent\n const prevParent = previousNode.parent;\n const preY = prevParent.y + getHeight(prevParent, node, align);\n node.y = preY > node.y ? preY : node.y;\n }\n } else {\n node.y = 0;\n }\n}\n\nexport default function indented(\n root: HierarchyNode,\n indent: number | ((node: HierarchyNode) => number),\n dropCap: boolean,\n align?: 'center' | undefined,\n): void {\n let previousNode: HierarchyNode | null = null;\n root.eachNode((node) => {\n positionNode(node, previousNode, indent, dropCap, align);\n previousNode = node;\n });\n}\n","import TreeLayout from './layout/base';\nimport indentedTree from './layout/indented';\nimport separateTree from './layout/separate-root';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, IndentedOptions, Direction } from './types';\n\nconst VALID_DIRECTIONS: Direction[] = [\n 'LR', // left to right\n 'RL', // right to left\n 'H', // horizontal\n];\nconst DEFAULT_DIRECTION: Direction = VALID_DIRECTIONS[0];\n\nclass IndentedLayout extends TreeLayout {\n execute(): HierarchyNode {\n const options = this.options as IndentedOptions;\n const root = this.rootNode;\n options.isHorizontal = true;\n\n // default indent 20 and sink first children;\n const { indent = 20, dropCap = true, direction = DEFAULT_DIRECTION, align } = options;\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError(`Invalid direction: ${direction}`);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n indentedTree(root, indent, dropCap, align);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n indentedTree(root, indent, dropCap, align);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // H\n // separate into left and right trees\n const { left, right } = separateTree(root, options);\n indentedTree(left, indent, dropCap, align);\n left.right2left();\n indentedTree(right, indent, dropCap, align);\n const bbox = left.getBoundingBox();\n right.translate(bbox.width, 0);\n root.x = right.x - root.width / 2;\n }\n\n return root;\n }\n}\n\nconst DEFAULT_OPTIONS: IndentedOptions = {};\n\nexport default function indentedLayout(\n root: HierarchyData,\n options?: IndentedOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new IndentedLayout(root, mergedOptions).execute();\n}\n","import { assign } from '../util';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\nfunction secondWalk(node: HierarchyNode, options: HierarchyOptions): number {\n let totalHeight = 0;\n if (!node.children.length) {\n totalHeight = node.height;\n } else {\n node.children.forEach((c) => {\n totalHeight += secondWalk(c, options);\n });\n }\n node._subTreeSep = options.getSubTreeSep!(node.data);\n node.totalHeight = Math.max(node.height, totalHeight) + 2 * node._subTreeSep;\n return node.totalHeight;\n}\n\nfunction thirdWalk(node: HierarchyNode): void {\n const children = node.children;\n const len = children.length;\n if (len) {\n children.forEach((c) => {\n thirdWalk(c);\n });\n const first = children[0];\n const last = children[len - 1];\n const childrenHeight = last.y - first.y + last.height;\n let childrenTotalHeight = 0;\n children.forEach((child) => {\n childrenTotalHeight += child.totalHeight!;\n });\n if (childrenHeight > node.height) {\n // 当子节点总高度大于父节点高度\n node.y = first.y + childrenHeight / 2 - node.height / 2;\n } else if (children.length !== 1 || node.height > childrenTotalHeight) {\n // 多于一个子节点或者父节点大于所有子节点的总高度\n const offset = node.y + (node.height - childrenHeight) / 2 - first.y;\n children.forEach((c) => {\n c.translate(0, offset);\n });\n } else {\n // 只有一个子节点\n node.y = (first.y + first.height / 2 + last.y + last.height / 2) / 2 - node.height / 2;\n }\n }\n}\n\nconst DEFAULT_OPTIONS: HierarchyOptions = {\n getSubTreeSep() {\n return 0;\n },\n};\n\nexport default function mindmap(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n options = assign({}, DEFAULT_OPTIONS, options);\n\n root.parent = {\n x: 0,\n width: 0,\n height: 0,\n y: 0,\n } as HierarchyNode;\n\n // first walk\n root.BFTraverse((node) => {\n node.x = node.parent!.x + node.parent!.width;\n });\n\n root.parent = undefined;\n\n // second walk\n secondWalk(root, options);\n\n // adjusting\n // separating nodes\n root.startY = 0;\n root.y = root.totalHeight! / 2 - root.height / 2;\n root.eachNode((node) => {\n const children = node.children;\n const len = children.length;\n if (len) {\n const first = children[0];\n first.startY = node.startY! + node._subTreeSep!;\n if (len === 1) {\n first.y = node.y + node.height / 2 - first.height / 2;\n } else {\n first.y = first.startY + first.totalHeight! / 2 - first.height / 2;\n for (let i = 1; i < len; i++) {\n const c = children[i];\n c.startY = children[i - 1].startY! + children[i - 1].totalHeight!;\n c.y = c.startY + c.totalHeight! / 2 - c.height / 2;\n }\n }\n }\n });\n\n // third walk\n thirdWalk(root);\n\n return root;\n}\n","import TreeLayout from './layout/base';\nimport mindmap from './layout/mindmap';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, MindmapOptions } from './types';\n\nclass MindmapLayout extends TreeLayout {\n execute(): HierarchyNode {\n return doTreeLayout(this.rootNode, this.options, mindmap);\n }\n}\n\nconst DEFAULT_OPTIONS: MindmapOptions = {};\n\nexport default function mindmapLayout(\n root: HierarchyData,\n options?: MindmapOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new MindmapLayout(root, mergedOptions).execute();\n}\n","import compactBox from './compact-box';\nimport dendrogram from './dendrogram';\nimport indented from './indented';\nimport mindmap from './mindmap';\n\nexport { compactBox, dendrogram, indented, mindmap };\n\nexport * from './types';\n\nexport default {\n compactBox,\n dendrogram,\n indented,\n mindmap,\n};\n\nexport const version = '0.7.0';\n"],"names":["getHeight","preNode","node","align","heightField","preNodeHeight","nodeHeight","height","assign","Object","DEFAULT_OPTIONS","getId","d","id","name","getPreH","preH","getPreV","preV","getHGap","hgap","getVGap","vgap","getChildren","children","PEM","getWidth","label","width","split","length","Node","constructor","data","options","this","x","y","depth","parent","addGap","isRoot","isLeaf","eachNode","callback","current","nodes","shift","concat","DFTraverse","BFTraverse","getBoundingBox","bb","left","Number","MAX_VALUE","top","Math","min","max","translate","tx","ty","right2left","bottom2top","hierarchy","isolated","root","collapsed","Array","i","child","push","Layout","rootNode","execute","Error","WrappedTree$1","WrappedTree","w","h","c","prelim","mod","change","tl","tr","el","er","msel","mser","cs","fromNode","isHorizontal","forEach","wrappedChild","moveRight","move","getMin","res","normalize","convertBack","converted","layer","nonLayeredTidy","setExtremes","t","separate","ih","sr","mssr","cl","mscl","bottom","low","nxt","dist","moveSubtree","index","sy","cy","nextRightContour","nextLeftContour","modsumcl","li","diff","setLeftThread","modsumsr","ri","setRightThread","si","nr","distributeExtra","updateIYL","wt","firstWalk","positionRoot","secondWalk","modsum","modsumdelta","addChildSpacing","separateRoot","right","treeSize","rightTreeSize","round","getSide","_child","side","VALID_DIRECTIONS","HORIZONTAL_DIRECTIONS","DEFAULT_DIRECTION","doLayout","layoutAlgorithm","direction","indexOf","TypeError","separateTree","fixedRoot","radial","rScale","radScale","Infinity","count","radDiff","avgRad","PI","nodeRadScale","minRadScale","nodeRScale","rootRScale","rad","r","cos","sin","reassignXYIfRadial","CompactBoxTreeLayout","TreeLayout","doTreeLayout","nonLayeredTidyTree","compactBoxLayout","mergedOptions","leftChild","rightChild","nodeSep","nodeSize","rankSep","subTreeSep","dendrogram","maxDepth","prevLeaf","wrappedTreeFromNode","n","childrenCount","childWT","originNode","getDrawingDepth","drawingDepth","depths","map","minChildDepth","position","DendrogramLayout","dendrogramLayout","indented","indent","dropCap","previousNode","displacementX","prevParent","preY","positionNode","IndentedLayout","indentedTree","bbox","indentedLayout","totalHeight","_subTreeSep","getSubTreeSep","thirdWalk","len","first","last","childrenHeight","childrenTotalHeight","offset","mindmap","startY","MindmapLayout","mindmapLayout","compactBox","version"],"mappings":"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"}
|
package/dist/hierarchy.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Hierarchy={})}(this,function(t){"use strict";function e(t,e,i,n="height"){const h=t[n],o=e[n];return"center"===i?(h+o)/2:t.height}const i=Object.assign,n={getId:t=>t.id||t.name,getPreH:t=>t.preH||0,getPreV:t=>t.preV||0,getHGap:t=>t.hgap||18,getVGap:t=>t.vgap||18,getChildren:t=>t.children,getHeight:t=>t.height||36,getWidth(t){const e=t.label||" ";return t.width||18*e.split("").length}};class h{constructor(t,e){if(this.x=0,this.y=0,this.depth=0,this.children=[],this.hgap=0,this.vgap=0,t instanceof h||"x"in t&&"y"in t&&"children"in t){const e=t;return this.data=e.data,this.id=e.id,this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.depth=e.depth,this.children=e.children,this.parent=e.parent,this.hgap=e.hgap,this.vgap=e.vgap,this.preH=e.preH,void(this.preV=e.preV)}this.data=t;const i=e.getHGap(t),n=e.getVGap(t);this.preH=e.getPreH(t),this.preV=e.getPreV(t),this.width=e.getWidth(t),this.height=e.getHeight(t),this.width+=this.preH,this.height+=this.preV,this.id=e.getId(t),this.addGap(i,n)}isRoot(){return 0===this.depth}isLeaf(){return 0===this.children.length}addGap(t,e){this.hgap+=t,this.vgap+=e,this.width+=2*t,this.height+=2*e}eachNode(t){let e,i=[this];for(;e=i.shift();)t(e),i=e.children.concat(i)}DFTraverse(t){this.eachNode(t)}BFTraverse(t){let e,i=[this];for(;e=i.shift();)t(e),i=i.concat(e.children)}getBoundingBox(){const t={left:Number.MAX_VALUE,top:Number.MAX_VALUE,width:0,height:0};return this.eachNode(e=>{t.left=Math.min(t.left,e.x),t.top=Math.min(t.top,e.y),t.width=Math.max(t.width,e.x+e.width),t.height=Math.max(t.height,e.y+e.height)}),t}translate(t=0,e=0){this.eachNode(i=>{i.x+=t,i.y+=e,i.x+=i.preH,i.y+=i.preV})}right2left(){const t=this.getBoundingBox();this.eachNode(e=>{e.x=e.x-2*(e.x-t.left)-e.width}),this.translate(t.width,0)}bottom2top(){const t=this.getBoundingBox();this.eachNode(e=>{e.y=e.y-2*(e.y-t.top)-e.height}),this.translate(0,t.height)}}function o(t,e={},o){e=i({},n,e);const r=new h(t,e),s=[r];let c;if(!o&&!t.collapsed)for(;c=s.shift();)if(!c.data.collapsed){const t=e.getChildren(c.data),i=t?t.length:0;if(c.children=new Array(i),t&&i)for(let n=0;n<i;n++){const i=new h(t[n],e);c.children[n]=i,s.push(i),i.parent=c,i.depth=c.depth+1}}return r}class r{constructor(t,e={}){this.options=e,this.rootNode=o(t,e)}execute(){throw new Error("please override this method")}}let s=class t{constructor(t=0,e=0,i=0,n=[]){this.x=0,this.prelim=0,this.mod=0,this.shift=0,this.change=0,this.tl=null,this.tr=null,this.el=null,this.er=null,this.msel=0,this.mser=0,this.w=t||0,this.h=e||0,this.y=i||0,this.c=n||[],this.cs=n.length}static fromNode(e,i){if(!e)return null;const n=[];return e.children.forEach(e=>{const h=t.fromNode(e,i);h&&n.push(h)}),i?new t(e.height,e.width,e.x,n):new t(e.width,e.height,e.y,n)}};function c(t,e,i){i?t.y+=e:t.x+=e,t.children.forEach(t=>{c(t,e,i)})}function l(t,e){let i=e?t.y:t.x;return t.children.forEach(t=>{i=Math.min(l(t,e),i)}),i}function d(t,e){c(t,-l(t,e),e)}function a(t,e,i){i?e.y=t.x:e.x=t.x,t.c.forEach((t,n)=>{a(t,e.children[n],i)})}function f(t,e,i=0){e?(t.x=i,i+=t.width):(t.y=i,i+=t.height),t.children.forEach(t=>{f(t,e,i)})}function u(t,e={}){const i=e.isHorizontal;function n(t){0===t.cs?(t.el=t,t.er=t,t.msel=t.mser=0):(t.el=t.c[0].el,t.msel=t.c[0].msel,t.er=t.c[t.cs-1].er,t.mser=t.c[t.cs-1].mser)}function h(t,e,i){let n=t.c[e-1],h=n.mod,s=t.c[e],d=s.mod;for(;null!==n&&null!==s;){i&&l(n)>i.low&&(i=i.nxt);const a=h+n.prelim+n.w-(d+s.prelim);a>0&&(d+=a,i&&o(t,e,i.index,a));const f=l(n),u=l(s);f<=u&&(n=c(n),null!==n&&(h+=n.mod)),f>=u&&(s=r(s),null!==s&&(d+=s.mod))}!n&&s?function(t,e,i,n){const h=t.c[0].el;h.tl=i;const o=n-i.mod-t.c[0].msel;h.mod+=o,h.prelim-=o,t.c[0].el=t.c[e].el,t.c[0].msel=t.c[e].msel}(t,e,s,d):n&&!s&&function(t,e,i,n){const h=t.c[e].er;h.tr=i;const o=n-i.mod-t.c[e].mser;h.mod+=o,h.prelim-=o,t.c[e].er=t.c[e-1].er,t.c[e].mser=t.c[e-1].mser}(t,e,n,h)}function o(t,e,i,n){t.c[e].mod+=n,t.c[e].msel+=n,t.c[e].mser+=n,function(t,e,i,n){if(i!==e-1){const h=e-i;t.c[i+1].shift+=n/h,t.c[e].shift-=n/h,t.c[e].change-=n-n/h}}(t,e,i,n)}function r(t){return 0===t.cs?t.tl:t.c[0]}function c(t){return 0===t.cs?t.tr:t.c[t.cs-1]}function l(t){return t.y+t.h}function u(t,e,i){for(;null!==i&&t>=i.low;)i=i.nxt;return{low:t,index:e,nxt:i}}f(t,i);const g=s.fromNode(t,i);return g&&(!function t(e){if(0===e.cs)return void n(e);t(e.c[0]);let i=u(l(e.c[0].el),0,null);for(let n=1;n<e.cs;++n){t(e.c[n]);const o=l(e.c[n].er);h(e,n,i),i=u(o,n,i)}!function(t){t.prelim=(t.c[0].prelim+t.c[0].mod+t.c[t.cs-1].mod+t.c[t.cs-1].prelim+t.c[t.cs-1].w)/2-t.w/2}(e),n(e)}(g),function t(e,i){i+=e.mod,e.x=e.prelim+i,function(t){let e=0,i=0;for(let n=0;n<t.cs;n++)e+=t.c[n].shift,i+=e+t.c[n].change,t.c[n].mod+=i}(e);for(let n=0;n<e.cs;n++)t(e.c[n],i)}(g,0),a(g,t,i),d(t,i)),t}function g(t,e){const i=o(t.data,e,!0),n=o(t.data,e,!0),h=t.children.length,r=Math.round(h/2),s=e.getSide||function(t,e){return e<r?"right":"left"};for(let o=0;o<h;o++){const e=t.children[o];"right"===s(e,o)?n.children.push(e):i.children.push(e)}return i.eachNode(t=>{t.isRoot()||(t.side="left")}),n.eachNode(t=>{t.isRoot()||(t.side="right")}),{left:i,right:n}}const p=["LR","RL","TB","BT","H","V"],x=["LR","RL","H"],y=p[0];function m(t,e,i){const n=e.direction||y;if(e.isHorizontal=(t=>x.indexOf(t)>-1)(n),n&&-1===p.indexOf(n))throw new TypeError(`Invalid direction: ${n}`);if(n===p[0])i(t,e);else if(n===p[1])i(t,e),t.right2left();else if(n===p[2])i(t,e);else if(n===p[3])i(t,e),t.bottom2top();else if(n===p[4]||n===p[5]){const{left:n,right:h}=g(t,e);i(n,e),i(h,e),e.isHorizontal?n.right2left():n.bottom2top(),h.translate(n.x-h.x,n.y-h.y),t.x=n.x,t.y=h.y;const o=t.getBoundingBox();e.isHorizontal?o.top<0&&t.translate(0,-o.top):o.left<0&&t.translate(-o.left,0)}let h=e.fixedRoot;return void 0===h&&(h=!0),h&&t.translate(-(t.x+t.width/2+t.hgap),-(t.y+t.height/2+t.vgap)),function(t,e){if(e.radial){const[i,n]=e.isHorizontal?["x","y"]:["y","x"],h={x:1/0,y:1/0},o={x:-1/0,y:-1/0};let r=0;t.DFTraverse(t=>{r++;const{x:e,y:i}=t;h.x=Math.min(h.x,e),h.y=Math.min(h.y,i),o.x=Math.max(o.x,e),o.y=Math.max(o.y,i)});const s=o[n]-h[n];if(0===s)return;const c=2*Math.PI/r;t.DFTraverse(e=>{const o=e[n],r=h[n],l=e[i],d=t[i],a=(o-r)/s*(2*Math.PI-c)+c,f=l-d;e.x=Math.cos(a)*f,e.y=Math.sin(a)*f})}}(t,e),t}class w extends r{execute(){return m(this.rootNode,this.options,u)}}const H={};function N(t,e){const n=i({},H,e);return new w(t,n).execute()}class v{constructor(t=0,e=[]){this.x=0,this.y=0,this.leftChild=null,this.rightChild=null,this.isLeaf=!1,this.height=t,this.children=e}}const M={isHorizontal:!0,nodeSep:20,nodeSize:20,rankSep:200,subTreeSep:10};function b(t,e,i){i?(e.x=t.x,e.y=t.y):(e.x=t.y,e.y=t.x),t.children.forEach((t,n)=>{b(t,e.children[n],i)})}function T(t,e={}){const n=i({},M,e);let h=0;let o=null;const r=function t(e){e.width=0,e.depth&&e.depth>h&&(h=e.depth);const i=e.children,n=i.length,o=new v(e.height,[]);return i.forEach((e,i)=>{const h=t(e);o.children.push(h),0===i&&(o.leftChild=h),i===n-1&&(o.rightChild=h)}),o.originNode=e,o.isLeaf=e.isLeaf(),o}(t);return function t(e){if(e.isLeaf||0===e.children.length)e.drawingDepth=h;else{const i=e.children.map(e=>t(e)),n=Math.min(...i);e.drawingDepth=n-1}return e.drawingDepth}(r),function t(e){e.x=e.drawingDepth*n.rankSep,e.isLeaf?(e.y=0,o&&(e.y=o.y+o.height+n.nodeSep,e.originNode.parent!==o.originNode.parent&&(e.y+=n.subTreeSep)),o=e):(e.children.forEach(e=>{t(e)}),e.y=(e.leftChild.y+e.rightChild.y)/2)}(r),b(r,t,n.isHorizontal),t}class E extends r{execute(){return this.rootNode.width=0,m(this.rootNode,this.options,T)}}const S={};function B(t,e){const n=i({},S,e);return new E(t,n).execute()}function L(t,i,n,h){let o=null;t.eachNode(t=>{!function(t,i,n,h,o){const r=("function"==typeof n?n(t):n)*t.depth;if(!h)try{if(t.parent&&t.id===t.parent.children[0].id)return t.x+=r,void(t.y=i?i.y:0)}catch{}if(t.x+=r,i){if(t.y=i.y+e(i,t,o),i.parent&&t.parent&&t.parent.id!==i.parent.id){const n=i.parent,h=n.y+e(n,t,o);t.y=h>t.y?h:t.y}}else t.y=0}(t,o,i,n,h),o=t})}const V=["LR","RL","H"],R=V[0];class z extends r{execute(){const t=this.options,e=this.rootNode;t.isHorizontal=!0;const{indent:i=20,dropCap:n=!0,direction:h=R,align:o}=t;if(h&&-1===V.indexOf(h))throw new TypeError(`Invalid direction: ${h}`);if(h===V[0])L(e,i,n,o);else if(h===V[1])L(e,i,n,o),e.right2left();else if(h===V[2]){const{left:h,right:r}=g(e,t);L(h,i,n,o),h.right2left(),L(r,i,n,o);const s=h.getBoundingBox();r.translate(s.width,0),e.x=r.x-e.width/2}return e}}const C={};function D(t,e){const n=i({},C,e);return new z(t,n).execute()}function P(t,e){let i=0;return t.children.length?t.children.forEach(t=>{i+=P(t,e)}):i=t.height,t._subTreeSep=e.getSubTreeSep(t.data),t.totalHeight=Math.max(t.height,i)+2*t._subTreeSep,t.totalHeight}function Y(t){const e=t.children,i=e.length;if(i){e.forEach(t=>{Y(t)});const n=e[0],h=e[i-1],o=h.y-n.y+h.height;let r=0;if(e.forEach(t=>{r+=t.totalHeight}),o>t.height)t.y=n.y+o/2-t.height/2;else if(1!==e.length||t.height>r){const i=t.y+(t.height-o)/2-n.y;e.forEach(t=>{t.translate(0,i)})}else t.y=(n.y+n.height/2+h.y+h.height/2)/2-t.height/2}}const _={getSubTreeSep:()=>0};function G(t,e={}){return e=i({},_,e),t.parent={x:0,width:0,height:0,y:0},t.BFTraverse(t=>{t.x=t.parent.x+t.parent.width}),t.parent=void 0,P(t,e),t.startY=0,t.y=t.totalHeight/2-t.height/2,t.eachNode(t=>{const e=t.children,i=e.length;if(i){const n=e[0];if(n.startY=t.startY+t._subTreeSep,1===i)n.y=t.y+t.height/2-n.height/2;else{n.y=n.startY+n.totalHeight/2-n.height/2;for(let t=1;t<i;t++){const i=e[t];i.startY=e[t-1].startY+e[t-1].totalHeight,i.y=i.startY+i.totalHeight/2-i.height/2}}}}),Y(t),t}class I extends r{execute(){return m(this.rootNode,this.options,G)}}const A={};function F(t,e){const n=i({},A,e);return new I(t,n).execute()}const O={compactBox:N,dendrogram:B,indented:D,mindmap:F};t.compactBox=N,t.default=O,t.dendrogram=B,t.indented=D,t.mindmap=F,t.version="0.7.0",Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Hierarchy={})}(this,function(t){"use strict";function e(t,e,i,n="height"){const h=t[n],o=e[n];return"center"===i?(h+o)/2:t.height}const i=Object.assign,n={getId:t=>t.id||t.name,getPreH:t=>t.preH||0,getPreV:t=>t.preV||0,getHGap:t=>t.hgap||18,getVGap:t=>t.vgap||18,getChildren:t=>t.children,getHeight:t=>t.height||36,getWidth(t){const e=t.label||" ";return t.width||18*e.split("").length}};class h{constructor(t,e){if(this.x=0,this.y=0,this.depth=0,this.children=[],this.hgap=0,this.vgap=0,t instanceof h||"x"in t&&"y"in t&&"children"in t){const e=t;return this.data=e.data,this.id=e.id,this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.depth=e.depth,this.children=e.children,this.parent=e.parent,this.hgap=e.hgap,this.vgap=e.vgap,this.preH=e.preH,void(this.preV=e.preV)}this.data=t;const i=e.getHGap(t),n=e.getVGap(t);this.preH=e.getPreH(t),this.preV=e.getPreV(t),this.width=e.getWidth(t),this.height=e.getHeight(t),this.width+=this.preH,this.height+=this.preV,this.id=e.getId(t),this.addGap(i,n)}isRoot(){return 0===this.depth}isLeaf(){return 0===this.children.length}addGap(t,e){this.hgap+=t,this.vgap+=e,this.width+=2*t,this.height+=2*e}eachNode(t){let e,i=[this];for(;e=i.shift();)t(e),i=e.children.concat(i)}DFTraverse(t){this.eachNode(t)}BFTraverse(t){let e,i=[this];for(;e=i.shift();)t(e),i=i.concat(e.children)}getBoundingBox(){const t={left:Number.MAX_VALUE,top:Number.MAX_VALUE,width:0,height:0};return this.eachNode(e=>{t.left=Math.min(t.left,e.x),t.top=Math.min(t.top,e.y),t.width=Math.max(t.width,e.x+e.width),t.height=Math.max(t.height,e.y+e.height)}),t}translate(t=0,e=0){this.eachNode(i=>{i.x+=t,i.y+=e,i.x+=i.preH,i.y+=i.preV})}right2left(){const t=this.getBoundingBox();this.eachNode(e=>{e.x=e.x-2*(e.x-t.left)-e.width}),this.translate(t.width,0)}bottom2top(){const t=this.getBoundingBox();this.eachNode(e=>{e.y=e.y-2*(e.y-t.top)-e.height}),this.translate(0,t.height)}}function o(t,e={},o){e=i({},n,e);const r=new h(t,e),s=[r];let c;if(!o&&!t.collapsed)for(;c=s.shift();)if(!c.data.collapsed){const t=e.getChildren(c.data),i=t?t.length:0;if(c.children=new Array(i),t&&i)for(let n=0;n<i;n++){const i=new h(t[n],e);c.children[n]=i,s.push(i),i.parent=c,i.depth=c.depth+1}}return r}class r{constructor(t,e={}){this.options=e,this.rootNode=o(t,e)}execute(){throw new Error("please override this method")}}let s=class t{constructor(t=0,e=0,i=0,n=[]){this.x=0,this.prelim=0,this.mod=0,this.shift=0,this.change=0,this.tl=null,this.tr=null,this.el=null,this.er=null,this.msel=0,this.mser=0,this.w=t||0,this.h=e||0,this.y=i||0,this.c=n||[],this.cs=n.length}static fromNode(e,i){if(!e)return null;const n=[];return e.children.forEach(e=>{const h=t.fromNode(e,i);h&&n.push(h)}),i?new t(e.height,e.width,e.x,n):new t(e.width,e.height,e.y,n)}};function c(t,e,i){i?t.y+=e:t.x+=e,t.children.forEach(t=>{c(t,e,i)})}function l(t,e){let i=e?t.y:t.x;return t.children.forEach(t=>{i=Math.min(l(t,e),i)}),i}function d(t,e){c(t,-l(t,e),e)}function a(t,e,i){i?e.y=t.x:e.x=t.x,t.c.forEach((t,n)=>{a(t,e.children[n],i)})}function f(t,e,i=0){e?(t.x=i,i+=t.width):(t.y=i,i+=t.height),t.children.forEach(t=>{f(t,e,i)})}function u(t,e={}){const i=e.isHorizontal;function n(t){0===t.cs?(t.el=t,t.er=t,t.msel=t.mser=0):(t.el=t.c[0].el,t.msel=t.c[0].msel,t.er=t.c[t.cs-1].er,t.mser=t.c[t.cs-1].mser)}function h(t,e,i){let n=t.c[e-1],h=n.mod,s=t.c[e],d=s.mod;for(;null!==n&&null!==s;){i&&l(n)>i.low&&(i=i.nxt);const a=h+n.prelim+n.w-(d+s.prelim);a>0&&(d+=a,i&&o(t,e,i.index,a));const f=l(n),u=l(s);f<=u&&(n=c(n),null!==n&&(h+=n.mod)),f>=u&&(s=r(s),null!==s&&(d+=s.mod))}!n&&s?function(t,e,i,n){const h=t.c[0].el;h.tl=i;const o=n-i.mod-t.c[0].msel;h.mod+=o,h.prelim-=o,t.c[0].el=t.c[e].el,t.c[0].msel=t.c[e].msel}(t,e,s,d):n&&!s&&function(t,e,i,n){const h=t.c[e].er;h.tr=i;const o=n-i.mod-t.c[e].mser;h.mod+=o,h.prelim-=o,t.c[e].er=t.c[e-1].er,t.c[e].mser=t.c[e-1].mser}(t,e,n,h)}function o(t,e,i,n){t.c[e].mod+=n,t.c[e].msel+=n,t.c[e].mser+=n,function(t,e,i,n){if(i!==e-1){const h=e-i;t.c[i+1].shift+=n/h,t.c[e].shift-=n/h,t.c[e].change-=n-n/h}}(t,e,i,n)}function r(t){return 0===t.cs?t.tl:t.c[0]}function c(t){return 0===t.cs?t.tr:t.c[t.cs-1]}function l(t){return t.y+t.h}function u(t,e,i){for(;null!==i&&t>=i.low;)i=i.nxt;return{low:t,index:e,nxt:i}}f(t,i);const g=s.fromNode(t,i);return g&&(!function t(e){if(0===e.cs)return void n(e);t(e.c[0]);let i=u(l(e.c[0].el),0,null);for(let n=1;n<e.cs;++n){t(e.c[n]);const o=l(e.c[n].er);h(e,n,i),i=u(o,n,i)}!function(t){t.prelim=(t.c[0].prelim+t.c[0].mod+t.c[t.cs-1].mod+t.c[t.cs-1].prelim+t.c[t.cs-1].w)/2-t.w/2}(e),n(e)}(g),function t(e,i){i+=e.mod,e.x=e.prelim+i,function(t){let e=0,i=0;for(let n=0;n<t.cs;n++)e+=t.c[n].shift,i+=e+t.c[n].change,t.c[n].mod+=i}(e);for(let n=0;n<e.cs;n++)t(e.c[n],i)}(g,0),a(g,t,i),d(t,i)),t}function g(t,e){const i=o(t.data,e,!0),n=o(t.data,e,!0),h=t.children.length,r=Math.round(h/2),s=e.getSide||function(t,e){return e<r?"right":"left"};for(let o=0;o<h;o++){const e=t.children[o];"right"===s(e,o)?n.children.push(e):i.children.push(e)}return i.eachNode(t=>{t.isRoot()||(t.side="left")}),n.eachNode(t=>{t.isRoot()||(t.side="right")}),{left:i,right:n}}const p=["LR","RL","TB","BT","H","V"],x=["LR","RL","H"],y=p[0];function m(t,e,i){const n=e.direction||y;if(e.isHorizontal=(t=>x.indexOf(t)>-1)(n),n&&-1===p.indexOf(n))throw new TypeError(`Invalid direction: ${n}`);if(n===p[0])i(t,e);else if(n===p[1])i(t,e),t.right2left();else if(n===p[2])i(t,e);else if(n===p[3])i(t,e),t.bottom2top();else if(n===p[4]||n===p[5]){const{left:n,right:h}=g(t,e);i(n,e),i(h,e),e.isHorizontal?n.right2left():n.bottom2top(),h.translate(n.x-h.x,n.y-h.y),t.x=n.x,t.y=h.y;const o=t.getBoundingBox();e.isHorizontal?o.top<0&&t.translate(0,-o.top):o.left<0&&t.translate(-o.left,0)}let h=e.fixedRoot;return void 0===h&&(h=!0),h&&t.translate(-(t.x+t.width/2+t.hgap),-(t.y+t.height/2+t.vgap)),function(t,e){if(e.radial){const[i,n]=e.isHorizontal?["x","y"]:["y","x"],h={x:1/0,y:1/0},o={x:-1/0,y:-1/0};let r=0;t.DFTraverse(t=>{r++;const{x:e,y:i}=t;h.x=Math.min(h.x,e),h.y=Math.min(h.y,i),o.x=Math.max(o.x,e),o.y=Math.max(o.y,i)});const s=o[n]-h[n];if(0===s)return;const c=2*Math.PI/r;t.DFTraverse(e=>{const o=e[n],r=h[n],l=e[i],d=t[i],a=(o-r)/s*(2*Math.PI-c)+c,f=l-d;e.x=Math.cos(a)*f,e.y=Math.sin(a)*f})}}(t,e),t}class w extends r{execute(){return m(this.rootNode,this.options,u)}}const H={};function N(t,e){const n=i({},H,e);return new w(t,n).execute()}class v{constructor(t=0,e=[]){this.x=0,this.y=0,this.leftChild=null,this.rightChild=null,this.isLeaf=!1,this.height=t,this.children=e}}const M={isHorizontal:!0,nodeSep:20,nodeSize:20,rankSep:200,subTreeSep:10};function b(t,e,i){i?(e.x=t.x,e.y=t.y):(e.x=t.y,e.y=t.x),t.children.forEach((t,n)=>{b(t,e.children[n],i)})}function T(t,e={}){const n=i({},M,e);let h=0;let o=null;const r=function t(e){e.width=0,e.depth&&e.depth>h&&(h=e.depth);const i=e.children,n=i.length,o=new v(0,[]);return i.forEach((e,i)=>{const h=t(e);o.children.push(h),0===i&&(o.leftChild=h),i===n-1&&(o.rightChild=h)}),o.originNode=e,o.isLeaf=e.isLeaf(),o}(t);return function t(e){if(e.isLeaf||0===e.children.length)e.drawingDepth=h;else{const i=e.children.map(e=>t(e)),n=Math.min(...i);e.drawingDepth=n-1}return e.drawingDepth}(r),function t(e){e.x=e.drawingDepth*n.rankSep,e.isLeaf?(e.y=0,o&&(e.y=o.y+o.height+n.nodeSep,e.originNode.parent!==o.originNode.parent&&(e.y+=n.subTreeSep)),o=e):(e.children.forEach(e=>{t(e)}),e.y=(e.leftChild.y+e.rightChild.y)/2)}(r),b(r,t,n.isHorizontal),t}class E extends r{execute(){return this.rootNode.width=0,m(this.rootNode,this.options,T)}}const S={};function B(t,e){const n=i({},S,e);return new E(t,n).execute()}function L(t,i,n,h){let o=null;t.eachNode(t=>{!function(t,i,n,h,o){const r=("function"==typeof n?n(t):n)*t.depth;if(!h)try{if(t.parent&&t.id===t.parent.children[0].id)return t.x+=r,void(t.y=i?i.y:0)}catch{}if(t.x+=r,i){if(t.y=i.y+e(i,t,o),i.parent&&t.parent&&t.parent.id!==i.parent.id){const n=i.parent,h=n.y+e(n,t,o);t.y=h>t.y?h:t.y}}else t.y=0}(t,o,i,n,h),o=t})}const V=["LR","RL","H"],R=V[0];class z extends r{execute(){const t=this.options,e=this.rootNode;t.isHorizontal=!0;const{indent:i=20,dropCap:n=!0,direction:h=R,align:o}=t;if(h&&-1===V.indexOf(h))throw new TypeError(`Invalid direction: ${h}`);if(h===V[0])L(e,i,n,o);else if(h===V[1])L(e,i,n,o),e.right2left();else if(h===V[2]){const{left:h,right:r}=g(e,t);L(h,i,n,o),h.right2left(),L(r,i,n,o);const s=h.getBoundingBox();r.translate(s.width,0),e.x=r.x-e.width/2}return e}}const C={};function D(t,e){const n=i({},C,e);return new z(t,n).execute()}function P(t,e){let i=0;return t.children.length?t.children.forEach(t=>{i+=P(t,e)}):i=t.height,t._subTreeSep=e.getSubTreeSep(t.data),t.totalHeight=Math.max(t.height,i)+2*t._subTreeSep,t.totalHeight}function Y(t){const e=t.children,i=e.length;if(i){e.forEach(t=>{Y(t)});const n=e[0],h=e[i-1],o=h.y-n.y+h.height;let r=0;if(e.forEach(t=>{r+=t.totalHeight}),o>t.height)t.y=n.y+o/2-t.height/2;else if(1!==e.length||t.height>r){const i=t.y+(t.height-o)/2-n.y;e.forEach(t=>{t.translate(0,i)})}else t.y=(n.y+n.height/2+h.y+h.height/2)/2-t.height/2}}const _={getSubTreeSep:()=>0};function G(t,e={}){return e=i({},_,e),t.parent={x:0,width:0,height:0,y:0},t.BFTraverse(t=>{t.x=t.parent.x+t.parent.width}),t.parent=void 0,P(t,e),t.startY=0,t.y=t.totalHeight/2-t.height/2,t.eachNode(t=>{const e=t.children,i=e.length;if(i){const n=e[0];if(n.startY=t.startY+t._subTreeSep,1===i)n.y=t.y+t.height/2-n.height/2;else{n.y=n.startY+n.totalHeight/2-n.height/2;for(let t=1;t<i;t++){const i=e[t];i.startY=e[t-1].startY+e[t-1].totalHeight,i.y=i.startY+i.totalHeight/2-i.height/2}}}}),Y(t),t}class I extends r{execute(){return m(this.rootNode,this.options,G)}}const A={};function F(t,e){const n=i({},A,e);return new I(t,n).execute()}const O={compactBox:N,dendrogram:B,indented:D,mindmap:F};t.compactBox=N,t.default=O,t.dendrogram=B,t.indented=D,t.mindmap=F,t.version="0.7.0",Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
2
2
|
//# sourceMappingURL=hierarchy.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.umd.js","sources":["../src/util.ts","../src/layout/hierarchy.ts","../src/layout/base.ts","../src/layout/non-layered-tidy.ts","../src/layout/separate-root.ts","../src/layout/do-layout.ts","../src/compact-box.ts","../src/layout/dendrogram.ts","../src/dendrogram.ts","../src/layout/indented.ts","../src/indented.ts","../src/layout/mindmap.ts","../src/mindmap.ts","../src/index.ts"],"sourcesContent":["import type { HierarchyNode } from './types';\n\n/**\n * Get average height or height for node's position calculation, according to align.\n * @param preNode previous node\n * @param node current node, whose position is going to be calculated\n * @param align 'center' means nodes align at the center, other value means align at the left-top\n * @param heightField field name for height value on preNode and node\n * @return the height for calculation\n */\nexport function getHeight(\n preNode: HierarchyNode,\n node: HierarchyNode,\n align?: 'center' | undefined,\n heightField: keyof HierarchyNode = 'height',\n): number {\n const preNodeHeight = preNode[heightField] as number;\n const nodeHeight = node[heightField] as number;\n return align === 'center' ? (preNodeHeight + nodeHeight) / 2 : preNode.height;\n}\n\nexport const assign = Object.assign;\n","import { assign } from '../util';\nimport type { HierarchyData, HierarchyNode, HierarchyOptions, BoundingBox } from '../types';\n\nconst PEM = 18;\nconst DEFAULT_HEIGHT = PEM * 2;\nconst DEFAULT_GAP = PEM;\n\nconst DEFAULT_OPTIONS: Required<\n Pick<\n HierarchyOptions,\n | 'getId'\n | 'getPreH'\n | 'getPreV'\n | 'getHGap'\n | 'getVGap'\n | 'getChildren'\n | 'getHeight'\n | 'getWidth'\n >\n> = {\n getId(d: HierarchyData): string {\n return (d.id || d.name) as string;\n },\n getPreH(d: HierarchyData): number {\n return d.preH || 0;\n },\n getPreV(d: HierarchyData): number {\n return d.preV || 0;\n },\n getHGap(d: HierarchyData): number {\n return d.hgap || DEFAULT_GAP;\n },\n getVGap(d: HierarchyData): number {\n return d.vgap || DEFAULT_GAP;\n },\n getChildren(d: HierarchyData): HierarchyData[] | undefined {\n return d.children;\n },\n getHeight(d: HierarchyData): number {\n return d.height || DEFAULT_HEIGHT;\n },\n getWidth(d: HierarchyData): number {\n const label = d.label || ' ';\n return d.width || label.split('').length * PEM; // FIXME DO NOT get width like this\n },\n};\n\nclass Node implements HierarchyNode {\n data: HierarchyData;\n id: string;\n x: number = 0;\n y: number = 0;\n width: number;\n height: number;\n depth: number = 0;\n children: HierarchyNode[] = [];\n parent?: HierarchyNode;\n hgap: number = 0;\n vgap: number = 0;\n preH: number;\n preV: number;\n\n constructor(data: HierarchyData | HierarchyNode, options: HierarchyOptions) {\n if (data instanceof Node || ('x' in data && 'y' in data && 'children' in data)) {\n // If it's already a Node, cast and return\n const node = data as Node;\n this.data = node.data;\n this.id = node.id;\n this.x = node.x;\n this.y = node.y;\n this.width = node.width;\n this.height = node.height;\n this.depth = node.depth;\n this.children = node.children;\n this.parent = node.parent;\n this.hgap = node.hgap;\n this.vgap = node.vgap;\n this.preH = node.preH;\n this.preV = node.preV;\n return;\n }\n\n this.data = data as HierarchyData;\n\n /*\n * Gaps: filling space between nodes\n * (x, y) ----------------------\n * | vgap |\n * | -------------------- h\n * | h | | e\n * | g | | i\n * | a | | g\n * | p | | h\n * | --------------------- t\n * | |\n * -----------width------------\n */\n const hgap = options.getHGap!(data);\n const vgap = options.getVGap!(data);\n this.preH = options.getPreH!(data);\n this.preV = options.getPreV!(data);\n this.width = options.getWidth!(data);\n this.height = options.getHeight!(data);\n this.width += this.preH;\n this.height += this.preV;\n this.id = options.getId!(data);\n\n this.addGap(hgap, vgap);\n }\n\n isRoot(): boolean {\n return this.depth === 0;\n }\n\n isLeaf(): boolean {\n return this.children.length === 0;\n }\n\n addGap(hgap: number, vgap: number): void {\n this.hgap += hgap;\n this.vgap += vgap;\n this.width += 2 * hgap;\n this.height += 2 * vgap;\n }\n\n eachNode(callback: (node: HierarchyNode) => void): void {\n let nodes: HierarchyNode[] = [this];\n let current: HierarchyNode | undefined;\n while ((current = nodes.shift())) {\n callback(current);\n nodes = current.children.concat(nodes);\n }\n }\n\n DFTraverse(callback: (node: HierarchyNode) => void): void {\n this.eachNode(callback);\n }\n\n BFTraverse(callback: (node: HierarchyNode) => void): void {\n let nodes: HierarchyNode[] = [this];\n let current: HierarchyNode | undefined;\n while ((current = nodes.shift())) {\n callback(current);\n nodes = nodes.concat(current.children);\n }\n }\n\n getBoundingBox(): BoundingBox {\n const bb: BoundingBox = {\n left: Number.MAX_VALUE,\n top: Number.MAX_VALUE,\n width: 0,\n height: 0,\n };\n this.eachNode((node) => {\n bb.left = Math.min(bb.left, node.x);\n bb.top = Math.min(bb.top, node.y);\n bb.width = Math.max(bb.width, node.x + node.width);\n bb.height = Math.max(bb.height, node.y + node.height);\n });\n return bb;\n }\n\n translate(tx: number = 0, ty: number = 0): void {\n this.eachNode((node) => {\n node.x += tx;\n node.y += ty;\n node.x += node.preH;\n node.y += node.preV;\n });\n }\n\n right2left(): void {\n const bb = this.getBoundingBox();\n this.eachNode((node) => {\n node.x = node.x - (node.x - bb.left) * 2 - node.width;\n });\n this.translate(bb.width, 0);\n }\n\n bottom2top(): void {\n const bb = this.getBoundingBox();\n this.eachNode((node) => {\n node.y = node.y - (node.y - bb.top) * 2 - node.height;\n });\n this.translate(0, bb.height);\n }\n}\n\nexport default function hierarchy(\n data: HierarchyData,\n options: HierarchyOptions = {},\n isolated?: boolean,\n): HierarchyNode {\n options = assign({}, DEFAULT_OPTIONS, options);\n const root = new Node(data, options);\n const nodes: HierarchyNode[] = [root];\n let node: HierarchyNode | undefined;\n\n if (!isolated && !data.collapsed) {\n while ((node = nodes.shift())) {\n if (!node.data.collapsed) {\n const children = options.getChildren!(node.data);\n const length = children ? children.length : 0;\n node.children = new Array(length);\n if (children && length) {\n for (let i = 0; i < length; i++) {\n const child = new Node(children[i], options);\n node.children[i] = child;\n nodes.push(child);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n }\n }\n\n return root;\n}\n","import hierarchy from './hierarchy';\nimport type { HierarchyData, HierarchyNode, HierarchyOptions } from '../types';\n\nexport default class Layout {\n options: HierarchyOptions;\n rootNode: HierarchyNode;\n\n constructor(root: HierarchyData, options: HierarchyOptions = {}) {\n this.options = options;\n this.rootNode = hierarchy(root, options);\n }\n\n execute(): HierarchyNode {\n throw new Error('please override this method');\n }\n}\n","import type { HierarchyNode, HierarchyOptions } from '../types';\n\ninterface WrappedTreeNode {\n w: number;\n h: number;\n y: number;\n x: number;\n c: WrappedTreeNode[];\n cs: number;\n prelim: number;\n mod: number;\n shift: number;\n change: number;\n tl: WrappedTreeNode | null;\n tr: WrappedTreeNode | null;\n el: WrappedTreeNode | null;\n er: WrappedTreeNode | null;\n msel: number;\n mser: number;\n}\n\nclass WrappedTree implements WrappedTreeNode {\n w: number;\n h: number;\n y: number;\n x: number = 0;\n c: WrappedTreeNode[];\n cs: number;\n prelim: number = 0;\n mod: number = 0;\n shift: number = 0;\n change: number = 0;\n tl: WrappedTreeNode | null = null;\n tr: WrappedTreeNode | null = null;\n el: WrappedTreeNode | null = null;\n er: WrappedTreeNode | null = null;\n msel: number = 0;\n mser: number = 0;\n\n constructor(w: number = 0, h: number = 0, y: number = 0, c: WrappedTreeNode[] = []) {\n this.w = w || 0;\n this.h = h || 0;\n this.y = y || 0;\n this.c = c || [];\n this.cs = c.length;\n }\n\n static fromNode(root: HierarchyNode | null, isHorizontal?: boolean): WrappedTreeNode | null {\n if (!root) return null;\n const children: WrappedTreeNode[] = [];\n root.children.forEach((child) => {\n const wrappedChild = WrappedTree.fromNode(child, isHorizontal);\n if (wrappedChild) children.push(wrappedChild);\n });\n if (isHorizontal) {\n return new WrappedTree(root.height, root.width, root.x, children);\n }\n return new WrappedTree(root.width, root.height, root.y, children);\n }\n}\n\nfunction moveRight(node: HierarchyNode, move: number, isHorizontal?: boolean): void {\n if (isHorizontal) {\n node.y += move;\n } else {\n node.x += move;\n }\n node.children.forEach((child) => {\n moveRight(child, move, isHorizontal);\n });\n}\n\nfunction getMin(node: HierarchyNode, isHorizontal?: boolean): number {\n let res = isHorizontal ? node.y : node.x;\n node.children.forEach((child) => {\n res = Math.min(getMin(child, isHorizontal), res);\n });\n return res;\n}\n\nfunction normalize(node: HierarchyNode, isHorizontal?: boolean): void {\n const min = getMin(node, isHorizontal);\n moveRight(node, -min, isHorizontal);\n}\n\nfunction convertBack(\n converted: WrappedTreeNode,\n root: HierarchyNode,\n isHorizontal?: boolean,\n): void {\n if (isHorizontal) {\n root.y = converted.x;\n } else {\n root.x = converted.x;\n }\n converted.c.forEach((child, i) => {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nfunction layer(node: HierarchyNode, isHorizontal?: boolean, d: number = 0): void {\n if (isHorizontal) {\n node.x = d;\n d += node.width;\n } else {\n node.y = d;\n d += node.height;\n }\n node.children.forEach((child) => {\n layer(child, isHorizontal, d);\n });\n}\n\ninterface IYL {\n low: number;\n index: number;\n nxt: IYL | null;\n}\n\nexport default function nonLayeredTidy(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n const isHorizontal = options.isHorizontal;\n\n function firstWalk(t: WrappedTreeNode): void {\n if (t.cs === 0) {\n setExtremes(t);\n return;\n }\n firstWalk(t.c[0]);\n let ih: IYL | null = updateIYL(bottom(t.c[0].el!), 0, null);\n for (let i = 1; i < t.cs; ++i) {\n firstWalk(t.c[i]);\n const min = bottom(t.c[i].er!);\n separate(t, i, ih);\n ih = updateIYL(min, i, ih);\n }\n positionRoot(t);\n setExtremes(t);\n }\n\n function setExtremes(t: WrappedTreeNode): void {\n if (t.cs === 0) {\n t.el = t;\n t.er = t;\n t.msel = t.mser = 0;\n } else {\n t.el = t.c[0].el;\n t.msel = t.c[0].msel;\n t.er = t.c[t.cs - 1].er;\n t.mser = t.c[t.cs - 1].mser;\n }\n }\n\n function separate(t: WrappedTreeNode, i: number, ih: IYL | null): void {\n let sr: WrappedTreeNode | null = t.c[i - 1];\n let mssr = sr.mod;\n let cl: WrappedTreeNode | null = t.c[i];\n let mscl = cl.mod;\n while (sr !== null && cl !== null) {\n if (ih && bottom(sr) > ih.low) ih = ih.nxt;\n const dist = mssr + sr.prelim + sr.w - (mscl + cl.prelim);\n if (dist > 0) {\n mscl += dist;\n if (ih) moveSubtree(t, i, ih.index, dist);\n }\n const sy = bottom(sr);\n const cy = bottom(cl);\n if (sy <= cy) {\n sr = nextRightContour(sr);\n if (sr !== null) mssr += sr.mod;\n }\n if (sy >= cy) {\n cl = nextLeftContour(cl);\n if (cl !== null) mscl += cl.mod;\n }\n }\n if (!sr && !!cl) {\n setLeftThread(t, i, cl, mscl);\n } else if (!!sr && !cl) {\n setRightThread(t, i, sr, mssr);\n }\n }\n\n function moveSubtree(t: WrappedTreeNode, i: number, si: number, dist: number): void {\n t.c[i].mod += dist;\n t.c[i].msel += dist;\n t.c[i].mser += dist;\n distributeExtra(t, i, si, dist);\n }\n\n function nextLeftContour(t: WrappedTreeNode): WrappedTreeNode | null {\n return t.cs === 0 ? t.tl : t.c[0];\n }\n\n function nextRightContour(t: WrappedTreeNode): WrappedTreeNode | null {\n return t.cs === 0 ? t.tr : t.c[t.cs - 1];\n }\n\n function bottom(t: WrappedTreeNode): number {\n return t.y + t.h;\n }\n\n function setLeftThread(\n t: WrappedTreeNode,\n i: number,\n cl: WrappedTreeNode,\n modsumcl: number,\n ): void {\n const li = t.c[0].el!;\n li.tl = cl;\n const diff = modsumcl - cl.mod - t.c[0].msel;\n li.mod += diff;\n li.prelim -= diff;\n t.c[0].el = t.c[i].el;\n t.c[0].msel = t.c[i].msel;\n }\n\n function setRightThread(\n t: WrappedTreeNode,\n i: number,\n sr: WrappedTreeNode,\n modsumsr: number,\n ): void {\n const ri = t.c[i].er!;\n ri.tr = sr;\n const diff = modsumsr - sr.mod - t.c[i].mser;\n ri.mod += diff;\n ri.prelim -= diff;\n t.c[i].er = t.c[i - 1].er;\n t.c[i].mser = t.c[i - 1].mser;\n }\n\n function positionRoot(t: WrappedTreeNode): void {\n t.prelim =\n (t.c[0].prelim + t.c[0].mod + t.c[t.cs - 1].mod + t.c[t.cs - 1].prelim + t.c[t.cs - 1].w) /\n 2 -\n t.w / 2;\n }\n\n function secondWalk(t: WrappedTreeNode, modsum: number): void {\n modsum += t.mod;\n t.x = t.prelim + modsum;\n addChildSpacing(t);\n for (let i = 0; i < t.cs; i++) {\n secondWalk(t.c[i], modsum);\n }\n }\n\n function distributeExtra(t: WrappedTreeNode, i: number, si: number, dist: number): void {\n if (si !== i - 1) {\n const nr = i - si;\n t.c[si + 1].shift += dist / nr;\n t.c[i].shift -= dist / nr;\n t.c[i].change -= dist - dist / nr;\n }\n }\n\n function addChildSpacing(t: WrappedTreeNode): void {\n let d = 0;\n let modsumdelta = 0;\n for (let i = 0; i < t.cs; i++) {\n d += t.c[i].shift;\n modsumdelta += d + t.c[i].change;\n t.c[i].mod += modsumdelta;\n }\n }\n\n function updateIYL(low: number, index: number, ih: IYL | null): IYL {\n while (ih !== null && low >= ih.low) {\n ih = ih.nxt;\n }\n return {\n low,\n index,\n nxt: ih,\n };\n }\n\n // do layout\n layer(root, isHorizontal);\n const wt = WrappedTree.fromNode(root, isHorizontal);\n if (wt) {\n firstWalk(wt);\n secondWalk(wt, 0);\n convertBack(wt, root, isHorizontal);\n normalize(root, isHorizontal);\n }\n\n return root;\n}\n","import hierarchy from './hierarchy';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\nexport default function separateRoot(\n root: HierarchyNode,\n options: HierarchyOptions,\n): { left: HierarchyNode; right: HierarchyNode } {\n // separate into left and right trees\n const left = hierarchy(root.data, options, true); // root only\n const right = hierarchy(root.data, options, true); // root only\n\n // automatically\n const treeSize = root.children.length;\n const rightTreeSize = Math.round(treeSize / 2);\n\n // separate left and right tree by meta data\n const getSide =\n options.getSide ||\n function (_child: HierarchyNode, index: number): 'left' | 'right' {\n if (index < rightTreeSize) {\n return 'right';\n }\n return 'left';\n };\n\n for (let i = 0; i < treeSize; i++) {\n const child = root.children[i];\n const side = getSide(child, i);\n if (side === 'right') {\n right.children.push(child);\n } else {\n left.children.push(child);\n }\n }\n\n left.eachNode((node) => {\n if (!node.isRoot()) {\n node.side = 'left';\n }\n });\n\n right.eachNode((node) => {\n if (!node.isRoot()) {\n node.side = 'right';\n }\n });\n\n return {\n left,\n right,\n };\n}\n","import separateTree from './separate-root';\nimport type { HierarchyNode, HierarchyOptions, Direction } from '../types';\n\nconst VALID_DIRECTIONS: Direction[] = [\n 'LR', // left to right\n 'RL', // right to left\n 'TB', // top to bottom\n 'BT', // bottom to top\n 'H', // horizontal\n 'V', // vertical\n];\n\nconst HORIZONTAL_DIRECTIONS: Direction[] = ['LR', 'RL', 'H'];\n\nconst isHorizontal = (direction: Direction): boolean =>\n HORIZONTAL_DIRECTIONS.indexOf(direction) > -1;\n\nconst DEFAULT_DIRECTION: Direction = VALID_DIRECTIONS[0];\n\ntype LayoutAlgorithm = (root: HierarchyNode, options: HierarchyOptions) => HierarchyNode;\n\nexport default function doLayout(\n root: HierarchyNode,\n options: HierarchyOptions,\n layoutAlgorithm: LayoutAlgorithm,\n): HierarchyNode {\n const direction = options.direction || DEFAULT_DIRECTION;\n options.isHorizontal = isHorizontal(direction);\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError(`Invalid direction: ${direction}`);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n layoutAlgorithm(root, options);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n layoutAlgorithm(root, options);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // TB\n layoutAlgorithm(root, options);\n } else if (direction === VALID_DIRECTIONS[3]) {\n // BT\n layoutAlgorithm(root, options);\n root.bottom2top();\n } else if (direction === VALID_DIRECTIONS[4] || direction === VALID_DIRECTIONS[5]) {\n // H or V\n // separate into left and right trees\n const { left, right } = separateTree(root, options);\n // do layout for left and right trees\n layoutAlgorithm(left, options);\n layoutAlgorithm(right, options);\n if (options.isHorizontal) {\n left.right2left();\n } else {\n left.bottom2top();\n }\n // combine left and right trees\n right.translate(left.x - right.x, left.y - right.y);\n // translate root\n root.x = left.x;\n root.y = right.y;\n const bb = root.getBoundingBox();\n if (options.isHorizontal) {\n if (bb.top < 0) {\n root.translate(0, -bb.top);\n }\n } else {\n if (bb.left < 0) {\n root.translate(-bb.left, 0);\n }\n }\n }\n\n // fixed root position, default value is true\n let fixedRoot = options.fixedRoot;\n if (fixedRoot === undefined) fixedRoot = true;\n if (fixedRoot) {\n root.translate(-(root.x + root.width / 2 + root.hgap), -(root.y + root.height / 2 + root.vgap));\n }\n\n reassignXYIfRadial(root, options);\n\n return root;\n}\n\nfunction reassignXYIfRadial(root: HierarchyNode, options: HierarchyOptions): void {\n if (options.radial) {\n const [rScale, radScale] = options.isHorizontal ? ['x', 'y'] : ['y', 'x'];\n\n const min = { x: Infinity, y: Infinity };\n const max = { x: -Infinity, y: -Infinity };\n\n let count = 0;\n root.DFTraverse((node) => {\n count++;\n const { x, y } = node;\n min.x = Math.min(min.x, x);\n min.y = Math.min(min.y, y);\n max.x = Math.max(max.x, x);\n max.y = Math.max(max.y, y);\n });\n\n const radDiff = max[radScale as 'x' | 'y'] - min[radScale as 'x' | 'y'];\n if (radDiff === 0) return;\n\n const avgRad = (Math.PI * 2) / count;\n root.DFTraverse((node) => {\n const nodeRadScale = node[radScale as 'x' | 'y'];\n const minRadScale = min[radScale as 'x' | 'y'];\n const nodeRScale = node[rScale as 'x' | 'y'];\n const rootRScale = root[rScale as 'x' | 'y'];\n\n const rad = ((nodeRadScale - minRadScale) / radDiff) * (Math.PI * 2 - avgRad) + avgRad;\n const r = nodeRScale - rootRScale;\n node.x = Math.cos(rad) * r;\n node.y = Math.sin(rad) * r;\n });\n }\n}\n","import TreeLayout from './layout/base';\nimport nonLayeredTidyTree from './layout/non-layered-tidy';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, CompactBoxOptions } from './types';\n\nclass CompactBoxTreeLayout extends TreeLayout {\n execute(): HierarchyNode {\n return doTreeLayout(this.rootNode, this.options, nonLayeredTidyTree);\n }\n}\n\nconst DEFAULT_OPTIONS: CompactBoxOptions = {};\n\nexport default function compactBoxLayout(\n root: HierarchyData,\n options?: CompactBoxOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new CompactBoxTreeLayout(root, mergedOptions).execute();\n}\n","import { assign } from '../util';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\ninterface WrappedTreeNode {\n x: number;\n y: number;\n height: number;\n leftChild: WrappedTreeNode | null;\n rightChild: WrappedTreeNode | null;\n children: WrappedTreeNode[];\n originNode: HierarchyNode;\n isLeaf: boolean;\n drawingDepth?: number;\n}\n\nclass WrappedTree implements WrappedTreeNode {\n x: number = 0;\n y: number = 0;\n height: number;\n leftChild: WrappedTreeNode | null = null;\n rightChild: WrappedTreeNode | null = null;\n children: WrappedTreeNode[];\n originNode!: HierarchyNode;\n isLeaf: boolean = false;\n\n constructor(height: number = 0, children: WrappedTreeNode[] = []) {\n this.height = height;\n this.children = children;\n }\n}\n\nconst DEFAULT_OPTIONS = {\n isHorizontal: true,\n nodeSep: 20,\n nodeSize: 20,\n rankSep: 200,\n subTreeSep: 10,\n};\n\nfunction convertBack(converted: WrappedTreeNode, root: HierarchyNode, isHorizontal: boolean): void {\n if (isHorizontal) {\n root.x = converted.x;\n root.y = converted.y;\n } else {\n root.x = converted.y;\n root.y = converted.x;\n }\n converted.children.forEach((child, i) => {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nexport default function dendrogram(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n\n let maxDepth = 0;\n\n function wrappedTreeFromNode(n: HierarchyNode): WrappedTreeNode {\n n.width = 0;\n if (n.depth && n.depth > maxDepth) {\n maxDepth = n.depth;\n }\n const children = n.children;\n const childrenCount = children.length;\n const t = new WrappedTree(n.height, []);\n children.forEach((child, i) => {\n const childWT = wrappedTreeFromNode(child);\n t.children.push(childWT);\n if (i === 0) {\n t.leftChild = childWT;\n }\n if (i === childrenCount - 1) {\n t.rightChild = childWT;\n }\n });\n t.originNode = n;\n t.isLeaf = n.isLeaf();\n return t;\n }\n\n function getDrawingDepth(t: WrappedTreeNode): number {\n if (t.isLeaf || t.children.length === 0) {\n t.drawingDepth = maxDepth;\n } else {\n const depths = t.children.map((child) => getDrawingDepth(child));\n const minChildDepth = Math.min(...depths);\n t.drawingDepth = minChildDepth - 1;\n }\n return t.drawingDepth;\n }\n\n let prevLeaf: WrappedTreeNode | null = null;\n\n function position(t: WrappedTreeNode): void {\n t.x = t.drawingDepth! * mergedOptions.rankSep;\n if (t.isLeaf) {\n t.y = 0;\n if (prevLeaf) {\n t.y = prevLeaf.y + prevLeaf.height + mergedOptions.nodeSep;\n if (t.originNode.parent !== prevLeaf.originNode.parent) {\n t.y += mergedOptions.subTreeSep;\n }\n }\n prevLeaf = t;\n } else {\n t.children.forEach((child) => {\n position(child);\n });\n t.y = (t.leftChild!.y + t.rightChild!.y) / 2;\n }\n }\n\n const wt = wrappedTreeFromNode(root);\n getDrawingDepth(wt);\n position(wt);\n convertBack(wt, root, mergedOptions.isHorizontal);\n\n return root;\n}\n","import TreeLayout from './layout/base';\nimport dendrogram from './layout/dendrogram';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, DendrogramOptions } from './types';\n\nclass DendrogramLayout extends TreeLayout {\n execute(): HierarchyNode {\n this.rootNode.width = 0;\n return doTreeLayout(this.rootNode, this.options, dendrogram);\n }\n}\n\nconst DEFAULT_OPTIONS: DendrogramOptions = {};\n\nexport default function dendrogramLayout(\n root: HierarchyData,\n options?: DendrogramOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new DendrogramLayout(root, mergedOptions).execute();\n}\n","import { getHeight } from '../util';\nimport type { HierarchyNode } from '../types';\n\nfunction positionNode(\n node: HierarchyNode,\n previousNode: HierarchyNode | null,\n indent: number | ((node: HierarchyNode) => number),\n dropCap: boolean,\n align?: 'center' | undefined,\n): void {\n // calculate the node's horizontal offset DX, dx's type might be number or function\n const displacementX = (typeof indent === 'function' ? indent(node) : indent) * node.depth;\n\n if (!dropCap) {\n try {\n if (node.parent && node.id === node.parent.children[0].id) {\n node.x += displacementX;\n node.y = previousNode ? previousNode.y : 0;\n return;\n }\n } catch {\n // skip to normal when a node has no parent\n }\n }\n\n node.x += displacementX;\n if (previousNode) {\n node.y = previousNode.y + getHeight(previousNode, node, align);\n if (previousNode.parent && node.parent && node.parent.id !== previousNode.parent.id) {\n // previous node has different parent\n const prevParent = previousNode.parent;\n const preY = prevParent.y + getHeight(prevParent, node, align);\n node.y = preY > node.y ? preY : node.y;\n }\n } else {\n node.y = 0;\n }\n}\n\nexport default function indented(\n root: HierarchyNode,\n indent: number | ((node: HierarchyNode) => number),\n dropCap: boolean,\n align?: 'center' | undefined,\n): void {\n let previousNode: HierarchyNode | null = null;\n root.eachNode((node) => {\n positionNode(node, previousNode, indent, dropCap, align);\n previousNode = node;\n });\n}\n","import TreeLayout from './layout/base';\nimport indentedTree from './layout/indented';\nimport separateTree from './layout/separate-root';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, IndentedOptions, Direction } from './types';\n\nconst VALID_DIRECTIONS: Direction[] = [\n 'LR', // left to right\n 'RL', // right to left\n 'H', // horizontal\n];\nconst DEFAULT_DIRECTION: Direction = VALID_DIRECTIONS[0];\n\nclass IndentedLayout extends TreeLayout {\n execute(): HierarchyNode {\n const options = this.options as IndentedOptions;\n const root = this.rootNode;\n options.isHorizontal = true;\n\n // default indent 20 and sink first children;\n const { indent = 20, dropCap = true, direction = DEFAULT_DIRECTION, align } = options;\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError(`Invalid direction: ${direction}`);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n indentedTree(root, indent, dropCap, align);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n indentedTree(root, indent, dropCap, align);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // H\n // separate into left and right trees\n const { left, right } = separateTree(root, options);\n indentedTree(left, indent, dropCap, align);\n left.right2left();\n indentedTree(right, indent, dropCap, align);\n const bbox = left.getBoundingBox();\n right.translate(bbox.width, 0);\n root.x = right.x - root.width / 2;\n }\n\n return root;\n }\n}\n\nconst DEFAULT_OPTIONS: IndentedOptions = {};\n\nexport default function indentedLayout(\n root: HierarchyData,\n options?: IndentedOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new IndentedLayout(root, mergedOptions).execute();\n}\n","import { assign } from '../util';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\nfunction secondWalk(node: HierarchyNode, options: HierarchyOptions): number {\n let totalHeight = 0;\n if (!node.children.length) {\n totalHeight = node.height;\n } else {\n node.children.forEach((c) => {\n totalHeight += secondWalk(c, options);\n });\n }\n node._subTreeSep = options.getSubTreeSep!(node.data);\n node.totalHeight = Math.max(node.height, totalHeight) + 2 * node._subTreeSep;\n return node.totalHeight;\n}\n\nfunction thirdWalk(node: HierarchyNode): void {\n const children = node.children;\n const len = children.length;\n if (len) {\n children.forEach((c) => {\n thirdWalk(c);\n });\n const first = children[0];\n const last = children[len - 1];\n const childrenHeight = last.y - first.y + last.height;\n let childrenTotalHeight = 0;\n children.forEach((child) => {\n childrenTotalHeight += child.totalHeight!;\n });\n if (childrenHeight > node.height) {\n // 当子节点总高度大于父节点高度\n node.y = first.y + childrenHeight / 2 - node.height / 2;\n } else if (children.length !== 1 || node.height > childrenTotalHeight) {\n // 多于一个子节点或者父节点大于所有子节点的总高度\n const offset = node.y + (node.height - childrenHeight) / 2 - first.y;\n children.forEach((c) => {\n c.translate(0, offset);\n });\n } else {\n // 只有一个子节点\n node.y = (first.y + first.height / 2 + last.y + last.height / 2) / 2 - node.height / 2;\n }\n }\n}\n\nconst DEFAULT_OPTIONS: HierarchyOptions = {\n getSubTreeSep() {\n return 0;\n },\n};\n\nexport default function mindmap(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n options = assign({}, DEFAULT_OPTIONS, options);\n\n root.parent = {\n x: 0,\n width: 0,\n height: 0,\n y: 0,\n } as HierarchyNode;\n\n // first walk\n root.BFTraverse((node) => {\n node.x = node.parent!.x + node.parent!.width;\n });\n\n root.parent = undefined;\n\n // second walk\n secondWalk(root, options);\n\n // adjusting\n // separating nodes\n root.startY = 0;\n root.y = root.totalHeight! / 2 - root.height / 2;\n root.eachNode((node) => {\n const children = node.children;\n const len = children.length;\n if (len) {\n const first = children[0];\n first.startY = node.startY! + node._subTreeSep!;\n if (len === 1) {\n first.y = node.y + node.height / 2 - first.height / 2;\n } else {\n first.y = first.startY + first.totalHeight! / 2 - first.height / 2;\n for (let i = 1; i < len; i++) {\n const c = children[i];\n c.startY = children[i - 1].startY! + children[i - 1].totalHeight!;\n c.y = c.startY + c.totalHeight! / 2 - c.height / 2;\n }\n }\n }\n });\n\n // third walk\n thirdWalk(root);\n\n return root;\n}\n","import TreeLayout from './layout/base';\nimport mindmap from './layout/mindmap';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, MindmapOptions } from './types';\n\nclass MindmapLayout extends TreeLayout {\n execute(): HierarchyNode {\n return doTreeLayout(this.rootNode, this.options, mindmap);\n }\n}\n\nconst DEFAULT_OPTIONS: MindmapOptions = {};\n\nexport default function mindmapLayout(\n root: HierarchyData,\n options?: MindmapOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new MindmapLayout(root, mergedOptions).execute();\n}\n","import compactBox from './compact-box';\nimport dendrogram from './dendrogram';\nimport indented from './indented';\nimport mindmap from './mindmap';\n\nexport { compactBox, dendrogram, indented, mindmap };\n\nexport * from './types';\n\nexport default {\n compactBox,\n dendrogram,\n indented,\n mindmap,\n};\n\nexport const version = '0.7.0';\n"],"names":["getHeight","preNode","node","align","heightField","preNodeHeight","nodeHeight","height","assign","Object","DEFAULT_OPTIONS","getId","d","id","name","getPreH","preH","getPreV","preV","getHGap","hgap","getVGap","vgap","getChildren","children","PEM","getWidth","label","width","split","length","Node","constructor","data","options","this","x","y","depth","parent","addGap","isRoot","isLeaf","eachNode","callback","current","nodes","shift","concat","DFTraverse","BFTraverse","getBoundingBox","bb","left","Number","MAX_VALUE","top","Math","min","max","translate","tx","ty","right2left","bottom2top","hierarchy","isolated","root","collapsed","Array","i","child","push","Layout","rootNode","execute","Error","WrappedTree$1","WrappedTree","w","h","c","prelim","mod","change","tl","tr","el","er","msel","mser","cs","fromNode","isHorizontal","forEach","wrappedChild","moveRight","move","getMin","res","normalize","convertBack","converted","layer","nonLayeredTidy","setExtremes","t","separate","ih","sr","mssr","cl","mscl","bottom","low","nxt","dist","moveSubtree","index","sy","cy","nextRightContour","nextLeftContour","modsumcl","li","diff","setLeftThread","modsumsr","ri","setRightThread","si","nr","distributeExtra","updateIYL","wt","firstWalk","positionRoot","secondWalk","modsum","modsumdelta","addChildSpacing","separateRoot","right","treeSize","rightTreeSize","round","getSide","_child","side","VALID_DIRECTIONS","HORIZONTAL_DIRECTIONS","DEFAULT_DIRECTION","doLayout","layoutAlgorithm","direction","indexOf","TypeError","separateTree","fixedRoot","radial","rScale","radScale","Infinity","count","radDiff","avgRad","PI","nodeRadScale","minRadScale","nodeRScale","rootRScale","rad","r","cos","sin","reassignXYIfRadial","CompactBoxTreeLayout","TreeLayout","doTreeLayout","nonLayeredTidyTree","compactBoxLayout","mergedOptions","leftChild","rightChild","nodeSep","nodeSize","rankSep","subTreeSep","dendrogram","maxDepth","prevLeaf","wrappedTreeFromNode","n","childrenCount","childWT","originNode","getDrawingDepth","drawingDepth","depths","map","minChildDepth","position","DendrogramLayout","dendrogramLayout","indented","indent","dropCap","previousNode","displacementX","prevParent","preY","positionNode","IndentedLayout","indentedTree","bbox","indentedLayout","totalHeight","_subTreeSep","getSubTreeSep","thirdWalk","len","first","last","childrenHeight","childrenTotalHeight","offset","mindmap","startY","MindmapLayout","mindmapLayout","compactBox"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hierarchy.umd.js","sources":["../src/util.ts","../src/layout/hierarchy.ts","../src/layout/base.ts","../src/layout/non-layered-tidy.ts","../src/layout/separate-root.ts","../src/layout/do-layout.ts","../src/compact-box.ts","../src/layout/dendrogram.ts","../src/dendrogram.ts","../src/layout/indented.ts","../src/indented.ts","../src/layout/mindmap.ts","../src/mindmap.ts","../src/index.ts"],"sourcesContent":["import type { HierarchyNode } from './types';\n\n/**\n * Get average height or height for node's position calculation, according to align.\n * @param preNode previous node\n * @param node current node, whose position is going to be calculated\n * @param align 'center' means nodes align at the center, other value means align at the left-top\n * @param heightField field name for height value on preNode and node\n * @return the height for calculation\n */\nexport function getHeight(\n preNode: HierarchyNode,\n node: HierarchyNode,\n align?: 'center' | undefined,\n heightField: keyof HierarchyNode = 'height',\n): number {\n const preNodeHeight = preNode[heightField] as number;\n const nodeHeight = node[heightField] as number;\n return align === 'center' ? (preNodeHeight + nodeHeight) / 2 : preNode.height;\n}\n\nexport const assign = Object.assign;\n","import { assign } from '../util';\nimport type { HierarchyData, HierarchyNode, HierarchyOptions, BoundingBox } from '../types';\n\nconst PEM = 18;\nconst DEFAULT_HEIGHT = PEM * 2;\nconst DEFAULT_GAP = PEM;\n\nconst DEFAULT_OPTIONS: Required<\n Pick<\n HierarchyOptions,\n | 'getId'\n | 'getPreH'\n | 'getPreV'\n | 'getHGap'\n | 'getVGap'\n | 'getChildren'\n | 'getHeight'\n | 'getWidth'\n >\n> = {\n getId(d: HierarchyData): string {\n return (d.id || d.name) as string;\n },\n getPreH(d: HierarchyData): number {\n return d.preH || 0;\n },\n getPreV(d: HierarchyData): number {\n return d.preV || 0;\n },\n getHGap(d: HierarchyData): number {\n return d.hgap || DEFAULT_GAP;\n },\n getVGap(d: HierarchyData): number {\n return d.vgap || DEFAULT_GAP;\n },\n getChildren(d: HierarchyData): HierarchyData[] | undefined {\n return d.children;\n },\n getHeight(d: HierarchyData): number {\n return d.height || DEFAULT_HEIGHT;\n },\n getWidth(d: HierarchyData): number {\n const label = d.label || ' ';\n return d.width || label.split('').length * PEM; // FIXME DO NOT get width like this\n },\n};\n\nclass Node implements HierarchyNode {\n data: HierarchyData;\n id: string;\n x: number = 0;\n y: number = 0;\n width: number;\n height: number;\n depth: number = 0;\n children: HierarchyNode[] = [];\n parent?: HierarchyNode;\n hgap: number = 0;\n vgap: number = 0;\n preH: number;\n preV: number;\n\n constructor(data: HierarchyData | HierarchyNode, options: HierarchyOptions) {\n if (data instanceof Node || ('x' in data && 'y' in data && 'children' in data)) {\n // If it's already a Node, cast and return\n const node = data as Node;\n this.data = node.data;\n this.id = node.id;\n this.x = node.x;\n this.y = node.y;\n this.width = node.width;\n this.height = node.height;\n this.depth = node.depth;\n this.children = node.children;\n this.parent = node.parent;\n this.hgap = node.hgap;\n this.vgap = node.vgap;\n this.preH = node.preH;\n this.preV = node.preV;\n return;\n }\n\n this.data = data as HierarchyData;\n\n /*\n * Gaps: filling space between nodes\n * (x, y) ----------------------\n * | vgap |\n * | -------------------- h\n * | h | | e\n * | g | | i\n * | a | | g\n * | p | | h\n * | --------------------- t\n * | |\n * -----------width------------\n */\n const hgap = options.getHGap!(data);\n const vgap = options.getVGap!(data);\n this.preH = options.getPreH!(data);\n this.preV = options.getPreV!(data);\n this.width = options.getWidth!(data);\n this.height = options.getHeight!(data);\n this.width += this.preH;\n this.height += this.preV;\n this.id = options.getId!(data);\n\n this.addGap(hgap, vgap);\n }\n\n isRoot(): boolean {\n return this.depth === 0;\n }\n\n isLeaf(): boolean {\n return this.children.length === 0;\n }\n\n addGap(hgap: number, vgap: number): void {\n this.hgap += hgap;\n this.vgap += vgap;\n this.width += 2 * hgap;\n this.height += 2 * vgap;\n }\n\n eachNode(callback: (node: HierarchyNode) => void): void {\n let nodes: HierarchyNode[] = [this];\n let current: HierarchyNode | undefined;\n while ((current = nodes.shift())) {\n callback(current);\n nodes = current.children.concat(nodes);\n }\n }\n\n DFTraverse(callback: (node: HierarchyNode) => void): void {\n this.eachNode(callback);\n }\n\n BFTraverse(callback: (node: HierarchyNode) => void): void {\n let nodes: HierarchyNode[] = [this];\n let current: HierarchyNode | undefined;\n while ((current = nodes.shift())) {\n callback(current);\n nodes = nodes.concat(current.children);\n }\n }\n\n getBoundingBox(): BoundingBox {\n const bb: BoundingBox = {\n left: Number.MAX_VALUE,\n top: Number.MAX_VALUE,\n width: 0,\n height: 0,\n };\n this.eachNode((node) => {\n bb.left = Math.min(bb.left, node.x);\n bb.top = Math.min(bb.top, node.y);\n bb.width = Math.max(bb.width, node.x + node.width);\n bb.height = Math.max(bb.height, node.y + node.height);\n });\n return bb;\n }\n\n translate(tx: number = 0, ty: number = 0): void {\n this.eachNode((node) => {\n node.x += tx;\n node.y += ty;\n node.x += node.preH;\n node.y += node.preV;\n });\n }\n\n right2left(): void {\n const bb = this.getBoundingBox();\n this.eachNode((node) => {\n node.x = node.x - (node.x - bb.left) * 2 - node.width;\n });\n this.translate(bb.width, 0);\n }\n\n bottom2top(): void {\n const bb = this.getBoundingBox();\n this.eachNode((node) => {\n node.y = node.y - (node.y - bb.top) * 2 - node.height;\n });\n this.translate(0, bb.height);\n }\n}\n\nexport default function hierarchy(\n data: HierarchyData,\n options: HierarchyOptions = {},\n isolated?: boolean,\n): HierarchyNode {\n options = assign({}, DEFAULT_OPTIONS, options);\n const root = new Node(data, options);\n const nodes: HierarchyNode[] = [root];\n let node: HierarchyNode | undefined;\n\n if (!isolated && !data.collapsed) {\n while ((node = nodes.shift())) {\n if (!node.data.collapsed) {\n const children = options.getChildren!(node.data);\n const length = children ? children.length : 0;\n node.children = new Array(length);\n if (children && length) {\n for (let i = 0; i < length; i++) {\n const child = new Node(children[i], options);\n node.children[i] = child;\n nodes.push(child);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n }\n }\n\n return root;\n}\n","import hierarchy from './hierarchy';\nimport type { HierarchyData, HierarchyNode, HierarchyOptions } from '../types';\n\nexport default class Layout {\n options: HierarchyOptions;\n rootNode: HierarchyNode;\n\n constructor(root: HierarchyData, options: HierarchyOptions = {}) {\n this.options = options;\n this.rootNode = hierarchy(root, options);\n }\n\n execute(): HierarchyNode {\n throw new Error('please override this method');\n }\n}\n","import type { HierarchyNode, HierarchyOptions } from '../types';\n\ninterface WrappedTreeNode {\n w: number;\n h: number;\n y: number;\n x: number;\n c: WrappedTreeNode[];\n cs: number;\n prelim: number;\n mod: number;\n shift: number;\n change: number;\n tl: WrappedTreeNode | null;\n tr: WrappedTreeNode | null;\n el: WrappedTreeNode | null;\n er: WrappedTreeNode | null;\n msel: number;\n mser: number;\n}\n\nclass WrappedTree implements WrappedTreeNode {\n w: number;\n h: number;\n y: number;\n x: number = 0;\n c: WrappedTreeNode[];\n cs: number;\n prelim: number = 0;\n mod: number = 0;\n shift: number = 0;\n change: number = 0;\n tl: WrappedTreeNode | null = null;\n tr: WrappedTreeNode | null = null;\n el: WrappedTreeNode | null = null;\n er: WrappedTreeNode | null = null;\n msel: number = 0;\n mser: number = 0;\n\n constructor(w: number = 0, h: number = 0, y: number = 0, c: WrappedTreeNode[] = []) {\n this.w = w || 0;\n this.h = h || 0;\n this.y = y || 0;\n this.c = c || [];\n this.cs = c.length;\n }\n\n static fromNode(root: HierarchyNode | null, isHorizontal?: boolean): WrappedTreeNode | null {\n if (!root) return null;\n const children: WrappedTreeNode[] = [];\n root.children.forEach((child) => {\n const wrappedChild = WrappedTree.fromNode(child, isHorizontal);\n if (wrappedChild) children.push(wrappedChild);\n });\n if (isHorizontal) {\n return new WrappedTree(root.height, root.width, root.x, children);\n }\n return new WrappedTree(root.width, root.height, root.y, children);\n }\n}\n\nfunction moveRight(node: HierarchyNode, move: number, isHorizontal?: boolean): void {\n if (isHorizontal) {\n node.y += move;\n } else {\n node.x += move;\n }\n node.children.forEach((child) => {\n moveRight(child, move, isHorizontal);\n });\n}\n\nfunction getMin(node: HierarchyNode, isHorizontal?: boolean): number {\n let res = isHorizontal ? node.y : node.x;\n node.children.forEach((child) => {\n res = Math.min(getMin(child, isHorizontal), res);\n });\n return res;\n}\n\nfunction normalize(node: HierarchyNode, isHorizontal?: boolean): void {\n const min = getMin(node, isHorizontal);\n moveRight(node, -min, isHorizontal);\n}\n\nfunction convertBack(\n converted: WrappedTreeNode,\n root: HierarchyNode,\n isHorizontal?: boolean,\n): void {\n if (isHorizontal) {\n root.y = converted.x;\n } else {\n root.x = converted.x;\n }\n converted.c.forEach((child, i) => {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nfunction layer(node: HierarchyNode, isHorizontal?: boolean, d: number = 0): void {\n if (isHorizontal) {\n node.x = d;\n d += node.width;\n } else {\n node.y = d;\n d += node.height;\n }\n node.children.forEach((child) => {\n layer(child, isHorizontal, d);\n });\n}\n\ninterface IYL {\n low: number;\n index: number;\n nxt: IYL | null;\n}\n\nexport default function nonLayeredTidy(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n const isHorizontal = options.isHorizontal;\n\n function firstWalk(t: WrappedTreeNode): void {\n if (t.cs === 0) {\n setExtremes(t);\n return;\n }\n firstWalk(t.c[0]);\n let ih: IYL | null = updateIYL(bottom(t.c[0].el!), 0, null);\n for (let i = 1; i < t.cs; ++i) {\n firstWalk(t.c[i]);\n const min = bottom(t.c[i].er!);\n separate(t, i, ih);\n ih = updateIYL(min, i, ih);\n }\n positionRoot(t);\n setExtremes(t);\n }\n\n function setExtremes(t: WrappedTreeNode): void {\n if (t.cs === 0) {\n t.el = t;\n t.er = t;\n t.msel = t.mser = 0;\n } else {\n t.el = t.c[0].el;\n t.msel = t.c[0].msel;\n t.er = t.c[t.cs - 1].er;\n t.mser = t.c[t.cs - 1].mser;\n }\n }\n\n function separate(t: WrappedTreeNode, i: number, ih: IYL | null): void {\n let sr: WrappedTreeNode | null = t.c[i - 1];\n let mssr = sr.mod;\n let cl: WrappedTreeNode | null = t.c[i];\n let mscl = cl.mod;\n while (sr !== null && cl !== null) {\n if (ih && bottom(sr) > ih.low) ih = ih.nxt;\n const dist = mssr + sr.prelim + sr.w - (mscl + cl.prelim);\n if (dist > 0) {\n mscl += dist;\n if (ih) moveSubtree(t, i, ih.index, dist);\n }\n const sy = bottom(sr);\n const cy = bottom(cl);\n if (sy <= cy) {\n sr = nextRightContour(sr);\n if (sr !== null) mssr += sr.mod;\n }\n if (sy >= cy) {\n cl = nextLeftContour(cl);\n if (cl !== null) mscl += cl.mod;\n }\n }\n if (!sr && !!cl) {\n setLeftThread(t, i, cl, mscl);\n } else if (!!sr && !cl) {\n setRightThread(t, i, sr, mssr);\n }\n }\n\n function moveSubtree(t: WrappedTreeNode, i: number, si: number, dist: number): void {\n t.c[i].mod += dist;\n t.c[i].msel += dist;\n t.c[i].mser += dist;\n distributeExtra(t, i, si, dist);\n }\n\n function nextLeftContour(t: WrappedTreeNode): WrappedTreeNode | null {\n return t.cs === 0 ? t.tl : t.c[0];\n }\n\n function nextRightContour(t: WrappedTreeNode): WrappedTreeNode | null {\n return t.cs === 0 ? t.tr : t.c[t.cs - 1];\n }\n\n function bottom(t: WrappedTreeNode): number {\n return t.y + t.h;\n }\n\n function setLeftThread(\n t: WrappedTreeNode,\n i: number,\n cl: WrappedTreeNode,\n modsumcl: number,\n ): void {\n const li = t.c[0].el!;\n li.tl = cl;\n const diff = modsumcl - cl.mod - t.c[0].msel;\n li.mod += diff;\n li.prelim -= diff;\n t.c[0].el = t.c[i].el;\n t.c[0].msel = t.c[i].msel;\n }\n\n function setRightThread(\n t: WrappedTreeNode,\n i: number,\n sr: WrappedTreeNode,\n modsumsr: number,\n ): void {\n const ri = t.c[i].er!;\n ri.tr = sr;\n const diff = modsumsr - sr.mod - t.c[i].mser;\n ri.mod += diff;\n ri.prelim -= diff;\n t.c[i].er = t.c[i - 1].er;\n t.c[i].mser = t.c[i - 1].mser;\n }\n\n function positionRoot(t: WrappedTreeNode): void {\n t.prelim =\n (t.c[0].prelim + t.c[0].mod + t.c[t.cs - 1].mod + t.c[t.cs - 1].prelim + t.c[t.cs - 1].w) /\n 2 -\n t.w / 2;\n }\n\n function secondWalk(t: WrappedTreeNode, modsum: number): void {\n modsum += t.mod;\n t.x = t.prelim + modsum;\n addChildSpacing(t);\n for (let i = 0; i < t.cs; i++) {\n secondWalk(t.c[i], modsum);\n }\n }\n\n function distributeExtra(t: WrappedTreeNode, i: number, si: number, dist: number): void {\n if (si !== i - 1) {\n const nr = i - si;\n t.c[si + 1].shift += dist / nr;\n t.c[i].shift -= dist / nr;\n t.c[i].change -= dist - dist / nr;\n }\n }\n\n function addChildSpacing(t: WrappedTreeNode): void {\n let d = 0;\n let modsumdelta = 0;\n for (let i = 0; i < t.cs; i++) {\n d += t.c[i].shift;\n modsumdelta += d + t.c[i].change;\n t.c[i].mod += modsumdelta;\n }\n }\n\n function updateIYL(low: number, index: number, ih: IYL | null): IYL {\n while (ih !== null && low >= ih.low) {\n ih = ih.nxt;\n }\n return {\n low,\n index,\n nxt: ih,\n };\n }\n\n // do layout\n layer(root, isHorizontal);\n const wt = WrappedTree.fromNode(root, isHorizontal);\n if (wt) {\n firstWalk(wt);\n secondWalk(wt, 0);\n convertBack(wt, root, isHorizontal);\n normalize(root, isHorizontal);\n }\n\n return root;\n}\n","import hierarchy from './hierarchy';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\nexport default function separateRoot(\n root: HierarchyNode,\n options: HierarchyOptions,\n): { left: HierarchyNode; right: HierarchyNode } {\n // separate into left and right trees\n const left = hierarchy(root.data, options, true); // root only\n const right = hierarchy(root.data, options, true); // root only\n\n // automatically\n const treeSize = root.children.length;\n const rightTreeSize = Math.round(treeSize / 2);\n\n // separate left and right tree by meta data\n const getSide =\n options.getSide ||\n function (_child: HierarchyNode, index: number): 'left' | 'right' {\n if (index < rightTreeSize) {\n return 'right';\n }\n return 'left';\n };\n\n for (let i = 0; i < treeSize; i++) {\n const child = root.children[i];\n const side = getSide(child, i);\n if (side === 'right') {\n right.children.push(child);\n } else {\n left.children.push(child);\n }\n }\n\n left.eachNode((node) => {\n if (!node.isRoot()) {\n node.side = 'left';\n }\n });\n\n right.eachNode((node) => {\n if (!node.isRoot()) {\n node.side = 'right';\n }\n });\n\n return {\n left,\n right,\n };\n}\n","import separateTree from './separate-root';\nimport type { HierarchyNode, HierarchyOptions, Direction } from '../types';\n\nconst VALID_DIRECTIONS: Direction[] = [\n 'LR', // left to right\n 'RL', // right to left\n 'TB', // top to bottom\n 'BT', // bottom to top\n 'H', // horizontal\n 'V', // vertical\n];\n\nconst HORIZONTAL_DIRECTIONS: Direction[] = ['LR', 'RL', 'H'];\n\nconst isHorizontal = (direction: Direction): boolean =>\n HORIZONTAL_DIRECTIONS.indexOf(direction) > -1;\n\nconst DEFAULT_DIRECTION: Direction = VALID_DIRECTIONS[0];\n\ntype LayoutAlgorithm = (root: HierarchyNode, options: HierarchyOptions) => HierarchyNode;\n\nexport default function doLayout(\n root: HierarchyNode,\n options: HierarchyOptions,\n layoutAlgorithm: LayoutAlgorithm,\n): HierarchyNode {\n const direction = options.direction || DEFAULT_DIRECTION;\n options.isHorizontal = isHorizontal(direction);\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError(`Invalid direction: ${direction}`);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n layoutAlgorithm(root, options);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n layoutAlgorithm(root, options);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // TB\n layoutAlgorithm(root, options);\n } else if (direction === VALID_DIRECTIONS[3]) {\n // BT\n layoutAlgorithm(root, options);\n root.bottom2top();\n } else if (direction === VALID_DIRECTIONS[4] || direction === VALID_DIRECTIONS[5]) {\n // H or V\n // separate into left and right trees\n const { left, right } = separateTree(root, options);\n // do layout for left and right trees\n layoutAlgorithm(left, options);\n layoutAlgorithm(right, options);\n if (options.isHorizontal) {\n left.right2left();\n } else {\n left.bottom2top();\n }\n // combine left and right trees\n right.translate(left.x - right.x, left.y - right.y);\n // translate root\n root.x = left.x;\n root.y = right.y;\n const bb = root.getBoundingBox();\n if (options.isHorizontal) {\n if (bb.top < 0) {\n root.translate(0, -bb.top);\n }\n } else {\n if (bb.left < 0) {\n root.translate(-bb.left, 0);\n }\n }\n }\n\n // fixed root position, default value is true\n let fixedRoot = options.fixedRoot;\n if (fixedRoot === undefined) fixedRoot = true;\n if (fixedRoot) {\n root.translate(-(root.x + root.width / 2 + root.hgap), -(root.y + root.height / 2 + root.vgap));\n }\n\n reassignXYIfRadial(root, options);\n\n return root;\n}\n\nfunction reassignXYIfRadial(root: HierarchyNode, options: HierarchyOptions): void {\n if (options.radial) {\n const [rScale, radScale] = options.isHorizontal ? ['x', 'y'] : ['y', 'x'];\n\n const min = { x: Infinity, y: Infinity };\n const max = { x: -Infinity, y: -Infinity };\n\n let count = 0;\n root.DFTraverse((node) => {\n count++;\n const { x, y } = node;\n min.x = Math.min(min.x, x);\n min.y = Math.min(min.y, y);\n max.x = Math.max(max.x, x);\n max.y = Math.max(max.y, y);\n });\n\n const radDiff = max[radScale as 'x' | 'y'] - min[radScale as 'x' | 'y'];\n if (radDiff === 0) return;\n\n const avgRad = (Math.PI * 2) / count;\n root.DFTraverse((node) => {\n const nodeRadScale = node[radScale as 'x' | 'y'];\n const minRadScale = min[radScale as 'x' | 'y'];\n const nodeRScale = node[rScale as 'x' | 'y'];\n const rootRScale = root[rScale as 'x' | 'y'];\n\n const rad = ((nodeRadScale - minRadScale) / radDiff) * (Math.PI * 2 - avgRad) + avgRad;\n const r = nodeRScale - rootRScale;\n node.x = Math.cos(rad) * r;\n node.y = Math.sin(rad) * r;\n });\n }\n}\n","import TreeLayout from './layout/base';\nimport nonLayeredTidyTree from './layout/non-layered-tidy';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, CompactBoxOptions } from './types';\n\nclass CompactBoxTreeLayout extends TreeLayout {\n execute(): HierarchyNode {\n return doTreeLayout(this.rootNode, this.options, nonLayeredTidyTree);\n }\n}\n\nconst DEFAULT_OPTIONS: CompactBoxOptions = {};\n\nexport default function compactBoxLayout(\n root: HierarchyData,\n options?: CompactBoxOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new CompactBoxTreeLayout(root, mergedOptions).execute();\n}\n","import { assign } from '../util';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\ninterface WrappedTreeNode {\n x: number;\n y: number;\n height: number;\n leftChild: WrappedTreeNode | null;\n rightChild: WrappedTreeNode | null;\n children: WrappedTreeNode[];\n originNode: HierarchyNode;\n isLeaf: boolean;\n drawingDepth?: number;\n}\n\nclass WrappedTree implements WrappedTreeNode {\n x: number = 0;\n y: number = 0;\n height: number;\n leftChild: WrappedTreeNode | null = null;\n rightChild: WrappedTreeNode | null = null;\n children: WrappedTreeNode[];\n originNode!: HierarchyNode;\n isLeaf: boolean = false;\n\n constructor(height: number = 0, children: WrappedTreeNode[] = []) {\n this.height = height;\n this.children = children;\n }\n}\n\nconst DEFAULT_OPTIONS = {\n isHorizontal: true,\n nodeSep: 20,\n nodeSize: 20,\n rankSep: 200,\n subTreeSep: 10,\n};\n\nfunction convertBack(converted: WrappedTreeNode, root: HierarchyNode, isHorizontal: boolean): void {\n if (isHorizontal) {\n root.x = converted.x;\n root.y = converted.y;\n } else {\n root.x = converted.y;\n root.y = converted.x;\n }\n converted.children.forEach((child, i) => {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nexport default function dendrogram(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n\n let maxDepth = 0;\n\n function wrappedTreeFromNode(n: HierarchyNode): WrappedTreeNode {\n n.width = 0;\n if (n.depth && n.depth > maxDepth) {\n maxDepth = n.depth;\n }\n const children = n.children;\n const childrenCount = children.length;\n const t = new WrappedTree(0, []);\n children.forEach((child, i) => {\n const childWT = wrappedTreeFromNode(child);\n t.children.push(childWT);\n if (i === 0) {\n t.leftChild = childWT;\n }\n if (i === childrenCount - 1) {\n t.rightChild = childWT;\n }\n });\n t.originNode = n;\n t.isLeaf = n.isLeaf();\n return t;\n }\n\n function getDrawingDepth(t: WrappedTreeNode): number {\n if (t.isLeaf || t.children.length === 0) {\n t.drawingDepth = maxDepth;\n } else {\n const depths = t.children.map((child) => getDrawingDepth(child));\n const minChildDepth = Math.min(...depths);\n t.drawingDepth = minChildDepth - 1;\n }\n return t.drawingDepth;\n }\n\n let prevLeaf: WrappedTreeNode | null = null;\n\n function position(t: WrappedTreeNode): void {\n t.x = t.drawingDepth! * mergedOptions.rankSep;\n if (t.isLeaf) {\n t.y = 0;\n if (prevLeaf) {\n t.y = prevLeaf.y + prevLeaf.height + mergedOptions.nodeSep;\n if (t.originNode.parent !== prevLeaf.originNode.parent) {\n t.y += mergedOptions.subTreeSep;\n }\n }\n prevLeaf = t;\n } else {\n t.children.forEach((child) => {\n position(child);\n });\n t.y = (t.leftChild!.y + t.rightChild!.y) / 2;\n }\n }\n\n const wt = wrappedTreeFromNode(root);\n getDrawingDepth(wt);\n position(wt);\n convertBack(wt, root, mergedOptions.isHorizontal);\n\n return root;\n}\n","import TreeLayout from './layout/base';\nimport dendrogram from './layout/dendrogram';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, DendrogramOptions } from './types';\n\nclass DendrogramLayout extends TreeLayout {\n execute(): HierarchyNode {\n this.rootNode.width = 0;\n return doTreeLayout(this.rootNode, this.options, dendrogram);\n }\n}\n\nconst DEFAULT_OPTIONS: DendrogramOptions = {};\n\nexport default function dendrogramLayout(\n root: HierarchyData,\n options?: DendrogramOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new DendrogramLayout(root, mergedOptions).execute();\n}\n","import { getHeight } from '../util';\nimport type { HierarchyNode } from '../types';\n\nfunction positionNode(\n node: HierarchyNode,\n previousNode: HierarchyNode | null,\n indent: number | ((node: HierarchyNode) => number),\n dropCap: boolean,\n align?: 'center' | undefined,\n): void {\n // calculate the node's horizontal offset DX, dx's type might be number or function\n const displacementX = (typeof indent === 'function' ? indent(node) : indent) * node.depth;\n\n if (!dropCap) {\n try {\n if (node.parent && node.id === node.parent.children[0].id) {\n node.x += displacementX;\n node.y = previousNode ? previousNode.y : 0;\n return;\n }\n } catch {\n // skip to normal when a node has no parent\n }\n }\n\n node.x += displacementX;\n if (previousNode) {\n node.y = previousNode.y + getHeight(previousNode, node, align);\n if (previousNode.parent && node.parent && node.parent.id !== previousNode.parent.id) {\n // previous node has different parent\n const prevParent = previousNode.parent;\n const preY = prevParent.y + getHeight(prevParent, node, align);\n node.y = preY > node.y ? preY : node.y;\n }\n } else {\n node.y = 0;\n }\n}\n\nexport default function indented(\n root: HierarchyNode,\n indent: number | ((node: HierarchyNode) => number),\n dropCap: boolean,\n align?: 'center' | undefined,\n): void {\n let previousNode: HierarchyNode | null = null;\n root.eachNode((node) => {\n positionNode(node, previousNode, indent, dropCap, align);\n previousNode = node;\n });\n}\n","import TreeLayout from './layout/base';\nimport indentedTree from './layout/indented';\nimport separateTree from './layout/separate-root';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, IndentedOptions, Direction } from './types';\n\nconst VALID_DIRECTIONS: Direction[] = [\n 'LR', // left to right\n 'RL', // right to left\n 'H', // horizontal\n];\nconst DEFAULT_DIRECTION: Direction = VALID_DIRECTIONS[0];\n\nclass IndentedLayout extends TreeLayout {\n execute(): HierarchyNode {\n const options = this.options as IndentedOptions;\n const root = this.rootNode;\n options.isHorizontal = true;\n\n // default indent 20 and sink first children;\n const { indent = 20, dropCap = true, direction = DEFAULT_DIRECTION, align } = options;\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError(`Invalid direction: ${direction}`);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n indentedTree(root, indent, dropCap, align);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n indentedTree(root, indent, dropCap, align);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // H\n // separate into left and right trees\n const { left, right } = separateTree(root, options);\n indentedTree(left, indent, dropCap, align);\n left.right2left();\n indentedTree(right, indent, dropCap, align);\n const bbox = left.getBoundingBox();\n right.translate(bbox.width, 0);\n root.x = right.x - root.width / 2;\n }\n\n return root;\n }\n}\n\nconst DEFAULT_OPTIONS: IndentedOptions = {};\n\nexport default function indentedLayout(\n root: HierarchyData,\n options?: IndentedOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new IndentedLayout(root, mergedOptions).execute();\n}\n","import { assign } from '../util';\nimport type { HierarchyNode, HierarchyOptions } from '../types';\n\nfunction secondWalk(node: HierarchyNode, options: HierarchyOptions): number {\n let totalHeight = 0;\n if (!node.children.length) {\n totalHeight = node.height;\n } else {\n node.children.forEach((c) => {\n totalHeight += secondWalk(c, options);\n });\n }\n node._subTreeSep = options.getSubTreeSep!(node.data);\n node.totalHeight = Math.max(node.height, totalHeight) + 2 * node._subTreeSep;\n return node.totalHeight;\n}\n\nfunction thirdWalk(node: HierarchyNode): void {\n const children = node.children;\n const len = children.length;\n if (len) {\n children.forEach((c) => {\n thirdWalk(c);\n });\n const first = children[0];\n const last = children[len - 1];\n const childrenHeight = last.y - first.y + last.height;\n let childrenTotalHeight = 0;\n children.forEach((child) => {\n childrenTotalHeight += child.totalHeight!;\n });\n if (childrenHeight > node.height) {\n // 当子节点总高度大于父节点高度\n node.y = first.y + childrenHeight / 2 - node.height / 2;\n } else if (children.length !== 1 || node.height > childrenTotalHeight) {\n // 多于一个子节点或者父节点大于所有子节点的总高度\n const offset = node.y + (node.height - childrenHeight) / 2 - first.y;\n children.forEach((c) => {\n c.translate(0, offset);\n });\n } else {\n // 只有一个子节点\n node.y = (first.y + first.height / 2 + last.y + last.height / 2) / 2 - node.height / 2;\n }\n }\n}\n\nconst DEFAULT_OPTIONS: HierarchyOptions = {\n getSubTreeSep() {\n return 0;\n },\n};\n\nexport default function mindmap(\n root: HierarchyNode,\n options: HierarchyOptions = {},\n): HierarchyNode {\n options = assign({}, DEFAULT_OPTIONS, options);\n\n root.parent = {\n x: 0,\n width: 0,\n height: 0,\n y: 0,\n } as HierarchyNode;\n\n // first walk\n root.BFTraverse((node) => {\n node.x = node.parent!.x + node.parent!.width;\n });\n\n root.parent = undefined;\n\n // second walk\n secondWalk(root, options);\n\n // adjusting\n // separating nodes\n root.startY = 0;\n root.y = root.totalHeight! / 2 - root.height / 2;\n root.eachNode((node) => {\n const children = node.children;\n const len = children.length;\n if (len) {\n const first = children[0];\n first.startY = node.startY! + node._subTreeSep!;\n if (len === 1) {\n first.y = node.y + node.height / 2 - first.height / 2;\n } else {\n first.y = first.startY + first.totalHeight! / 2 - first.height / 2;\n for (let i = 1; i < len; i++) {\n const c = children[i];\n c.startY = children[i - 1].startY! + children[i - 1].totalHeight!;\n c.y = c.startY + c.totalHeight! / 2 - c.height / 2;\n }\n }\n }\n });\n\n // third walk\n thirdWalk(root);\n\n return root;\n}\n","import TreeLayout from './layout/base';\nimport mindmap from './layout/mindmap';\nimport doTreeLayout from './layout/do-layout';\nimport { assign } from './util';\nimport type { HierarchyData, HierarchyNode, MindmapOptions } from './types';\n\nclass MindmapLayout extends TreeLayout {\n execute(): HierarchyNode {\n return doTreeLayout(this.rootNode, this.options, mindmap);\n }\n}\n\nconst DEFAULT_OPTIONS: MindmapOptions = {};\n\nexport default function mindmapLayout(\n root: HierarchyData,\n options?: MindmapOptions,\n): HierarchyNode {\n const mergedOptions = assign({}, DEFAULT_OPTIONS, options);\n return new MindmapLayout(root, mergedOptions).execute();\n}\n","import compactBox from './compact-box';\nimport dendrogram from './dendrogram';\nimport indented from './indented';\nimport mindmap from './mindmap';\n\nexport { compactBox, dendrogram, indented, mindmap };\n\nexport * from './types';\n\nexport default {\n compactBox,\n dendrogram,\n indented,\n mindmap,\n};\n\nexport const version = '0.7.0';\n"],"names":["getHeight","preNode","node","align","heightField","preNodeHeight","nodeHeight","height","assign","Object","DEFAULT_OPTIONS","getId","d","id","name","getPreH","preH","getPreV","preV","getHGap","hgap","getVGap","vgap","getChildren","children","PEM","getWidth","label","width","split","length","Node","constructor","data","options","this","x","y","depth","parent","addGap","isRoot","isLeaf","eachNode","callback","current","nodes","shift","concat","DFTraverse","BFTraverse","getBoundingBox","bb","left","Number","MAX_VALUE","top","Math","min","max","translate","tx","ty","right2left","bottom2top","hierarchy","isolated","root","collapsed","Array","i","child","push","Layout","rootNode","execute","Error","WrappedTree$1","WrappedTree","w","h","c","prelim","mod","change","tl","tr","el","er","msel","mser","cs","fromNode","isHorizontal","forEach","wrappedChild","moveRight","move","getMin","res","normalize","convertBack","converted","layer","nonLayeredTidy","setExtremes","t","separate","ih","sr","mssr","cl","mscl","bottom","low","nxt","dist","moveSubtree","index","sy","cy","nextRightContour","nextLeftContour","modsumcl","li","diff","setLeftThread","modsumsr","ri","setRightThread","si","nr","distributeExtra","updateIYL","wt","firstWalk","positionRoot","secondWalk","modsum","modsumdelta","addChildSpacing","separateRoot","right","treeSize","rightTreeSize","round","getSide","_child","side","VALID_DIRECTIONS","HORIZONTAL_DIRECTIONS","DEFAULT_DIRECTION","doLayout","layoutAlgorithm","direction","indexOf","TypeError","separateTree","fixedRoot","radial","rScale","radScale","Infinity","count","radDiff","avgRad","PI","nodeRadScale","minRadScale","nodeRScale","rootRScale","rad","r","cos","sin","reassignXYIfRadial","CompactBoxTreeLayout","TreeLayout","doTreeLayout","nonLayeredTidyTree","compactBoxLayout","mergedOptions","leftChild","rightChild","nodeSep","nodeSize","rankSep","subTreeSep","dendrogram","maxDepth","prevLeaf","wrappedTreeFromNode","n","childrenCount","childWT","originNode","getDrawingDepth","drawingDepth","depths","map","minChildDepth","position","DendrogramLayout","dendrogramLayout","indented","indent","dropCap","previousNode","displacementX","prevParent","preY","positionNode","IndentedLayout","indentedTree","bbox","indentedLayout","totalHeight","_subTreeSep","getSubTreeSep","thirdWalk","len","first","last","childrenHeight","childrenTotalHeight","offset","mindmap","startY","MindmapLayout","mindmapLayout","compactBox"],"mappings":"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"}
|