@knowvah/dot-engine 2.0.1 → 2.0.2

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 (40) hide show
  1. package/dist/async/collect.d.ts.map +1 -1
  2. package/dist/async/render-async.d.ts.map +1 -1
  3. package/dist/gvc/device-labels.d.ts +30 -0
  4. package/dist/gvc/device-labels.d.ts.map +1 -0
  5. package/dist/gvc/device-transform.d.ts +22 -0
  6. package/dist/gvc/device-transform.d.ts.map +1 -0
  7. package/dist/gvc/device.d.ts +2 -42
  8. package/dist/gvc/device.d.ts.map +1 -1
  9. package/dist/index.js +73 -69
  10. package/dist/index.js.map +4 -4
  11. package/dist/layout/dot/graph-label.d.ts +10 -0
  12. package/dist/layout/dot/graph-label.d.ts.map +1 -1
  13. package/dist/layout/fdp/xlayout.d.ts +1 -1
  14. package/dist/layout/neato/dijkstra.d.ts +0 -32
  15. package/dist/layout/neato/dijkstra.d.ts.map +1 -1
  16. package/dist/layout/neato/fdp-adjust.d.ts +12 -1
  17. package/dist/layout/neato/fdp-adjust.d.ts.map +1 -1
  18. package/dist/layout/neato/index.d.ts +5 -5
  19. package/dist/layout/neato/index.d.ts.map +1 -1
  20. package/dist/layout/sfdp/index.d.ts.map +1 -1
  21. package/dist/render/public.d.ts +5 -0
  22. package/dist/render/public.d.ts.map +1 -1
  23. package/dist/render.js +70 -66
  24. package/dist/render.js.map +4 -4
  25. package/package.json +1 -1
  26. package/src/async/collect.ts +2 -14
  27. package/src/async/render-async.ts +1 -9
  28. package/src/gvc/device-labels.ts +98 -0
  29. package/src/gvc/device-transform.ts +58 -0
  30. package/src/gvc/device.ts +8 -132
  31. package/src/layout/dot/graph-label.ts +6 -1
  32. package/src/layout/fdp/xlayout.ts +3 -2
  33. package/src/layout/neato/dijkstra.ts +0 -141
  34. package/src/layout/neato/fdp-adjust.ts +25 -3
  35. package/src/layout/neato/index.ts +13 -12
  36. package/src/layout/sfdp/index.ts +2 -1
  37. package/src/render/public.ts +6 -5
  38. package/dist/layout/neato/overlap.d.ts +0 -85
  39. package/dist/layout/neato/overlap.d.ts.map +0 -1
  40. package/src/layout/neato/overlap.ts +0 -158
@@ -7,6 +7,16 @@ import type { Graph } from '../../model/graph.js';
7
7
  import type { TextMeasurer } from '../../common/textmeasure.js';
8
8
  /** Graph has a label. @see lib/common/const.h:GRAPH_LABEL */
9
9
  export declare const GRAPH_LABEL: number;
10
+ /**
11
+ * Graph/cluster label font, read through graphAttrInherited.
12
+ * @internal also used by src/async/collect.ts to request the same face.
13
+ * @see lib/common/input.c:do_graph_label
14
+ */
15
+ export declare function readFontParams(sg: Graph): {
16
+ fontsize: number;
17
+ fontname: string;
18
+ fontcolor: string;
19
+ };
10
20
  /**
11
21
  * Compute cluster label dimensions and set sg.info.border so that clustHt
12
22
  * accounts for label height.
@@ -1 +1 @@
1
- {"version":3,"file":"graph-label.d.ts","sourceRoot":"","sources":["../../../src/layout/dot/graph-label.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,6DAA6D;AAC7D,eAAO,MAAM,WAAW,QAAS,CAAC;AAmElC;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAuBhF"}
1
+ {"version":3,"file":"graph-label.d.ts","sourceRoot":"","sources":["../../../src/layout/dot/graph-label.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,6DAA6D;AAC7D,eAAO,MAAM,WAAW,QAAS,CAAC;AA8ClC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,KAAK,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMnG;AAeD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAuBhF"}
@@ -3,7 +3,7 @@ import { type XParams } from './fdp-model.js';
3
3
  /**
4
4
  * Overlap-removal dispatch on the overlap attribute:
5
5
  * ""/null → default "9:prism"; "n:mode" → n x_layout tries, then
6
- * removeOverlap with mode; "true" → keep overlaps.
6
+ * removeOverlapAs with mode; "true" → keep overlaps.
7
7
  * @see lib/fdpgen/xlayout.c:fdp_xLayout
8
8
  */
9
9
  export declare function fdpXLayout(g: Graph, xpms: XParams): void;
@@ -1,5 +1,4 @@
1
1
  /** @see lib/neatogen/dijkstra.c */
2
- import type { GraphSgd } from './sgd.js';
3
2
  /**
4
3
  * Sparse-graph vertex descriptor used by neato layout algorithms.
5
4
  * Matches `vtx_data` in lib/neatogen/sparsegraph.h.
@@ -46,35 +45,4 @@ export declare function dijkstraRelax(closest: number, closestDist: number, grap
46
45
  * @see lib/neatogen/dijkstra.c:dijkstra_f
47
46
  */
48
47
  export declare function dijkstra(src: number, graph: VtxData[], n: number, dist: Float32Array): void;
49
- /**
50
- * BFS single-source distances for unweighted graphs.
51
- * Fills `dist` with hop counts; unreachable nodes get BFS_INF (0x7fffffff).
52
- * edges[0] of each vertex is the self-loop and is skipped.
53
- * @see lib/neatogen/bfs.c:bfs
54
- */
55
- export declare function bfsDistances(src: number, graph: VtxData[], n: number, dist: Float32Array): void;
56
- /**
57
- * All-pairs shortest paths (unweighted), packed upper-triangular.
58
- * Length n*(n+1)/2; index for (i,j) j>=i: i*(2n-i-1)/2 + j.
59
- * @see lib/neatogen/stress.c:compute_apsp_packed
60
- */
61
- export declare function computeApspPacked(graph: VtxData[], n: number): Float32Array;
62
- /**
63
- * All-pairs shortest paths (weighted), packed upper-triangular.
64
- * Length n*(n+1)/2.
65
- * @see lib/neatogen/stress.c:compute_weighted_apsp_packed
66
- */
67
- export declare function computeWeightedApspPacked(graph: VtxData[], n: number): Float32Array;
68
- /** Initialise SGD dists from source's adjacency list. @internal */
69
- export declare function sgdInitDist(graph: GraphSgd, src: number, dists: Float32Array): void;
70
- /** Relax SGD neighbours of `closest` and push updates onto `heap`. @internal */
71
- export declare function sgdRelaxNeighbors(graph: GraphSgd, closest: number, d: number, dists: Float32Array, heap: number[]): void;
72
- /**
73
- * Single-source shortest paths for the SGD engine.
74
- * Writes terms for all reachable `j < src` and pinned nodes.
75
- * Returns the count of terms written.
76
- *
77
- * @see lib/neatogen/dijkstra.c:dijkstra_sgd
78
- */
79
- export declare function dijkstraSgd(graph: GraphSgd, src: number, terms: TermSgd[]): number;
80
48
  //# sourceMappingURL=dijkstra.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dijkstra.d.ts","sourceRoot":"","sources":["../../../src/layout/neato/dijkstra.ts"],"names":[],"mappings":"AACA,mCAAmC;AAEnC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;;;GASG;AACH,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AASD,uDAAuD;AACvD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,MAAM,GACV,IAAI,CAWN;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAcrE;AAED,iEAAiE;AACjE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAOlE;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,YAAY,GACjB,MAAM,EAAE,CAMV;AAMD,yDAAyD;AACzD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EAAE,EAChB,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,YAAY,GACjB,IAAI,CAKN;AAED,uDAAuD;AACvD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,EAAE,EAChB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EAAE,GACb,IAAI,CAUN;AAMD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EAAE,EAChB,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,YAAY,GACjB,IAAI,CASN;AAMD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EAAE,EAChB,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,YAAY,GACjB,IAAI,CAeN;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAS3E;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EAAE,EAChB,CAAC,EAAE,MAAM,GACR,YAAY,CASd;AAMD,mEAAmE;AACnE,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,GAClB,IAAI,CAMN;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EACf,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EAAE,GACb,IAAI,CAUN;AAMD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EAAE,GACf,MAAM,CAgBR"}
1
+ {"version":3,"file":"dijkstra.d.ts","sourceRoot":"","sources":["../../../src/layout/neato/dijkstra.ts"],"names":[],"mappings":"AACA,mCAAmC;AAEnC;;;;;;;;;GASG;AACH,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAMD,uDAAuD;AACvD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,MAAM,GACV,IAAI,CAWN;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAcrE;AAED,iEAAiE;AACjE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAOlE;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,YAAY,GACjB,MAAM,EAAE,CAMV;AAMD,yDAAyD;AACzD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EAAE,EAChB,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,YAAY,GACjB,IAAI,CAKN;AAED,uDAAuD;AACvD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,EAAE,EAChB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EAAE,GACb,IAAI,CAUN;AAMD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EAAE,EAChB,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,YAAY,GACjB,IAAI,CASN"}
@@ -38,9 +38,15 @@ export interface AdjustData {
38
38
  print: string;
39
39
  value: number;
40
40
  }
41
+ /**
42
+ * getAdjustMode's fallback warning: a value that is not a mode name, not
43
+ * prism*, and not a boolean is used as `false` (prism) with this warning.
44
+ * @see lib/neatogen/adjust.c:getAdjustMode (unmappable branch)
45
+ */
46
+ export declare function warnUnrecognizedOverlap(flag: string | undefined): void;
41
47
  /**
42
48
  * Resolve an `overlap` value to its adjust mode (the PRISM try count lands in
43
- * `value`).
49
+ * `value`), warning as C does for an unrecognized value.
44
50
  * @see lib/neatogen/adjust.c:getAdjustMode
45
51
  */
46
52
  export declare function getAdjustMode(flag: string | undefined): AdjustData;
@@ -56,4 +62,9 @@ export declare function removeOverlapWith(g: Graph, am: AdjustData): number;
56
62
  * @see lib/neatogen/adjust.c:adjustNodes / removeOverlapAs
57
63
  */
58
64
  export declare function adjustNodesFull(g: Graph): number;
65
+ /**
66
+ * The graph's `overlap` value resolved once (agget falls back to the root).
67
+ * @see lib/neatogen/adjust.c:graphAdjustMode
68
+ */
69
+ export declare function graphAdjustMode(g: Graph): AdjustData;
59
70
  //# sourceMappingURL=fdp-adjust.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fdp-adjust.d.ts","sourceRoot":"","sources":["../../../src/layout/neato/fdp-adjust.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AA6ClD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAUzE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAgCtD;AAED;wCACwC;AACxC,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,OAAO,KAAK,CAAC;AAC1B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAE3B,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAsBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAMlE;AA8CD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,GAAG,MAAM,CAMlE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAGhD"}
1
+ {"version":3,"file":"fdp-adjust.d.ts","sourceRoot":"","sources":["../../../src/layout/neato/fdp-adjust.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AA6ClD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAUzE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAgCtD;AAED;wCACwC;AACxC,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,MAAM,IAAI,CAAC;AACxB,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,OAAO,KAAK,CAAC;AAC1B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAE3B,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAsBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMtE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAOlE;AA8CD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,GAAG,MAAM,CAMlE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAGhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,GAAG,UAAU,CAEpD"}
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import type { Graph } from '../../model/graph.js';
13
13
  import type { LayoutEngine } from '../../gvc/context.js';
14
+ import { type AdjustData } from './fdp-adjust.js';
14
15
  export { MODE_KK, MODE_MAJOR, MODE_HIER, MODE_IPSEP, MODE_SGD, MODEL_SHORTPATH, MODEL_CIRCUIT, MODEL_SUBSET, MODEL_MDS, neatoInitNode, setSeed, solveModel, neatoTranslate, neatoSetAspect, neatoCleanup, } from './init.js';
15
16
  /**
16
17
  * Parse the root `mode` attribute into a numeric mode constant (C neatoMode).
@@ -27,14 +28,13 @@ export declare function parseMode(g: Graph): number;
27
28
  */
28
29
  export declare function parseModel(g: Graph): number;
29
30
  /**
30
- * Remove node overlaps per the `overlap` attribute: C's removeOverlapWith
31
- * dispatch (prism, scale family, oscale, ortho*, portho*, vpsc, voronoi) for
32
- * every mode, as neato_layout's adjustNodes call does.
31
+ * Remove node overlaps with the mode neato_layout resolved once
32
+ * (graphAdjustMode): C's removeOverlapWith dispatch for every mode.
33
33
  *
34
- * @see lib/neatogen/neatoinit.c:neato_layout (adjustNodes call)
34
+ * @see lib/neatogen/neatoinit.c:neato_layout (removeOverlapWith calls)
35
35
  * @see lib/neatogen/adjust.c:removeOverlapWith
36
36
  */
37
- export declare function maybeRemoveOverlap(g: Graph): void;
37
+ export declare function maybeRemoveOverlap(g: Graph, am: AdjustData): void;
38
38
  /**
39
39
  * Full neato layout pipeline for a single graph.
40
40
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layout/neato/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAqCzD,OAAO,EACL,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EACpD,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EACvD,aAAa,EAAE,OAAO,EAAE,UAAU,EAClC,cAAc,EAAE,cAAc,EAAE,YAAY,GAC7C,MAAM,WAAW,CAAC;AAMnB;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAE1C;AAcD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAK3C;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAEjD;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CA4D1C;AAsFD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAIjC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layout/neato/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAazD,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAwBtF,OAAO,EACL,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EACpD,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EACvD,aAAa,EAAE,OAAO,EAAE,UAAU,EAClC,cAAc,EAAE,cAAc,EAAE,YAAY,GAC7C,MAAM,WAAW,CAAC;AAMnB;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAE1C;AAcD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAK3C;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI,CAEjE;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CA8D1C;AAsFD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAIjC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layout/sfdp/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAqBzD,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,MAAM,EACP,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,EAAE,mCAAmC,EAAE,CAAC;AAK/C;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,IAAI,CAYN;AA+GD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CA4BzC;AAED,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,EAAE,YAIhC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layout/sfdp/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAqBzD,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,MAAM,EACP,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,EAAE,mCAAmC,EAAE,CAAC;AAK/C;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,IAAI,CAYN;AAgHD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CA4BzC;AAED,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,EAAE,YAIhC,CAAC"}
@@ -37,6 +37,11 @@ export interface RenderOptions {
37
37
  */
38
38
  inlineImages?: boolean;
39
39
  }
40
+ /**
41
+ * Reject a bad `g` / `format` / `opts` before any work starts.
42
+ * @internal shared with src/async/render-async.ts; not part of the public API.
43
+ */
44
+ export declare function checkRenderArgs(g: unknown, format: unknown, opts: unknown): void;
40
45
  /**
41
46
  * Render a (parsed or built) graph to the requested format string.
42
47
  *
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/render/public.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB,KAAK,GACL,KAAK,GACL,MAAM,GACN,MAAM,GACN,OAAO,GACP,WAAW,GACX,MAAM,GACN,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,MAAM,CACpB,CAAC,EAAE,KAAK,EACR,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,MAAM,CAaR"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/render/public.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB,KAAK,GACL,KAAK,GACL,MAAM,GACN,MAAM,GACN,OAAO,GACP,WAAW,GACX,MAAM,GACN,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAUhF;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,MAAM,CACpB,CAAC,EAAE,KAAK,EACR,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,MAAM,CAaR"}
package/dist/render.js CHANGED
@@ -19277,10 +19277,7 @@ function walkNodesAndEdges(g, renderer, job, info) {
19277
19277
  }
19278
19278
  }
19279
19279
 
19280
- // src/gvc/device.ts
19281
- function renderClusterLabel(sg, renderer, job) {
19282
- renderOneLabel(sg.info.label, renderer, job, false);
19283
- }
19280
+ // src/gvc/device-transform.ts
19284
19281
  function transformPoint(p, job) {
19285
19282
  if ((job.flags & GVRENDER_DOES_TRANSFORM) !== 0) {
19286
19283
  return p;
@@ -19300,6 +19297,50 @@ function buildPoint(x, y) {
19300
19297
  const pt = { x, y };
19301
19298
  return pt;
19302
19299
  }
19300
+
19301
+ // src/gvc/device-labels.ts
19302
+ var VALIGN_TOP = "t".charCodeAt(0);
19303
+ var VALIGN_BOTTOM = "b".charCodeAt(0);
19304
+ function labelFirstSpanY(lp) {
19305
+ if (lp.valign === VALIGN_TOP) return lp.pos.y + lp.space.y / 2 - lp.fontsize;
19306
+ if (lp.valign === VALIGN_BOTTOM) {
19307
+ return lp.pos.y - lp.space.y / 2 + lp.dimen.y - lp.fontsize;
19308
+ }
19309
+ return lp.pos.y + lp.dimen.y / 2 - lp.fontsize;
19310
+ }
19311
+ function labelSpanX(lp, just) {
19312
+ if (just === "l") return lp.pos.x - lp.space.x / 2;
19313
+ if (just === "r") return lp.pos.x + lp.space.x / 2;
19314
+ return lp.pos.x;
19315
+ }
19316
+ function renderOneLabel(lp, renderer, job, requireSet = true) {
19317
+ if (!lp) return;
19318
+ if (requireSet && !lp.set) return;
19319
+ if (lp.html) {
19320
+ if (lp.u.kind === "html") {
19321
+ const html = lp.u.html;
19322
+ const pos = lp.pos;
19323
+ withLabelEmitState(job, () => emitHtmlLabel(html, pos, renderer, job));
19324
+ }
19325
+ return;
19326
+ }
19327
+ if (lp.u.kind !== "txt" || lp.u.nspans < 1) return;
19328
+ let y = labelFirstSpanY(lp);
19329
+ for (let i = 0; i < lp.u.nspans; i++) {
19330
+ const span = lp.u.span[i];
19331
+ if (!span) break;
19332
+ gvrenderTextspan(renderer, { x: labelSpanX(lp, span.just), y }, span, job);
19333
+ y -= span.size.y;
19334
+ }
19335
+ }
19336
+ function renderNodeXLabel(n, renderer, job) {
19337
+ renderOneLabel(n.info.xlabel, renderer, job);
19338
+ }
19339
+ function renderClusterLabel(sg, renderer, job) {
19340
+ renderOneLabel(sg.info.label, renderer, job, false);
19341
+ }
19342
+
19343
+ // src/gvc/device.ts
19303
19344
  function labelTextOf2(lp) {
19304
19345
  return lp?.text ?? null;
19305
19346
  }
@@ -19374,43 +19415,6 @@ function renderEdge(e, renderer, job) {
19374
19415
  job.popObj();
19375
19416
  }
19376
19417
  }
19377
- var VALIGN_TOP = "t".charCodeAt(0);
19378
- var VALIGN_BOTTOM = "b".charCodeAt(0);
19379
- function labelFirstSpanY(lp) {
19380
- if (lp.valign === VALIGN_TOP) return lp.pos.y + lp.space.y / 2 - lp.fontsize;
19381
- if (lp.valign === VALIGN_BOTTOM) {
19382
- return lp.pos.y - lp.space.y / 2 + lp.dimen.y - lp.fontsize;
19383
- }
19384
- return lp.pos.y + lp.dimen.y / 2 - lp.fontsize;
19385
- }
19386
- function labelSpanX(lp, just) {
19387
- if (just === "l") return lp.pos.x - lp.space.x / 2;
19388
- if (just === "r") return lp.pos.x + lp.space.x / 2;
19389
- return lp.pos.x;
19390
- }
19391
- function renderOneLabel(lp, renderer, job, requireSet = true) {
19392
- if (!lp) return;
19393
- if (requireSet && !lp.set) return;
19394
- if (lp.html) {
19395
- if (lp.u.kind === "html") {
19396
- const html = lp.u.html;
19397
- const pos = lp.pos;
19398
- withLabelEmitState(job, () => emitHtmlLabel(html, pos, renderer, job));
19399
- }
19400
- return;
19401
- }
19402
- if (lp.u.kind !== "txt" || lp.u.nspans < 1) return;
19403
- let y = labelFirstSpanY(lp);
19404
- for (let i = 0; i < lp.u.nspans; i++) {
19405
- const span = lp.u.span[i];
19406
- if (!span) break;
19407
- gvrenderTextspan(renderer, { x: labelSpanX(lp, span.just), y }, span, job);
19408
- y -= span.size.y;
19409
- }
19410
- }
19411
- function renderNodeXLabel(n, renderer, job) {
19412
- renderOneLabel(n.info.xlabel, renderer, job);
19413
- }
19414
19418
  function renderGraphLabel(g, renderer, job) {
19415
19419
  setHtmlAnchorObj(svgGraphId(g, job), labelTextOf2(g.info.label), job.obj ?? void 0);
19416
19420
  renderOneLabel(g.info.label, renderer, job, false);
@@ -43693,7 +43697,15 @@ var ADJUST_MODES = /* @__PURE__ */ new Map([
43693
43697
  ["porthoxy", [AM_PORTHOXY, "xy pseudo-orthogonal constraints"]],
43694
43698
  ["porthoyx", [AM_PORTHOYX, "yx pseudo-orthogonal constraints"]]
43695
43699
  ]);
43700
+ function warnUnrecognizedOverlap(flag) {
43701
+ if (flag === void 0 || flag === "") return;
43702
+ const s = flag.toLowerCase();
43703
+ if (s.startsWith("prism") || NAMED_MODES.has(s)) return;
43704
+ if (mapBoolDflt(flag, false) === mapBoolDflt(flag, true)) return;
43705
+ console.warn(`Unrecognized overlap value "${flag}" - using false`);
43706
+ }
43696
43707
  function getAdjustMode(flag) {
43708
+ warnUnrecognizedOverlap(flag);
43697
43709
  const ntry = overlapPrismTries(flag);
43698
43710
  if (ntry !== null) return { mode: AM_PRISM, print: "prism", value: ntry };
43699
43711
  const named = ADJUST_MODES.get((flag ?? "").toLowerCase());
@@ -43742,8 +43754,11 @@ function removeOverlapWith(g, am) {
43742
43754
  return nret + (am.mode === AM_SCALE ? sAdjustGraph(g) : adjustVoronoi(g, am));
43743
43755
  }
43744
43756
  function adjustNodesFull(g) {
43745
- const flag = g.attrs.get("overlap") ?? g.root.attrs.get("overlap");
43746
- return removeOverlapWith(g, getAdjustMode(flag));
43757
+ if (g.nodes.size < 2) return 0;
43758
+ return removeOverlapWith(g, graphAdjustMode(g));
43759
+ }
43760
+ function graphAdjustMode(g) {
43761
+ return getAdjustMode(g.attrs.get("overlap") ?? g.root.attrs.get("overlap"));
43747
43762
  }
43748
43763
 
43749
43764
  // src/layout/twopi/init.ts
@@ -44110,8 +44125,8 @@ function parseModel(g) {
44110
44125
  if (!s) return MODEL_SHORTPATH2;
44111
44126
  return MODEL_MAP[s] ?? MODEL_SHORTPATH2;
44112
44127
  }
44113
- function maybeRemoveOverlap(g) {
44114
- adjustNodesFull(g);
44128
+ function maybeRemoveOverlap(g, am) {
44129
+ removeOverlapWith(g, am);
44115
44130
  }
44116
44131
  function neatoLayout(g) {
44117
44132
  graphInit(g, false);
@@ -44126,13 +44141,14 @@ function neatoLayout(g) {
44126
44141
  for (const e of g.edges) initEdgeLabels(e, g, measurer);
44127
44142
  }
44128
44143
  const mode = parseMode(g);
44144
+ const am = graphAdjustMode(g);
44129
44145
  const model = parseModel(g);
44130
44146
  const { graphs: comps, pinned } = neatoPack(g, mode) >= 0 ? pccomps(g, "_neato_cc") : { graphs: [g], pinned: false };
44131
44147
  if (comps.length > 1) {
44132
- layoutComponents(g, comps, mode, model, pinned);
44148
+ layoutComponents(g, comps, { mode, model, am }, pinned);
44133
44149
  } else {
44134
44150
  solveModel2(g, mode, model);
44135
- maybeRemoveOverlap(g);
44151
+ maybeRemoveOverlap(g, am);
44136
44152
  splineEdgesShifted(g);
44137
44153
  }
44138
44154
  addClusters(g);
@@ -44168,11 +44184,11 @@ function addClusters(g) {
44168
44184
  g.info.clust = clusters;
44169
44185
  g.info.n_cluster = clusters.length;
44170
44186
  }
44171
- function layoutComponents(g, comps, mode, model, pinned) {
44187
+ function layoutComponents(g, comps, solve2, pinned) {
44172
44188
  for (const gc of comps) {
44173
44189
  setEdgeTypeFromAttr(gc, EDGETYPE_LINE);
44174
- solveModel2(gc, mode, model);
44175
- maybeRemoveOverlap(gc);
44190
+ solveModel2(gc, solve2.mode, solve2.model);
44191
+ maybeRemoveOverlap(gc, solve2.am);
44176
44192
  splineEdgesShifted(gc);
44177
44193
  }
44178
44194
  const pinfo = {
@@ -45050,6 +45066,7 @@ function fdpXLayout(g, xpms) {
45050
45066
  }
45051
45067
  function removeOverlapAs(g, flag) {
45052
45068
  if (g.nodes.size < 2) return;
45069
+ warnUnrecognizedOverlap(flag);
45053
45070
  normalizeG(g);
45054
45071
  simpleScale(g);
45055
45072
  const ntry = overlapPrismTries(flag);
@@ -46200,6 +46217,7 @@ function resolveControl(g) {
46200
46217
  const pad = { x: DFLT_MARGIN / 72, y: DFLT_MARGIN / 72 };
46201
46218
  const overlap5 = aggetGraph(g, "overlap");
46202
46219
  const flag = overlap5 === void 0 ? "prism0" : overlap5;
46220
+ warnUnrecognizedOverlap(flag);
46203
46221
  const ntry = overlapPrismTries(flag);
46204
46222
  if (ntry !== null) {
46205
46223
  ctrl.overlap = ntry;
@@ -55120,16 +55138,9 @@ function collectEdge(acc, e) {
55120
55138
  addLabel(acc, e.attrs.get("headlabel"), lfi);
55121
55139
  addLabel(acc, e.attrs.get("taillabel"), lfi);
55122
55140
  }
55123
- function graphLabelFont(sg) {
55124
- const get = (k) => sg.attrs.get(k) ?? sg.graphDefaultsSnapshot?.get(k);
55125
- return {
55126
- fontname: get("fontname") ?? DEFAULT_FONTNAME,
55127
- fontsize: parseFloat(get("fontsize") ?? "") || DEFAULT_FONTSIZE2
55128
- };
55129
- }
55130
55141
  function collectGraphLabels(acc, sg, root) {
55131
55142
  if (isACluster(sg)) {
55132
- addLabel(acc, sg.attrs.get("label") ?? sg.graphDefaultsSnapshot?.get("label"), graphLabelFont(sg));
55143
+ addLabel(acc, sg.attrs.get("label") ?? sg.graphDefaultsSnapshot?.get("label"), readFontParams(sg));
55133
55144
  }
55134
55145
  for (const child of sg.subgraphs.values()) collectGraphLabels(acc, child, root);
55135
55146
  }
@@ -55189,13 +55200,6 @@ async function loadFonts(fontSet, fonts, timeoutMs) {
55189
55200
 
55190
55201
  // src/async/render-async.ts
55191
55202
  var DEFAULT_FONT_TIMEOUT_MS = 3e3;
55192
- function checkRenderArgs2(g, format, opts) {
55193
- if (typeof g !== "object" || g === null) throw invalidArgType("g", "object", g);
55194
- if (typeof format !== "string") throw invalidArgType("format", "string", format);
55195
- if (opts !== void 0 && (typeof opts !== "object" || opts === null)) {
55196
- throw invalidArgType("opts", "object or undefined", opts);
55197
- }
55198
- }
55199
55203
  function defaultFontSet() {
55200
55204
  const doc = Reflect.get(globalThis, "document");
55201
55205
  if (typeof doc !== "object" || doc === null) return void 0;
@@ -55231,7 +55235,7 @@ async function prefetchAll(g, opts) {
55231
55235
  return { fontIssues, sizes, bytes };
55232
55236
  }
55233
55237
  async function renderAsync(g, format, opts) {
55234
- checkRenderArgs2(g, format, opts);
55238
+ checkRenderArgs(g, format, opts);
55235
55239
  const engine = opts?.engine ?? "dot";
55236
55240
  try {
55237
55241
  const { fontIssues, sizes, bytes } = await prefetchAll(g, opts);