@knowvah/dot-engine 2.6.12 → 2.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.
Files changed (198) hide show
  1. package/README.md +1 -1
  2. package/dist/api.js +18 -4
  3. package/dist/api.js.map +3 -3
  4. package/dist/common/attr-get.d.ts +30 -0
  5. package/dist/common/attr-get.d.ts.map +1 -0
  6. package/dist/common/htmltable-emit-fill.d.ts +20 -2
  7. package/dist/common/htmltable-emit-fill.d.ts.map +1 -1
  8. package/dist/common/htmltable-emit.d.ts.map +1 -1
  9. package/dist/common/htmltable-lex-expat.d.ts.map +1 -1
  10. package/dist/common/htmltable-pos-runs.d.ts +7 -4
  11. package/dist/common/htmltable-pos-runs.d.ts.map +1 -1
  12. package/dist/common/htmltable.d.ts.map +1 -1
  13. package/dist/common/libm-trig.d.ts +5 -0
  14. package/dist/common/libm-trig.d.ts.map +1 -0
  15. package/dist/common/make-label.d.ts.map +1 -1
  16. package/dist/common/multicolor.d.ts +21 -13
  17. package/dist/common/multicolor.d.ts.map +1 -1
  18. package/dist/common/poly-gencode.d.ts +1 -2
  19. package/dist/common/poly-gencode.d.ts.map +1 -1
  20. package/dist/common/poly-init.d.ts +2 -12
  21. package/dist/common/poly-init.d.ts.map +1 -1
  22. package/dist/common/splines-clip.d.ts +7 -0
  23. package/dist/common/splines-clip.d.ts.map +1 -1
  24. package/dist/gvc/context.d.ts +6 -0
  25. package/dist/gvc/context.d.ts.map +1 -1
  26. package/dist/gvc/device-cluster.d.ts +15 -0
  27. package/dist/gvc/device-cluster.d.ts.map +1 -1
  28. package/dist/gvc/device.d.ts.map +1 -1
  29. package/dist/gvc/first-layer.d.ts +9 -0
  30. package/dist/gvc/first-layer.d.ts.map +1 -0
  31. package/dist/gvc/gvrender-set-style.d.ts +28 -0
  32. package/dist/gvc/gvrender-set-style.d.ts.map +1 -0
  33. package/dist/gvc/usershape.d.ts +18 -0
  34. package/dist/gvc/usershape.d.ts.map +1 -1
  35. package/dist/index.js +2478 -912
  36. package/dist/index.js.map +4 -4
  37. package/dist/layout/dot/compound.d.ts.map +1 -1
  38. package/dist/layout/dot/edge-route-clip.d.ts +14 -4
  39. package/dist/layout/dot/edge-route-clip.d.ts.map +1 -1
  40. package/dist/layout/dot/edge-route-routing.d.ts.map +1 -1
  41. package/dist/layout/dot/graph-label.d.ts.map +1 -1
  42. package/dist/layout/neato/__fixtures__/dijkstra-f.d.ts +11 -0
  43. package/dist/layout/neato/__fixtures__/dijkstra-f.d.ts.map +1 -0
  44. package/dist/layout/neato/__fixtures__/hier-imds.d.ts +36 -0
  45. package/dist/layout/neato/__fixtures__/hier-imds.d.ts.map +1 -0
  46. package/dist/layout/neato/__fixtures__/hier-majorization.d.ts +32 -0
  47. package/dist/layout/neato/__fixtures__/hier-majorization.d.ts.map +1 -0
  48. package/dist/layout/neato/cdt-surface.d.ts.map +1 -1
  49. package/dist/layout/neato/compute-hierarchy.d.ts +24 -0
  50. package/dist/layout/neato/compute-hierarchy.d.ts.map +1 -0
  51. package/dist/layout/neato/conjgrad-mkernel.d.ts +20 -0
  52. package/dist/layout/neato/conjgrad-mkernel.d.ts.map +1 -0
  53. package/dist/layout/neato/conjgrad.d.ts +19 -0
  54. package/dist/layout/neato/conjgrad.d.ts.map +1 -1
  55. package/dist/layout/neato/constrained-majorization.d.ts +26 -0
  56. package/dist/layout/neato/constrained-majorization.d.ts.map +1 -0
  57. package/dist/layout/neato/dijkstra.d.ts +33 -16
  58. package/dist/layout/neato/dijkstra.d.ts.map +1 -1
  59. package/dist/layout/neato/gts-triangle.d.ts +14 -0
  60. package/dist/layout/neato/gts-triangle.d.ts.map +1 -0
  61. package/dist/layout/neato/init.d.ts +2 -12
  62. package/dist/layout/neato/init.d.ts.map +1 -1
  63. package/dist/layout/neato/kkutils.d.ts +20 -0
  64. package/dist/layout/neato/kkutils.d.ts.map +1 -0
  65. package/dist/layout/neato/make-graph-data.d.ts +43 -0
  66. package/dist/layout/neato/make-graph-data.d.ts.map +1 -0
  67. package/dist/layout/neato/matrix-ops.d.ts +46 -0
  68. package/dist/layout/neato/matrix-ops.d.ts.map +1 -1
  69. package/dist/layout/neato/opt-arrangement.d.ts +20 -0
  70. package/dist/layout/neato/opt-arrangement.d.ts.map +1 -0
  71. package/dist/layout/neato/quad-prog-solve.d.ts +44 -0
  72. package/dist/layout/neato/quad-prog-solve.d.ts.map +1 -0
  73. package/dist/layout/neato/smart-ini-x.d.ts +9 -0
  74. package/dist/layout/neato/smart-ini-x.d.ts.map +1 -0
  75. package/dist/layout/neato/splines.d.ts +1 -1
  76. package/dist/layout/neato/splines.d.ts.map +1 -1
  77. package/dist/layout/neato/start.d.ts +4 -1
  78. package/dist/layout/neato/start.d.ts.map +1 -1
  79. package/dist/layout/neato/stress.d.ts +8 -0
  80. package/dist/layout/neato/stress.d.ts.map +1 -1
  81. package/dist/model/edge.d.ts +1 -1
  82. package/dist/model/edge.d.ts.map +1 -1
  83. package/dist/model/lazy-attrs.d.ts +10 -0
  84. package/dist/model/lazy-attrs.d.ts.map +1 -0
  85. package/dist/model/node.d.ts +1 -1
  86. package/dist/model/node.d.ts.map +1 -1
  87. package/dist/ortho/index.d.ts.map +1 -1
  88. package/dist/render/dot/edge-draw.d.ts +1 -1
  89. package/dist/render/dot/edge-draw.d.ts.map +1 -1
  90. package/dist/render/svg-multicolor.d.ts +2 -2
  91. package/dist/render/svg-multicolor.d.ts.map +1 -1
  92. package/dist/render.js +2358 -792
  93. package/dist/render.js.map +4 -4
  94. package/package.json +1 -1
  95. package/src/common/attr-get.ts +46 -0
  96. package/src/common/graph-init.ts +1 -1
  97. package/src/common/htmltable-emit-fill.ts +56 -11
  98. package/src/common/htmltable-emit.ts +4 -3
  99. package/src/common/htmltable-lex-expat.ts +21 -3
  100. package/src/common/htmltable-pos-runs.ts +11 -6
  101. package/src/common/htmltable.ts +28 -116
  102. package/src/common/libm-trig.ts +43 -0
  103. package/src/common/make-label.ts +14 -2
  104. package/src/common/multicolor.ts +88 -24
  105. package/src/common/poly-gencode.ts +16 -8
  106. package/src/common/poly-init.ts +23 -19
  107. package/src/common/postproc.ts +2 -2
  108. package/src/common/splines-clip.ts +15 -12
  109. package/src/common/splines-routespl.ts +2 -2
  110. package/src/common/textmeasure-lookup.ts +1 -1
  111. package/src/gvc/context.ts +8 -0
  112. package/src/gvc/device-cluster.ts +63 -8
  113. package/src/gvc/device.ts +16 -2
  114. package/src/gvc/first-layer.ts +26 -0
  115. package/src/gvc/gvrender-set-style.ts +114 -0
  116. package/src/gvc/usershape.ts +26 -0
  117. package/src/layout/dot/cluster.ts +1 -1
  118. package/src/layout/dot/compound.ts +3 -4
  119. package/src/layout/dot/conc.ts +1 -1
  120. package/src/layout/dot/edge-route-clip.ts +19 -7
  121. package/src/layout/dot/edge-route-routing.ts +11 -3
  122. package/src/layout/dot/fastgr.ts +2 -2
  123. package/src/layout/dot/graph-label.ts +1 -15
  124. package/src/layout/neato/__fixtures__/dijkstra-f.ts +17 -0
  125. package/src/layout/neato/__fixtures__/hier/c1554.gv +33 -0
  126. package/src/layout/neato/__fixtures__/hier/c1554.plain +26 -0
  127. package/src/layout/neato/__fixtures__/hier/c1554.xdot +161 -0
  128. package/src/layout/neato/__fixtures__/hier/cases/cycle.gv +1 -0
  129. package/src/layout/neato/__fixtures__/hier/cases/cycle.plain +10 -0
  130. package/src/layout/neato/__fixtures__/hier/cases/cycle.stderr +0 -0
  131. package/src/layout/neato/__fixtures__/hier/cases/dirnone.gv +1 -0
  132. package/src/layout/neato/__fixtures__/hier/cases/dirnone.plain +11 -0
  133. package/src/layout/neato/__fixtures__/hier/cases/dirnone.stderr +0 -0
  134. package/src/layout/neato/__fixtures__/hier/cases/epsilon.gv +1 -0
  135. package/src/layout/neato/__fixtures__/hier/cases/epsilon.plain +13 -0
  136. package/src/layout/neato/__fixtures__/hier/cases/epsilon.stderr +0 -0
  137. package/src/layout/neato/__fixtures__/hier/cases/levelsgap.gv +1 -0
  138. package/src/layout/neato/__fixtures__/hier/cases/levelsgap.plain +8 -0
  139. package/src/layout/neato/__fixtures__/hier/cases/levelsgap.stderr +0 -0
  140. package/src/layout/neato/__fixtures__/hier/cases/mds.gv +1 -0
  141. package/src/layout/neato/__fixtures__/hier/cases/mds.plain +10 -0
  142. package/src/layout/neato/__fixtures__/hier/cases/mds.stderr +0 -0
  143. package/src/layout/neato/__fixtures__/hier/cases/multiedge.gv +1 -0
  144. package/src/layout/neato/__fixtures__/hier/cases/multiedge.plain +10 -0
  145. package/src/layout/neato/__fixtures__/hier/cases/multiedge.stderr +0 -0
  146. package/src/layout/neato/__fixtures__/hier/cases/neglevelsgap.gv +1 -0
  147. package/src/layout/neato/__fixtures__/hier/cases/neglevelsgap.plain +8 -0
  148. package/src/layout/neato/__fixtures__/hier/cases/neglevelsgap.stderr +0 -0
  149. package/src/layout/neato/__fixtures__/hier/cases/startrandom.gv +1 -0
  150. package/src/layout/neato/__fixtures__/hier/cases/startrandom.plain +10 -0
  151. package/src/layout/neato/__fixtures__/hier/cases/startrandom.stderr +0 -0
  152. package/src/layout/neato/__fixtures__/hier/cases/startregular.gv +1 -0
  153. package/src/layout/neato/__fixtures__/hier/cases/startregular.plain +10 -0
  154. package/src/layout/neato/__fixtures__/hier/cases/startregular.stderr +0 -0
  155. package/src/layout/neato/__fixtures__/hier/cases/tdist.gv +1 -0
  156. package/src/layout/neato/__fixtures__/hier/cases/tdist.plain +13 -0
  157. package/src/layout/neato/__fixtures__/hier/cases/tdist.stderr +0 -0
  158. package/src/layout/neato/__fixtures__/hier/cases/undirected.gv +1 -0
  159. package/src/layout/neato/__fixtures__/hier/cases/undirected.plain +10 -0
  160. package/src/layout/neato/__fixtures__/hier/cases/undirected.stderr +0 -0
  161. package/src/layout/neato/__fixtures__/hier/hier-probe.gv +1 -0
  162. package/src/layout/neato/__fixtures__/hier/hier-probe.plain +16 -0
  163. package/src/layout/neato/__fixtures__/hier/hier-probe.xdot +62 -0
  164. package/src/layout/neato/__fixtures__/hier-imds.ts +151 -0
  165. package/src/layout/neato/__fixtures__/hier-majorization.ts +145 -0
  166. package/src/layout/neato/cdt-surface.ts +6 -16
  167. package/src/layout/neato/compute-hierarchy.ts +90 -0
  168. package/src/layout/neato/conjgrad-mkernel.ts +141 -0
  169. package/src/layout/neato/conjgrad.ts +208 -0
  170. package/src/layout/neato/constrained-majorization.ts +479 -0
  171. package/src/layout/neato/dijkstra.ts +218 -92
  172. package/src/layout/neato/edge-len.ts +2 -2
  173. package/src/layout/neato/fdp-adjust.ts +3 -3
  174. package/src/layout/neato/gts-triangle.ts +42 -0
  175. package/src/layout/neato/init.ts +57 -57
  176. package/src/layout/neato/kk.ts +2 -2
  177. package/src/layout/neato/kkutils.ts +96 -0
  178. package/src/layout/neato/make-graph-data.ts +166 -0
  179. package/src/layout/neato/matrix-ops.ts +138 -0
  180. package/src/layout/neato/opt-arrangement.ts +86 -0
  181. package/src/layout/neato/quad-prog-solve.ts +489 -0
  182. package/src/layout/neato/smart-ini-x.ts +503 -0
  183. package/src/layout/neato/splines.ts +4 -4
  184. package/src/layout/neato/start.ts +7 -6
  185. package/src/layout/neato/stress.ts +28 -0
  186. package/src/model/edge.ts +3 -2
  187. package/src/model/lazy-attrs.ts +36 -0
  188. package/src/model/node.ts +3 -2
  189. package/src/ortho/index.ts +2 -3
  190. package/src/parser/dot.js +1 -1
  191. package/src/parser/dot.pegjs +1 -1
  192. package/src/parser/index.ts +1 -1
  193. package/src/render/color-resolve.ts +2 -2
  194. package/src/render/dot/edge-draw.ts +6 -3
  195. package/src/render/dot.ts +1 -1
  196. package/src/render/svg-edge-split.ts +2 -2
  197. package/src/render/svg-multicolor.ts +4 -3
  198. package/src/render/svg-parallel-edge.ts +2 -2
package/src/parser/dot.js CHANGED
@@ -289,7 +289,7 @@ function peg$parse(input, options) {
289
289
  function peg$f13(t, m, attrs) {
290
290
  // grammar.y:attrstmt calls nomacros() when a macro name is present;
291
291
  // the attributes are still applied unchanged.
292
- if (m) agwarningf("attribute macros not implemented", "error");
292
+ if (m) agwarningf("attribute macros not implemented");
293
293
  return { type: "attr", target: t, attrs: attrs };
294
294
  }
295
295
  function peg$f14(a) { return { type: "assign", key: a.key, value: a.value }; }
@@ -75,7 +75,7 @@ AttrStmt
75
75
  {
76
76
  // grammar.y:attrstmt calls nomacros() when a macro name is present;
77
77
  // the attributes are still applied unchanged.
78
- if (m) agwarningf("attribute macros not implemented", "error");
78
+ if (m) agwarningf("attribute macros not implemented");
79
79
  return { type: "attr", target: t, attrs: attrs };
80
80
  }
81
81
  / a:AttrAssignment
@@ -234,7 +234,7 @@ export function isPeggyError(err: unknown): err is {
234
234
  function warnNumberAmbiguities(src: string, upTo: number): void {
235
235
  for (const a of scanNumberAmbiguities(src, Stripper.strip(src))) {
236
236
  if (a.offset > upTo) break;
237
- agerrFinished(numberAmbiguityMessage(a), 'error');
237
+ agerrFinished(numberAmbiguityMessage(a));
238
238
  }
239
239
  }
240
240
 
@@ -26,7 +26,7 @@ import {
26
26
  import type { Edge } from '../model/edge.js';
27
27
  import { registerRenderState } from '../common/render-state.js';
28
28
  import { agerrorf, agwarningf } from '../common/agerr.js';
29
- import { parseSegs } from '../common/multicolor.js';
29
+ import { parseSegsSilent } from '../common/multicolor.js';
30
30
  import { findStopColor, styleTokens } from '../common/style-resolve.js';
31
31
  import { emitOnce } from '../common/emit-once.js';
32
32
 
@@ -282,7 +282,7 @@ function multicolorNames(
282
282
  color: string,
283
283
  arrows: readonly EdgeArrowFlags[],
284
284
  ): string[] | null {
285
- const { segs, error } = parseSegs(color);
285
+ const { segs, error } = parseSegsSilent(color);
286
286
  if (error === 1 || error === 2) return null;
287
287
  const out: string[] = [];
288
288
  const front = segs[0]?.color ?? null;
@@ -23,11 +23,12 @@ import { resolveRenderColor } from '../color-resolve.js';
23
23
  import { taper, taperfun } from '../../common/taper.js';
24
24
  import { orthoRoundedRadius } from '../svg-helpers.js';
25
25
  import { orthoRoundedPolylines } from '../svg-edge-ortho-radius.js';
26
- import { parseSegs } from '../../common/multicolor.js';
26
+ import { edgeSegsContext, parseSegs, parseSegsSilent } from '../../common/multicolor.js';
27
27
  import { splitSplineByColor } from '../svg-edge-split.js';
28
28
  import { buildOffsetLists, advanceTmpList } from '../../common/edge-offset.js';
29
29
  import { xdotFillColor, xdotNum, xdotPenColor, xdotPoint, xdotPoints, xdotStrOp, trimFixed3 } from './xdot-ops.js';
30
30
  import { DotWriterBase } from './agwrite.js';
31
+ import { gvrenderSetStyle } from '../../gvc/gvrender-set-style.js';
31
32
 
32
33
  /** Pen colour when a colour-list entry is empty. @see lib/common/emit.c:2485 */
33
34
  const DEFAULT_COLOR = 'black';
@@ -81,6 +82,7 @@ export abstract class EdgeDrawBase extends DotWriterBase {
81
82
  */
82
83
  attachmentPolyline(pts: Point[], pencolor: string, job: RenderJob): void {
83
84
  const obj = job.obj;
85
+ gvrenderSetStyle(DEFAULT_LINE_STYLE);
84
86
  if (obj !== null) {
85
87
  obj.rawStyle = [...DEFAULT_LINE_STYLE];
86
88
  obj.pen = PenType.Solid;
@@ -147,11 +149,12 @@ export abstract class EdgeDrawBase extends DotWriterBase {
147
149
  */
148
150
  protected emitSplitSpline(
149
151
  bzList: (Bezier | undefined)[],
152
+ e: Edge,
150
153
  colorAttr: string,
151
154
  edraw: string[],
152
155
  job: RenderJob,
153
156
  ): { firstColor: string; endColor: string } {
154
- const segs = parseSegs(colorAttr).segs;
157
+ const segs = parseSegs(colorAttr, edgeSegsContext(e)).segs;
155
158
  const firstColor = segs[0]?.color ?? DEFAULT_COLOR;
156
159
  let endColor = firstColor;
157
160
  for (const bz of bzList) {
@@ -183,7 +186,7 @@ export abstract class EdgeDrawBase extends DotWriterBase {
183
186
  ? buildOffsetLists(bz.list, (2 + numc) / 2)
184
187
  : { offlist: [] as Point[], tmplist: [] as Point[] },
185
188
  );
186
- const colors = parseSegs(colorAttr).segs.map((s) => s.color ?? DEFAULT_COLOR);
189
+ const colors = parseSegsSilent(colorAttr).segs.map((s) => s.color ?? DEFAULT_COLOR);
187
190
  for (const color of colors) {
188
191
  const pen = xdotPenColor(resolveRenderColor(color));
189
192
  for (const sd of segData) {
package/src/render/dot.ts CHANGED
@@ -215,7 +215,7 @@ export class XdotRenderer extends EdgeDrawBase implements RendererPlugin {
215
215
  // color segment, split along the spline's arc length. Takes precedence
216
216
  // over tapered / `:` parallel, matching C's `if (numsemi && numc)` order.
217
217
  // @see lib/common/emit.c:2389 multicolor
218
- const c = this.emitSplitSpline(spl.list as (Bezier | undefined)[], colorAttr, edraw, job);
218
+ const c = this.emitSplitSpline(spl.list as (Bezier | undefined)[], e, colorAttr, edraw, job);
219
219
  tailArrowColor = c.firstColor;
220
220
  headArrowColor = c.endColor;
221
221
  } else if (edgeIsTapered(e)) {
@@ -21,7 +21,7 @@ import type { RenderJob } from '../gvc/job.js';
21
21
  import type { Point, Bezier } from '../model/geom.js';
22
22
  import { bezier } from '../common/bezier.js';
23
23
  import { dist2 } from '../common/spline-midpoint.js';
24
- import { parseSegs } from '../common/multicolor.js';
24
+ import { edgeSegsContext, parseSegs } from '../common/multicolor.js';
25
25
  import { transformPoint } from '../gvc/device.js';
26
26
  import { emitBezierPath, emitDash, emitPenWidth } from './svg-helpers.js';
27
27
  import { resolveRenderColor, colorPaint } from './color-resolve.js';
@@ -160,7 +160,7 @@ export function emitSplitEdgePaths(
160
160
  job: RenderJob,
161
161
  colorList: string,
162
162
  ): { firstColor: string; endColor: string } {
163
- const segs = parseSegs(colorList).segs;
163
+ const segs = parseSegs(colorList, edgeSegsContext(e)).segs;
164
164
  const firstColor = segs[0]?.color ?? DEFAULT_COLOR;
165
165
  const spl = e.info.spl;
166
166
  let endColor = firstColor;
@@ -231,8 +231,9 @@ function drawWedge(seg: WedgeSeg, e: EllipseParams, ctx: RenderCtx): number {
231
231
  */
232
232
  export function wedgedEllipse(
233
233
  job: RenderJob, pf: Point[], clrs: string, renderer: RendererPlugin,
234
+ context?: () => string,
234
235
  ): number {
235
- const { segs, error } = parseSegs(clrs);
236
+ const { segs, error } = parseSegs(clrs, context);
236
237
  if (error === 1 || error === 2) return error;
237
238
  const ctrX = (pf[0]!.x + pf[1]!.x) / 2;
238
239
  const ctrY = (pf[0]!.y + pf[1]!.y) / 2;
@@ -286,9 +287,9 @@ function drawBand(p: Point[], seg: BandSeg, ctx: RenderCtx): void {
286
287
  */
287
288
  export function stripedBox(
288
289
  job: RenderJob, pts: Point[], clrs: string,
289
- rotate: boolean, renderer: RendererPlugin,
290
+ rotate: boolean, renderer: RendererPlugin, context?: () => string,
290
291
  ): number {
291
- const { segs, error } = parseSegs(clrs);
292
+ const { segs, error } = parseSegs(clrs, context);
292
293
  if (error === 1 || error === 2) return error;
293
294
  // @see lib/common/emit.c:605-615 rotate swap
294
295
  const p: Point[] = rotate
@@ -27,7 +27,7 @@ import { buildOffsetLists, advanceTmpList } from '../common/edge-offset.js';
27
27
  import { transformPoint } from '../gvc/device.js';
28
28
  import { emitBezierPath, emitDash, emitPenWidth } from './svg-helpers.js';
29
29
  import { resolveRenderColor, colorPaint, colorOpacity } from './color-resolve.js';
30
- import { parseSegs } from '../common/multicolor.js';
30
+ import { parseSegsSilent } from '../common/multicolor.js';
31
31
 
32
32
  const PENWIDTH_NORMAL = 1.0;
33
33
  const PENWIDTH_THRESHOLD = 0.005;
@@ -114,7 +114,7 @@ export function emitParallelEdgePaths(
114
114
  // parseSegs strips any ';weight', so the semicolon syntax (which C routes
115
115
  // to split-along-length multicolor — a follow-up) at least yields valid
116
116
  // parallel colors instead of an invalid "red;0.5" stroke.
117
- const colors = parseSegs(colorList).segs.map((s) => s.color ?? DEFAULT_COLOR);
117
+ const colors = parseSegsSilent(colorList).segs.map((s) => s.color ?? DEFAULT_COLOR);
118
118
  emitColorPasses(segData, colors, job);
119
119
  return {
120
120
  headColor: colors[0] ?? DEFAULT_COLOR,