@knowvah/dot-engine 0.1.0

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 (986) hide show
  1. package/LICENSE +277 -0
  2. package/README.md +292 -0
  3. package/dist/api/builder.d.ts +78 -0
  4. package/dist/api/builder.d.ts.map +1 -0
  5. package/dist/api/edge-ops.d.ts +45 -0
  6. package/dist/api/edge-ops.d.ts.map +1 -0
  7. package/dist/api/geometry.d.ts +159 -0
  8. package/dist/api/geometry.d.ts.map +1 -0
  9. package/dist/api/index.d.ts +24 -0
  10. package/dist/api/index.d.ts.map +1 -0
  11. package/dist/api.js +719 -0
  12. package/dist/api.js.map +7 -0
  13. package/dist/bundle.js +101 -0
  14. package/dist/cdt/bag.d.ts +58 -0
  15. package/dist/cdt/bag.d.ts.map +1 -0
  16. package/dist/cdt/hash-core.d.ts +40 -0
  17. package/dist/cdt/hash-core.d.ts.map +1 -0
  18. package/dist/cdt/hash.d.ts +74 -0
  19. package/dist/cdt/hash.d.ts.map +1 -0
  20. package/dist/cdt/index.d.ts +16 -0
  21. package/dist/cdt/index.d.ts.map +1 -0
  22. package/dist/cdt/splay-core.d.ts +78 -0
  23. package/dist/cdt/splay-core.d.ts.map +1 -0
  24. package/dist/cdt/splay.d.ts +63 -0
  25. package/dist/cdt/splay.d.ts.map +1 -0
  26. package/dist/cdt/strhash.d.ts +26 -0
  27. package/dist/cdt/strhash.d.ts.map +1 -0
  28. package/dist/cdt/types.d.ts +11 -0
  29. package/dist/cdt/types.d.ts.map +1 -0
  30. package/dist/common/arith.d.ts +35 -0
  31. package/dist/common/arith.d.ts.map +1 -0
  32. package/dist/common/arm-pow-data.d.ts +17 -0
  33. package/dist/common/arm-pow-data.d.ts.map +1 -0
  34. package/dist/common/arm-pow.d.ts +12 -0
  35. package/dist/common/arm-pow.d.ts.map +1 -0
  36. package/dist/common/arrows-constants.d.ts +97 -0
  37. package/dist/common/arrows-constants.d.ts.map +1 -0
  38. package/dist/common/arrows-geometry.d.ts +24 -0
  39. package/dist/common/arrows-geometry.d.ts.map +1 -0
  40. package/dist/common/arrows-miter.d.ts +24 -0
  41. package/dist/common/arrows-miter.d.ts.map +1 -0
  42. package/dist/common/arrows-shapes-poly.d.ts +24 -0
  43. package/dist/common/arrows-shapes-poly.d.ts.map +1 -0
  44. package/dist/common/arrows-shapes-util.d.ts +77 -0
  45. package/dist/common/arrows-shapes-util.d.ts.map +1 -0
  46. package/dist/common/arrows-shapes.d.ts +48 -0
  47. package/dist/common/arrows-shapes.d.ts.map +1 -0
  48. package/dist/common/arrows-types.d.ts +59 -0
  49. package/dist/common/arrows-types.d.ts.map +1 -0
  50. package/dist/common/arrows.d.ts +69 -0
  51. package/dist/common/arrows.d.ts.map +1 -0
  52. package/dist/common/color.d.ts +66 -0
  53. package/dist/common/color.d.ts.map +1 -0
  54. package/dist/common/colorData.d.ts +10 -0
  55. package/dist/common/colorData.d.ts.map +1 -0
  56. package/dist/common/compass-port.d.ts +39 -0
  57. package/dist/common/compass-port.d.ts.map +1 -0
  58. package/dist/common/crand.d.ts +42 -0
  59. package/dist/common/crand.d.ts.map +1 -0
  60. package/dist/common/edge-label-init.d.ts +51 -0
  61. package/dist/common/edge-label-init.d.ts.map +1 -0
  62. package/dist/common/edge-offset.d.ts +66 -0
  63. package/dist/common/edge-offset.d.ts.map +1 -0
  64. package/dist/common/ellipse-wedge.d.ts +10 -0
  65. package/dist/common/ellipse-wedge.d.ts.map +1 -0
  66. package/dist/common/emit-types.d.ts +255 -0
  67. package/dist/common/emit-types.d.ts.map +1 -0
  68. package/dist/common/fma.d.ts +10 -0
  69. package/dist/common/fma.d.ts.map +1 -0
  70. package/dist/common/graph-init.d.ts +61 -0
  71. package/dist/common/graph-init.d.ts.map +1 -0
  72. package/dist/common/html-entities.d.ts +17 -0
  73. package/dist/common/html-entities.d.ts.map +1 -0
  74. package/dist/common/html-string.d.ts +14 -0
  75. package/dist/common/html-string.d.ts.map +1 -0
  76. package/dist/common/htmltable-emit-fill.d.ts +84 -0
  77. package/dist/common/htmltable-emit-fill.d.ts.map +1 -0
  78. package/dist/common/htmltable-emit-rules.d.ts +79 -0
  79. package/dist/common/htmltable-emit-rules.d.ts.map +1 -0
  80. package/dist/common/htmltable-emit.d.ts +63 -0
  81. package/dist/common/htmltable-emit.d.ts.map +1 -0
  82. package/dist/common/htmltable-lex.d.ts +16 -0
  83. package/dist/common/htmltable-lex.d.ts.map +1 -0
  84. package/dist/common/htmltable-parse.d.ts +37 -0
  85. package/dist/common/htmltable-parse.d.ts.map +1 -0
  86. package/dist/common/htmltable-port.d.ts +15 -0
  87. package/dist/common/htmltable-port.d.ts.map +1 -0
  88. package/dist/common/htmltable-pos-runs.d.ts +88 -0
  89. package/dist/common/htmltable-pos-runs.d.ts.map +1 -0
  90. package/dist/common/htmltable-pos.d.ts +192 -0
  91. package/dist/common/htmltable-pos.d.ts.map +1 -0
  92. package/dist/common/htmltable-types.d.ts +237 -0
  93. package/dist/common/htmltable-types.d.ts.map +1 -0
  94. package/dist/common/htmltable.d.ts +74 -0
  95. package/dist/common/htmltable.d.ts.map +1 -0
  96. package/dist/common/layers.d.ts +20 -0
  97. package/dist/common/layers.d.ts.map +1 -0
  98. package/dist/common/make-label.d.ts +60 -0
  99. package/dist/common/make-label.d.ts.map +1 -0
  100. package/dist/common/multicolor.d.ts +46 -0
  101. package/dist/common/multicolor.d.ts.map +1 -0
  102. package/dist/common/nodeinit.d.ts +45 -0
  103. package/dist/common/nodeinit.d.ts.map +1 -0
  104. package/dist/common/poly-gencode.d.ts +40 -0
  105. package/dist/common/poly-gencode.d.ts.map +1 -0
  106. package/dist/common/poly-init.d.ts +51 -0
  107. package/dist/common/poly-init.d.ts.map +1 -0
  108. package/dist/common/poly-inside.d.ts +37 -0
  109. package/dist/common/poly-inside.d.ts.map +1 -0
  110. package/dist/common/poly-shapes-cases.d.ts +31 -0
  111. package/dist/common/poly-shapes-cases.d.ts.map +1 -0
  112. package/dist/common/poly-shapes-cases2.d.ts +25 -0
  113. package/dist/common/poly-shapes-cases2.d.ts.map +1 -0
  114. package/dist/common/poly-shapes-util.d.ts +42 -0
  115. package/dist/common/poly-shapes-util.d.ts.map +1 -0
  116. package/dist/common/poly-shapes.d.ts +39 -0
  117. package/dist/common/poly-shapes.d.ts.map +1 -0
  118. package/dist/common/poly-sizing.d.ts +189 -0
  119. package/dist/common/poly-sizing.d.ts.map +1 -0
  120. package/dist/common/poly-vertices.d.ts +42 -0
  121. package/dist/common/poly-vertices.d.ts.map +1 -0
  122. package/dist/common/postproc.d.ts +49 -0
  123. package/dist/common/postproc.d.ts.map +1 -0
  124. package/dist/common/ps-fontalias.d.ts +36 -0
  125. package/dist/common/ps-fontalias.d.ts.map +1 -0
  126. package/dist/common/random.d.ts +8 -0
  127. package/dist/common/random.d.ts.map +1 -0
  128. package/dist/common/record-port.d.ts +34 -0
  129. package/dist/common/record-port.d.ts.map +1 -0
  130. package/dist/common/record.d.ts +105 -0
  131. package/dist/common/record.d.ts.map +1 -0
  132. package/dist/common/shapeData.d.ts +186 -0
  133. package/dist/common/shapeData.d.ts.map +1 -0
  134. package/dist/common/shapes.d.ts +36 -0
  135. package/dist/common/shapes.d.ts.map +1 -0
  136. package/dist/common/spline-midpoint.d.ts +31 -0
  137. package/dist/common/spline-midpoint.d.ts.map +1 -0
  138. package/dist/common/splines-clip.d.ts +21 -0
  139. package/dist/common/splines-clip.d.ts.map +1 -0
  140. package/dist/common/splines-constants.d.ts +42 -0
  141. package/dist/common/splines-constants.d.ts.map +1 -0
  142. package/dist/common/splines-geom.d.ts +51 -0
  143. package/dist/common/splines-geom.d.ts.map +1 -0
  144. package/dist/common/splines-path-begin.d.ts +17 -0
  145. package/dist/common/splines-path-begin.d.ts.map +1 -0
  146. package/dist/common/splines-path-end.d.ts +17 -0
  147. package/dist/common/splines-path-end.d.ts.map +1 -0
  148. package/dist/common/splines-path-shared.d.ts +53 -0
  149. package/dist/common/splines-path-shared.d.ts.map +1 -0
  150. package/dist/common/splines-routespl.d.ts +40 -0
  151. package/dist/common/splines-routespl.d.ts.map +1 -0
  152. package/dist/common/splines-selfedge.d.ts +21 -0
  153. package/dist/common/splines-selfedge.d.ts.map +1 -0
  154. package/dist/common/splines.d.ts +18 -0
  155. package/dist/common/splines.d.ts.map +1 -0
  156. package/dist/common/style-resolve.d.ts +197 -0
  157. package/dist/common/style-resolve.d.ts.map +1 -0
  158. package/dist/common/subst.d.ts +31 -0
  159. package/dist/common/subst.d.ts.map +1 -0
  160. package/dist/common/taper.d.ts +23 -0
  161. package/dist/common/taper.d.ts.map +1 -0
  162. package/dist/common/textmeasure-factory.d.ts +33 -0
  163. package/dist/common/textmeasure-factory.d.ts.map +1 -0
  164. package/dist/common/textmeasure-lookup.d.ts +17 -0
  165. package/dist/common/textmeasure-lookup.d.ts.map +1 -0
  166. package/dist/common/textmeasure-lut-data-a.d.ts +13 -0
  167. package/dist/common/textmeasure-lut-data-a.d.ts.map +1 -0
  168. package/dist/common/textmeasure-lut-data-b.d.ts +12 -0
  169. package/dist/common/textmeasure-lut-data-b.d.ts.map +1 -0
  170. package/dist/common/textmeasure-lut-data-c.d.ts +13 -0
  171. package/dist/common/textmeasure-lut-data-c.d.ts.map +1 -0
  172. package/dist/common/textmeasure-lut-data.d.ts +27 -0
  173. package/dist/common/textmeasure-lut-data.d.ts.map +1 -0
  174. package/dist/common/textmeasure.d.ts +120 -0
  175. package/dist/common/textmeasure.d.ts.map +1 -0
  176. package/dist/common/types.d.ts +316 -0
  177. package/dist/common/types.d.ts.map +1 -0
  178. package/dist/common/xlabels-place.d.ts +125 -0
  179. package/dist/common/xlabels-place.d.ts.map +1 -0
  180. package/dist/debug.d.ts +58 -0
  181. package/dist/debug.d.ts.map +1 -0
  182. package/dist/errors.d.ts +63 -0
  183. package/dist/errors.d.ts.map +1 -0
  184. package/dist/gvc/anchor.d.ts +86 -0
  185. package/dist/gvc/anchor.d.ts.map +1 -0
  186. package/dist/gvc/context.d.ts +177 -0
  187. package/dist/gvc/context.d.ts.map +1 -0
  188. package/dist/gvc/default-context.d.ts +20 -0
  189. package/dist/gvc/default-context.d.ts.map +1 -0
  190. package/dist/gvc/device-cluster.d.ts +25 -0
  191. package/dist/gvc/device-cluster.d.ts.map +1 -0
  192. package/dist/gvc/device.d.ts +99 -0
  193. package/dist/gvc/device.d.ts.map +1 -0
  194. package/dist/gvc/edge-labels.d.ts +10 -0
  195. package/dist/gvc/edge-labels.d.ts.map +1 -0
  196. package/dist/gvc/emit-walk.d.ts +22 -0
  197. package/dist/gvc/emit-walk.d.ts.map +1 -0
  198. package/dist/gvc/image-resolver.d.ts +44 -0
  199. package/dist/gvc/image-resolver.d.ts.map +1 -0
  200. package/dist/gvc/job.d.ts +234 -0
  201. package/dist/gvc/job.d.ts.map +1 -0
  202. package/dist/gvc/textlayout.d.ts +33 -0
  203. package/dist/gvc/textlayout.d.ts.map +1 -0
  204. package/dist/gvc/textspan-emit.d.ts +41 -0
  205. package/dist/gvc/textspan-emit.d.ts.map +1 -0
  206. package/dist/gvc/usershape.d.ts +25 -0
  207. package/dist/gvc/usershape.d.ts.map +1 -0
  208. package/dist/gvc/viewport.d.ts +71 -0
  209. package/dist/gvc/viewport.d.ts.map +1 -0
  210. package/dist/index.d.ts +54 -0
  211. package/dist/index.d.ts.map +1 -0
  212. package/dist/index.js +52862 -0
  213. package/dist/index.js.map +7 -0
  214. package/dist/label/index.d.ts +74 -0
  215. package/dist/label/index.d.ts.map +1 -0
  216. package/dist/label/node.d.ts +108 -0
  217. package/dist/label/node.d.ts.map +1 -0
  218. package/dist/label/rectangle.d.ts +60 -0
  219. package/dist/label/rectangle.d.ts.map +1 -0
  220. package/dist/label/split-q.d.ts +13 -0
  221. package/dist/label/split-q.d.ts.map +1 -0
  222. package/dist/label/xlabels-geom.d.ts +46 -0
  223. package/dist/label/xlabels-geom.d.ts.map +1 -0
  224. package/dist/label/xlabels-intersect.d.ts +79 -0
  225. package/dist/label/xlabels-intersect.d.ts.map +1 -0
  226. package/dist/label/xlabels.d.ts +67 -0
  227. package/dist/label/xlabels.d.ts.map +1 -0
  228. package/dist/layout/circo/blockpath.d.ts +120 -0
  229. package/dist/layout/circo/blockpath.d.ts.map +1 -0
  230. package/dist/layout/circo/blocks.d.ts +135 -0
  231. package/dist/layout/circo/blocks.d.ts.map +1 -0
  232. package/dist/layout/circo/blocktree.d.ts +51 -0
  233. package/dist/layout/circo/blocktree.d.ts.map +1 -0
  234. package/dist/layout/circo/circular.d.ts +59 -0
  235. package/dist/layout/circo/circular.d.ts.map +1 -0
  236. package/dist/layout/circo/index.d.ts +35 -0
  237. package/dist/layout/circo/index.d.ts.map +1 -0
  238. package/dist/layout/circo/init.d.ts +50 -0
  239. package/dist/layout/circo/init.d.ts.map +1 -0
  240. package/dist/layout/circo/position-helpers.d.ts +33 -0
  241. package/dist/layout/circo/position-helpers.d.ts.map +1 -0
  242. package/dist/layout/circo/position.d.ts +66 -0
  243. package/dist/layout/circo/position.d.ts.map +1 -0
  244. package/dist/layout/dot/acyclic.d.ts +8 -0
  245. package/dist/layout/dot/acyclic.d.ts.map +1 -0
  246. package/dist/layout/dot/aspect.d.ts +17 -0
  247. package/dist/layout/dot/aspect.d.ts.map +1 -0
  248. package/dist/layout/dot/classify.d.ts +52 -0
  249. package/dist/layout/dot/classify.d.ts.map +1 -0
  250. package/dist/layout/dot/cluster-path.d.ts +38 -0
  251. package/dist/layout/dot/cluster-path.d.ts.map +1 -0
  252. package/dist/layout/dot/cluster.d.ts +102 -0
  253. package/dist/layout/dot/cluster.d.ts.map +1 -0
  254. package/dist/layout/dot/compound-clip.d.ts +69 -0
  255. package/dist/layout/dot/compound-clip.d.ts.map +1 -0
  256. package/dist/layout/dot/compound-geom.d.ts +115 -0
  257. package/dist/layout/dot/compound-geom.d.ts.map +1 -0
  258. package/dist/layout/dot/compound.d.ts +56 -0
  259. package/dist/layout/dot/compound.d.ts.map +1 -0
  260. package/dist/layout/dot/conc.d.ts +88 -0
  261. package/dist/layout/dot/conc.d.ts.map +1 -0
  262. package/dist/layout/dot/decomp.d.ts +66 -0
  263. package/dist/layout/dot/decomp.d.ts.map +1 -0
  264. package/dist/layout/dot/edge-order.d.ts +27 -0
  265. package/dist/layout/dot/edge-order.d.ts.map +1 -0
  266. package/dist/layout/dot/edge-route-arrow.d.ts +46 -0
  267. package/dist/layout/dot/edge-route-arrow.d.ts.map +1 -0
  268. package/dist/layout/dot/edge-route-boxes.d.ts +75 -0
  269. package/dist/layout/dot/edge-route-boxes.d.ts.map +1 -0
  270. package/dist/layout/dot/edge-route-chain.d.ts +67 -0
  271. package/dist/layout/dot/edge-route-chain.d.ts.map +1 -0
  272. package/dist/layout/dot/edge-route-clip.d.ts +88 -0
  273. package/dist/layout/dot/edge-route-clip.d.ts.map +1 -0
  274. package/dist/layout/dot/edge-route-faithful.d.ts +94 -0
  275. package/dist/layout/dot/edge-route-faithful.d.ts.map +1 -0
  276. package/dist/layout/dot/edge-route-geom.d.ts +43 -0
  277. package/dist/layout/dot/edge-route-geom.d.ts.map +1 -0
  278. package/dist/layout/dot/edge-route-helpers.d.ts +50 -0
  279. package/dist/layout/dot/edge-route-helpers.d.ts.map +1 -0
  280. package/dist/layout/dot/edge-route-poly.d.ts +48 -0
  281. package/dist/layout/dot/edge-route-poly.d.ts.map +1 -0
  282. package/dist/layout/dot/edge-route-rank.d.ts +57 -0
  283. package/dist/layout/dot/edge-route-rank.d.ts.map +1 -0
  284. package/dist/layout/dot/edge-route-routing.d.ts +99 -0
  285. package/dist/layout/dot/edge-route-routing.d.ts.map +1 -0
  286. package/dist/layout/dot/edge-route.d.ts +57 -0
  287. package/dist/layout/dot/edge-route.d.ts.map +1 -0
  288. package/dist/layout/dot/fastgr.d.ts +147 -0
  289. package/dist/layout/dot/fastgr.d.ts.map +1 -0
  290. package/dist/layout/dot/flat-utils.d.ts +21 -0
  291. package/dist/layout/dot/flat-utils.d.ts.map +1 -0
  292. package/dist/layout/dot/flat.d.ts +152 -0
  293. package/dist/layout/dot/flat.d.ts.map +1 -0
  294. package/dist/layout/dot/graph-label.d.ts +18 -0
  295. package/dist/layout/dot/graph-label.d.ts.map +1 -0
  296. package/dist/layout/dot/index.d.ts +128 -0
  297. package/dist/layout/dot/index.d.ts.map +1 -0
  298. package/dist/layout/dot/init.d.ts +93 -0
  299. package/dist/layout/dot/init.d.ts.map +1 -0
  300. package/dist/layout/dot/label-order.d.ts +45 -0
  301. package/dist/layout/dot/label-order.d.ts.map +1 -0
  302. package/dist/layout/dot/mincross-build.d.ts +52 -0
  303. package/dist/layout/dot/mincross-build.d.ts.map +1 -0
  304. package/dist/layout/dot/mincross-cross.d.ts +80 -0
  305. package/dist/layout/dot/mincross-cross.d.ts.map +1 -0
  306. package/dist/layout/dot/mincross-flat.d.ts +27 -0
  307. package/dist/layout/dot/mincross-flat.d.ts.map +1 -0
  308. package/dist/layout/dot/mincross-order.d.ts +89 -0
  309. package/dist/layout/dot/mincross-order.d.ts.map +1 -0
  310. package/dist/layout/dot/mincross-utils.d.ts +60 -0
  311. package/dist/layout/dot/mincross-utils.d.ts.map +1 -0
  312. package/dist/layout/dot/mincross.d.ts +75 -0
  313. package/dist/layout/dot/mincross.d.ts.map +1 -0
  314. package/dist/layout/dot/ns-core.d.ts +37 -0
  315. package/dist/layout/dot/ns-core.d.ts.map +1 -0
  316. package/dist/layout/dot/ns-range.d.ts +17 -0
  317. package/dist/layout/dot/ns-range.d.ts.map +1 -0
  318. package/dist/layout/dot/ns-subtree.d.ts +78 -0
  319. package/dist/layout/dot/ns-subtree.d.ts.map +1 -0
  320. package/dist/layout/dot/ns.d.ts +86 -0
  321. package/dist/layout/dot/ns.d.ts.map +1 -0
  322. package/dist/layout/dot/ortho-adapter.d.ts +19 -0
  323. package/dist/layout/dot/ortho-adapter.d.ts.map +1 -0
  324. package/dist/layout/dot/pack-components.d.ts +100 -0
  325. package/dist/layout/dot/pack-components.d.ts.map +1 -0
  326. package/dist/layout/dot/position-aux.d.ts +110 -0
  327. package/dist/layout/dot/position-aux.d.ts.map +1 -0
  328. package/dist/layout/dot/position-bbox.d.ts +57 -0
  329. package/dist/layout/dot/position-bbox.d.ts.map +1 -0
  330. package/dist/layout/dot/position-cluster.d.ts +48 -0
  331. package/dist/layout/dot/position-cluster.d.ts.map +1 -0
  332. package/dist/layout/dot/position-ycoords.d.ts +42 -0
  333. package/dist/layout/dot/position-ycoords.d.ts.map +1 -0
  334. package/dist/layout/dot/position.d.ts +47 -0
  335. package/dist/layout/dot/position.d.ts.map +1 -0
  336. package/dist/layout/dot/rank-dot2.d.ts +114 -0
  337. package/dist/layout/dot/rank-dot2.d.ts.map +1 -0
  338. package/dist/layout/dot/rank.d.ts +119 -0
  339. package/dist/layout/dot/rank.d.ts.map +1 -0
  340. package/dist/layout/dot/sameport.d.ts +70 -0
  341. package/dist/layout/dot/sameport.d.ts.map +1 -0
  342. package/dist/layout/dot/self-loop.d.ts +54 -0
  343. package/dist/layout/dot/self-loop.d.ts.map +1 -0
  344. package/dist/layout/dot/splines-clone.d.ts +33 -0
  345. package/dist/layout/dot/splines-clone.d.ts.map +1 -0
  346. package/dist/layout/dot/splines-flat-labeled.d.ts +101 -0
  347. package/dist/layout/dot/splines-flat-labeled.d.ts.map +1 -0
  348. package/dist/layout/dot/splines-flat-multi.d.ts +35 -0
  349. package/dist/layout/dot/splines-flat-multi.d.ts.map +1 -0
  350. package/dist/layout/dot/splines-flat.d.ts +116 -0
  351. package/dist/layout/dot/splines-flat.d.ts.map +1 -0
  352. package/dist/layout/dot/splines-groups.d.ts +38 -0
  353. package/dist/layout/dot/splines-groups.d.ts.map +1 -0
  354. package/dist/layout/dot/splines-label.d.ts +105 -0
  355. package/dist/layout/dot/splines-label.d.ts.map +1 -0
  356. package/dist/layout/dot/splines-route-type.d.ts +28 -0
  357. package/dist/layout/dot/splines-route-type.d.ts.map +1 -0
  358. package/dist/layout/dot/splines-route.d.ts +99 -0
  359. package/dist/layout/dot/splines-route.d.ts.map +1 -0
  360. package/dist/layout/dot/splines.d.ts +157 -0
  361. package/dist/layout/dot/splines.d.ts.map +1 -0
  362. package/dist/layout/dot/straight-edges.d.ts +39 -0
  363. package/dist/layout/dot/straight-edges.d.ts.map +1 -0
  364. package/dist/layout/fdp/cluster-edges.d.ts +31 -0
  365. package/dist/layout/fdp/cluster-edges.d.ts.map +1 -0
  366. package/dist/layout/fdp/comp.d.ts +29 -0
  367. package/dist/layout/fdp/comp.d.ts.map +1 -0
  368. package/dist/layout/fdp/derive.d.ts +39 -0
  369. package/dist/layout/fdp/derive.d.ts.map +1 -0
  370. package/dist/layout/fdp/fdp-model.d.ts +101 -0
  371. package/dist/layout/fdp/fdp-model.d.ts.map +1 -0
  372. package/dist/layout/fdp/grid.d.ts +49 -0
  373. package/dist/layout/fdp/grid.d.ts.map +1 -0
  374. package/dist/layout/fdp/index.d.ts +36 -0
  375. package/dist/layout/fdp/index.d.ts.map +1 -0
  376. package/dist/layout/fdp/init.d.ts +26 -0
  377. package/dist/layout/fdp/init.d.ts.map +1 -0
  378. package/dist/layout/fdp/layout.d.ts +57 -0
  379. package/dist/layout/fdp/layout.d.ts.map +1 -0
  380. package/dist/layout/fdp/normalize.d.ts +18 -0
  381. package/dist/layout/fdp/normalize.d.ts.map +1 -0
  382. package/dist/layout/fdp/ports.d.ts +41 -0
  383. package/dist/layout/fdp/ports.d.ts.map +1 -0
  384. package/dist/layout/fdp/tlayout-init.d.ts +21 -0
  385. package/dist/layout/fdp/tlayout-init.d.ts.map +1 -0
  386. package/dist/layout/fdp/tlayout-parms.d.ts +98 -0
  387. package/dist/layout/fdp/tlayout-parms.d.ts.map +1 -0
  388. package/dist/layout/fdp/tlayout.d.ts +43 -0
  389. package/dist/layout/fdp/tlayout.d.ts.map +1 -0
  390. package/dist/layout/fdp/xlayout.d.ts +26 -0
  391. package/dist/layout/fdp/xlayout.d.ts.map +1 -0
  392. package/dist/layout/neato/bfs.d.ts +43 -0
  393. package/dist/layout/neato/bfs.d.ts.map +1 -0
  394. package/dist/layout/neato/cdt-surface.d.ts +16 -0
  395. package/dist/layout/neato/cdt-surface.d.ts.map +1 -0
  396. package/dist/layout/neato/conjgrad.d.ts +61 -0
  397. package/dist/layout/neato/conjgrad.d.ts.map +1 -0
  398. package/dist/layout/neato/delaunay.d.ts +28 -0
  399. package/dist/layout/neato/delaunay.d.ts.map +1 -0
  400. package/dist/layout/neato/dijkstra.d.ts +80 -0
  401. package/dist/layout/neato/dijkstra.d.ts.map +1 -0
  402. package/dist/layout/neato/fdp-adjust.d.ts +31 -0
  403. package/dist/layout/neato/fdp-adjust.d.ts.map +1 -0
  404. package/dist/layout/neato/index.d.ts +58 -0
  405. package/dist/layout/neato/index.d.ts.map +1 -0
  406. package/dist/layout/neato/init.d.ts +207 -0
  407. package/dist/layout/neato/init.d.ts.map +1 -0
  408. package/dist/layout/neato/legal.d.ts +7 -0
  409. package/dist/layout/neato/legal.d.ts.map +1 -0
  410. package/dist/layout/neato/matrix-ops.d.ts +28 -0
  411. package/dist/layout/neato/matrix-ops.d.ts.map +1 -0
  412. package/dist/layout/neato/multispline-router.d.ts +80 -0
  413. package/dist/layout/neato/multispline-router.d.ts.map +1 -0
  414. package/dist/layout/neato/multispline.d.ts +24 -0
  415. package/dist/layout/neato/multispline.d.ts.map +1 -0
  416. package/dist/layout/neato/overlap-prism.d.ts +26 -0
  417. package/dist/layout/neato/overlap-prism.d.ts.map +1 -0
  418. package/dist/layout/neato/overlap.d.ts +85 -0
  419. package/dist/layout/neato/overlap.d.ts.map +1 -0
  420. package/dist/layout/neato/sc-adjust.d.ts +33 -0
  421. package/dist/layout/neato/sc-adjust.d.ts.map +1 -0
  422. package/dist/layout/neato/sep-factor.d.ts +41 -0
  423. package/dist/layout/neato/sep-factor.d.ts.map +1 -0
  424. package/dist/layout/neato/set-aspect.d.ts +33 -0
  425. package/dist/layout/neato/set-aspect.d.ts.map +1 -0
  426. package/dist/layout/neato/sgd.d.ts +166 -0
  427. package/dist/layout/neato/sgd.d.ts.map +1 -0
  428. package/dist/layout/neato/splines.d.ts +153 -0
  429. package/dist/layout/neato/splines.d.ts.map +1 -0
  430. package/dist/layout/neato/stress-kernel.d.ts +53 -0
  431. package/dist/layout/neato/stress-kernel.d.ts.map +1 -0
  432. package/dist/layout/neato/stress.d.ts +158 -0
  433. package/dist/layout/neato/stress.d.ts.map +1 -0
  434. package/dist/layout/osage/index.d.ts +158 -0
  435. package/dist/layout/osage/index.d.ts.map +1 -0
  436. package/dist/layout/osage/layout.d.ts +49 -0
  437. package/dist/layout/osage/layout.d.ts.map +1 -0
  438. package/dist/layout/osage/types.d.ts +28 -0
  439. package/dist/layout/osage/types.d.ts.map +1 -0
  440. package/dist/layout/pack/array-pack.d.ts +114 -0
  441. package/dist/layout/pack/array-pack.d.ts.map +1 -0
  442. package/dist/layout/pack/index.d.ts +157 -0
  443. package/dist/layout/pack/index.d.ts.map +1 -0
  444. package/dist/layout/pack/poly-pack.d.ts +126 -0
  445. package/dist/layout/pack/poly-pack.d.ts.map +1 -0
  446. package/dist/layout/pack/poly-place.d.ts +27 -0
  447. package/dist/layout/pack/poly-place.d.ts.map +1 -0
  448. package/dist/layout/pack/spiral-search.d.ts +18 -0
  449. package/dist/layout/pack/spiral-search.d.ts.map +1 -0
  450. package/dist/layout/pack/test-helpers.d.ts +7 -0
  451. package/dist/layout/pack/test-helpers.d.ts.map +1 -0
  452. package/dist/layout/pack/types.d.ts +74 -0
  453. package/dist/layout/pack/types.d.ts.map +1 -0
  454. package/dist/layout/patchwork/index.d.ts +136 -0
  455. package/dist/layout/patchwork/index.d.ts.map +1 -0
  456. package/dist/layout/patchwork/tree-map.d.ts +32 -0
  457. package/dist/layout/patchwork/tree-map.d.ts.map +1 -0
  458. package/dist/layout/patchwork/tree-node.d.ts +46 -0
  459. package/dist/layout/patchwork/tree-node.d.ts.map +1 -0
  460. package/dist/layout/sfdp/index.d.ts +39 -0
  461. package/dist/layout/sfdp/index.d.ts.map +1 -0
  462. package/dist/layout/sfdp/init.d.ts +61 -0
  463. package/dist/layout/sfdp/init.d.ts.map +1 -0
  464. package/dist/layout/sfdp/multilevel.d.ts +23 -0
  465. package/dist/layout/sfdp/multilevel.d.ts.map +1 -0
  466. package/dist/layout/sfdp/quadtree.d.ts +45 -0
  467. package/dist/layout/sfdp/quadtree.d.ts.map +1 -0
  468. package/dist/layout/sfdp/sparse-matrix-multiply.d.ts +34 -0
  469. package/dist/layout/sfdp/sparse-matrix-multiply.d.ts.map +1 -0
  470. package/dist/layout/sfdp/sparse-matrix.d.ts +101 -0
  471. package/dist/layout/sfdp/sparse-matrix.d.ts.map +1 -0
  472. package/dist/layout/sfdp/sparse-solve.d.ts +14 -0
  473. package/dist/layout/sfdp/sparse-solve.d.ts.map +1 -0
  474. package/dist/layout/sfdp/spring-driver.d.ts +18 -0
  475. package/dist/layout/sfdp/spring-driver.d.ts.map +1 -0
  476. package/dist/layout/sfdp/spring-electrical.d.ts +61 -0
  477. package/dist/layout/sfdp/spring-electrical.d.ts.map +1 -0
  478. package/dist/layout/twopi/circle.d.ts +83 -0
  479. package/dist/layout/twopi/circle.d.ts.map +1 -0
  480. package/dist/layout/twopi/index.d.ts +24 -0
  481. package/dist/layout/twopi/index.d.ts.map +1 -0
  482. package/dist/layout/twopi/init.d.ts +85 -0
  483. package/dist/layout/twopi/init.d.ts.map +1 -0
  484. package/dist/layout/twopi/pipeline.d.ts +37 -0
  485. package/dist/layout/twopi/pipeline.d.ts.map +1 -0
  486. package/dist/layout/twopi/twopi-test-helpers.d.ts +12 -0
  487. package/dist/layout/twopi/twopi-test-helpers.d.ts.map +1 -0
  488. package/dist/model/algData.d.ts +175 -0
  489. package/dist/model/algData.d.ts.map +1 -0
  490. package/dist/model/cgraph-ops.d.ts +86 -0
  491. package/dist/model/cgraph-ops.d.ts.map +1 -0
  492. package/dist/model/edge.d.ts +80 -0
  493. package/dist/model/edge.d.ts.map +1 -0
  494. package/dist/model/edgeInfo.d.ts +299 -0
  495. package/dist/model/edgeInfo.d.ts.map +1 -0
  496. package/dist/model/geom.d.ts +149 -0
  497. package/dist/model/geom.d.ts.map +1 -0
  498. package/dist/model/graph.d.ts +135 -0
  499. package/dist/model/graph.d.ts.map +1 -0
  500. package/dist/model/graphInfo.d.ts +418 -0
  501. package/dist/model/graphInfo.d.ts.map +1 -0
  502. package/dist/model/index.d.ts +10 -0
  503. package/dist/model/index.d.ts.map +1 -0
  504. package/dist/model/layoutParams.d.ts +85 -0
  505. package/dist/model/layoutParams.d.ts.map +1 -0
  506. package/dist/model/node.d.ts +101 -0
  507. package/dist/model/node.d.ts.map +1 -0
  508. package/dist/model/nodeInfo.d.ts +278 -0
  509. package/dist/model/nodeInfo.d.ts.map +1 -0
  510. package/dist/model/rankEntry.d.ts +80 -0
  511. package/dist/model/rankEntry.d.ts.map +1 -0
  512. package/dist/ortho/chan-dict.d.ts +82 -0
  513. package/dist/ortho/chan-dict.d.ts.map +1 -0
  514. package/dist/ortho/fpq.d.ts +54 -0
  515. package/dist/ortho/fpq.d.ts.map +1 -0
  516. package/dist/ortho/index.d.ts +35 -0
  517. package/dist/ortho/index.d.ts.map +1 -0
  518. package/dist/ortho/maze-channels.d.ts +47 -0
  519. package/dist/ortho/maze-channels.d.ts.map +1 -0
  520. package/dist/ortho/maze.d.ts +27 -0
  521. package/dist/ortho/maze.d.ts.map +1 -0
  522. package/dist/ortho/ortho-parallel.d.ts +26 -0
  523. package/dist/ortho/ortho-parallel.d.ts.map +1 -0
  524. package/dist/ortho/ortho-route.d.ts +31 -0
  525. package/dist/ortho/ortho-route.d.ts.map +1 -0
  526. package/dist/ortho/partition.d.ts +34 -0
  527. package/dist/ortho/partition.d.ts.map +1 -0
  528. package/dist/ortho/rawgraph.d.ts +41 -0
  529. package/dist/ortho/rawgraph.d.ts.map +1 -0
  530. package/dist/ortho/sgraph.d.ts +74 -0
  531. package/dist/ortho/sgraph.d.ts.map +1 -0
  532. package/dist/ortho/trap-query.d.ts +32 -0
  533. package/dist/ortho/trap-query.d.ts.map +1 -0
  534. package/dist/ortho/trap-segment.d.ts +23 -0
  535. package/dist/ortho/trap-segment.d.ts.map +1 -0
  536. package/dist/ortho/trap-types.d.ts +91 -0
  537. package/dist/ortho/trap-types.d.ts.map +1 -0
  538. package/dist/ortho/trap-update.d.ts +12 -0
  539. package/dist/ortho/trap-update.d.ts.map +1 -0
  540. package/dist/ortho/trapezoid.d.ts +18 -0
  541. package/dist/ortho/trapezoid.d.ts.map +1 -0
  542. package/dist/ortho/types.d.ts +241 -0
  543. package/dist/ortho/types.d.ts.map +1 -0
  544. package/dist/parser/ast.d.ts +49 -0
  545. package/dist/parser/ast.d.ts.map +1 -0
  546. package/dist/parser/builder.d.ts +75 -0
  547. package/dist/parser/builder.d.ts.map +1 -0
  548. package/dist/parser/index.d.ts +97 -0
  549. package/dist/parser/index.d.ts.map +1 -0
  550. package/dist/pathplan/index.d.ts +8 -0
  551. package/dist/pathplan/index.d.ts.map +1 -0
  552. package/dist/pathplan/route.d.ts +9 -0
  553. package/dist/pathplan/route.d.ts.map +1 -0
  554. package/dist/pathplan/shortest.d.ts +5 -0
  555. package/dist/pathplan/shortest.d.ts.map +1 -0
  556. package/dist/pathplan/solvers.d.ts +5 -0
  557. package/dist/pathplan/solvers.d.ts.map +1 -0
  558. package/dist/pathplan/triang.d.ts +25 -0
  559. package/dist/pathplan/triang.d.ts.map +1 -0
  560. package/dist/pathplan/types.d.ts +22 -0
  561. package/dist/pathplan/types.d.ts.map +1 -0
  562. package/dist/pathplan/visibility.d.ts +13 -0
  563. package/dist/pathplan/visibility.d.ts.map +1 -0
  564. package/dist/pathplan/vispath.d.ts +9 -0
  565. package/dist/pathplan/vispath.d.ts.map +1 -0
  566. package/dist/rbtree/index.d.ts +127 -0
  567. package/dist/rbtree/index.d.ts.map +1 -0
  568. package/dist/render/color-resolve.d.ts +38 -0
  569. package/dist/render/color-resolve.d.ts.map +1 -0
  570. package/dist/render/dot.d.ts +379 -0
  571. package/dist/render/dot.d.ts.map +1 -0
  572. package/dist/render/index.d.ts +24 -0
  573. package/dist/render/index.d.ts.map +1 -0
  574. package/dist/render/json.d.ts +89 -0
  575. package/dist/render/json.d.ts.map +1 -0
  576. package/dist/render/map-test-helpers.d.ts +13 -0
  577. package/dist/render/map-test-helpers.d.ts.map +1 -0
  578. package/dist/render/map.d.ts +197 -0
  579. package/dist/render/map.d.ts.map +1 -0
  580. package/dist/render/public.d.ts +64 -0
  581. package/dist/render/public.d.ts.map +1 -0
  582. package/dist/render/svg-arrow-ops.d.ts +10 -0
  583. package/dist/render/svg-arrow-ops.d.ts.map +1 -0
  584. package/dist/render/svg-cluster.d.ts +9 -0
  585. package/dist/render/svg-cluster.d.ts.map +1 -0
  586. package/dist/render/svg-edge-ortho-radius.d.ts +31 -0
  587. package/dist/render/svg-edge-ortho-radius.d.ts.map +1 -0
  588. package/dist/render/svg-edge-split.d.ts +48 -0
  589. package/dist/render/svg-edge-split.d.ts.map +1 -0
  590. package/dist/render/svg-gradient.d.ts +46 -0
  591. package/dist/render/svg-gradient.d.ts.map +1 -0
  592. package/dist/render/svg-graph.d.ts +97 -0
  593. package/dist/render/svg-graph.d.ts.map +1 -0
  594. package/dist/render/svg-helpers.d.ts +122 -0
  595. package/dist/render/svg-helpers.d.ts.map +1 -0
  596. package/dist/render/svg-id.d.ts +28 -0
  597. package/dist/render/svg-id.d.ts.map +1 -0
  598. package/dist/render/svg-multicolor.d.ts +60 -0
  599. package/dist/render/svg-multicolor.d.ts.map +1 -0
  600. package/dist/render/svg-parallel-edge.d.ts +28 -0
  601. package/dist/render/svg-parallel-edge.d.ts.map +1 -0
  602. package/dist/render/svg-tapered-edge.d.ts +18 -0
  603. package/dist/render/svg-tapered-edge.d.ts.map +1 -0
  604. package/dist/render/svg.d.ts +104 -0
  605. package/dist/render/svg.d.ts.map +1 -0
  606. package/dist/render/xdot-public.d.ts +95 -0
  607. package/dist/render/xdot-public.d.ts.map +1 -0
  608. package/dist/render/xml-escape.d.ts +21 -0
  609. package/dist/render/xml-escape.d.ts.map +1 -0
  610. package/dist/render.js +52556 -0
  611. package/dist/render.js.map +7 -0
  612. package/dist/util/agxbuf.d.ts +72 -0
  613. package/dist/util/agxbuf.d.ts.map +1 -0
  614. package/dist/util/bsd-qsort.d.ts +22 -0
  615. package/dist/util/bsd-qsort.d.ts.map +1 -0
  616. package/dist/util/index.d.ts +11 -0
  617. package/dist/util/index.d.ts.map +1 -0
  618. package/dist/util/list.d.ts +47 -0
  619. package/dist/util/list.d.ts.map +1 -0
  620. package/dist/util/math.d.ts +54 -0
  621. package/dist/util/math.d.ts.map +1 -0
  622. package/dist/util/mt19937.d.ts +40 -0
  623. package/dist/util/mt19937.d.ts.map +1 -0
  624. package/dist/util/printf-round.d.ts +45 -0
  625. package/dist/util/printf-round.d.ts.map +1 -0
  626. package/dist/util/xml.d.ts +24 -0
  627. package/dist/util/xml.d.ts.map +1 -0
  628. package/dist/vpsc/Block.d.ts +116 -0
  629. package/dist/vpsc/Block.d.ts.map +1 -0
  630. package/dist/vpsc/Blocks.d.ts +66 -0
  631. package/dist/vpsc/Blocks.d.ts.map +1 -0
  632. package/dist/vpsc/Constraint.d.ts +51 -0
  633. package/dist/vpsc/Constraint.d.ts.map +1 -0
  634. package/dist/vpsc/HeapUtils.d.ts +37 -0
  635. package/dist/vpsc/HeapUtils.d.ts.map +1 -0
  636. package/dist/vpsc/Solver.d.ts +107 -0
  637. package/dist/vpsc/Solver.d.ts.map +1 -0
  638. package/dist/vpsc/SweepLine.d.ts +38 -0
  639. package/dist/vpsc/SweepLine.d.ts.map +1 -0
  640. package/dist/vpsc/Variable.d.ts +38 -0
  641. package/dist/vpsc/Variable.d.ts.map +1 -0
  642. package/dist/vpsc/index.d.ts +54 -0
  643. package/dist/vpsc/index.d.ts.map +1 -0
  644. package/dist/vpsc/sweepTypes.d.ts +29 -0
  645. package/dist/vpsc/sweepTypes.d.ts.map +1 -0
  646. package/dist/xdot/index.d.ts +6 -0
  647. package/dist/xdot/index.d.ts.map +1 -0
  648. package/dist/xdot/lex.d.ts +22 -0
  649. package/dist/xdot/lex.d.ts.map +1 -0
  650. package/dist/xdot/misc.d.ts +13 -0
  651. package/dist/xdot/misc.d.ts.map +1 -0
  652. package/dist/xdot/parse.d.ts +21 -0
  653. package/dist/xdot/parse.d.ts.map +1 -0
  654. package/dist/xdot/types.d.ts +152 -0
  655. package/dist/xdot/types.d.ts.map +1 -0
  656. package/package.json +113 -0
  657. package/src/api/builder.ts +277 -0
  658. package/src/api/edge-ops.ts +113 -0
  659. package/src/api/geometry.ts +307 -0
  660. package/src/api/index.ts +46 -0
  661. package/src/cdt/bag.ts +196 -0
  662. package/src/cdt/hash-core.ts +84 -0
  663. package/src/cdt/hash.ts +207 -0
  664. package/src/cdt/index.ts +17 -0
  665. package/src/cdt/splay-core.ts +301 -0
  666. package/src/cdt/splay.ts +191 -0
  667. package/src/cdt/strhash.ts +52 -0
  668. package/src/cdt/types.ts +13 -0
  669. package/src/common/arith.ts +39 -0
  670. package/src/common/arm-pow-data.ts +201 -0
  671. package/src/common/arm-pow.ts +296 -0
  672. package/src/common/arrows-constants.ts +175 -0
  673. package/src/common/arrows-geometry.ts +62 -0
  674. package/src/common/arrows-miter.ts +84 -0
  675. package/src/common/arrows-shapes-poly.ts +241 -0
  676. package/src/common/arrows-shapes-util.ts +162 -0
  677. package/src/common/arrows-shapes.ts +360 -0
  678. package/src/common/arrows-types.ts +59 -0
  679. package/src/common/arrows.ts +209 -0
  680. package/src/common/color.ts +340 -0
  681. package/src/common/colorData.ts +264 -0
  682. package/src/common/compass-port.ts +384 -0
  683. package/src/common/crand.ts +79 -0
  684. package/src/common/edge-label-init.ts +310 -0
  685. package/src/common/edge-offset.ts +140 -0
  686. package/src/common/ellipse-wedge.ts +189 -0
  687. package/src/common/emit-types.ts +332 -0
  688. package/src/common/fma.ts +52 -0
  689. package/src/common/graph-init.ts +359 -0
  690. package/src/common/html-entities.ts +299 -0
  691. package/src/common/html-string.ts +22 -0
  692. package/src/common/htmltable-emit-fill.ts +367 -0
  693. package/src/common/htmltable-emit-rules.ts +293 -0
  694. package/src/common/htmltable-emit.ts +345 -0
  695. package/src/common/htmltable-lex.ts +138 -0
  696. package/src/common/htmltable-parse.ts +539 -0
  697. package/src/common/htmltable-port.ts +32 -0
  698. package/src/common/htmltable-pos-runs.ts +313 -0
  699. package/src/common/htmltable-pos.ts +601 -0
  700. package/src/common/htmltable-types.ts +262 -0
  701. package/src/common/htmltable.ts +477 -0
  702. package/src/common/layers.ts +113 -0
  703. package/src/common/make-label.ts +192 -0
  704. package/src/common/multicolor.ts +167 -0
  705. package/src/common/nodeinit.ts +339 -0
  706. package/src/common/poly-gencode.ts +475 -0
  707. package/src/common/poly-init.ts +133 -0
  708. package/src/common/poly-inside.ts +202 -0
  709. package/src/common/poly-shapes-cases.ts +253 -0
  710. package/src/common/poly-shapes-cases2.ts +170 -0
  711. package/src/common/poly-shapes-util.ts +124 -0
  712. package/src/common/poly-shapes.ts +181 -0
  713. package/src/common/poly-sizing.ts +639 -0
  714. package/src/common/poly-vertices.ts +237 -0
  715. package/src/common/postproc.ts +436 -0
  716. package/src/common/ps-fontalias.ts +112 -0
  717. package/src/common/random.ts +37 -0
  718. package/src/common/record-port.ts +89 -0
  719. package/src/common/record.ts +523 -0
  720. package/src/common/shapeData.ts +502 -0
  721. package/src/common/shapes.ts +187 -0
  722. package/src/common/spline-midpoint.ts +105 -0
  723. package/src/common/splines-clip.ts +449 -0
  724. package/src/common/splines-constants.ts +53 -0
  725. package/src/common/splines-geom.ts +194 -0
  726. package/src/common/splines-path-begin.ts +243 -0
  727. package/src/common/splines-path-end.ts +231 -0
  728. package/src/common/splines-path-shared.ts +258 -0
  729. package/src/common/splines-routespl.ts +444 -0
  730. package/src/common/splines-selfedge.ts +403 -0
  731. package/src/common/splines.ts +33 -0
  732. package/src/common/style-resolve.ts +481 -0
  733. package/src/common/subst.ts +126 -0
  734. package/src/common/taper.ts +219 -0
  735. package/src/common/textmeasure-factory.ts +86 -0
  736. package/src/common/textmeasure-lookup.ts +50 -0
  737. package/src/common/textmeasure-lut-data-a.ts +182 -0
  738. package/src/common/textmeasure-lut-data-b.ts +140 -0
  739. package/src/common/textmeasure-lut-data-c.ts +221 -0
  740. package/src/common/textmeasure-lut-data.ts +78 -0
  741. package/src/common/textmeasure.ts +321 -0
  742. package/src/common/types.ts +425 -0
  743. package/src/common/xlabels-place.ts +475 -0
  744. package/src/debug.ts +38 -0
  745. package/src/errors.ts +95 -0
  746. package/src/gvc/anchor.ts +530 -0
  747. package/src/gvc/context.ts +260 -0
  748. package/src/gvc/default-context.ts +70 -0
  749. package/src/gvc/device-cluster.ts +114 -0
  750. package/src/gvc/device.ts +598 -0
  751. package/src/gvc/edge-labels.ts +116 -0
  752. package/src/gvc/emit-walk.ts +98 -0
  753. package/src/gvc/image-resolver.ts +137 -0
  754. package/src/gvc/job.ts +401 -0
  755. package/src/gvc/textlayout.ts +44 -0
  756. package/src/gvc/textspan-emit.ts +100 -0
  757. package/src/gvc/usershape.ts +33 -0
  758. package/src/gvc/viewport.ts +203 -0
  759. package/src/index.ts +165 -0
  760. package/src/label/index.ts +302 -0
  761. package/src/label/node.ts +278 -0
  762. package/src/label/rectangle.ts +123 -0
  763. package/src/label/split-q.ts +237 -0
  764. package/src/label/xlabels-geom.ts +132 -0
  765. package/src/label/xlabels-intersect.ts +421 -0
  766. package/src/label/xlabels.ts +212 -0
  767. package/src/layout/circo/blockpath.ts +560 -0
  768. package/src/layout/circo/blocks.ts +234 -0
  769. package/src/layout/circo/blocktree.ts +246 -0
  770. package/src/layout/circo/circular.ts +227 -0
  771. package/src/layout/circo/index.ts +90 -0
  772. package/src/layout/circo/init.ts +84 -0
  773. package/src/layout/circo/position-helpers.ts +104 -0
  774. package/src/layout/circo/position.ts +196 -0
  775. package/src/layout/dot/__fixtures__/xcoord-pivot-divergence.gv +79 -0
  776. package/src/layout/dot/acyclic.ts +60 -0
  777. package/src/layout/dot/aspect.ts +22 -0
  778. package/src/layout/dot/classify.ts +462 -0
  779. package/src/layout/dot/cluster-path.ts +200 -0
  780. package/src/layout/dot/cluster.ts +480 -0
  781. package/src/layout/dot/compound-clip.ts +224 -0
  782. package/src/layout/dot/compound-geom.ts +282 -0
  783. package/src/layout/dot/compound.ts +294 -0
  784. package/src/layout/dot/conc.ts +433 -0
  785. package/src/layout/dot/decomp.ts +165 -0
  786. package/src/layout/dot/edge-order.ts +62 -0
  787. package/src/layout/dot/edge-route-arrow.ts +87 -0
  788. package/src/layout/dot/edge-route-boxes.ts +99 -0
  789. package/src/layout/dot/edge-route-chain.ts +420 -0
  790. package/src/layout/dot/edge-route-clip.ts +253 -0
  791. package/src/layout/dot/edge-route-faithful.ts +404 -0
  792. package/src/layout/dot/edge-route-geom.ts +90 -0
  793. package/src/layout/dot/edge-route-helpers.ts +170 -0
  794. package/src/layout/dot/edge-route-poly.ts +174 -0
  795. package/src/layout/dot/edge-route-rank.ts +136 -0
  796. package/src/layout/dot/edge-route-routing.ts +219 -0
  797. package/src/layout/dot/edge-route.ts +490 -0
  798. package/src/layout/dot/fastgr.ts +377 -0
  799. package/src/layout/dot/flat-utils.ts +52 -0
  800. package/src/layout/dot/flat.ts +518 -0
  801. package/src/layout/dot/graph-label.ts +114 -0
  802. package/src/layout/dot/index.ts +302 -0
  803. package/src/layout/dot/init.ts +300 -0
  804. package/src/layout/dot/label-order.ts +161 -0
  805. package/src/layout/dot/mincross-build.ts +373 -0
  806. package/src/layout/dot/mincross-cross.ts +409 -0
  807. package/src/layout/dot/mincross-flat.ts +213 -0
  808. package/src/layout/dot/mincross-order.ts +401 -0
  809. package/src/layout/dot/mincross-utils.ts +170 -0
  810. package/src/layout/dot/mincross.ts +386 -0
  811. package/src/layout/dot/ns-core.ts +122 -0
  812. package/src/layout/dot/ns-range.ts +228 -0
  813. package/src/layout/dot/ns-subtree.ts +347 -0
  814. package/src/layout/dot/ns.ts +506 -0
  815. package/src/layout/dot/ortho-adapter.ts +133 -0
  816. package/src/layout/dot/pack-components.ts +433 -0
  817. package/src/layout/dot/position-aux.ts +382 -0
  818. package/src/layout/dot/position-bbox.ts +221 -0
  819. package/src/layout/dot/position-cluster.ts +286 -0
  820. package/src/layout/dot/position-ycoords.ts +287 -0
  821. package/src/layout/dot/position.ts +194 -0
  822. package/src/layout/dot/rank-dot2.ts +528 -0
  823. package/src/layout/dot/rank.ts +547 -0
  824. package/src/layout/dot/sameport.ts +278 -0
  825. package/src/layout/dot/self-loop.ts +147 -0
  826. package/src/layout/dot/splines-clone.ts +121 -0
  827. package/src/layout/dot/splines-flat-labeled.ts +408 -0
  828. package/src/layout/dot/splines-flat-multi.ts +188 -0
  829. package/src/layout/dot/splines-flat.ts +598 -0
  830. package/src/layout/dot/splines-groups.ts +190 -0
  831. package/src/layout/dot/splines-label.ts +432 -0
  832. package/src/layout/dot/splines-route-type.ts +44 -0
  833. package/src/layout/dot/splines-route.ts +478 -0
  834. package/src/layout/dot/splines.ts +538 -0
  835. package/src/layout/dot/straight-edges.ts +332 -0
  836. package/src/layout/fdp/cluster-edges.ts +0 -0
  837. package/src/layout/fdp/comp.ts +160 -0
  838. package/src/layout/fdp/derive.ts +272 -0
  839. package/src/layout/fdp/fdp-model.ts +238 -0
  840. package/src/layout/fdp/grid.ts +77 -0
  841. package/src/layout/fdp/index.ts +113 -0
  842. package/src/layout/fdp/init.ts +116 -0
  843. package/src/layout/fdp/layout.ts +485 -0
  844. package/src/layout/fdp/normalize.ts +100 -0
  845. package/src/layout/fdp/ports.ts +161 -0
  846. package/src/layout/fdp/tlayout-init.ts +230 -0
  847. package/src/layout/fdp/tlayout-parms.ts +234 -0
  848. package/src/layout/fdp/tlayout.ts +317 -0
  849. package/src/layout/fdp/xlayout.ts +350 -0
  850. package/src/layout/neato/bfs.ts +131 -0
  851. package/src/layout/neato/cdt-surface.ts +693 -0
  852. package/src/layout/neato/conjgrad.ts +159 -0
  853. package/src/layout/neato/delaunay.ts +259 -0
  854. package/src/layout/neato/dijkstra.ts +296 -0
  855. package/src/layout/neato/fdp-adjust.ts +124 -0
  856. package/src/layout/neato/index.ts +310 -0
  857. package/src/layout/neato/init.ts +505 -0
  858. package/src/layout/neato/legal.ts +316 -0
  859. package/src/layout/neato/matrix-ops.ts +112 -0
  860. package/src/layout/neato/multispline-router.ts +417 -0
  861. package/src/layout/neato/multispline.ts +427 -0
  862. package/src/layout/neato/overlap-prism.ts +503 -0
  863. package/src/layout/neato/overlap.ts +158 -0
  864. package/src/layout/neato/sc-adjust.ts +206 -0
  865. package/src/layout/neato/sep-factor.ts +118 -0
  866. package/src/layout/neato/set-aspect.ts +178 -0
  867. package/src/layout/neato/sgd.ts +461 -0
  868. package/src/layout/neato/splines.ts +1014 -0
  869. package/src/layout/neato/stress-kernel.ts +362 -0
  870. package/src/layout/neato/stress.ts +420 -0
  871. package/src/layout/osage/index.ts +548 -0
  872. package/src/layout/osage/layout.ts +254 -0
  873. package/src/layout/osage/types.ts +31 -0
  874. package/src/layout/pack/array-pack.ts +254 -0
  875. package/src/layout/pack/index.ts +570 -0
  876. package/src/layout/pack/poly-pack.ts +266 -0
  877. package/src/layout/pack/poly-place.ts +426 -0
  878. package/src/layout/pack/spiral-search.ts +106 -0
  879. package/src/layout/pack/test-helpers.ts +46 -0
  880. package/src/layout/pack/types.ts +85 -0
  881. package/src/layout/patchwork/index.ts +441 -0
  882. package/src/layout/patchwork/tree-map.ts +183 -0
  883. package/src/layout/patchwork/tree-node.ts +120 -0
  884. package/src/layout/sfdp/index.ts +231 -0
  885. package/src/layout/sfdp/init.ts +224 -0
  886. package/src/layout/sfdp/multilevel.ts +262 -0
  887. package/src/layout/sfdp/quadtree.ts +267 -0
  888. package/src/layout/sfdp/sparse-matrix-multiply.ts +160 -0
  889. package/src/layout/sfdp/sparse-matrix.ts +367 -0
  890. package/src/layout/sfdp/sparse-solve.ts +122 -0
  891. package/src/layout/sfdp/spring-driver.ts +209 -0
  892. package/src/layout/sfdp/spring-electrical.ts +431 -0
  893. package/src/layout/twopi/circle.ts +339 -0
  894. package/src/layout/twopi/index.ts +78 -0
  895. package/src/layout/twopi/init.ts +174 -0
  896. package/src/layout/twopi/pipeline.ts +98 -0
  897. package/src/layout/twopi/twopi-test-helpers.ts +44 -0
  898. package/src/model/algData.ts +194 -0
  899. package/src/model/cgraph-ops.ts +175 -0
  900. package/src/model/edge.ts +104 -0
  901. package/src/model/edgeInfo.ts +431 -0
  902. package/src/model/geom.ts +204 -0
  903. package/src/model/graph.ts +172 -0
  904. package/src/model/graphInfo.ts +528 -0
  905. package/src/model/index.ts +10 -0
  906. package/src/model/layoutParams.ts +127 -0
  907. package/src/model/node.ts +138 -0
  908. package/src/model/nodeInfo.ts +424 -0
  909. package/src/model/rankEntry.ts +95 -0
  910. package/src/ortho/chan-dict.ts +236 -0
  911. package/src/ortho/fpq.ts +149 -0
  912. package/src/ortho/index.ts +206 -0
  913. package/src/ortho/maze-channels.ts +196 -0
  914. package/src/ortho/maze.ts +311 -0
  915. package/src/ortho/ortho-parallel.ts +254 -0
  916. package/src/ortho/ortho-route.ts +349 -0
  917. package/src/ortho/partition.ts +303 -0
  918. package/src/ortho/rawgraph.ts +119 -0
  919. package/src/ortho/sgraph.ts +283 -0
  920. package/src/ortho/trap-query.ts +174 -0
  921. package/src/ortho/trap-segment.ts +303 -0
  922. package/src/ortho/trap-types.ts +171 -0
  923. package/src/ortho/trap-update.ts +89 -0
  924. package/src/ortho/trapezoid.ts +120 -0
  925. package/src/ortho/types.ts +286 -0
  926. package/src/parser/__fixtures__/directed.dot +10 -0
  927. package/src/parser/__fixtures__/simple.dot +7 -0
  928. package/src/parser/__fixtures__/subgraph.dot +17 -0
  929. package/src/parser/ast.ts +64 -0
  930. package/src/parser/builder.ts +401 -0
  931. package/src/parser/dot.d.ts +208 -0
  932. package/src/parser/dot.js +3321 -0
  933. package/src/parser/dot.pegjs +263 -0
  934. package/src/parser/index.ts +353 -0
  935. package/src/pathplan/index.ts +9 -0
  936. package/src/pathplan/route.ts +284 -0
  937. package/src/pathplan/shortest.ts +268 -0
  938. package/src/pathplan/solvers.ts +65 -0
  939. package/src/pathplan/triang.ts +221 -0
  940. package/src/pathplan/types.ts +16 -0
  941. package/src/pathplan/visibility.ts +170 -0
  942. package/src/pathplan/vispath.ts +118 -0
  943. package/src/rbtree/index.ts +418 -0
  944. package/src/render/color-resolve.ts +171 -0
  945. package/src/render/dot.ts +1514 -0
  946. package/src/render/index.ts +29 -0
  947. package/src/render/json.ts +734 -0
  948. package/src/render/map-test-helpers.ts +61 -0
  949. package/src/render/map.ts +528 -0
  950. package/src/render/public.ts +131 -0
  951. package/src/render/svg-arrow-ops.ts +113 -0
  952. package/src/render/svg-cluster.ts +24 -0
  953. package/src/render/svg-edge-ortho-radius.ts +228 -0
  954. package/src/render/svg-edge-split.ts +180 -0
  955. package/src/render/svg-gradient.ts +185 -0
  956. package/src/render/svg-graph.ts +415 -0
  957. package/src/render/svg-helpers.ts +623 -0
  958. package/src/render/svg-id.ts +76 -0
  959. package/src/render/svg-multicolor.ts +313 -0
  960. package/src/render/svg-parallel-edge.ts +123 -0
  961. package/src/render/svg-tapered-edge.ts +56 -0
  962. package/src/render/svg.ts +307 -0
  963. package/src/render/xdot-public.ts +164 -0
  964. package/src/render/xml-escape.ts +56 -0
  965. package/src/util/agxbuf.ts +138 -0
  966. package/src/util/bsd-qsort.ts +251 -0
  967. package/src/util/index.ts +25 -0
  968. package/src/util/list.ts +122 -0
  969. package/src/util/math.ts +104 -0
  970. package/src/util/mt19937.ts +143 -0
  971. package/src/util/printf-round.ts +163 -0
  972. package/src/util/xml.ts +184 -0
  973. package/src/vpsc/Block.ts +375 -0
  974. package/src/vpsc/Blocks.ts +164 -0
  975. package/src/vpsc/Constraint.ts +94 -0
  976. package/src/vpsc/HeapUtils.ts +88 -0
  977. package/src/vpsc/Solver.ts +274 -0
  978. package/src/vpsc/SweepLine.ts +214 -0
  979. package/src/vpsc/Variable.ts +54 -0
  980. package/src/vpsc/index.ts +122 -0
  981. package/src/vpsc/sweepTypes.ts +31 -0
  982. package/src/xdot/index.ts +7 -0
  983. package/src/xdot/lex.ts +151 -0
  984. package/src/xdot/misc.ts +226 -0
  985. package/src/xdot/parse.ts +349 -0
  986. package/src/xdot/types.ts +158 -0
@@ -0,0 +1,307 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * SVG renderer plugin.
5
+ *
6
+ * Faithful TypeScript port of plugin/core/gvrender_core_svg.c.
7
+ * Implements RendererPlugin to produce SVG 1.1 output.
8
+ *
9
+ * Y-coordinate investigation: The C svg_bzptarray and all shape emitters
10
+ * negate Y with -A[i].y because they receive raw PostScript (Y-up)
11
+ * coordinates and must convert to SVG (Y-down). In this TypeScript port
12
+ * the Y-flip is applied upstream via transformPoint with devscale.y = -1
13
+ * (src/gvc/device.ts). Coordinates received in all renderer callbacks are
14
+ * therefore already in SVG Y-down space; no additional negation is needed.
15
+ *
16
+ * @see plugin/core/gvrender_core_svg.c
17
+ */
18
+
19
+ import type { Graph } from '../model/graph.js';
20
+ import type { Node } from '../model/node.js';
21
+ import type { Edge } from '../model/edge.js';
22
+ import type { Point, Box } from '../model/geom.js';
23
+ import { boxOverlap } from '../model/geom.js';
24
+ import type { TextlabelT } from '../common/types.js';
25
+ import type { TextSpan } from '../common/emit-types.js';
26
+ import type { RendererPlugin, LabelType } from '../gvc/context.js';
27
+ import type { RenderJob } from '../gvc/job.js';
28
+ import { renderEdgeLabels } from '../gvc/edge-labels.js';
29
+ import { beginAnchorIf } from '../gvc/anchor.js';
30
+ import {
31
+ svgBeginGraph,
32
+ svgEndGraph,
33
+ svgBeginPage,
34
+ svgPageBackground,
35
+ svgEndPage,
36
+ svgBeginLayer,
37
+ svgEndLayer,
38
+ svgBeginNode,
39
+ svgEndNode,
40
+ svgBeginEdge,
41
+ svgEndEdge,
42
+ svgBeginAnchor,
43
+ svgEndAnchor,
44
+ svgTextspan,
45
+ svgEllipse,
46
+ svgPolygon,
47
+ svgBezier,
48
+ svgPolyline,
49
+ svgComment,
50
+ svgEdgePath,
51
+ svgEdgePathOrthoRounded,
52
+ orthoRoundedRadius,
53
+ svgArrowPolygons,
54
+ emitParallelEdgePaths,
55
+ escapeXml,
56
+ emitPoints,
57
+ } from './svg-helpers.js';
58
+ import { emitArrowOps } from './svg-arrow-ops.js';
59
+ import { resolveRenderColor, colorOpacity, colorPaint } from './color-resolve.js';
60
+ import { svgBeginCluster, svgEndCluster } from './svg-cluster.js';
61
+ import { emitSplitEdgePaths } from './svg-edge-split.js';
62
+ import { edgeIsTapered, svgTaperedEdge } from './svg-tapered-edge.js';
63
+ import { findImageBytes, toDataUri } from '../gvc/image-resolver.js';
64
+
65
+ // ---------------------------------------------------------------------------
66
+ // Multicolor arrow helpers
67
+ // @see lib/common/emit.c:2508-2528 (tail/head arrow with headcolor/tailcolor)
68
+ // ---------------------------------------------------------------------------
69
+
70
+ /** Emit tail arrow with tailColor and head arrow with headColor (multicolor). */
71
+ function emitMulticolorArrows(e: Edge, job: RenderJob, headColor: string, tailColor: string): void {
72
+ const obj = job.obj;
73
+ const pw = obj !== null ? obj.penWidth : 1.0;
74
+ const tailOps = e.info.tailArrowOps;
75
+ if (tailOps?.length) {
76
+ emitArrowOps(tailOps, tailColor, job, pw, colorOpacity(resolveRenderColor(tailColor)));
77
+ }
78
+ const headOps = e.info.headArrowOps;
79
+ if (headOps?.length) {
80
+ emitArrowOps(headOps, headColor, job, pw, colorOpacity(resolveRenderColor(headColor)));
81
+ }
82
+ }
83
+
84
+ // ---------------------------------------------------------------------------
85
+ // SvgRenderer — delegates all work to module-level helpers in svg-helpers.ts
86
+ // @see plugin/core/gvrender_core_svg.c:svg_engine
87
+ // ---------------------------------------------------------------------------
88
+
89
+ /** overlap_label: does the label's box (pos ± dimen/2) overlap clip box b?
90
+ * @see lib/common/utils.c:overlap_label */
91
+ function overlapLabel(lp: TextlabelT, b: Box): boolean {
92
+ const sx = lp.dimen.x / 2;
93
+ const sy = lp.dimen.y / 2;
94
+ const bb: Box = {
95
+ ll: { x: lp.pos.x - sx, y: lp.pos.y - sy },
96
+ ur: { x: lp.pos.x + sx, y: lp.pos.y + sy },
97
+ };
98
+ return boxOverlap(b, bb);
99
+ }
100
+
101
+ /**
102
+ * Faithful-to-outcome `edge_in_box`: true when the edge has something to draw.
103
+ * C's gvrender defers the `<g>` until a draw op, so an edge whose content falls
104
+ * entirely outside the clip emits no group (emit.c:edge_in_box tests each piece
105
+ * vs job->clip via boxf_overlap/overlap_label).
106
+ *
107
+ * The only piece that can legitimately fall OUTSIDE the clip on this corpus is a
108
+ * degenerate labeled-flat label: it is spline-less, so map_edge leaves it at its
109
+ * internal (un-normalized) x-frame position while the clip is the final frame.
110
+ * The `overlapLabel` test on the main label reproduces C's draw-iff-overlap for
111
+ * exactly that case — on-canvas (2368) → drawn; off-canvas (2368_1, negative
112
+ * un-normalized x) → suppressed. A present spline always lies within the clip
113
+ * (GD_bb contains it), and head/tail/xlabels are positioned at on-canvas
114
+ * endpoints, so those keep their existing unconditional triggers — adding an
115
+ * overlap test there only risks suppressing legitimately-drawn content (it
116
+ * regressed neato/circo edges whose spl.bb is computed differently). The `set`
117
+ * guard on the main label is kept: the port retains an unplaced (`pos=0,0`,
118
+ * `set=false`) label on merged back-edges where C has none.
119
+ * @see lib/common/emit.c:edge_in_box, lib/common/utils.c:overlap_label
120
+ */
121
+ export function edgeHasDrawableContent(e: Edge, clip: Box): boolean {
122
+ const i = e.info;
123
+ return i.spl !== undefined
124
+ || (i.label !== undefined && i.label.set && overlapLabel(i.label, clip))
125
+ || i.xlabel !== undefined
126
+ || i.head_label !== undefined || i.tail_label !== undefined;
127
+ }
128
+
129
+ export class SvgRenderer implements RendererPlugin {
130
+ readonly type = 'svg';
131
+ /** @see plugin/core/gvplugin_core.c registration table */
132
+ readonly quality = 0;
133
+ /** Whether the current edge's <g> group was opened (deferred-emit state). */
134
+ private edgeGroupOpen = false;
135
+
136
+ beginGraph(g: Graph, job: RenderJob): void { svgBeginGraph(g, job); }
137
+ endGraph(_g: Graph, job: RenderJob): void { svgEndGraph(job); }
138
+ beginPage(g: Graph, job: RenderJob): void { svgBeginPage(g, job); }
139
+
140
+ pageBackground(g: Graph, job: RenderJob): void { svgPageBackground(g, job); }
141
+ endPage(_g: Graph, job: RenderJob): void { svgEndPage(job); }
142
+ beginLayer(name: string, job: RenderJob): void { svgBeginLayer(name, job); }
143
+ endLayer(job: RenderJob): void { svgEndLayer(job); }
144
+ beginNode(n: Node, job: RenderJob): void { svgBeginNode(n, job); }
145
+ endNode(_n: Node, job: RenderJob): void { svgEndNode(job); }
146
+ beginEdge(e: Edge, job: RenderJob): void {
147
+ // job.bb is the final drawing bbox (= GD_bb / job->clip); emit_edge gates
148
+ // all edge drawing on edge_in_box(e, job->clip). @see lib/common/emit.c:emit_edge
149
+ this.edgeGroupOpen = edgeHasDrawableContent(e, job.bb);
150
+ if (this.edgeGroupOpen) svgBeginEdge(e, job);
151
+ }
152
+
153
+ /**
154
+ * Close the edge group. Edge graphics (path + arrowhead) are emitted here
155
+ * because the full spline is available on e.info.spl only after layout has
156
+ * run routeDotEdges.
157
+ *
158
+ * For multi-color edges (color="c1:c2:…"), emits parallel offset Béziers
159
+ * (one per color, SEP=2.0 apart) then arrows in headcolor/tailcolor.
160
+ * Single-color edges use the T4 path unchanged.
161
+ *
162
+ * @see plugin/core/gvrender_core_svg.c:svg_end_edge
163
+ * @see lib/common/emit.c:2442-2528 (else if numc parallel-bezier branch)
164
+ */
165
+ endEdge(e: Edge, job: RenderJob): void {
166
+ // No <g> opened (no spline/label) → nothing to draw or close, matching C's
167
+ // deferred group emission for content-less edges.
168
+ if (!this.edgeGroupOpen) return;
169
+ this.edgeGroupOpen = false;
170
+ // Whole-edge anchor wraps the spline + arrows only; it closes before the
171
+ // labels, which carry their own sub-anchors (siblings, not nested).
172
+ // @see lib/common/emit.c:2877 (begin) / emit_end_edge:2970 (end)
173
+ const anchored = beginAnchorIf(this, job);
174
+ const colorAttr = e.attrs.get('color') ?? '';
175
+ const numc = (colorAttr.match(/:/g) ?? []).length;
176
+ const numsemi = (colorAttr.match(/;/g) ?? []).length;
177
+ if (numsemi > 0 && numc > 0) {
178
+ // Split-along-length branch (semicolon syntax).
179
+ // Arrow rule is inverted: tail = first color, head = endcolor.
180
+ // @see lib/common/emit.c:2390 if (numsemi && numc) multicolor()
181
+ const { firstColor, endColor } = emitSplitEdgePaths(e, job, colorAttr);
182
+ emitMulticolorArrows(e, job, endColor, firstColor);
183
+ } else if (edgeIsTapered(e)) {
184
+ // Tapered edge: a filled taper polygon + arrows. Takes precedence over
185
+ // colon-multicolor, matching C's `if (tapered) ... else if (numc)`.
186
+ // @see lib/common/emit.c:2422
187
+ svgTaperedEdge(e, job);
188
+ } else if (numc > 0) {
189
+ // Multicolor parallel-bezier branch
190
+ // @see lib/common/emit.c:2443 else if (numc)
191
+ const { headColor, tailColor } = emitParallelEdgePaths(e, job, colorAttr);
192
+ emitMulticolorArrows(e, job, headColor, tailColor);
193
+ } else {
194
+ // Single-color branch. Ortho edges with rounded corners (splines=ortho +
195
+ // radius/style=rounded) emit polyline segments + corner arcs; all other
196
+ // edges keep the byte-stable bezier <path>. @see lib/common/emit.c:2553
197
+ const orthoRadius = orthoRoundedRadius(e, job);
198
+ // svgEdgePath interleaves each bezier's arrowheads per C's emit loop;
199
+ // the rounded-ortho variant keeps the trailing arrow pass (its arrows
200
+ // always sit on the single ortho bezier). @see lib/common/emit.c:2668
201
+ if (orthoRadius !== null) {
202
+ svgEdgePathOrthoRounded(e, orthoRadius, job);
203
+ svgArrowPolygons(e, job);
204
+ } else {
205
+ svgEdgePath(e, job);
206
+ }
207
+ }
208
+ if (anchored) this.endAnchor(job);
209
+ // Edge labels go inside the group, after path + arrows.
210
+ // @see lib/common/emit.c:emit_end_edge (3010-3025)
211
+ renderEdgeLabels(e, this, job);
212
+ svgEndEdge(job);
213
+ }
214
+
215
+ beginAnchor(
216
+ href: string,
217
+ tooltip: string,
218
+ target: string,
219
+ id: string,
220
+ job: RenderJob,
221
+ ): void {
222
+ svgBeginAnchor(href, tooltip, target, id, job);
223
+ }
224
+
225
+ endAnchor(job: RenderJob): void { svgEndAnchor(job); }
226
+
227
+ textspan(pos: Point, span: TextSpan, job: RenderJob): void {
228
+ svgTextspan(pos, span, job);
229
+ }
230
+
231
+ ellipse(
232
+ center: Point,
233
+ rx: number,
234
+ ry: number,
235
+ filled: boolean,
236
+ job: RenderJob,
237
+ ): void {
238
+ svgEllipse(center, rx, ry, filled, job);
239
+ }
240
+
241
+ polygon(pts: Point[], filled: boolean, job: RenderJob): void {
242
+ svgPolygon(pts, filled, job);
243
+ }
244
+
245
+ bezier(pts: Point[], filled: boolean, job: RenderJob): void {
246
+ svgBezier(pts, filled, job);
247
+ }
248
+
249
+ polyline(pts: Point[], job: RenderJob): void { svgPolyline(pts, job); }
250
+ // C resets to the default line style and the label's fontcolor before the
251
+ // attachment polyline (emit.c:1886-1893) — the edge's own dash/width must
252
+ // not leak onto it.
253
+ attachmentPolyline(pts: Point[], pencolor: string, job: RenderJob): void {
254
+ // Resolve the label fontcolor through the SVG known-color gate before
255
+ // emission, mirroring C's gvrender_set_pencolor in emit_attachment; a raw
256
+ // attribute value must never reach stroke="..." unresolved/unescaped.
257
+ job.write('<polyline fill="none" stroke="' + colorPaint(resolveRenderColor(pencolor)) + '" points="');
258
+ emitPoints(job, pts);
259
+ job.write('"/>\n');
260
+ }
261
+
262
+ /**
263
+ * Emit an <image> element. C formats numbers with %g here (not the
264
+ * svg_printdouble used elsewhere); toPrecision(6) reproduces %g.
265
+ * Deviation: C writes us->name raw (gvputs); the port XML-escapes the
266
+ * src so metacharacter paths cannot produce invalid SVG.
267
+ *
268
+ * AD-1 (image-api, additive): when job.inlineImages is set AND the
269
+ * registered image resolver (`setImageResolver`) resolves `src`, emit a
270
+ * self-contained `data:` URI instead of the raw src passthrough. This is
271
+ * not a C behavior — native Graphviz never inlines image bytes. Default
272
+ * off (job.inlineImages unset/false, or no resolver registered, or the
273
+ * resolver misses) reproduces the byte-identical pre-AD-1 output below.
274
+ * @see plugin/core/gvloadimage_core.c:core_loadimage_svg
275
+ * @see src/gvc/image-resolver.ts
276
+ */
277
+ usershape(src: string, b: Box, job: RenderJob): void {
278
+ const g = (n: number): string => String(parseFloat(n.toPrecision(6)));
279
+ const width = b.ur.x - b.ll.x;
280
+ const height = b.ur.y - b.ll.y;
281
+ const originx = (b.ur.x + b.ll.x - width) / 2;
282
+ const originy = (b.ur.y + b.ll.y + height) / 2;
283
+ let href = src;
284
+ if (job.inlineImages === true) {
285
+ const found = findImageBytes(src);
286
+ if (found !== null) href = toDataUri(found.bytes, found.mime);
287
+ }
288
+ job.write('<image xlink:href="' + escapeXml(href) + '" width="' + g(width)
289
+ + 'px" height="' + g(height) + 'px" preserveAspectRatio="xMinYMin meet" x="'
290
+ + g(originx) + '" y="' + g(-originy) + '"/>\n');
291
+ }
292
+
293
+ comment(text: string, job: RenderJob): void { svgComment(text, job); }
294
+
295
+ beginLabel(_type: LabelType, _job: RenderJob): void { /* no-op */ }
296
+ endLabel(_job: RenderJob): void { /* no-op */ }
297
+ beginCluster(sg: Graph, job: RenderJob): void { svgBeginCluster(sg, job); }
298
+ endCluster(_sg: Graph, job: RenderJob): void { svgEndCluster(job); }
299
+ }
300
+
301
+ // ---------------------------------------------------------------------------
302
+ // Factory — @see plugin/core/gvrender_core_svg.c:gvrender_svg_types
303
+ // ---------------------------------------------------------------------------
304
+
305
+ export function createSvgRenderer(): RendererPlugin {
306
+ return new SvgRenderer();
307
+ }
@@ -0,0 +1,164 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * Public API for structured xdot draw-op access.
5
+ *
6
+ * Lays out a Graph, renders it to the xdot format, parses the xdot
7
+ * attribute strings back into typed XdotOp values, and returns a flat
8
+ * op stream the caller can feed to any drawing backend (canvas, WebGL,
9
+ * PDF, native UI) without touching SVG.
10
+ *
11
+ * This wrapper is a thin, faithful exposure of whatever the xdot renderer
12
+ * emits — it adds no draw ops of its own.
13
+ *
14
+ * KNOWN LIMITATION (xdot renderer, not this wrapper): the underlying xdot
15
+ * renderer (`createXdotRenderer` in `render/dot.ts`) is currently
16
+ * integration-incomplete relative to native `dot -Txdot`:
17
+ * - edges emit no `_draw_` ops (no spline/arrowhead draw ops surface here);
18
+ * - custom node pen/fill colors are not applied to the emitted ops;
19
+ * - node draw-op coordinates can be mismatched between nodes.
20
+ * Node shape ops (ellipse/polygon), text/label ops, and font ops are
21
+ * emitted and surface correctly. The geometry itself is fully computed
22
+ * (the SVG renderer draws the same graph correctly); only the xdot
23
+ * emission path is incomplete. A faithful fix is tracked as a follow-on
24
+ * mission (see plans/expose-library-api/decision-journal.md, 2026-06-21).
25
+ *
26
+ * @see lib/xdot/xdot.h
27
+ * @see plugin/core/gvrender_core_dot.c (FORMAT_XDOT)
28
+ */
29
+
30
+ import type { XdotOp } from '../xdot/types.js';
31
+ import { Graph } from '../model/graph.js';
32
+ import { parse } from '../parser/index.js';
33
+ import { render as gvcRender } from '../gvc/device.js';
34
+ import { createDefaultContext } from '../gvc/default-context.js';
35
+ import { parseXDot } from '../xdot/index.js';
36
+ import type { EngineName } from '../gvc/context.js';
37
+ import { RenderError } from '../errors.js';
38
+ import type { GvError } from '../errors.js';
39
+
40
+ /**
41
+ * `Xdot` — the parsed result of one xdot attribute stream: `ops` (the
42
+ * decoded draw-op array) plus `flags` (parse status bits).
43
+ *
44
+ * `XdotOp` — a single decoded xdot drawing operation, discriminated by its
45
+ * `kind` field (e.g. `filled_ellipse`, `filled_polygon`, `filled_bezier`,
46
+ * `polyline`, `text`, `fill_color`, `pen_color`, `grad_fill_color`,
47
+ * `grad_pen_color`, `font`, `style`, `image`, `fontchar`). Each variant
48
+ * carries one payload property named for its shape (`ellipse`, `polygon`,
49
+ * `bezier`, `polyline`, `text`, `color`, `gradColor`, `font`, `style`,
50
+ * `image`, `fontchar`) — narrow on `kind` in a switch to access it safely.
51
+ *
52
+ * `XdotColor` — a resolved xdot fill/pen color: `{ type: 'none', clr }` for
53
+ * a solid color, or a linear/radial gradient (`{ type: 'linear', ling }` /
54
+ * `{ type: 'radial', ring }`).
55
+ *
56
+ * @see lib/xdot/xdot.h:xdot
57
+ * @see lib/xdot/xdot.h:xdot_op (`_xdot_op`)
58
+ * @see lib/xdot/xdot.h:xdot_color
59
+ */
60
+ export type { Xdot, XdotOp, XdotColor } from '../xdot/index.js';
61
+
62
+ /** Options for {@link getDrawOps}. */
63
+ export interface DrawOpsOptions {
64
+ /** Layout engine to use. Defaults to `'dot'`. */
65
+ engine?: EngineName;
66
+ }
67
+
68
+ /** Default layout engine used by {@link getDrawOps}. */
69
+ export const DEFAULT_DRAW_ENGINE: EngineName = 'dot';
70
+
71
+ /**
72
+ * xdot attribute keys that carry draw-op streams.
73
+ * @see plugin/core/gvrender_core_dot.c xdot_obj_attr_names
74
+ */
75
+ const XDOT_DRAW_ATTRS = [
76
+ '_draw_', '_ldraw_', '_hdraw_', '_tdraw_', '_hldraw_', '_tldraw_',
77
+ ] as const;
78
+
79
+ function isGvErrorLike(err: unknown): err is GvError {
80
+ return (
81
+ typeof err === 'object' &&
82
+ err !== null &&
83
+ typeof (err as { type?: unknown }).type === 'string' &&
84
+ typeof (err as { code?: unknown }).code === 'string'
85
+ );
86
+ }
87
+
88
+ /** Re-throw GvError-like values; otherwise wrap as RENDER_ERROR. */
89
+ function rethrowAsRender(err: unknown): never {
90
+ if (isGvErrorLike(err)) throw err;
91
+ const msg = err instanceof Error ? err.message : String(err);
92
+ throw new RenderError(msg, 'RENDER_ERROR');
93
+ }
94
+
95
+ /** Append XdotOps found in `attrs` for each xdot draw key into `out`. */
96
+ function appendAttrsOps(attrs: Map<string, string>, out: XdotOp[]): void {
97
+ for (const key of XDOT_DRAW_ATTRS) {
98
+ const val = attrs.get(key);
99
+ if (val === undefined) continue;
100
+ const parsed = parseXDot(val);
101
+ if (parsed !== null) out.push(...parsed.ops);
102
+ }
103
+ }
104
+
105
+ function collectGraphOps(xdotGraph: Graph): XdotOp[] {
106
+ const ops: XdotOp[] = [];
107
+ appendAttrsOps(xdotGraph.attrs, ops);
108
+ for (const n of xdotGraph.nodes.values()) appendAttrsOps(n.attrs, ops);
109
+ for (const e of xdotGraph.edges) appendAttrsOps(e.attrs, ops);
110
+ return ops;
111
+ }
112
+
113
+ function layoutAndRenderXdot(g: Graph, engine: EngineName): string {
114
+ const ctx = createDefaultContext();
115
+ try {
116
+ ctx.layout(g, engine);
117
+ const src = gvcRender(ctx, g, 'xdot');
118
+ ctx.freeLayout(g, engine);
119
+ return src;
120
+ } catch (err: unknown) {
121
+ rethrowAsRender(err);
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Lay out `g`, render to xdot, parse every draw-attribute stream, and
127
+ * return all ops as a flat `XdotOp[]` in paint order (graph → node → edge).
128
+ *
129
+ * Consumers discriminate on the `kind` field of the `XdotOp` union —
130
+ * no string parsing required.
131
+ *
132
+ * @param g - A Graph from `parse()` or the builder API.
133
+ * @param opts - Optional: `{ engine }` overrides the default `'dot'`.
134
+ * @returns Flat typed draw-op array covering the full graph.
135
+ * @throws ParseError if the xdot DOT output cannot be re-parsed.
136
+ * @throws RenderError if layout or rendering fails.
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * import { parse } from '@knowvah/dot-engine';
141
+ * import { getDrawOps } from 'graphviz-ts/render';
142
+ *
143
+ * const g = parse('digraph { a -> b; }');
144
+ * for (const op of getDrawOps(g)) {
145
+ * switch (op.kind) {
146
+ * case 'filled_ellipse':
147
+ * case 'unfilled_ellipse':
148
+ * drawEllipse(op.ellipse);
149
+ * break;
150
+ * case 'text':
151
+ * drawText(op.text);
152
+ * break;
153
+ * // ...handle the remaining XdotOp kinds
154
+ * }
155
+ * }
156
+ * ```
157
+ *
158
+ * @see lib/xdot/xdot.h
159
+ * @see lib/gvc/gvc.h:gvRender
160
+ */
161
+ export function getDrawOps(g: Graph, opts?: DrawOpsOptions): XdotOp[] {
162
+ const engine = opts?.engine ?? DEFAULT_DRAW_ENGINE;
163
+ return collectGraphOps(parse(layoutAndRenderXdot(g, engine)));
164
+ }
@@ -0,0 +1,56 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+ //
3
+ // XML escaping faithful to graphviz's gv_xml_escape (lib/util/xml.c). '<', '>',
4
+ // '"', and "'" are always escaped; '&' is escaped to &amp; only when it does
5
+ // not begin a valid entity (&name; / &#NNN; / &#xHH;). The text/tooltip variant
6
+ // additionally honors the {raw, dash, nbsp} flags used by the SVG plugin.
7
+
8
+ // Regexes for quote chars: /"/g and /'/g break Lizard's quote-tracker.
9
+ // Use these named patterns instead to avoid the parser bug.
10
+ const RE_DQUOTE = new RegExp('"', 'g');
11
+ const RE_SQUOTE = new RegExp("'", 'g');
12
+ // A bare '&' that does NOT begin a valid entity (&name; / &#NNN; / &#xHH;).
13
+ // Mirrors xml_isentity (lib/util/xml.c): only such '&' are escaped to &amp;.
14
+ const RE_AMP_NONENTITY = /&(?![A-Za-z]+;|#[0-9]+;|#x[0-9A-Fa-f]+;)/g;
15
+
16
+ /**
17
+ * Base XML escape (gv_xml_escape with flags {0}): ids, titles, hrefs.
18
+ * @see lib/util/xml.c gv_xml_escape / xml_core / xml_isentity
19
+ */
20
+ export function escapeXml(s: string): string {
21
+ let r = s.replace(RE_AMP_NONENTITY, '&amp;');
22
+ r = r.replace(/</g, '&lt;');
23
+ r = r.replace(/>/g, '&gt;');
24
+ r = r.replace(RE_DQUOTE, '&quot;');
25
+ r = r.replace(RE_SQUOTE, '&#39;');
26
+ return r;
27
+ }
28
+
29
+ /**
30
+ * Title/id/class XML escape (gv_xml_escape with flags {dash, nbsp} — C's
31
+ * gvputs_xml): base escaping plus '-'→&#45; and 2nd+ consecutive
32
+ * spaces→&#160;, WITHOUT the raw flag (entity-aware '&', no \n/\r
33
+ * escapes). Used for <title> content and id/class attribute values.
34
+ * @see lib/gvc/gvdevice.c:gvputs_xml, lib/util/xml.c:xml_core
35
+ */
36
+ export function escapeXmlTitle(s: string): string {
37
+ let r = escapeXml(s);
38
+ r = r.replace(/-/g, '&#45;');
39
+ r = r.replace(/ {2,}/g, (m) => ' ' + '&#160;'.repeat(m.length - 1));
40
+ return r;
41
+ }
42
+
43
+ /**
44
+ * Text/tooltip XML escape (gv_xml_escape with flags {raw, dash, nbsp}):
45
+ * additionally escapes '-'→&#45;, newline/CR→&#10;/&#13;, and 2nd+ consecutive
46
+ * spaces→&#160;. Used for textspans and tooltips.
47
+ * @see plugin/core/gvrender_core_svg.c:546 (svg_textspan flags)
48
+ */
49
+ export function escapeXmlText(s: string): string {
50
+ let r = escapeXml(s);
51
+ r = r.replace(/-/g, '&#45;');
52
+ r = r.replace(/\n/g, '&#10;');
53
+ r = r.replace(/\r/g, '&#13;');
54
+ r = r.replace(/ {2,}/g, (m) => ' ' + '&#160;'.repeat(m.length - 1));
55
+ return r;
56
+ }
@@ -0,0 +1,138 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+ /**
3
+ * @see lib/util/agxbuf.h
4
+ * @see lib/util/agxbuf.c (agxbuf_trim_zeros)
5
+ *
6
+ * Dynamically expanding string buffer. SSO threshold need not be
7
+ * replicated — only the observable contract matters.
8
+ */
9
+
10
+ /**
11
+ * Extensible string buffer, analogous to C's agxbuf.
12
+ *
13
+ * @see cgraph/agxbuf.h:agxbuf
14
+ */
15
+ export class AgBuffer {
16
+ private _data: string = "";
17
+
18
+ /** @see cgraph/agxbuf.h:agxbput */
19
+ append(s: string): this {
20
+ this._data += s;
21
+ return this;
22
+ }
23
+
24
+ /** @see cgraph/agxbuf.h:agxbputc */
25
+ appendChar(c: string): this {
26
+ this._data += c[0] ?? "";
27
+ return this;
28
+ }
29
+
30
+ /**
31
+ * Append first n characters of s.
32
+ * @see cgraph/agxbuf.h:agxbput_n
33
+ */
34
+ appendN(s: string, n: number): this {
35
+ this._data += s.slice(0, n);
36
+ return this;
37
+ }
38
+
39
+ /** @see cgraph/agxbuf.h:agxbclear */
40
+ clear(): void {
41
+ this._data = "";
42
+ }
43
+
44
+ /**
45
+ * Matches agxbuse semantics: resets the buffer and returns the content.
46
+ * The returned string is valid only until the next write.
47
+ * @see cgraph/agxbuf.h:agxbuse
48
+ */
49
+ str(): string {
50
+ const result = this._data;
51
+ this._data = "";
52
+ return result;
53
+ }
54
+
55
+ /**
56
+ * Caller takes ownership; buffer is reset.
57
+ * @see cgraph/agxbuf.h:agxbdisown
58
+ */
59
+ disown(): string {
60
+ return this.str();
61
+ }
62
+
63
+ /** @see cgraph/agxbuf.h:agxblen */
64
+ length(): number {
65
+ return this._data.length;
66
+ }
67
+
68
+ /**
69
+ * Removes and returns the last character (UTF-16 charCodeAt semantics
70
+ * matching C char-pop), or null if empty.
71
+ * @see cgraph/agxbuf.h:agxbpop
72
+ */
73
+ pop(): string | null {
74
+ if (this._data.length === 0) {
75
+ return null;
76
+ }
77
+ const c = this._data[this._data.length - 1];
78
+ this._data = this._data.slice(0, -1);
79
+ return c;
80
+ }
81
+
82
+ /**
83
+ * Trim trailing fractional zeros from a printed floating-point value.
84
+ *
85
+ * Examples:
86
+ * "42.00" → "42"
87
+ * "42.01" → "42.01"
88
+ * "42.10" → "42.1"
89
+ * "-0.0" → "0"
90
+ *
91
+ * @see cgraph/agxbuf.h:agxbuf_trim_zeros
92
+ */
93
+ trimZeros(): void {
94
+ const period = this._lastPeriodIndex();
95
+ if (period < 0) return;
96
+ const trimmed = this._trimFractional(period);
97
+ if (trimmed !== null) this._data = trimmed;
98
+ }
99
+
100
+ /** Return index of last '.' in _data, or -1 if none. */
101
+ private _lastPeriodIndex(): number {
102
+ for (let i = this._data.length - 1; i >= 0; i--) {
103
+ if (this._data[i] === ".") return i;
104
+ }
105
+ return -1;
106
+ }
107
+
108
+ /**
109
+ * Walk backwards from end; trim trailing '0' digits then the '.' if all
110
+ * fractional digits were zero. Returns the trimmed string, or null when
111
+ * no trimming is needed.
112
+ * @see cgraph/agxbuf.h:agxbuf_trim_zeros (truncate loop)
113
+ */
114
+ private _trimFractional(period: number): string | null {
115
+ const s = this._data;
116
+ let end = s.length;
117
+ while (end > period + 1 && s[end - 1] === "0") {
118
+ end--;
119
+ }
120
+ if (end === s.length) return null; // no trailing zeros
121
+ if (end === period + 1) {
122
+ return AgBuffer._fixNegativeZero(s.slice(0, period));
123
+ }
124
+ return s.slice(0, end);
125
+ }
126
+
127
+ /**
128
+ * Replace trailing "-0" with "0".
129
+ * @see cgraph/agxbuf.h:agxbuf_trim_zeros (-0 fix)
130
+ */
131
+ private static _fixNegativeZero(s: string): string {
132
+ const n = s.length;
133
+ if (n >= 2 && s[n - 2] === "-" && s[n - 1] === "0") {
134
+ return s.slice(0, n - 2) + "0";
135
+ }
136
+ return s;
137
+ }
138
+ }