@antv/layout 0.1.19-beta.4 → 0.1.21

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.
Files changed (215) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/layout.min.js +1 -1
  3. package/dist/layout.min.js.LICENSE.txt +9 -0
  4. package/dist/layout.min.js.map +1 -1
  5. package/es/layout/comboForce.js +4 -19
  6. package/es/layout/comboForce.js.map +1 -1
  7. package/es/layout/dagre/index.d.ts +9 -0
  8. package/es/layout/dagre/index.js +33 -0
  9. package/es/layout/dagre/index.js.map +1 -0
  10. package/es/layout/dagre/src/acyclic.d.ts +7 -0
  11. package/es/layout/dagre/src/acyclic.js +52 -0
  12. package/es/layout/dagre/src/acyclic.js.map +1 -0
  13. package/es/layout/dagre/src/add-border-segments.d.ts +4 -0
  14. package/es/layout/dagre/src/add-border-segments.js +32 -0
  15. package/es/layout/dagre/src/add-border-segments.js.map +1 -0
  16. package/es/layout/dagre/src/coordinate-system.d.ts +7 -0
  17. package/es/layout/dagre/src/coordinate-system.js +57 -0
  18. package/es/layout/dagre/src/coordinate-system.js.map +1 -0
  19. package/es/layout/dagre/src/data/list.d.ts +8 -0
  20. package/es/layout/dagre/src/data/list.js +50 -0
  21. package/es/layout/dagre/src/data/list.js.map +1 -0
  22. package/es/layout/dagre/src/debug.d.ts +4 -0
  23. package/es/layout/dagre/src/debug.js +26 -0
  24. package/es/layout/dagre/src/debug.js.map +1 -0
  25. package/es/layout/dagre/src/graphlib.d.ts +2 -0
  26. package/es/layout/dagre/src/graphlib.js +8 -0
  27. package/es/layout/dagre/src/graphlib.js.map +1 -0
  28. package/es/layout/dagre/src/greedy-fas.d.ts +4 -0
  29. package/es/layout/dagre/src/greedy-fas.js +113 -0
  30. package/es/layout/dagre/src/greedy-fas.js.map +1 -0
  31. package/es/layout/dagre/src/layout.d.ts +4 -0
  32. package/es/layout/dagre/src/layout.js +435 -0
  33. package/es/layout/dagre/src/layout.js.map +1 -0
  34. package/es/layout/dagre/src/nesting-graph.d.ts +7 -0
  35. package/es/layout/dagre/src/nesting-graph.js +112 -0
  36. package/es/layout/dagre/src/nesting-graph.js.map +1 -0
  37. package/es/layout/dagre/src/normalize.d.ts +7 -0
  38. package/es/layout/dagre/src/normalize.js +88 -0
  39. package/es/layout/dagre/src/normalize.js.map +1 -0
  40. package/es/layout/dagre/src/order/add-subgraph-constraints.d.ts +4 -0
  41. package/es/layout/dagre/src/order/add-subgraph-constraints.js +27 -0
  42. package/es/layout/dagre/src/order/add-subgraph-constraints.js.map +1 -0
  43. package/es/layout/dagre/src/order/barycenter.d.ts +12 -0
  44. package/es/layout/dagre/src/order/barycenter.js +24 -0
  45. package/es/layout/dagre/src/order/barycenter.js.map +1 -0
  46. package/es/layout/dagre/src/order/build-layer-graph.d.ts +4 -0
  47. package/es/layout/dagre/src/order/build-layer-graph.js +67 -0
  48. package/es/layout/dagre/src/order/build-layer-graph.js.map +1 -0
  49. package/es/layout/dagre/src/order/cross-count.d.ts +4 -0
  50. package/es/layout/dagre/src/order/cross-count.js +64 -0
  51. package/es/layout/dagre/src/order/cross-count.js.map +1 -0
  52. package/es/layout/dagre/src/order/index.d.ts +4 -0
  53. package/es/layout/dagre/src/order/index.js +88 -0
  54. package/es/layout/dagre/src/order/index.js.map +1 -0
  55. package/es/layout/dagre/src/order/init-data-order.d.ts +7 -0
  56. package/es/layout/dagre/src/order/init-data-order.js +25 -0
  57. package/es/layout/dagre/src/order/init-data-order.js.map +1 -0
  58. package/es/layout/dagre/src/order/init-order.d.ts +4 -0
  59. package/es/layout/dagre/src/order/init-order.js +49 -0
  60. package/es/layout/dagre/src/order/init-order.js.map +1 -0
  61. package/es/layout/dagre/src/order/resolve-conflicts.d.ts +4 -0
  62. package/es/layout/dagre/src/order/resolve-conflicts.js +111 -0
  63. package/es/layout/dagre/src/order/resolve-conflicts.js.map +1 -0
  64. package/es/layout/dagre/src/order/sort-subgraph.d.ts +4 -0
  65. package/es/layout/dagre/src/order/sort-subgraph.js +79 -0
  66. package/es/layout/dagre/src/order/sort-subgraph.js.map +1 -0
  67. package/es/layout/dagre/src/order/sort.d.ts +2 -0
  68. package/es/layout/dagre/src/order/sort.js +67 -0
  69. package/es/layout/dagre/src/order/sort.js.map +1 -0
  70. package/es/layout/dagre/src/parent-dummy-chains.d.ts +4 -0
  71. package/es/layout/dagre/src/parent-dummy-chains.js +78 -0
  72. package/es/layout/dagre/src/parent-dummy-chains.js.map +1 -0
  73. package/es/layout/dagre/src/position/bk.d.ts +32 -0
  74. package/es/layout/dagre/src/position/bk.js +402 -0
  75. package/es/layout/dagre/src/position/bk.js.map +1 -0
  76. package/es/layout/dagre/src/position/index.d.ts +4 -0
  77. package/es/layout/dagre/src/position/index.js +53 -0
  78. package/es/layout/dagre/src/position/index.js.map +1 -0
  79. package/es/layout/dagre/src/rank/feasible-tree.d.ts +10 -0
  80. package/es/layout/dagre/src/rank/feasible-tree.js +149 -0
  81. package/es/layout/dagre/src/rank/feasible-tree.js.map +1 -0
  82. package/es/layout/dagre/src/rank/index.d.ts +4 -0
  83. package/es/layout/dagre/src/rank/index.js +53 -0
  84. package/es/layout/dagre/src/rank/index.js.map +1 -0
  85. package/es/layout/dagre/src/rank/network-simplex.d.ts +12 -0
  86. package/es/layout/dagre/src/rank/network-simplex.js +207 -0
  87. package/es/layout/dagre/src/rank/network-simplex.js.map +1 -0
  88. package/es/layout/dagre/src/rank/util.d.ts +12 -0
  89. package/es/layout/dagre/src/rank/util.js +109 -0
  90. package/es/layout/dagre/src/rank/util.js.map +1 -0
  91. package/es/layout/dagre/src/util.d.ts +50 -0
  92. package/es/layout/dagre/src/util.js +260 -0
  93. package/es/layout/dagre/src/util.js.map +1 -0
  94. package/es/layout/dagre.d.ts +3 -3
  95. package/es/layout/dagre.js +35 -11
  96. package/es/layout/dagre.js.map +1 -1
  97. package/es/layout/force/force-in-a-box.js +1 -0
  98. package/es/layout/force/force-in-a-box.js.map +1 -1
  99. package/es/layout/fruchterman.js +12 -36
  100. package/es/layout/fruchterman.js.map +1 -1
  101. package/es/layout/index.d.ts +2 -1
  102. package/es/layout/index.js +2 -1
  103. package/es/layout/index.js.map +1 -1
  104. package/es/layout/layout.js +33 -11
  105. package/es/layout/layout.js.map +1 -1
  106. package/es/layout/types.d.ts +2 -2
  107. package/es/registy/index.d.ts +1 -1
  108. package/es/registy/index.js +1 -0
  109. package/es/registy/index.js.map +1 -1
  110. package/lib/layout/comboForce.js +4 -19
  111. package/lib/layout/comboForce.js.map +1 -1
  112. package/lib/layout/dagre/index.d.ts +9 -0
  113. package/lib/layout/dagre/index.js +38 -0
  114. package/lib/layout/dagre/index.js.map +1 -0
  115. package/lib/layout/dagre/src/acyclic.d.ts +7 -0
  116. package/lib/layout/dagre/src/acyclic.js +57 -0
  117. package/lib/layout/dagre/src/acyclic.js.map +1 -0
  118. package/lib/layout/dagre/src/add-border-segments.d.ts +4 -0
  119. package/lib/layout/dagre/src/add-border-segments.js +37 -0
  120. package/lib/layout/dagre/src/add-border-segments.js.map +1 -0
  121. package/lib/layout/dagre/src/coordinate-system.d.ts +7 -0
  122. package/lib/layout/dagre/src/coordinate-system.js +59 -0
  123. package/lib/layout/dagre/src/coordinate-system.js.map +1 -0
  124. package/lib/layout/dagre/src/data/list.d.ts +8 -0
  125. package/lib/layout/dagre/src/data/list.js +53 -0
  126. package/lib/layout/dagre/src/data/list.js.map +1 -0
  127. package/lib/layout/dagre/src/debug.d.ts +4 -0
  128. package/lib/layout/dagre/src/debug.js +31 -0
  129. package/lib/layout/dagre/src/debug.js.map +1 -0
  130. package/lib/layout/dagre/src/graphlib.d.ts +2 -0
  131. package/lib/layout/dagre/src/graphlib.js +13 -0
  132. package/lib/layout/dagre/src/graphlib.js.map +1 -0
  133. package/lib/layout/dagre/src/greedy-fas.d.ts +4 -0
  134. package/lib/layout/dagre/src/greedy-fas.js +118 -0
  135. package/lib/layout/dagre/src/greedy-fas.js.map +1 -0
  136. package/lib/layout/dagre/src/layout.d.ts +4 -0
  137. package/lib/layout/dagre/src/layout.js +459 -0
  138. package/lib/layout/dagre/src/layout.js.map +1 -0
  139. package/lib/layout/dagre/src/nesting-graph.d.ts +7 -0
  140. package/lib/layout/dagre/src/nesting-graph.js +117 -0
  141. package/lib/layout/dagre/src/nesting-graph.js.map +1 -0
  142. package/lib/layout/dagre/src/normalize.d.ts +7 -0
  143. package/lib/layout/dagre/src/normalize.js +93 -0
  144. package/lib/layout/dagre/src/normalize.js.map +1 -0
  145. package/lib/layout/dagre/src/order/add-subgraph-constraints.d.ts +4 -0
  146. package/lib/layout/dagre/src/order/add-subgraph-constraints.js +29 -0
  147. package/lib/layout/dagre/src/order/add-subgraph-constraints.js.map +1 -0
  148. package/lib/layout/dagre/src/order/barycenter.d.ts +12 -0
  149. package/lib/layout/dagre/src/order/barycenter.js +26 -0
  150. package/lib/layout/dagre/src/order/barycenter.js.map +1 -0
  151. package/lib/layout/dagre/src/order/build-layer-graph.d.ts +4 -0
  152. package/lib/layout/dagre/src/order/build-layer-graph.js +72 -0
  153. package/lib/layout/dagre/src/order/build-layer-graph.js.map +1 -0
  154. package/lib/layout/dagre/src/order/cross-count.d.ts +4 -0
  155. package/lib/layout/dagre/src/order/cross-count.js +66 -0
  156. package/lib/layout/dagre/src/order/cross-count.js.map +1 -0
  157. package/lib/layout/dagre/src/order/index.d.ts +4 -0
  158. package/lib/layout/dagre/src/order/index.js +93 -0
  159. package/lib/layout/dagre/src/order/index.js.map +1 -0
  160. package/lib/layout/dagre/src/order/init-data-order.d.ts +7 -0
  161. package/lib/layout/dagre/src/order/init-data-order.js +27 -0
  162. package/lib/layout/dagre/src/order/init-data-order.js.map +1 -0
  163. package/lib/layout/dagre/src/order/init-order.d.ts +4 -0
  164. package/lib/layout/dagre/src/order/init-order.js +51 -0
  165. package/lib/layout/dagre/src/order/init-order.js.map +1 -0
  166. package/lib/layout/dagre/src/order/resolve-conflicts.d.ts +4 -0
  167. package/lib/layout/dagre/src/order/resolve-conflicts.js +116 -0
  168. package/lib/layout/dagre/src/order/resolve-conflicts.js.map +1 -0
  169. package/lib/layout/dagre/src/order/sort-subgraph.d.ts +4 -0
  170. package/lib/layout/dagre/src/order/sort-subgraph.js +84 -0
  171. package/lib/layout/dagre/src/order/sort-subgraph.js.map +1 -0
  172. package/lib/layout/dagre/src/order/sort.d.ts +2 -0
  173. package/lib/layout/dagre/src/order/sort.js +72 -0
  174. package/lib/layout/dagre/src/order/sort.js.map +1 -0
  175. package/lib/layout/dagre/src/parent-dummy-chains.d.ts +4 -0
  176. package/lib/layout/dagre/src/parent-dummy-chains.js +80 -0
  177. package/lib/layout/dagre/src/parent-dummy-chains.js.map +1 -0
  178. package/lib/layout/dagre/src/position/bk.d.ts +32 -0
  179. package/lib/layout/dagre/src/position/bk.js +417 -0
  180. package/lib/layout/dagre/src/position/bk.js.map +1 -0
  181. package/lib/layout/dagre/src/position/index.d.ts +4 -0
  182. package/lib/layout/dagre/src/position/index.js +58 -0
  183. package/lib/layout/dagre/src/position/index.js.map +1 -0
  184. package/lib/layout/dagre/src/rank/feasible-tree.d.ts +10 -0
  185. package/lib/layout/dagre/src/rank/feasible-tree.js +156 -0
  186. package/lib/layout/dagre/src/rank/feasible-tree.js.map +1 -0
  187. package/lib/layout/dagre/src/rank/index.d.ts +4 -0
  188. package/lib/layout/dagre/src/rank/index.js +58 -0
  189. package/lib/layout/dagre/src/rank/index.js.map +1 -0
  190. package/lib/layout/dagre/src/rank/network-simplex.d.ts +12 -0
  191. package/lib/layout/dagre/src/rank/network-simplex.js +212 -0
  192. package/lib/layout/dagre/src/rank/network-simplex.js.map +1 -0
  193. package/lib/layout/dagre/src/rank/util.d.ts +12 -0
  194. package/lib/layout/dagre/src/rank/util.js +114 -0
  195. package/lib/layout/dagre/src/rank/util.js.map +1 -0
  196. package/lib/layout/dagre/src/util.d.ts +50 -0
  197. package/lib/layout/dagre/src/util.js +281 -0
  198. package/lib/layout/dagre/src/util.js.map +1 -0
  199. package/lib/layout/dagre.d.ts +3 -3
  200. package/lib/layout/dagre.js +37 -13
  201. package/lib/layout/dagre.js.map +1 -1
  202. package/lib/layout/force/force-in-a-box.js +1 -0
  203. package/lib/layout/force/force-in-a-box.js.map +1 -1
  204. package/lib/layout/fruchterman.js +12 -36
  205. package/lib/layout/fruchterman.js.map +1 -1
  206. package/lib/layout/index.d.ts +2 -1
  207. package/lib/layout/index.js +3 -1
  208. package/lib/layout/index.js.map +1 -1
  209. package/lib/layout/layout.js +32 -10
  210. package/lib/layout/layout.js.map +1 -1
  211. package/lib/layout/types.d.ts +2 -2
  212. package/lib/registy/index.d.ts +1 -1
  213. package/lib/registy/index.js +1 -0
  214. package/lib/registy/index.js.map +1 -1
  215. package/package.json +4 -4
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var util_1 = __importDefault(require("./util"));
7
+ var graphlib_1 = __importDefault(require("./graphlib"));
8
+ var Graph = graphlib_1.default.Graph;
9
+ /* istanbul ignore next */
10
+ var debugOrdering = function (g) {
11
+ var layerMatrix = util_1.default.buildLayerMatrix(g);
12
+ var h = new Graph({ compound: true, multigraph: true }).setGraph({});
13
+ g.nodes().forEach(function (v) {
14
+ h.setNode(v, { label: v });
15
+ h.setParent(v, "layer" + g.node(v).rank);
16
+ });
17
+ g.edges().forEach(function (e) {
18
+ h.setEdge(e.v, e.w, {}, e.name);
19
+ });
20
+ layerMatrix.forEach(function (layer, i) {
21
+ var layerV = "layer" + i;
22
+ h.setNode(layerV, { rank: "same" });
23
+ layer === null || layer === void 0 ? void 0 : layer.reduce(function (u, v) {
24
+ h.setEdge(u, v, { style: "invis" });
25
+ return v;
26
+ });
27
+ });
28
+ return h;
29
+ };
30
+ exports.default = debugOrdering;
31
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../../src/layout/dagre/src/debug.ts"],"names":[],"mappings":";;;;;AAAA,gDAA0B;AAC1B,wDAAkC;AAIlC,IAAM,KAAK,GAAI,kBAAgB,CAAC,KAAK,CAAC;AAEtC,0BAA0B;AAC1B,IAAM,aAAa,GAAG,UAAC,CAAS;IAC9B,IAAM,WAAW,GAAG,cAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE7C,IAAM,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvE,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAC,CAAS;QAC1B,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,UAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAM,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAC,CAAC;QAClB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,OAAO,CAAC,UAAC,KAAU,EAAE,CAAS;QACxC,IAAM,MAAM,GAAG,UAAQ,CAAG,CAAC;QAC3B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,CAAC,UAAC,CAAS,EAAE,CAAS;YACjC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,kBAAe,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare let graphlib: any;
2
+ export default graphlib;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ // @ts-ignore
7
+ var graphlib_1 = __importDefault(require("@dagrejs/graphlib"));
8
+ var graphlib = graphlib_1.default;
9
+ if (!graphlib && typeof window !== "undefined") {
10
+ graphlib = window.graphlib;
11
+ }
12
+ exports.default = graphlib;
13
+ //# sourceMappingURL=graphlib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphlib.js","sourceRoot":"","sources":["../../../../src/layout/dagre/src/graphlib.ts"],"names":[],"mappings":";;;;;AAAA,aAAa;AACb,+DAAqC;AAErC,IAAI,QAAQ,GAAG,kBAAI,CAAC;AAGpB,IAAI,CAAC,QAAQ,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IAC9C,QAAQ,GAAI,MAAc,CAAC,QAAQ,CAAC;CACrC;AAED,kBAAe,QAAQ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { graphlib as IGraphLib } from '../graphlib';
2
+ declare type IGraph = IGraphLib.Graph;
3
+ declare const greedyFAS: (g: IGraph, weightFn: () => unknown) => (import("../graphlib").Edge | undefined)[];
4
+ export default greedyFAS;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var graphlib_1 = __importDefault(require("./graphlib"));
7
+ var list_1 = __importDefault(require("./data/list"));
8
+ var Graph = graphlib_1.default.Graph;
9
+ /*
10
+ * A greedy heuristic for finding a feedback arc set for a graph. A feedback
11
+ * arc set is a set of edges that can be removed to make a graph acyclic.
12
+ * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, "A fast and
13
+ * effective heuristic for the feedback arc set problem." This implementation
14
+ * adjusts that from the paper to allow for weighted edges.
15
+ */
16
+ // module.exports = greedyFAS;
17
+ var DEFAULT_WEIGHT_FN = function () { return 1; };
18
+ var greedyFAS = function (g, weightFn) {
19
+ var _a;
20
+ if (g.nodeCount() <= 1)
21
+ return [];
22
+ var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
23
+ var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
24
+ // Expand multi-edges
25
+ // @ts-ignore
26
+ return (_a = results.map(function (e) { return g.outEdges(e.v, e.w); })) === null || _a === void 0 ? void 0 : _a.flat();
27
+ };
28
+ var doGreedyFAS = function (g, buckets, zeroIdx) {
29
+ var results = [];
30
+ var sources = buckets[buckets.length - 1];
31
+ var sinks = buckets[0];
32
+ var entry;
33
+ while (g.nodeCount()) {
34
+ while ((entry = sinks.dequeue())) {
35
+ removeNode(g, buckets, zeroIdx, entry);
36
+ }
37
+ while ((entry = sources.dequeue())) {
38
+ removeNode(g, buckets, zeroIdx, entry);
39
+ }
40
+ if (g.nodeCount()) {
41
+ for (var i = buckets.length - 2; i > 0; --i) {
42
+ entry = buckets[i].dequeue();
43
+ if (entry) {
44
+ results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ return results;
51
+ };
52
+ var removeNode = function (g, buckets, zeroIdx, entry, collectPredecessors) {
53
+ var _a, _b;
54
+ var results = collectPredecessors ? [] : undefined;
55
+ (_a = g.inEdges(entry.v)) === null || _a === void 0 ? void 0 : _a.forEach(function (edge) {
56
+ var weight = g.edge(edge);
57
+ var uEntry = g.node(edge.v);
58
+ if (collectPredecessors) {
59
+ results.push({ v: edge.v, w: edge.w });
60
+ }
61
+ if (uEntry.out === undefined)
62
+ uEntry.out = 0;
63
+ uEntry.out -= weight;
64
+ assignBucket(buckets, zeroIdx, uEntry);
65
+ });
66
+ (_b = g.outEdges(entry.v)) === null || _b === void 0 ? void 0 : _b.forEach(function (edge) {
67
+ var weight = g.edge(edge);
68
+ var w = edge.w;
69
+ var wEntry = g.node(w);
70
+ if (wEntry.in === undefined)
71
+ wEntry.in = 0;
72
+ wEntry.in -= weight;
73
+ assignBucket(buckets, zeroIdx, wEntry);
74
+ });
75
+ g.removeNode(entry.v);
76
+ return results;
77
+ };
78
+ var buildState = function (g, weightFn) {
79
+ var fasGraph = new Graph();
80
+ var maxIn = 0;
81
+ var maxOut = 0;
82
+ g.nodes().forEach(function (v) {
83
+ fasGraph.setNode(v, { v: v, "in": 0, out: 0 });
84
+ });
85
+ // Aggregate weights on nodes, but also sum the weights across multi-edges
86
+ // into a single edge for the fasGraph.
87
+ g.edges().forEach(function (e) {
88
+ var prevWeight = fasGraph.edge(e.v, e.w) || 0;
89
+ var weight = weightFn === null || weightFn === void 0 ? void 0 : weightFn(e);
90
+ var edgeWeight = prevWeight + weight;
91
+ fasGraph.setEdge(e.v, e.w, edgeWeight);
92
+ maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
93
+ maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight);
94
+ });
95
+ var buckets = [];
96
+ var rangeMax = maxOut + maxIn + 3;
97
+ for (var i = 0; i < rangeMax; i++) {
98
+ buckets.push(new list_1.default());
99
+ }
100
+ var zeroIdx = maxIn + 1;
101
+ fasGraph.nodes().forEach(function (v) {
102
+ assignBucket(buckets, zeroIdx, fasGraph.node(v));
103
+ });
104
+ return { buckets: buckets, zeroIdx: zeroIdx, graph: fasGraph };
105
+ };
106
+ var assignBucket = function (buckets, zeroIdx, entry) {
107
+ if (!entry.out) {
108
+ buckets[0].enqueue(entry);
109
+ }
110
+ else if (!entry["in"]) {
111
+ buckets[buckets.length - 1].enqueue(entry);
112
+ }
113
+ else {
114
+ buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);
115
+ }
116
+ };
117
+ exports.default = greedyFAS;
118
+ //# sourceMappingURL=greedy-fas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"greedy-fas.js","sourceRoot":"","sources":["../../../../src/layout/dagre/src/greedy-fas.ts"],"names":[],"mappings":";;;;;AAAA,wDAAkC;AAClC,qDAA+B;AAI/B,IAAM,KAAK,GAAI,kBAAgB,CAAC,KAAK,CAAC;AAGtC;;;;;;GAMG;AACH,8BAA8B;AAE9B,IAAM,iBAAiB,GAAG,cAAM,OAAA,CAAC,EAAD,CAAC,CAAC;AAElC,IAAM,SAAS,GAAG,UAAC,CAAS,EAAE,QAAuB;;IACnD,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,IAAM,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,QAAQ,IAAI,iBAAiB,CAAC,CAAC;IAC3D,IAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,KAAY,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAE9E,qBAAqB;IACrB,aAAa;IACb,OAAO,MAAA,OAAO,CAAC,GAAG,CAAC,UAAC,CAAM,IAAK,OAAA,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAApB,CAAoB,CAAC,0CAAE,IAAI,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEF,IAAM,WAAW,GAAG,UAAC,CAAS,EAAE,OAAY,EAAE,OAAe;IAC3D,IAAI,OAAO,GAAW,EAAE,CAAC;IACzB,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5C,IAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEzB,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,EAAI;YAAE,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;SAAE;QAC/E,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE;YAAE,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;SAAE;QAC/E,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YACjB,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;gBAC3C,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC7B,IAAI,KAAK,EAAE;oBACT,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;oBACvE,MAAM;iBACP;aACF;SACF;KACF;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,IAAM,UAAU,GAAG,UAAC,CAAS,EAAE,OAAY,EAAE,OAAe,EAAE,KAAU,EAAE,mBAA6B;;IACrG,IAAM,OAAO,GAAQ,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1D,MAAA,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,0CAAE,OAAO,CAAC,UAAC,IAAI;QAC/B,IAAM,MAAM,GAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAM,MAAM,GAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpC,IAAI,mBAAmB,EAAE;YACvB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;SACxC;QACD,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;QACrB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAA,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,0CAAE,OAAO,CAAC,UAAC,IAAI;QAChC,IAAM,MAAM,GAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjB,IAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS;YAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC;QACpB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtB,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,IAAM,UAAU,GAAG,UAAC,CAAS,EAAE,QAAkC;IAC/D,IAAM,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAC,CAAC;QAClB,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,GAAA,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,uCAAuC;IACvC,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAC,CAAC;QAClB,IAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,IAAM,MAAM,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,CAAC,CAAC,CAAC;QAC7B,IAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;QACvC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QAC5D,KAAK,GAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAK,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,IAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAG,EAAE;QAClC,OAAO,CAAC,IAAI,CAAC,IAAI,cAAI,EAAE,CAAC,CAAC;KAC1B;IACD,IAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;IAE1B,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAC,CAAS;QACjC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,SAAA,EAAE,OAAO,SAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC,CAAC;AAEF,IAAM,YAAY,GAAG,UAAC,OAAY,EAAE,OAAe,EAAE,KAAU;IAC7D,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAC3B;SAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACvB,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAC5C;SAAM;QACL,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAC3D;AACH,CAAC,CAAC;AAGF,kBAAe,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { graphlib as IGraphLib } from '../graphlib';
2
+ declare type IGraph = IGraphLib.Graph;
3
+ declare const layout: (g: IGraph, opts: any) => void;
4
+ export default layout;
@@ -0,0 +1,459 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ var acyclic_1 = __importDefault(require("./acyclic"));
26
+ var normalize_1 = __importDefault(require("./normalize"));
27
+ var rank_1 = __importDefault(require("./rank"));
28
+ var util_1 = __importStar(require("./util"));
29
+ var parent_dummy_chains_1 = __importDefault(require("./parent-dummy-chains"));
30
+ var nesting_graph_1 = __importDefault(require("./nesting-graph"));
31
+ var add_border_segments_1 = __importDefault(require("./add-border-segments"));
32
+ var coordinate_system_1 = __importDefault(require("./coordinate-system"));
33
+ var order_1 = __importDefault(require("./order"));
34
+ var position_1 = __importDefault(require("./position"));
35
+ var graphlib_1 = __importDefault(require("./graphlib"));
36
+ var init_data_order_1 = __importDefault(require("./order/init-data-order"));
37
+ var Graph = graphlib_1.default.Graph;
38
+ var layout = function (g, opts) {
39
+ var time = opts && opts.debugTiming ? util_1.default.time : util_1.default.notime;
40
+ time("layout", function () {
41
+ // 如果在原图基础上修改,继承原图的order结果
42
+ if (opts && !opts.keepNodeOrder && opts.prevGraph) {
43
+ time(" inheritOrder", function () { inheritOrder(g, opts.prevGraph); });
44
+ }
45
+ var layoutGraph = time(" buildLayoutGraph", function () { return buildLayoutGraph(g); });
46
+ // 控制是否为边的label留位置(这会影响是否在边中间添加dummy node)
47
+ if (!(opts && (opts.edgeLabelSpace === false))) {
48
+ time(" makeSpaceForEdgeLabels", function () { makeSpaceForEdgeLabels(layoutGraph); });
49
+ }
50
+ // TODO: 暂时处理层级设置不正确时的异常报错,提示设置正确的层级
51
+ try {
52
+ time(" runLayout", function () { runLayout(layoutGraph, time, opts); });
53
+ }
54
+ catch (e) {
55
+ if (e.message === "Not possible to find intersection inside of the rectangle") {
56
+ console.error('The following error may be caused by improper layer setting, please make sure your manual layer setting does not violate the graph\'s structure:\n', e);
57
+ return;
58
+ }
59
+ throw (e);
60
+ }
61
+ time(" updateInputGraph", function () { updateInputGraph(g, layoutGraph); });
62
+ });
63
+ };
64
+ var runLayout = function (g, time, opts) {
65
+ time(" removeSelfEdges", function () { removeSelfEdges(g); });
66
+ time(" acyclic", function () { acyclic_1.default.run(g); });
67
+ time(" nestingGraph.run", function () { nesting_graph_1.default.run(g); });
68
+ time(" rank", function () { (0, rank_1.default)(util_1.default.asNonCompoundGraph(g)); });
69
+ time(" injectEdgeLabelProxies", function () { injectEdgeLabelProxies(g); });
70
+ time(" removeEmptyRanks", function () { (0, util_1.removeEmptyRanks)(g); });
71
+ time(" nestingGraph.cleanup", function () { nesting_graph_1.default.cleanup(g); });
72
+ time(" normalizeRanks", function () { (0, util_1.normalizeRanks)(g); });
73
+ time(" assignRankMinMax", function () { assignRankMinMax(g); });
74
+ time(" removeEdgeLabelProxies", function () { removeEdgeLabelProxies(g); });
75
+ time(" normalize.run", function () { normalize_1.default.run(g); });
76
+ time(" parentDummyChains", function () { (0, parent_dummy_chains_1.default)(g); });
77
+ time(" addBorderSegments", function () { (0, add_border_segments_1.default)(g); });
78
+ if (opts && opts.keepNodeOrder) {
79
+ time(" initDataOrder", function () { (0, init_data_order_1.default)(g, opts.nodeOrder); });
80
+ }
81
+ time(" order", function () { (0, order_1.default)(g); });
82
+ time(" insertSelfEdges", function () { insertSelfEdges(g); });
83
+ time(" adjustCoordinateSystem", function () { coordinate_system_1.default.adjust(g); });
84
+ time(" position", function () { (0, position_1.default)(g); });
85
+ time(" positionSelfEdges", function () { positionSelfEdges(g); });
86
+ time(" removeBorderNodes", function () { removeBorderNodes(g); });
87
+ time(" normalize.undo", function () { normalize_1.default.undo(g); });
88
+ time(" fixupEdgeLabelCoords", function () { fixupEdgeLabelCoords(g); });
89
+ time(" undoCoordinateSystem", function () { coordinate_system_1.default.undo(g); });
90
+ time(" translateGraph", function () { translateGraph(g); });
91
+ time(" assignNodeIntersects", function () { assignNodeIntersects(g); });
92
+ time(" reversePoints", function () { reversePointsForReversedEdges(g); });
93
+ time(" acyclic.undo", function () { acyclic_1.default.undo(g); });
94
+ };
95
+ /**
96
+ * 继承上一个布局中的order,防止翻转
97
+ * TODO: 暂时没有考虑涉及层级变动的布局,只保证原来布局层级和相对顺序不变
98
+ */
99
+ var inheritOrder = function (currG, prevG) {
100
+ var prevNodeMap = prevG._nodes || {};
101
+ currG.nodes().forEach(function (n) {
102
+ var node = currG.node(n);
103
+ if (prevNodeMap[n] !== undefined) {
104
+ node.fixorder = prevNodeMap[n]._order;
105
+ delete prevNodeMap[n]._order;
106
+ }
107
+ else {
108
+ delete node.fixorder;
109
+ }
110
+ });
111
+ };
112
+ /*
113
+ * Copies final layout information from the layout graph back to the input
114
+ * graph. This process only copies whitelisted attributes from the layout graph
115
+ * to the input graph, so it serves as a good place to determine what
116
+ * attributes can influence layout.
117
+ */
118
+ var updateInputGraph = function (inputGraph, layoutGraph) {
119
+ inputGraph.nodes().forEach(function (v) {
120
+ var _a;
121
+ var inputLabel = inputGraph.node(v);
122
+ var layoutLabel = layoutGraph.node(v);
123
+ if (inputLabel) {
124
+ inputLabel.x = layoutLabel.x;
125
+ inputLabel.y = layoutLabel.y;
126
+ inputLabel._order = layoutLabel.order;
127
+ inputLabel._rank = layoutLabel.rank;
128
+ if ((_a = layoutGraph.children(v)) === null || _a === void 0 ? void 0 : _a.length) {
129
+ inputLabel.width = layoutLabel.width;
130
+ inputLabel.height = layoutLabel.height;
131
+ }
132
+ }
133
+ });
134
+ inputGraph.edges().forEach(function (e) {
135
+ var inputLabel = inputGraph.edge(e);
136
+ var layoutLabel = layoutGraph.edge(e);
137
+ inputLabel.points = layoutLabel.points;
138
+ if (layoutLabel.hasOwnProperty("x")) {
139
+ inputLabel.x = layoutLabel.x;
140
+ inputLabel.y = layoutLabel.y;
141
+ }
142
+ });
143
+ inputGraph.graph().width = layoutGraph.graph().width;
144
+ inputGraph.graph().height = layoutGraph.graph().height;
145
+ };
146
+ var graphNumAttrs = ["nodesep", "edgesep", "ranksep", "marginx", "marginy"];
147
+ var graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: "tb" };
148
+ var graphAttrs = ["acyclicer", "ranker", "rankdir", "align"];
149
+ var nodeNumAttrs = ["width", "height", "layer", "fixorder"]; // 需要传入layer, fixOrder作为参数参考
150
+ var nodeDefaults = { width: 0, height: 0 };
151
+ var edgeNumAttrs = ["minlen", "weight", "width", "height", "labeloffset"];
152
+ var edgeDefaults = {
153
+ minlen: 1, weight: 1, width: 0, height: 0,
154
+ labeloffset: 10, labelpos: "r"
155
+ };
156
+ var edgeAttrs = ["labelpos"];
157
+ /*
158
+ * Constructs a new graph from the input graph, which can be used for layout.
159
+ * This process copies only whitelisted attributes from the input graph to the
160
+ * layout graph. Thus this function serves as a good place to determine what
161
+ * attributes can influence layout.
162
+ */
163
+ var buildLayoutGraph = function (inputGraph) {
164
+ var g = new Graph({ multigraph: true, compound: true });
165
+ var graph = canonicalize(inputGraph.graph());
166
+ var pickedProperties = {};
167
+ graphAttrs.forEach(function (key) {
168
+ if (graph[key] !== undefined)
169
+ pickedProperties[key] = graph[key];
170
+ });
171
+ g.setGraph(Object.assign({}, graphDefaults, selectNumberAttrs(graph, graphNumAttrs), pickedProperties));
172
+ inputGraph.nodes().forEach(function (v) {
173
+ var node = canonicalize(inputGraph.node(v));
174
+ var defaultAttrs = selectNumberAttrs(node, nodeNumAttrs);
175
+ Object.keys(nodeDefaults).forEach(function (key) {
176
+ if (defaultAttrs[key] === undefined) {
177
+ defaultAttrs[key] = nodeDefaults[key];
178
+ }
179
+ });
180
+ g.setNode(v, defaultAttrs);
181
+ g.setParent(v, inputGraph.parent(v));
182
+ });
183
+ inputGraph.edges().forEach(function (e) {
184
+ var edge = canonicalize(inputGraph.edge(e));
185
+ var pickedProperties = {};
186
+ edgeAttrs.forEach(function (key) {
187
+ if (edge[key] !== undefined)
188
+ pickedProperties[key] = edge[key];
189
+ });
190
+ g.setEdge(e, Object.assign({}, edgeDefaults, selectNumberAttrs(edge, edgeNumAttrs), pickedProperties));
191
+ });
192
+ return g;
193
+ };
194
+ /*
195
+ * This idea comes from the Gansner paper: to account for edge labels in our
196
+ * layout we split each rank in half by doubling minlen and halving ranksep.
197
+ * Then we can place labels at these mid-points between nodes.
198
+ *
199
+ * We also add some minimal padding to the width to push the label for the edge
200
+ * away from the edge itself a bit.
201
+ */
202
+ var makeSpaceForEdgeLabels = function (g) {
203
+ var graph = g.graph();
204
+ if (!graph.ranksep)
205
+ graph.ranksep = 0;
206
+ graph.ranksep /= 2;
207
+ g.nodes().forEach(function (n) {
208
+ var node = g.node(n);
209
+ if (!isNaN(node.layer)) {
210
+ if (!node.layer)
211
+ node.layer = 0;
212
+ else
213
+ node.layer *= 2; // TODO: 因为默认的rank变为两倍,设定的layer也*2
214
+ }
215
+ });
216
+ g.edges().forEach(function (e) {
217
+ var _a;
218
+ var edge = g.edge(e);
219
+ edge.minlen *= 2;
220
+ if (((_a = edge.labelpos) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== "c") {
221
+ if (graph.rankdir === "TB" || graph.rankdir === "BT") {
222
+ edge.width += edge.labeloffset;
223
+ }
224
+ else {
225
+ edge.height += edge.labeloffset;
226
+ }
227
+ }
228
+ });
229
+ };
230
+ /*
231
+ * Creates temporary dummy nodes that capture the rank in which each edge's
232
+ * label is going to, if it has one of non-zero width and height. We do this
233
+ * so that we can safely remove empty ranks while preserving balance for the
234
+ * label's position.
235
+ */
236
+ var injectEdgeLabelProxies = function (g) {
237
+ g.edges().forEach(function (e) {
238
+ var edge = g.edge(e);
239
+ if (edge.width && edge.height) {
240
+ var v = g.node(e.v);
241
+ var w = g.node(e.w);
242
+ var label = { e: e, rank: (w.rank - v.rank) / 2 + v.rank };
243
+ util_1.default.addDummyNode(g, "edge-proxy", label, "_ep");
244
+ }
245
+ });
246
+ };
247
+ var assignRankMinMax = function (g) {
248
+ var maxRank = 0;
249
+ g.nodes().forEach(function (v) {
250
+ var node = g.node(v);
251
+ if (node.borderTop) {
252
+ node.minRank = g.node(node.borderTop).rank;
253
+ node.maxRank = g.node(node.borderBottom).rank;
254
+ maxRank = Math.max(maxRank, node.maxRank || -Infinity);
255
+ }
256
+ });
257
+ g.graph().maxRank = maxRank;
258
+ };
259
+ var removeEdgeLabelProxies = function (g) {
260
+ g.nodes().forEach(function (v) {
261
+ var node = g.node(v);
262
+ if (node.dummy === "edge-proxy") {
263
+ g.edge(node.e).labelRank = node.rank;
264
+ g.removeNode(v);
265
+ }
266
+ });
267
+ };
268
+ var translateGraph = function (g) {
269
+ var minX = Number.POSITIVE_INFINITY;
270
+ var maxX = 0;
271
+ var minY = Number.POSITIVE_INFINITY;
272
+ var maxY = 0;
273
+ var graphLabel = g.graph();
274
+ var marginX = graphLabel.marginx || 0;
275
+ var marginY = graphLabel.marginy || 0;
276
+ var getExtremes = function (attrs) {
277
+ var x = attrs.x;
278
+ var y = attrs.y;
279
+ var w = attrs.width;
280
+ var h = attrs.height;
281
+ minX = Math.min(minX, x - w / 2);
282
+ maxX = Math.max(maxX, x + w / 2);
283
+ minY = Math.min(minY, y - h / 2);
284
+ maxY = Math.max(maxY, y + h / 2);
285
+ };
286
+ g.nodes().forEach(function (v) { getExtremes(g.node(v)); });
287
+ g.edges().forEach(function (e) {
288
+ var edge = g.edge(e);
289
+ if (edge.hasOwnProperty("x")) {
290
+ getExtremes(edge);
291
+ }
292
+ });
293
+ minX -= marginX;
294
+ minY -= marginY;
295
+ g.nodes().forEach(function (v) {
296
+ var node = g.node(v);
297
+ node.x -= minX;
298
+ node.y -= minY;
299
+ });
300
+ g.edges().forEach(function (e) {
301
+ var _a;
302
+ var edge = g.edge(e);
303
+ (_a = edge.points) === null || _a === void 0 ? void 0 : _a.forEach(function (p) {
304
+ p.x -= minX;
305
+ p.y -= minY;
306
+ });
307
+ if (edge.hasOwnProperty("x")) {
308
+ edge.x -= minX;
309
+ }
310
+ if (edge.hasOwnProperty("y")) {
311
+ edge.y -= minY;
312
+ }
313
+ });
314
+ graphLabel.width = maxX - minX + marginX;
315
+ graphLabel.height = maxY - minY + marginY;
316
+ };
317
+ var assignNodeIntersects = function (g) {
318
+ g.edges().forEach(function (e) {
319
+ var edge = g.edge(e);
320
+ var nodeV = g.node(e.v);
321
+ var nodeW = g.node(e.w);
322
+ var p1;
323
+ var p2;
324
+ if (!edge.points) {
325
+ edge.points = [];
326
+ p1 = nodeW;
327
+ p2 = nodeV;
328
+ }
329
+ else {
330
+ p1 = edge.points[0];
331
+ p2 = edge.points[edge.points.length - 1];
332
+ }
333
+ edge.points.unshift(util_1.default.intersectRect(nodeV, p1));
334
+ edge.points.push(util_1.default.intersectRect(nodeW, p2));
335
+ });
336
+ };
337
+ var fixupEdgeLabelCoords = function (g) {
338
+ g.edges().forEach(function (e) {
339
+ var edge = g.edge(e);
340
+ if (edge.hasOwnProperty("x")) {
341
+ if (edge.labelpos === "l" || edge.labelpos === "r") {
342
+ edge.width -= edge.labeloffset;
343
+ }
344
+ switch (edge.labelpos) {
345
+ case "l":
346
+ edge.x -= edge.width / 2 + edge.labeloffset;
347
+ break;
348
+ case "r":
349
+ edge.x += edge.width / 2 + edge.labeloffset;
350
+ break;
351
+ }
352
+ }
353
+ });
354
+ };
355
+ var reversePointsForReversedEdges = function (g) {
356
+ g.edges().forEach(function (e) {
357
+ var edge = g.edge(e);
358
+ if (edge.reversed) {
359
+ edge.points.reverse();
360
+ }
361
+ });
362
+ };
363
+ var removeBorderNodes = function (g) {
364
+ g.nodes().forEach(function (v) {
365
+ var _a, _b, _c;
366
+ if ((_a = g.children(v)) === null || _a === void 0 ? void 0 : _a.length) {
367
+ var node = g.node(v);
368
+ var t = g.node(node.borderTop);
369
+ var b = g.node(node.borderBottom);
370
+ var l = g.node(node.borderLeft[((_b = node.borderLeft) === null || _b === void 0 ? void 0 : _b.length) - 1]);
371
+ var r = g.node(node.borderRight[((_c = node.borderRight) === null || _c === void 0 ? void 0 : _c.length) - 1]);
372
+ node.width = Math.abs(r.x - l.x);
373
+ node.height = Math.abs(b.y - t.y);
374
+ node.x = l.x + node.width / 2;
375
+ node.y = t.y + node.height / 2;
376
+ }
377
+ });
378
+ g.nodes().forEach(function (v) {
379
+ if (g.node(v).dummy === "border") {
380
+ g.removeNode(v);
381
+ }
382
+ });
383
+ };
384
+ var removeSelfEdges = function (g) {
385
+ g.edges().forEach(function (e) {
386
+ if (e.v === e.w) {
387
+ var node = g.node(e.v);
388
+ if (!node.selfEdges) {
389
+ node.selfEdges = [];
390
+ }
391
+ node.selfEdges.push({ e: e, label: g.edge(e) });
392
+ g.removeEdge(e);
393
+ }
394
+ });
395
+ };
396
+ var insertSelfEdges = function (g) {
397
+ var layers = util_1.default.buildLayerMatrix(g);
398
+ layers.forEach(function (layer) {
399
+ var orderShift = 0;
400
+ layer.forEach(function (v, i) {
401
+ var _a;
402
+ var node = g.node(v);
403
+ node.order = i + orderShift;
404
+ (_a = node.selfEdges) === null || _a === void 0 ? void 0 : _a.forEach(function (selfEdge) {
405
+ util_1.default.addDummyNode(g, "selfedge", {
406
+ width: selfEdge.label.width,
407
+ height: selfEdge.label.height,
408
+ rank: node.rank,
409
+ order: i + (++orderShift),
410
+ e: selfEdge.e,
411
+ label: selfEdge.label
412
+ }, "_se");
413
+ });
414
+ delete node.selfEdges;
415
+ });
416
+ });
417
+ };
418
+ var positionSelfEdges = function (g) {
419
+ g.nodes().forEach(function (v) {
420
+ var node = g.node(v);
421
+ if (node.dummy === "selfedge") {
422
+ var selfNode = g.node(node.e.v);
423
+ var x = selfNode.x + selfNode.width / 2;
424
+ var y = selfNode.y;
425
+ var dx = node.x - x;
426
+ var dy = selfNode.height / 2;
427
+ g.setEdge(node.e, node.label);
428
+ g.removeNode(v);
429
+ node.label.points = [
430
+ { x: x + 2 * dx / 3, y: y - dy },
431
+ { x: x + 5 * dx / 6, y: y - dy },
432
+ { y: y, x: x + dx },
433
+ { x: x + 5 * dx / 6, y: y + dy },
434
+ { x: x + 2 * dx / 3, y: y + dy }
435
+ ];
436
+ node.label.x = node.x;
437
+ node.label.y = node.y;
438
+ }
439
+ });
440
+ };
441
+ var selectNumberAttrs = function (obj, attrs) {
442
+ var pickedProperties = {};
443
+ attrs.forEach(function (key) {
444
+ if (obj[key] === undefined)
445
+ return;
446
+ pickedProperties[key] = (+obj[key]);
447
+ });
448
+ return pickedProperties;
449
+ };
450
+ var canonicalize = function (attrs) {
451
+ var newAttrs = {};
452
+ Object.keys(attrs).forEach(function (k) {
453
+ var v = attrs[k];
454
+ newAttrs[k.toLowerCase()] = v;
455
+ });
456
+ return newAttrs;
457
+ };
458
+ exports.default = layout;
459
+ //# sourceMappingURL=layout.js.map