@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,518 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * TypeScript port of lib/dotgen/flat.c.
5
+ *
6
+ * Handles labeled flat (same-rank) edges: virtual node insertion into rank
7
+ * arrays, label-node slot allocation, and the abomination rank-array shift
8
+ * when labeled flat edges fall at rank 0.
9
+ *
10
+ * Note: all functions are exported because lizard 1.22.1's TypeScript parser
11
+ * only recognises function boundaries when the `export` keyword is present.
12
+ * Non-exported TS functions with return-type annotations cause the parser to
13
+ * merge them into the preceding function's body, inflating CCN counts.
14
+ *
15
+ * @see lib/dotgen/flat.c
16
+ */
17
+
18
+ import type { Graph } from '../../model/graph.js';
19
+ import type { Node } from '../../model/node.js';
20
+ import type { Edge } from '../../model/edge.js';
21
+ import type { RankEntry } from '../../model/rankEntry.js';
22
+ import type { EdgeList } from '../../model/nodeInfo.js';
23
+ import { FLATORDER, NORMAL, VIRTUAL, virtualNode, virtualEdge } from './fastgr.js';
24
+ import { recSaveVlists, recResetVlists, dotRoot } from './mincross.js';
25
+ import { checkLabelOrder } from './label-order.js';
26
+ import {
27
+ nodeOrder, nodeRank, graphMaxrank, graphMinrank, getOrd,
28
+ } from './flat-utils.js';
29
+ import type { TextlabelT } from '../../common/types.js';
30
+
31
+ // ---------------------------------------------------------------------------
32
+ // make_vn_slot @see lib/dotgen/flat.c:make_vn_slot
33
+ // ---------------------------------------------------------------------------
34
+
35
+ export function shiftSlotRight(rk: RankEntry, pos: number): void {
36
+ for (let i = rk.n; i > pos; i--) {
37
+ rk.v[i] = rk.v[i - 1];
38
+ const cur = rk.v[i];
39
+ const curOrd = cur.info.order;
40
+ if (curOrd !== undefined) cur.info.order = curOrd + 1;
41
+ else cur.info.order = 1;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Insert a virtual node slot at position `pos` in rank `r` of graph `g`.
47
+ * @see lib/dotgen/flat.c:make_vn_slot
48
+ */
49
+ export function makeVnSlot(g: Graph, r: number, pos: number): Node {
50
+ const rk = g.info.rank![r];
51
+ if (rk.v.length <= rk.n + 1) rk.v.push(null as unknown as Node);
52
+ shiftSlotRight(rk, pos);
53
+ const v = virtualNode(g);
54
+ rk.v[pos] = v;
55
+ v.info.order = pos;
56
+ v.info.rank = r;
57
+ rk.n++;
58
+ return v;
59
+ }
60
+
61
+ // ---------------------------------------------------------------------------
62
+ // flat_limits @see lib/dotgen/flat.c:flat_limits / setbounds / findlr
63
+ //
64
+ // Placement of a labeled flat edge's label virtual node on rank r-1 is
65
+ // topology-aware: it does NOT compare the r-1 vnodes' own orders against the
66
+ // flat edge's endpoint orders (those live on a different rank). Instead, for
67
+ // each node already on rank r-1, it inspects where that node's edges connect on
68
+ // rank r relative to the flat edge's endpoint-order span [lpos,rpos], and
69
+ // places the label at the midpoint of the resulting hard/soft bounds. A crude
70
+ // order-vs-order comparison mis-placed the label (graphviz #1213: the back-edge
71
+ // chain vnodes shifted +1 order, perturbing their positions and routing
72
+ // corridors and warping every constraint=false back-edge spline).
73
+ // ---------------------------------------------------------------------------
74
+
75
+ // bound indices @see lib/dotgen/flat.c HLB/HRB/SLB/SRB
76
+ const HLB = 0;
77
+ const HRB = 1;
78
+ const SLB = 2;
79
+ const SRB = 3;
80
+
81
+ /** Sorted [lo, hi] of the orders of u and v. @see lib/dotgen/flat.c:findlr */
82
+ export function findlr(u: Node, v: Node): [number, number] {
83
+ const a = nodeOrder(u);
84
+ const b = nodeOrder(v);
85
+ return a > b ? [b, a] : [a, b];
86
+ }
87
+
88
+ /** A flat label vnode (no in-edges): bound by where its two endpoints sit
89
+ * relative to [lpos,rpos]. @see lib/dotgen/flat.c:setbounds (flat branch) */
90
+ export function setBoundsFlat(v: Node, bounds: number[], lpos: number, rpos: number): void {
91
+ const out = v.info.out;
92
+ if (out === undefined || out.size < 2) return; // C asserts size == 2
93
+ const ord = nodeOrder(v);
94
+ const [l, r] = findlr(out.list[0].head, out.list[1].head);
95
+ if (r <= lpos) { bounds[SLB] = bounds[HLB] = ord; }
96
+ else if (l >= rpos) { bounds[SRB] = bounds[HRB] = ord; }
97
+ else if (l < lpos && r > rpos) { /* spanning this one — ignore */ }
98
+ else {
99
+ if (l < lpos || (l === lpos && r < rpos)) bounds[SLB] = ord;
100
+ if (r > rpos || (r === rpos && l > lpos)) bounds[SRB] = ord;
101
+ }
102
+ }
103
+
104
+ /** A forward chain vnode (has in-edges): hard-bound by whether all its
105
+ * downstream connections fall left or right of the span.
106
+ * @see lib/dotgen/flat.c:setbounds (forward branch) */
107
+ export function setBoundsForward(v: Node, bounds: number[], lpos: number, rpos: number): void {
108
+ const out = v.info.out;
109
+ const size = out?.size ?? 0;
110
+ let onleft = false;
111
+ let onright = false;
112
+ for (let i = 0; i < size; i++) {
113
+ const ho = nodeOrder(out!.list[i].head);
114
+ if (ho <= lpos) { onleft = true; continue; }
115
+ if (ho >= rpos) { onright = true; continue; }
116
+ }
117
+ const ord = nodeOrder(v);
118
+ if (onleft && !onright) bounds[HLB] = ord + 1;
119
+ if (onright && !onleft) bounds[HRB] = ord - 1;
120
+ }
121
+
122
+ /** Update label-placement bounds from one rank-(r-1) node `v`, given the flat
123
+ * edge's endpoint-order span [lpos,rpos] on rank r. @see lib/dotgen/flat.c:setbounds */
124
+ export function setBounds(v: Node, bounds: number[], lpos: number, rpos: number): void {
125
+ if ((v.info.node_type ?? NORMAL) !== VIRTUAL) return;
126
+ if ((v.info.in?.size ?? 0) === 0) setBoundsFlat(v, bounds, lpos, rpos);
127
+ else setBoundsForward(v, bounds, lpos, rpos);
128
+ }
129
+
130
+ /**
131
+ * Find the best order position for a flat-edge label virtual node in rank r-1.
132
+ * Faithful port of C's bound-scan (NOT a simple order comparison).
133
+ * @see lib/dotgen/flat.c:flat_limits
134
+ */
135
+ export function flatLimits(g: Graph, e: Edge): number {
136
+ const r = nodeRank(e.tail) - 1;
137
+ if (r < 0 || !g.info.rank) return 0;
138
+ const rk = g.info.rank[r];
139
+ let lnode = 0;
140
+ let rnode = rk.n - 1;
141
+ // bounds = [HLB, HRB, SLB, SRB]
142
+ const bounds = [lnode - 1, rnode + 1, lnode - 1, rnode + 1];
143
+ const [lpos, rpos] = findlr(e.tail, e.head);
144
+ while (lnode <= rnode) {
145
+ setBounds(rk.v[lnode], bounds, lpos, rpos);
146
+ if (lnode !== rnode) setBounds(rk.v[rnode], bounds, lpos, rpos);
147
+ lnode++;
148
+ rnode--;
149
+ if (bounds[HRB] - bounds[HLB] <= 1) break;
150
+ }
151
+ // C integer division truncates toward zero (Math.trunc).
152
+ if (bounds[HLB] <= bounds[HRB]) return Math.trunc((bounds[HLB] + bounds[HRB] + 1) / 2);
153
+ return Math.trunc((bounds[SLB] + bounds[SRB] + 1) / 2);
154
+ }
155
+
156
+ // ---------------------------------------------------------------------------
157
+ // flat_node @see lib/dotgen/flat.c:flat_node
158
+ // ---------------------------------------------------------------------------
159
+
160
+ type LabelWithDimen = { dimen?: { x: number; y: number } };
161
+
162
+ export function graphRanksep(g: Graph): number {
163
+ return g.info.ranksep ?? 0;
164
+ }
165
+
166
+ /**
167
+ * ypos = LL.y of the label box, grabbed before make_vn_slot so the new slot does
168
+ * not perturb it. @see lib/dotgen/flat.c:flat_node 154-159
169
+ */
170
+ export function flatLabelYpos(g: Graph, r: number): number {
171
+ const rank = g.info.rank!;
172
+ const above = rank[r - 1].v[0];
173
+ if (above) return above.info.coord.y - rank[r - 1].ht1;
174
+ const here = rank[r].v[0];
175
+ return here.info.coord.y + rank[r].ht2 + graphRanksep(g);
176
+ }
177
+
178
+ /**
179
+ * Set ht/lw/rw on the label vnode from the label dimen (flip swaps x/y); return
180
+ * half-height. @see lib/dotgen/flat.c:flat_node 161-167
181
+ */
182
+ export function flatNodeDims(g: Graph, vn: Node, lbl: TextlabelT): number {
183
+ let dx = lbl.dimen.x;
184
+ let dy = lbl.dimen.y;
185
+ if (g.info.flip === true) { const t = dx; dx = dy; dy = t; }
186
+ vn.info.ht = dy;
187
+ vn.info.lw = vn.info.rw = dx / 2;
188
+ return dy / 2;
189
+ }
190
+
191
+ /**
192
+ * Create the two FLATORDER virtual edges (vn→tail, vn→head) with label ports.
193
+ * @see lib/dotgen/flat.c:flat_node 170-177
194
+ */
195
+ export function flatNodeEdges(vn: Node, e: Edge): void {
196
+ const et = virtualEdge(vn, e.tail, e);
197
+ et.info.tail_port.p.x = -vn.info.lw;
198
+ et.info.head_port.p.x = e.tail.info.rw;
199
+ et.info.edge_type = FLATORDER;
200
+ const eh = virtualEdge(vn, e.head, e);
201
+ eh.info.tail_port.p.x = vn.info.rw;
202
+ eh.info.head_port.p.x = e.head.info.lw;
203
+ eh.info.edge_type = FLATORDER;
204
+ }
205
+
206
+ /**
207
+ * Create a VIRTUAL label node (ND_alg → e) above a non-adjacent flat edge.
208
+ *
209
+ * `g` is the graph being laid out. C reads it as `dot_root(agtail(e))`, which is
210
+ * `GD_dotroot(agroot(e))` — a MUTABLE slot on the cgraph root that `dot_init_subg`
211
+ * re-points at the graph currently being laid out. It is therefore NOT the same as
212
+ * `agroot(agtail(e))`: under `pack`, each connected component is laid out as its own
213
+ * dot-root, so `dot_root()` yields the COMPONENT while `agroot()` yields the true
214
+ * root (which has no rank table at all). The port has no such mutable slot, so the
215
+ * layout graph is threaded in from `flat_edges` — which is exactly what C's
216
+ * `dot_root()` evaluates to at every call site here.
217
+ *
218
+ * @see lib/dotgen/flat.c:flat_node (g = dot_root(agtail(e)))
219
+ * @see lib/dotgen/dotinit.c:dot_init_subg (GD_dotroot(agroot(g)) = droot)
220
+ */
221
+ export function flatNode(g: Graph, e: Edge): void {
222
+ const lbl = e.info.label;
223
+ if (lbl === undefined) return;
224
+ const r = nodeRank(e.tail);
225
+ const place = flatLimits(g, e);
226
+ const ypos = flatLabelYpos(g, r);
227
+ const vn = makeVnSlot(g, r - 1, place);
228
+ const h2 = flatNodeDims(g, vn, lbl);
229
+ vn.info.label = lbl;
230
+ vn.info.coord.y = ypos + h2;
231
+ flatNodeEdges(vn, e);
232
+ const rk = g.info.rank![r - 1];
233
+ if (rk.ht1 < h2) rk.ht1 = h2;
234
+ if (rk.ht2 < h2) rk.ht2 = h2;
235
+ vn.info.posAlg = e;
236
+ }
237
+
238
+ // abomination @see lib/dotgen/flat.c:abomination
239
+
240
+ /** Fresh empty rank entry (the slot vacated by the +1 renumber). */
241
+ export function emptyRankEntry(): RankEntry {
242
+ return {
243
+ n: 0, v: [], an: 0, av: [],
244
+ ht1: 1, ht2: 1, pht1: 1, pht2: 1,
245
+ candidate: false, valid: false, cache_nc: 0, flat: undefined, vStart: 0,
246
+ };
247
+ }
248
+
249
+ /**
250
+ * Shift a cluster subtree's absolute-rank-indexed state to follow the +1
251
+ * renumber performed by `abomination` (AD-2).
252
+ *
253
+ * C needs no such pass: its abomination adds the label rank at index -1
254
+ * (`GD_rank(g) = rptr + 1`, `GD_minrank(g)--`) and never touches ND_rank, so a
255
+ * cluster's GD_minrank/GD_maxrank, GD_rank(clust)[] and GD_rankleader(clust)[]
256
+ * — all indexed by ABSOLUTE rank — stay correct. JS has no negative index, so
257
+ * the port renumbers +1 instead, and every absolute-rank-indexed structure has
258
+ * to move with it. Skipping the clusters leaves them pointing one rank too low:
259
+ * the next step of flat_edges (rec_reset_vlists → reset_vlist) re-aliases
260
+ * GD_rank(clust)[r].v = GD_rank(root)[r].v at the cluster's stale r, which now
261
+ * addresses the newly inserted flat-label rank instead of the cluster's own.
262
+ *
263
+ * @see lib/dotgen/flat.c:abomination
264
+ * @see lib/dotgen/mincross.c:reset_vlist
265
+ */
266
+ export function shiftClusterRanks(g: Graph): void {
267
+ const nClust = g.info.n_cluster ?? 0;
268
+ for (let c = 1; c <= nClust; c++) {
269
+ const sub = g.info.clust![c - 1];
270
+ const mn = graphMinrank(sub);
271
+ const mx = graphMaxrank(sub);
272
+ const rank = sub.info.rank;
273
+ if (rank) {
274
+ for (let r = mx; r >= mn; r--) rank[r + 1] = rank[r];
275
+ rank[mn] = emptyRankEntry();
276
+ // The shift overwrote the zeroed sentinel that `allocate_ranks` parks at
277
+ // maxrank+1 (C: gv_calloc(maxrank + 2)); re-establish it at the NEW
278
+ // maxrank+1 so rank[maxrank+1] is never a hole. @see below (abomination).
279
+ rank[mx + 2] = emptyRankEntry();
280
+ }
281
+ // GD_rankleader(clust)[r] is absolute-rank-indexed too (save_vlist writes
282
+ // it at r = minrank..maxrank; map_interclust_node reads it at ND_rank(n)).
283
+ const rl = sub.info.rankleader;
284
+ if (rl) for (let r = mx; r >= mn; r--) rl[r + 1] = rl[r];
285
+ sub.info.minrank = mn + 1;
286
+ sub.info.maxrank = mx + 1;
287
+ shiftClusterRanks(sub);
288
+ }
289
+ }
290
+
291
+ /** Make room for a flat label vnode below the lowest rank (name from C; AD-2).
292
+ * @see lib/dotgen/flat.c:abomination */
293
+ export function abomination(g: Graph): void {
294
+ // C shifts its base pointer so rank[-1] is valid (minrank → -1). JS has no
295
+ // negative indices, so AD-2 renumbers: insert an empty rank at index 0, shift
296
+ // ranks up, bump every ND_rank and maxrank by 1, minrank stays 0. The vnode C
297
+ // places at rank -1 then lands at rank 0. position.ts re-runs setYcoords after.
298
+ // needsAbomination only fires on rank mn == 0 (C asserts GD_minrank == 0).
299
+ const mx = graphMaxrank(g);
300
+ const rank = g.info.rank!;
301
+ for (let r = mx; r >= 0; r--) rank[r + 1] = rank[r];
302
+ rank[0] = emptyRankEntry();
303
+ // C allocates THREE extra rank slots here ("one for new rank, one for
304
+ // sentinel, one for off-by-one", flat.c:193) and re-bases the pointer, so the
305
+ // zeroed sentinel that `allocate_ranks` keeps at maxrank+1
306
+ // (`gv_calloc(GD_maxrank(g) + 2)`, mincross.c:1155) survives the insert. This
307
+ // port shifts UP in place instead of using a -1 index, so the shift writes the
308
+ // old top rank OVER that sentinel; without re-establishing it, rank[maxrank+1]
309
+ // is a hole. Readers that index maxrank+1 unguarded — `transposeCounts`' useOut
310
+ // gate (`GD_rank(g)[r+1].n`, mincross.c:650) and `mergeRanks`
311
+ // (`GD_rank(root)[mx+1].valid`, cluster.c:245) — would then fault on undefined.
312
+ // @see lib/dotgen/flat.c:abomination (gv_recalloc to GD_maxrank(g) + 3)
313
+ rank[mx + 2] = emptyRankEntry();
314
+ for (let n: Node | undefined = g.info.nlist; n; n = n.info.next) {
315
+ n.info.rank = (n.info.rank ?? 0) + 1;
316
+ }
317
+ g.info.maxrank = mx + 1;
318
+ // The root's nlist holds every node (merge_ranks calls fast_node(root, v) on
319
+ // each cluster member), so the ND_rank bump above already covers the clusters'
320
+ // nodes. What it does NOT cover is the clusters' own rank-indexed bookkeeping.
321
+ shiftClusterRanks(g);
322
+ // Record the +1 renumber so make_LR_constraints can recover C's rank-index
323
+ // parity: C inserts the label rank at -1 and keeps real nodes on even ranks;
324
+ // this 0-based shift puts them on odd ranks, inverting `sep[i & 1]`.
325
+ g.info.abomShift = (g.info.abomShift ?? 0) + 1;
326
+ }
327
+
328
+ // ---------------------------------------------------------------------------
329
+ // checkFlatAdjacent @see lib/dotgen/flat.c:checkFlatAdjacent
330
+ // ---------------------------------------------------------------------------
331
+
332
+ export function hasInterveningNode(rk: RankEntry, lo: number, hi: number): boolean {
333
+ for (let i = 0; i < rk.n; i++) {
334
+ const ord = getOrd(rk, i);
335
+ if (ord <= lo || ord >= hi) continue;
336
+ // C only treats a between-node as blocking flat-edge adjacency when it is a
337
+ // NORMAL node or a LABELED virtual node; an UNLABELED virtual node (e.g. an
338
+ // edge merely passing through the rank) does NOT block. The port previously
339
+ // blocked on any node. @see lib/dotgen/flat.c:checkFlatAdjacent
340
+ const n = rk.v[i];
341
+ const t = n.info.node_type ?? NORMAL;
342
+ if (t === NORMAL || (t === VIRTUAL && n.info.label !== undefined)) return true;
343
+ }
344
+ return false;
345
+ }
346
+
347
+ /**
348
+ * Mark flat edge as adjacent if no nodes fall between its endpoints in rank.
349
+ * When adjacent, C marks the edge AND every edge in its `to_virt` chain (the
350
+ * `do { ED_adjacent(e)=1; e=ED_to_virt(e); } while(e)` loop): the class rep must
351
+ * carry the flag too, because flat_edges' `other`-loop copies adjacency from the
352
+ * rep (`ED_adjacent(e) = ED_adjacent(le)`). Marking only the leaf left the rep
353
+ * unmarked, so that copy clobbered the flag back to 0 and the edge mis-routed
354
+ * through the generic fitter (a spurious y-slope on a flat edge).
355
+ *
356
+ * `g` is the graph being laid out — C's `dot_root(tn)`, NOT `agroot(tn)`. See
357
+ * `flatNode` above for why these differ under `pack`.
358
+ *
359
+ * @see lib/dotgen/flat.c:checkFlatAdjacent (rank = &GD_rank(dot_root(tn))[...])
360
+ */
361
+ export function checkFlatAdjacent(g: Graph, e: Edge): void {
362
+ const tOrd = nodeOrder(e.tail);
363
+ const hOrd = nodeOrder(e.head);
364
+ const lo = Math.min(tOrd, hOrd);
365
+ const hi = Math.max(tOrd, hOrd);
366
+ let adjacent = hi - lo <= 1;
367
+ if (!adjacent) {
368
+ adjacent = !hasInterveningNode(g.info.rank![nodeRank(e.tail)], lo, hi);
369
+ }
370
+ if (!adjacent) return;
371
+ for (let le: Edge | undefined = e; le; le = le.info.to_virt) le.info.adjacent = 1;
372
+ }
373
+
374
+
375
+ // ---------------------------------------------------------------------------
376
+ // flatEdges helpers @see lib/dotgen/flat.c:flat_edges
377
+ // ---------------------------------------------------------------------------
378
+
379
+ export function isLabeledFlat(e: Edge): boolean {
380
+ return e.info.label !== undefined;
381
+ }
382
+
383
+ export function markEdgeList(g: Graph, edges: EdgeList | undefined): void {
384
+ if (!edges) return;
385
+ for (let i = 0; i < edges.size; i++) checkFlatAdjacent(g, edges.list[i]);
386
+ }
387
+
388
+ export function markAdjacent(g: Graph): void {
389
+ for (let n: Node | undefined = g.info.nlist; n; n = n.info.next) {
390
+ markEdgeList(g, n.info.flat_out);
391
+ // ND_other entries are marked only when actually flat: a cross-rank merged
392
+ // 2-cycle member must NOT get adjacent=1 (the chain-walk would set it on
393
+ // its rep too, and groupSize's flat-adjacent short-circuit would then
394
+ // swallow portcmp group breaks). @see lib/dotgen/flat.c:272-276
395
+ if (n.info.other) {
396
+ for (let i = 0; i < n.info.other.size; i++) {
397
+ const e = n.info.other.list[i];
398
+ if (nodeRank(e.tail) === nodeRank(e.head)) checkFlatAdjacent(g, e);
399
+ }
400
+ }
401
+ }
402
+ }
403
+
404
+ export function rankHasNonAdjacentLabel(rk: RankEntry): boolean {
405
+ for (let i = 0; i < rk.n; i++) {
406
+ const fo = rk.v[i].info.flat_out;
407
+ if (!fo) continue;
408
+ for (let j = 0; j < fo.size; j++) {
409
+ if (isLabeledFlat(fo.list[j]) && !fo.list[j].info.adjacent) return true;
410
+ }
411
+ }
412
+ return false;
413
+ }
414
+
415
+ /**
416
+ * AD-1: C gates this on `GD_rank(g)[0].flat || GD_n_cluster(g) > 0` and then
417
+ * scans for a labeled non-adjacent flat edge on rank mn. In this port the
418
+ * `rank[mn].flat` adjacency matrix is unreliable at position-time (mincross
419
+ * builds it before `flat_out` is populated), so we detect the rank-mn labeled
420
+ * non-adjacent flat edge directly via `flat_out` — which is the real gate. This
421
+ * only fires for a graph with such an edge on the lowest rank (none of the 115
422
+ * goldens have one), so it is byte-safe. @see lib/dotgen/flat.c:flat_edges 279
423
+ */
424
+ export function needsAbomination(g: Graph): boolean {
425
+ const mn = graphMinrank(g);
426
+ const rank = g.info.rank;
427
+ if (!rank || rank[mn] === undefined) return false;
428
+ return rankHasNonAdjacentLabel(rank[mn]);
429
+ }
430
+
431
+ /** Label width contribution (flip-aware), or 0 if no label dimen. */
432
+ function labelWidth(g: Graph, e: Edge): number {
433
+ const lbl = e.info.label as (LabelWithDimen | undefined);
434
+ if (!lbl || !lbl.dimen) return 0;
435
+ return g.info.flip === true ? lbl.dimen.y : lbl.dimen.x;
436
+ }
437
+
438
+ /** Store the representative's flat-label width directly. @see flat.c:300 */
439
+ export function applyLabelDist(g: Graph, e: Edge): void {
440
+ e.info.dist = labelWidth(g, e);
441
+ }
442
+
443
+ /** Resolve a flat edge to its class representative via the to_virt chain.
444
+ * @see lib/dotgen/flat.c:flat_edges (`while (ED_to_virt(le)) le = ED_to_virt(le)`) */
445
+ function flatClassRep(e: Edge): Edge {
446
+ let le = e;
447
+ while (le.info.to_virt) le = le.info.to_virt;
448
+ return le;
449
+ }
450
+
451
+ /** flat_out loop body: store label dist on e (the rep), or add a label vnode.
452
+ * @see lib/dotgen/flat.c:flat_edges 296-307 */
453
+ export function processFlatOutLabel(g: Graph, e: Edge, reset: boolean): boolean {
454
+ if (!isLabeledFlat(e)) return reset;
455
+ if (e.info.adjacent) { applyLabelDist(g, e); return reset; }
456
+ flatNode(g, e);
457
+ return true;
458
+ }
459
+
460
+ /** other loop body: inherit adjacency from the class rep, and for an adjacent
461
+ * labeled edge MAX its label width onto the rep's dist (not the edge itself);
462
+ * non-adjacent labeled edges add a label vnode. Skips cross-rank and self
463
+ * edges. @see lib/dotgen/flat.c:flat_edges 309-326 */
464
+ export function processOtherLabel(g: Graph, e: Edge, reset: boolean): boolean {
465
+ if (nodeRank(e.tail) !== nodeRank(e.head)) return reset;
466
+ if (e.tail === e.head) return reset;
467
+ const le = flatClassRep(e);
468
+ e.info.adjacent = le.info.adjacent;
469
+ if (!isLabeledFlat(e)) return reset;
470
+ if (e.info.adjacent) {
471
+ le.info.dist = Math.max(labelWidth(g, e), le.info.dist ?? 0);
472
+ return reset;
473
+ }
474
+ flatNode(g, e);
475
+ return true;
476
+ }
477
+
478
+ /**
479
+ * The flat_edges dist/label-vnode pass. C nests BOTH the flat_out and other
480
+ * loops inside `if (ND_flat_out(n).list)`, so a node with no flat_out processes
481
+ * neither. @see lib/dotgen/flat.c:flat_edges 288-330
482
+ */
483
+ export function processNodes(g: Graph): boolean {
484
+ let reset = false;
485
+ for (let n: Node | undefined = g.info.nlist; n; n = n.info.next) {
486
+ const fo = n.info.flat_out;
487
+ if (!fo) continue;
488
+ for (let i = 0; i < fo.size; i++) reset = processFlatOutLabel(g, fo.list[i], reset);
489
+ const ot = n.info.other;
490
+ if (ot) for (let i = 0; i < ot.size; i++) reset = processOtherLabel(g, ot.list[i], reset);
491
+ }
492
+ return reset;
493
+ }
494
+
495
+ // ---------------------------------------------------------------------------
496
+ // flatEdges @see lib/dotgen/flat.c:flat_edges
497
+ // ---------------------------------------------------------------------------
498
+
499
+ /**
500
+ * Process flat edges for label placement and abomination.
501
+ * Returns true if rank arrays were modified (label nodes inserted).
502
+ * @see lib/dotgen/flat.c:flat_edges
503
+ */
504
+ export function flatEdges(g: Graph): boolean {
505
+ markAdjacent(g);
506
+ if (needsAbomination(g)) abomination(g);
507
+ recSaveVlists(g);
508
+ const reset = processNodes(g);
509
+ if (reset) {
510
+ checkLabelOrder(g);
511
+ // Cluster rank windows (rankleader/vStart/n) are stale once flat_node
512
+ // inserted label vnodes and shifted ND_order; C re-derives them here.
513
+ // Only Root is consulted by the reset chain, so a bare {root} suffices
514
+ // in place of the mincross-pass context. @see lib/dotgen/flat.c:333
515
+ recResetVlists({ root: dotRoot(g) }, g);
516
+ }
517
+ return reset;
518
+ }
@@ -0,0 +1,114 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * Cluster label dimension setup for dot layout.
5
+ *
6
+ * @see lib/common/input.c:do_graph_label
7
+ */
8
+
9
+ import type { Graph } from '../../model/graph.js';
10
+ import type { Point } from '../../model/geom.js';
11
+ import type { TextMeasurer } from '../../common/textmeasure.js';
12
+ import { makeAnyLabel, DEFAULT_FONTSIZE, DEFAULT_FONTNAME, DEFAULT_COLOR } from '../../common/make-label.js';
13
+ import { isHtmlValue, htmlValueContent } from '../../common/html-string.js';
14
+ import { BOTTOM_IX, TOP_IX, RIGHT_IX, LEFT_IX } from './position-aux.js';
15
+
16
+ /** Graph has a label. @see lib/common/const.h:GRAPH_LABEL */
17
+ export const GRAPH_LABEL = 1 << 3;
18
+
19
+ /** @see lib/common/const.h:GAP */
20
+ const GAP = 4;
21
+
22
+ /** LABEL_AT_BOTTOM=0, LABEL_AT_TOP=1, LABEL_AT_LEFT=2, LABEL_AT_RIGHT=4.
23
+ * @see lib/common/const.h */
24
+ const LABEL_AT_TOP = 1;
25
+ const LABEL_AT_LEFT = 2;
26
+ const LABEL_AT_RIGHT = 4;
27
+
28
+ /**
29
+ * Cluster label-position flag from `labelloc` (top/bottom) AND `labeljust`
30
+ * (left/right), mirroring C `do_graph_label`. The cluster default is TOP (the
31
+ * root default is BOTTOM — see rootLabelPos); the labeljust logic is identical
32
+ * for both. Both keys inherit from an ancestor's default (C `agget`), so read
33
+ * them through graphAttrInherited — the same helper `label`/`fontname` use —
34
+ * not raw `sg.attrs`, else an inherited `labelloc=bottom` is lost.
35
+ * @see lib/common/input.c:858-877 do_graph_label
36
+ */
37
+ function readLabelPos(sg: Graph): number {
38
+ const loc = graphAttrInherited(sg, 'labelloc');
39
+ let pos = loc && loc[0] === 'b' ? 0 : LABEL_AT_TOP;
40
+ const just = graphAttrInherited(sg, 'labeljust');
41
+ if (just) {
42
+ if (just[0] === 'l') pos |= LABEL_AT_LEFT;
43
+ else if (just[0] === 'r') pos |= LABEL_AT_RIGHT;
44
+ }
45
+ return pos;
46
+ }
47
+
48
+ /**
49
+ * Read a graph attribute with subgraph→root inheritance, mirroring C's
50
+ * agxget (late_nnstring(sg, agfindgraphattr(sg, key), ...) in do_graph_label):
51
+ * a cluster inherits `fontname`/`fontsize`/`fontcolor` set on an ancestor
52
+ * (e.g. root `graph[fontname=Arial]`) when it sets none of its own.
53
+ * @see lib/common/input.c:do_graph_label
54
+ */
55
+ function graphAttrInherited(sg: Graph, key: string): string | undefined {
56
+ // Own value wins; otherwise the ancestor defaults SNAPSHOTTED when this
57
+ // subgraph opened (not a live parent walk) — so an ancestor attribute set
58
+ // later in statement order does not retroactively apply (2184).
59
+ // @see lib/cgraph/graph.c:agsubg (parse-time defval copy)
60
+ return sg.attrs.get(key) ?? sg.graphDefaultsSnapshot?.get(key);
61
+ }
62
+
63
+ function readFontParams(sg: Graph): { fontsize: number; fontname: string; fontcolor: string } {
64
+ return {
65
+ fontsize: parseFloat(graphAttrInherited(sg, 'fontsize') ?? '') || DEFAULT_FONTSIZE,
66
+ fontname: graphAttrInherited(sg, 'fontname') ?? DEFAULT_FONTNAME,
67
+ fontcolor: graphAttrInherited(sg, 'fontcolor') ?? DEFAULT_COLOR,
68
+ };
69
+ }
70
+
71
+ /** Apply PAD and store in sg.info.border at the index appropriate for flip/pos. */
72
+ function applyLabelBorder(sg: Graph, dimen: Point): void {
73
+ if (!sg.info.border) {
74
+ sg.info.border = [{ x: 0, y: 0 }, { x: 0, y: 0 }, { x: 0, y: 0 }, { x: 0, y: 0 }];
75
+ }
76
+ const labelPos = sg.info.label_pos ?? 1;
77
+ if (!sg.root.info.flip) {
78
+ sg.info.border[(labelPos & 1) ? TOP_IX : BOTTOM_IX] = dimen;
79
+ } else {
80
+ sg.info.border[(labelPos & 1) ? RIGHT_IX : LEFT_IX] = { x: dimen.y, y: dimen.x };
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Compute cluster label dimensions and set sg.info.border so that clustHt
86
+ * accounts for label height.
87
+ *
88
+ * @see lib/common/input.c:do_graph_label
89
+ * @see lib/common/input.c:850 — make_label(sg, str, aghtmlstr(str), false, ...)
90
+ */
91
+ export function doGraphLabel(sg: Graph, measurer: TextMeasurer | undefined): void {
92
+ if (!measurer) return;
93
+ // C reads agget(sg, "label"), which returns the value seeded at subgraph
94
+ // creation from the nearest ancestor's default (agmakeattrs copies the parent
95
+ // dict's defvals). So a cluster with no label of its own inherits a parent
96
+ // cluster's — or even the root graph's — label. graphviz #1323's nested
97
+ // cluster_mount1/cluster_mount2 (label commented out) inherit the enclosing
98
+ // cluster_vfsmount's "struct vfsmount" and each render it.
99
+ // @see lib/common/input.c:844 do_graph_label — agget(sg, "label")
100
+ // @see lib/cgraph/attr.c:165 agmakeattrs — copies parent defvals at creation
101
+ const str = graphAttrInherited(sg, 'label');
102
+ if (!str) return;
103
+
104
+ const { fontsize, fontname, fontcolor } = readFontParams(sg);
105
+ const isHtml = isHtmlValue(str);
106
+ const content = isHtml ? htmlValueContent(str) : str;
107
+ const label = makeAnyLabel(content, isHtml, { fontname, fontsize, fontcolor }, measurer, sg);
108
+ sg.info.label = label;
109
+ sg.root.info.has_labels |= GRAPH_LABEL;
110
+
111
+ if (sg === sg.root) return;
112
+ sg.info.label_pos = readLabelPos(sg);
113
+ applyLabelBorder(sg, { x: label.dimen.x + 4 * GAP, y: label.dimen.y + 2 * GAP });
114
+ }