@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,734 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * JSON and JSON0 renderer plugins.
5
+ *
6
+ * Ports plugin/core/gvrender_core_json.c — FORMAT_JSON and FORMAT_JSON0.
7
+ * FORMAT_DOT_JSON and FORMAT_XDOT_JSON are out of scope (AD-12).
8
+ *
9
+ * ## Draw-op / layout-attr sourcing (mirrors C's json_begin_graph)
10
+ *
11
+ * C's `json_begin_graph` (FORMAT_JSON) clones the GVC and runs a full
12
+ * `gvRender(gvc, g, "xdot", NULL)` over the already-laid-out graph. That xdot
13
+ * pass attaches every draw string (`_draw_`, `_ldraw_`, ...) plus the layout
14
+ * attributes (`pos`, `width`, `height`, `bb`, `xdotversion`) to the graph
15
+ * objects as cgraph string attributes; `json_end_graph` then serializes them,
16
+ * re-parsing each xdot draw string into an array of typed op objects
17
+ * (`write_xdot`). This port mirrors that literally: it re-renders the laid-out
18
+ * graph to xdot text via a fresh context and parses the text back (the same
19
+ * technique as `getDrawOps`/`layoutAndRenderXdot`), then looks each object's
20
+ * draw + layout attributes up by identity. Structure (subgraph tree, node/edge
21
+ * membership) and user/inherited attributes come from the ORIGINAL laid-out
22
+ * graph — the same object C's `json_end_graph` walks — because the port's xdot
23
+ * writer omits user attributes (color/label/shape) and filters "irrelevant"
24
+ * subgraphs, so the xdot re-parse alone is not a faithful source of structure.
25
+ *
26
+ * Output is emitted as a semantically-equivalent JSON value tree
27
+ * (`JSON.stringify`); byte-for-byte formatting is not required — the
28
+ * conformance bar is the semantic `compare-json` comparator (±0.01, colors /
29
+ * fonts canonicalized). `stoj`/`ind` are retained as the C-faithful string
30
+ * helpers referenced by the unit tests.
31
+ *
32
+ * @see plugin/core/gvrender_core_json.c
33
+ */
34
+
35
+ import type { Graph } from '../model/graph.js';
36
+ import type { Node } from '../model/node.js';
37
+ import type { Edge } from '../model/edge.js';
38
+ import type { Point } from '../model/geom.js';
39
+ import type { TextSpan } from '../common/emit-types.js';
40
+ import type { RendererPlugin } from '../gvc/context.js';
41
+ import type { RenderJob } from '../gvc/job.js';
42
+ import type { XdotOp, XdotColor } from '../xdot/types.js';
43
+ import type { TextlabelT, FieldT } from '../common/types.js';
44
+ import { printNum, gfmt5, XdotRenderer, type XdotDraws } from './dot.js';
45
+ import { CHAR_LATIN1 } from '../common/graph-init.js';
46
+ import { parse } from '../parser/index.js';
47
+ import { render as deviceRender } from '../gvc/device.js';
48
+ import { createDefaultContext } from '../gvc/default-context.js';
49
+ import { parseXDot } from '../xdot/index.js';
50
+ import { isHtmlValue, htmlValueContent } from '../common/html-string.js';
51
+
52
+ // ---------------------------------------------------------------------------
53
+ // Constants
54
+ // ---------------------------------------------------------------------------
55
+
56
+ /** Draw-op attribute names re-serialized as typed op arrays. @see isXDot */
57
+ const XDOT_ATTR_NAMES: ReadonlySet<string> = new Set([
58
+ '_draw_', '_ldraw_', '_hdraw_', '_tdraw_', '_hldraw_', '_tldraw_',
59
+ ]);
60
+
61
+ /** Built-in node label default installed by graphviz (`\N`). Emitted for every
62
+ * node with no explicit/inherited label. @see lib/common/input.c NODENAME */
63
+ const DEFAULT_NODE_LABEL = '\\N';
64
+
65
+ /** Loosely-typed JSON value tree, serialized with JSON.stringify. */
66
+ type JVal = string | number | boolean | JVal[] | JObj;
67
+ interface JObj { [k: string]: JVal; }
68
+
69
+ // ---------------------------------------------------------------------------
70
+ // stoj — @see plugin/core/gvrender_core_json.c:stoj
71
+ // ---------------------------------------------------------------------------
72
+
73
+ /** Convert a dot string to a JSON-embedded string (with surrounding quotes). */
74
+ export function stoj(s: string): string {
75
+ let r = '"';
76
+ for (const c of s) {
77
+ switch (c) {
78
+ case '"': r += '\\"'; break;
79
+ case '\\': r += '\\\\'; break;
80
+ case '/': r += '\\/'; break;
81
+ case '\b': r += '\\b'; break;
82
+ case '\f': r += '\\f'; break;
83
+ case '\n': r += '\\n'; break;
84
+ case '\r': r += '\\r'; break;
85
+ case '\t': r += '\\t'; break;
86
+ default: r += c;
87
+ }
88
+ }
89
+ return r + '"';
90
+ }
91
+
92
+ // ---------------------------------------------------------------------------
93
+ // indent — @see plugin/core/gvrender_core_json.c:indent
94
+ // ---------------------------------------------------------------------------
95
+
96
+ export function ind(level: number): string {
97
+ return ' '.repeat(level);
98
+ }
99
+
100
+ // ---------------------------------------------------------------------------
101
+ // isXDot — @see plugin/core/gvrender_core_json.c:isXDot
102
+ // ---------------------------------------------------------------------------
103
+
104
+ function isXDot(name: string): boolean {
105
+ return XDOT_ATTR_NAMES.has(name);
106
+ }
107
+
108
+ // ---------------------------------------------------------------------------
109
+ // Draw-op serialization — @see plugin/core/gvrender_core_json.c:write_xdot
110
+ // ---------------------------------------------------------------------------
111
+
112
+ /** Flatten an xdot polyline to `[[x,y],...]`. @see write_polyline */
113
+ function opPoints(pts: ReadonlyArray<{ x: number; y: number }>): JVal[] {
114
+ return pts.map((p) => [p.x, p.y] as JVal);
115
+ }
116
+
117
+ /** Gradient stops as `[{frac,color},...]`. @see write_stops */
118
+ function gradStops(stops: ReadonlyArray<{ frac: number; color: string }>): JVal[] {
119
+ return stops.map((s) => ({ frac: s.frac, color: s.color } as JObj));
120
+ }
121
+
122
+ /** Serialize a gradient color op. @see write_xdot xd_grad_* / write_*_grad */
123
+ function gradColorOp(op: 'C' | 'c', c: XdotColor): JObj {
124
+ if (c.type === 'none') {
125
+ return { op, grad: 'none', color: c.clr };
126
+ }
127
+ if (c.type === 'linear') {
128
+ const g = c.ling;
129
+ return { op, grad: 'linear', p0: [g.x0, g.y0], p1: [g.x1, g.y1], stops: gradStops(g.stops) };
130
+ }
131
+ const g = c.ring;
132
+ return {
133
+ op, grad: 'radial',
134
+ p0: [g.x0, g.y0, g.r0], p1: [g.x1, g.y1, g.r1], stops: gradStops(g.stops),
135
+ };
136
+ }
137
+
138
+ /** Serialize one parsed xdot op to its JSON op-object shape. @see write_xdot */
139
+ function opToJson(op: XdotOp, isLatin: boolean): JObj {
140
+ switch (op.kind) {
141
+ case 'filled_ellipse':
142
+ case 'unfilled_ellipse': {
143
+ const e = op.ellipse;
144
+ return { op: op.kind === 'filled_ellipse' ? 'E' : 'e', rect: [e.x, e.y, e.w, e.h] };
145
+ }
146
+ case 'filled_polygon':
147
+ case 'unfilled_polygon':
148
+ return { op: op.kind === 'filled_polygon' ? 'P' : 'p', points: opPoints(op.polygon.pts) };
149
+ case 'filled_bezier':
150
+ case 'unfilled_bezier':
151
+ return { op: op.kind === 'filled_bezier' ? 'B' : 'b', points: opPoints(op.bezier.pts) };
152
+ case 'polyline':
153
+ return { op: 'L', points: opPoints(op.polyline.pts) };
154
+ case 'text': {
155
+ const t = op.text;
156
+ const align = t.align === 'left' ? 'l' : t.align === 'center' ? 'c' : 'r';
157
+ // charset=latin1: draw text is stored already-UTF-8, so C's stoj pass
158
+ // double-encodes it (unlike raw-stored attribute values). @see latin1Reencode
159
+ return { op: 'T', pt: [t.x, t.y], align, width: t.width,
160
+ text: isLatin ? latin1Reencode(t.text) : t.text };
161
+ }
162
+ case 'fill_color':
163
+ case 'pen_color':
164
+ return { op: op.kind === 'fill_color' ? 'C' : 'c', grad: 'none', color: op.color };
165
+ case 'grad_fill_color':
166
+ case 'grad_pen_color':
167
+ return gradColorOp(op.kind === 'grad_fill_color' ? 'C' : 'c', op.gradColor);
168
+ case 'font':
169
+ return { op: 'F', size: op.font.size, face: op.font.name };
170
+ case 'style':
171
+ return { op: 'S', style: op.style };
172
+ case 'fontchar':
173
+ return { op: 't', fontchar: op.fontchar };
174
+ case 'image':
175
+ // C's write_xdot emits an empty op object for xd_image (no fields).
176
+ return {};
177
+ }
178
+ }
179
+
180
+ /** Parse an xdot draw string into its JSON op-object array. @see write_xdots */
181
+ function drawStringToOps(val: string, isLatin: boolean): JVal[] {
182
+ if (val === '') return [];
183
+ const parsed = parseXDot(val);
184
+ if (parsed === null) return [];
185
+ return parsed.ops.map((op) => opToJson(op, isLatin));
186
+ }
187
+
188
+ // ---------------------------------------------------------------------------
189
+ // Draw / layout attribute lookup — mirrors json_begin_graph's xdot render
190
+ // ---------------------------------------------------------------------------
191
+
192
+ /** Per-object xdot/layout attribute strings, keyed by identity. */
193
+ interface DrawLookup {
194
+ /** Root-graph xdot attrs (`_draw_`, `bb`, `xdotversion`, ...). */
195
+ graph: Map<string, string>;
196
+ /** Node xdot/layout attrs by node name. */
197
+ node: Map<string, Map<string, string>>;
198
+ /** Cluster xdot/layout attrs, keyed by the original-graph cluster object
199
+ * (name is ambiguous — see collectDrawLookup). */
200
+ cluster: Map<Graph, Map<string, string>>;
201
+ /** Edge xdot/layout attrs by the original graph's Edge object. */
202
+ edge: Map<Edge, Map<string, string>>;
203
+ }
204
+
205
+ /** Root edges in agfstnode/agfstout order, each tagged with its canonical
206
+ * `tail head occurrence` key (stable across the port/xdot re-parse). */
207
+ function canonicalRootEdges(g: Graph): Array<{ e: Edge; key: string }> {
208
+ const out: Array<{ e: Edge; key: string }> = [];
209
+ const counter = new Map<string, number>();
210
+ for (const [, n] of g.nodes) {
211
+ for (const e of n.outEdges(g)) {
212
+ const base = e.tail.name + '' + e.head.name;
213
+ const occ = counter.get(base) ?? 0;
214
+ counter.set(base, occ + 1);
215
+ out.push({ e, key: base + '' + occ });
216
+ }
217
+ }
218
+ return out;
219
+ }
220
+
221
+ /** XdotDraws field → xdot draw-attribute name. */
222
+ const DRAW_FIELDS: ReadonlyArray<readonly [keyof XdotDraws, string]> = [
223
+ ['draw', '_draw_'], ['ldraw', '_ldraw_'], ['hdraw', '_hdraw_'],
224
+ ['tdraw', '_tdraw_'], ['hldraw', '_hldraw_'], ['tldraw', '_tldraw_'],
225
+ ];
226
+
227
+ /** Overlay an object's pre-serialization draw strings onto its attr map,
228
+ * replacing the DOT-round-trip values (which drop a `\` before a `"`). */
229
+ function applyDraws(attrs: Map<string, string> | undefined, d: XdotDraws | undefined): void {
230
+ if (attrs === undefined || d === undefined) return;
231
+ for (const [field, attr] of DRAW_FIELDS) {
232
+ const v = d[field];
233
+ if (v !== undefined) attrs.set(attr, v);
234
+ }
235
+ }
236
+
237
+ /** Re-render the laid-out graph to xdot and index every object's draw/layout
238
+ * attributes by identity. Returns `undefined` if the re-render fails (e.g. a
239
+ * hand-built graph with no real layout state) so callers fall back cleanly. */
240
+ function collectDrawLookup(g: Graph): DrawLookup | undefined {
241
+ let xg: Graph;
242
+ // Inject our own XdotRenderer (last-registered wins bestRenderer) so we can
243
+ // read its per-object draw strings AFTER the render: the DOT-text re-parse
244
+ // below is faithful for coordinates but LOSSY for draw text containing `"`
245
+ // (a DOT quoted string cannot hold `\` before `"`; a cluster label's `\"`
246
+ // round-trips to `"`, id 2239). The draws map holds the pre-serialization
247
+ // strings C's -Tjson reads directly, so we overlay them onto the re-parse.
248
+ const xr = new XdotRenderer();
249
+ try {
250
+ const ctx = createDefaultContext();
251
+ ctx.register(xr);
252
+ const xdotText = deviceRender(ctx, g, 'xdot');
253
+ xg = parse(xdotText);
254
+ } catch {
255
+ return undefined;
256
+ }
257
+ const draws = xr.drawStringsByObject();
258
+ const node = new Map<string, Map<string, string>>();
259
+ for (const [nm, xn] of xg.nodes) node.set(nm, new Map(xn.attrs));
260
+ // Correlate each original-graph cluster with its xdot-re-render attrs by a
261
+ // PARALLEL walk keyed on the cluster OBJECT, not its name. A bare-name Map
262
+ // collides when two clusters share a name at different tree depths (empty
263
+ // `cluster_1` in `cluster_0` + a real top-level `cluster_1` — graphs-b7).
264
+ // xg holds only the drawable clusters (the xdot writer drops anonymous/rank
265
+ // subgraphs), so when a g-child has no same-named xg-child at this level it
266
+ // is a filtered non-cluster (or a cluster nested under one): descend g but
267
+ // hold the xg position, matching xg's flattened cluster tree (1436).
268
+ const cluster = new Map<Graph, Map<string, string>>();
269
+ const correlate = (gSub: Graph, xgSub: Graph): void => {
270
+ for (const [nm, gChild] of gSub.subgraphs) {
271
+ const xgChild = xgSub.subgraphs.get(nm);
272
+ if (xgChild !== undefined) {
273
+ cluster.set(gChild, new Map(xgChild.attrs));
274
+ correlate(gChild, xgChild);
275
+ } else {
276
+ correlate(gChild, xgSub);
277
+ }
278
+ }
279
+ };
280
+ correlate(g, xg);
281
+ // Edge draw attrs: match g-edges to xg-edges by the shared canonical key.
282
+ const xByKey = new Map<string, Map<string, string>>();
283
+ for (const { e, key } of canonicalRootEdges(xg)) xByKey.set(key, new Map(e.attrs));
284
+ const edge = new Map<Edge, Map<string, string>>();
285
+ for (const { e, key } of canonicalRootEdges(g)) {
286
+ const a = xByKey.get(key);
287
+ if (a !== undefined) edge.set(e, a);
288
+ }
289
+ const graphAttrs = new Map(xg.attrs);
290
+ // Overlay the lossless per-object draw strings, keyed by the ORIGINAL object,
291
+ // over the (coordinate-faithful but draw-text-lossy) re-parsed attrs.
292
+ applyDraws(graphAttrs, draws.get(g));
293
+ for (const [nm, gn] of g.nodes) applyDraws(node.get(nm), draws.get(gn));
294
+ for (const [gc, attrs] of cluster) applyDraws(attrs, draws.get(gc));
295
+ for (const [ge, attrs] of edge) applyDraws(attrs, draws.get(ge));
296
+ return { graph: graphAttrs, node, cluster, edge };
297
+ }
298
+
299
+ // ---------------------------------------------------------------------------
300
+ // Object-id assignment — @see write_graph / label_subgs
301
+ // ---------------------------------------------------------------------------
302
+
303
+ interface BuildCtx {
304
+ doXDot: boolean;
305
+ draws?: DrawLookup;
306
+ sgcnt: number;
307
+ subgGid: Map<Graph, number>;
308
+ nodeGid: Map<Node, number>;
309
+ edgeGid: Map<Edge, number>;
310
+ /** All subgraphs in DFS preorder (the flat top-level "objects" ordering). */
311
+ dfsSubs: Graph[];
312
+ /** True once any edge (or edge default) declares `label`: cgraph then carries
313
+ * a global `label` edge symbol, and write_attrs emits `label` (its value or
314
+ * the empty default) on EVERY edge — the empty-value skip exempts `label`.
315
+ * @see write_attrs (`*attrval=='\0' && !streq(sym->name,"label")`) */
316
+ edgeLabelDeclared: boolean;
317
+ /** Same as `edgeLabelDeclared`, for the graph-type `label` symbol: once any
318
+ * graph or cluster carries a label, the root and every subgraph emit `label`
319
+ * (their own value or the empty default). @see write_attrs label exemption */
320
+ graphLabelDeclared: boolean;
321
+ /** charset=latin1: draw-op text was stored already-UTF-8, so C's `stoj`
322
+ * double-encodes it. @see latin1Reencode */
323
+ isLatin: boolean;
324
+ }
325
+
326
+ /** Whether a graph-type `label` symbol is declared anywhere (root, any cluster,
327
+ * or subgraph carries a label). @see BuildCtx.graphLabelDeclared */
328
+ function isGraphLabelDeclared(g: Graph): boolean {
329
+ if (g.attrs.has('label')) return true;
330
+ const lbl = graphLabel(g.info);
331
+ if (lbl !== undefined && lbl.text !== '') return true;
332
+ for (const [, sg] of g.subgraphs) if (isGraphLabelDeclared(sg)) return true;
333
+ return false;
334
+ }
335
+
336
+ /** Effective graph attributes: a subgraph inherits its enclosing graphs'
337
+ * graph-attribute values (agxget inheritance), captured at build time in
338
+ * `graphDefaultsSnapshot`; the root uses only its own. */
339
+ function graphEffectiveAttrs(g: Graph, top: boolean): Map<string, string> {
340
+ if (top) return g.attrs;
341
+ const m = new Map<string, string>(g.graphDefaultsSnapshot ?? []);
342
+ for (const [k, v] of g.attrs) m.set(k, v);
343
+ return m;
344
+ }
345
+
346
+ /** Whether a `label` edge attribute symbol is declared anywhere in the graph
347
+ * (an explicit edge label or an `edge [label=...]` default). */
348
+ function isEdgeLabelDeclared(g: Graph): boolean {
349
+ for (const e of g.edges) if (e.attrs.has('label')) return true;
350
+ const walk = (sg: Graph): boolean => {
351
+ if (sg.edgeDefaults.has('label')) return true;
352
+ for (const [, sub] of sg.subgraphs) if (walk(sub)) return true;
353
+ return false;
354
+ };
355
+ return walk(g);
356
+ }
357
+
358
+ /** DFS preorder over the subgraph tree. @see label_subgs recursion order */
359
+ function dfsSubgraphs(g: Graph, out: Graph[]): void {
360
+ for (const [, sg] of g.subgraphs) {
361
+ out.push(sg);
362
+ dfsSubgraphs(sg, out);
363
+ }
364
+ }
365
+
366
+ /** Assign every object its `_gvid`, mirroring write_graph's top-level pass:
367
+ * subgraphs DFS-preorder 0..sgcnt-1, then nodes sgcnt.., then edges 0.. in
368
+ * agfstnode/agfstout order. @see plugin/core/gvrender_core_json.c:write_graph */
369
+ function assignIds(g: Graph, doXDot: boolean, draws?: DrawLookup): BuildCtx {
370
+ const dfsSubs: Graph[] = [];
371
+ dfsSubgraphs(g, dfsSubs);
372
+ const subgGid = new Map<Graph, number>();
373
+ dfsSubs.forEach((sg, i) => subgGid.set(sg, i));
374
+ const sgcnt = dfsSubs.length;
375
+ const nodeGid = new Map<Node, number>();
376
+ let ncnt = 0;
377
+ for (const [, n] of g.nodes) nodeGid.set(n, sgcnt + ncnt++);
378
+ const edgeGid = new Map<Edge, number>();
379
+ let ecnt = 0;
380
+ for (const { e } of canonicalRootEdges(g)) edgeGid.set(e, ecnt++);
381
+ return {
382
+ doXDot, draws, sgcnt, subgGid, nodeGid, edgeGid, dfsSubs,
383
+ edgeLabelDeclared: isEdgeLabelDeclared(g),
384
+ graphLabelDeclared: isGraphLabelDeclared(g),
385
+ isLatin: g.info.charset === CHAR_LATIN1,
386
+ };
387
+ }
388
+
389
+ // ---------------------------------------------------------------------------
390
+ // Attribute emission — @see write_attrs
391
+ // ---------------------------------------------------------------------------
392
+
393
+ /**
394
+ * Emit an object's attributes into `o`, mirroring C's write_attrs: `agxget`
395
+ * returns HTML-string content with the marker stripped, empty non-`label`
396
+ * values are skipped, and xdot draw attrs are re-serialized as op arrays.
397
+ * `base` carries user/inherited attrs; `overlay` (from the xdot re-render)
398
+ * supplies the post-layout `pos`/`width`/`height`/`bb`/draw strings and wins
399
+ * on conflict.
400
+ */
401
+ function emitAttrs(
402
+ o: JObj,
403
+ base: Map<string, string>,
404
+ overlay: Map<string, string> | undefined,
405
+ ctx: BuildCtx,
406
+ ): void {
407
+ const merged = new Map(base);
408
+ if (overlay !== undefined) for (const [k, v] of overlay) merged.set(k, v);
409
+ for (const [k, rawV] of merged) {
410
+ // agxget mirror: HTML strings surface as their marker-stripped content.
411
+ const v = isHtmlValue(rawV) ? htmlValueContent(rawV) : rawV;
412
+ if (v === '' && k !== 'label') continue;
413
+ if (ctx.doXDot && isXDot(k)) {
414
+ o[k] = drawStringToOps(v, ctx.isLatin);
415
+ } else if (!isXDot(k)) {
416
+ o[k] = v;
417
+ }
418
+ // json0 (!doXDot): xdot draw attrs are not emitted at all.
419
+ }
420
+ }
421
+
422
+ // ---------------------------------------------------------------------------
423
+ // Label geometry — @see attach_attrs_and_arrows / rec_attach_bb (output.c)
424
+ // ---------------------------------------------------------------------------
425
+ //
426
+ // The port's xdot writer omits the label-geometry attributes that native
427
+ // attach_attrs sets (`lp` for labeled edges; `lp`/`lwidth`/`lheight` for
428
+ // labeled graphs and clusters), so they are sourced here directly from the
429
+ // laid-out model. yDir is identity for the common (non-rankdir=BT/RL) case —
430
+ // coordinates are stored post-layout in the output frame, matching node `pos`.
431
+
432
+ /** The TextlabelT on a graph/cluster info, or undefined. */
433
+ function graphLabel(info: { label?: unknown }): TextlabelT | undefined {
434
+ const l = info.label;
435
+ if (l !== undefined && l !== null && typeof l === 'object' && 'pos' in l) {
436
+ return l as TextlabelT;
437
+ }
438
+ return undefined;
439
+ }
440
+
441
+ /** Format a label position as `x,y`. @see attach_attrs (yDir identity). */
442
+ function labelPos(l: TextlabelT): string {
443
+ return gfmt5(l.pos.x) + ',' + gfmt5(l.pos.y);
444
+ }
445
+
446
+ /** Attach edge label positions the port's xdot writer omits: `lp` (center
447
+ * label), `head_lp`/`tail_lp` (end labels), and `xlp` (exterior label, only
448
+ * when its position is set). @see attach_attrs ED_label/head_label/tail_label/xlabel */
449
+ function attachEdgeLabelPositions(o: JObj, e: Edge): void {
450
+ // C attaches pos/lp/head_lp/tail_lp/xlp only inside `if (ED_spl(e))`: a
451
+ // concentrated/merged edge with no spline of its own carries none of them, so
452
+ // its label position must be omitted (2368_1, 2470). @see attach_attrs
453
+ if (!e.info.spl) return;
454
+ if (e.info.label !== undefined) o.lp = labelPos(e.info.label);
455
+ if (e.info.head_label !== undefined) o.head_lp = labelPos(e.info.head_label);
456
+ if (e.info.tail_label !== undefined) o.tail_lp = labelPos(e.info.tail_label);
457
+ const xl = e.info.xlabel as TextlabelT | undefined;
458
+ if (xl !== undefined && xl.set) o.xlp = labelPos(xl);
459
+ }
460
+
461
+ /** Attach a node's exterior-label position `xlp` when set.
462
+ * @see attach_attrs (ND_xlabel && ->set -> "xlp") */
463
+ function attachNodeXlp(o: JObj, n: Node): void {
464
+ const xl = n.info.xlabel as TextlabelT | undefined;
465
+ if (xl !== undefined && xl.set) o.xlp = labelPos(xl);
466
+ }
467
+
468
+ /** Attach `lp`/`lwidth`/`lheight` for a labeled graph/cluster.
469
+ * @see rec_attach_bb (GD_label -> "lp"/"lwidth"/"lheight") */
470
+ function attachGraphLabelGeom(o: JObj, g: Graph): void {
471
+ const lbl = graphLabel(g.info);
472
+ if (lbl !== undefined && lbl.text !== '') {
473
+ o.lp = gfmt5(lbl.pos.x) + ',' + gfmt5(lbl.pos.y);
474
+ o.lwidth = (lbl.dimen.x / 72).toFixed(2);
475
+ o.lheight = (lbl.dimen.y / 72).toFixed(2);
476
+ }
477
+ }
478
+
479
+ /** Recursively collect a record node's leaf-field rectangles (node-relative
480
+ * box + node coord), each `LLx,LLy,URx,URy` rounded. @see set_record_rects */
481
+ function setRecordRects(f: FieldT, coord: Point, out: string[]): void {
482
+ if (f.n_flds === 0) {
483
+ out.push(
484
+ gfmt5(f.b.ll.x + coord.x) + ',' + gfmt5(f.b.ll.y + coord.y) + ',' +
485
+ gfmt5(f.b.ur.x + coord.x) + ',' + gfmt5(f.b.ur.y + coord.y),
486
+ );
487
+ } else if (f.fld !== null) {
488
+ for (const sub of f.fld) setRecordRects(sub, coord, out);
489
+ }
490
+ }
491
+
492
+ /** Attach `rects` for a record-shape node. @see attach_attrs (ND_shape==record) */
493
+ function attachNodeRects(o: JObj, n: Node): void {
494
+ const shape = n.info.shape as { name?: string } | undefined;
495
+ if (shape?.name !== 'record') return;
496
+ const f = n.info.shape_info as FieldT | undefined;
497
+ if (f === undefined) return;
498
+ const parts: string[] = [];
499
+ setRecordRects(f, n.info.coord, parts);
500
+ if (parts.length > 0) o.rects = parts.join(' ');
501
+ }
502
+
503
+ // ---------------------------------------------------------------------------
504
+ // Node / edge object builders — @see write_node / write_edge
505
+ // ---------------------------------------------------------------------------
506
+
507
+ /** Effective node attributes: inherited defaults, explicit overrides, and the
508
+ * built-in `\N` label default. Mirrors agnxtattr/agxget resolution. */
509
+ function nodeEffectiveAttrs(n: Node): Map<string, string> {
510
+ const m = new Map<string, string>(n.nodeDefaultsSnapshot ?? []);
511
+ for (const [k, v] of n.attrs) m.set(k, v);
512
+ if (!m.has('label')) m.set('label', DEFAULT_NODE_LABEL);
513
+ return m;
514
+ }
515
+
516
+ /** @see plugin/core/gvrender_core_json.c:write_node (top) */
517
+ function buildNodeObject(n: Node, ctx: BuildCtx): JObj {
518
+ const o: JObj = { _gvid: ctx.nodeGid.get(n)!, name: n.name };
519
+ const eff = nodeEffectiveAttrs(n);
520
+ const xd = ctx.draws?.node.get(n.name);
521
+ if (xd === undefined) {
522
+ // Fallback (json0 / hand-built graph): synthesize the layout attrs the
523
+ // xdot render would otherwise supply, from the laid-out node.
524
+ eff.set('pos', printNum(n.info.coord.x) + ',' + printNum(n.info.coord.y));
525
+ eff.set('width', printNum(n.info.width));
526
+ eff.set('height', printNum(n.info.height));
527
+ }
528
+ emitAttrs(o, eff, xd, ctx);
529
+ attachNodeRects(o, n);
530
+ attachNodeXlp(o, n);
531
+ // Only synthesize an empty `_draw_` when the whole xdot re-render failed
532
+ // (hand-built graph / no layout state). When the re-render succeeded, an
533
+ // object with no draw string genuinely has no `_draw_` — the oracle omits
534
+ // the key too, so forcing it here would be a spurious divergence.
535
+ if (ctx.doXDot && ctx.draws === undefined && !('_draw_' in o)) o._draw_ = [];
536
+ return o;
537
+ }
538
+
539
+ /** @see plugin/core/gvrender_core_json.c:write_edge (top) */
540
+ function buildEdgeObject(e: Edge, ctx: BuildCtx): JObj {
541
+ const o: JObj = {
542
+ _gvid: ctx.edgeGid.get(e)!,
543
+ tail: ctx.nodeGid.get(e.tail)!,
544
+ head: ctx.nodeGid.get(e.head)!,
545
+ };
546
+ emitAttrs(o, e.attrs, ctx.draws?.edge.get(e), ctx);
547
+ // A declared `label` edge symbol makes write_attrs emit `label` on every
548
+ // edge — the empty value included. @see BuildCtx.edgeLabelDeclared
549
+ if (ctx.edgeLabelDeclared && !('label' in o)) o.label = '';
550
+ attachEdgeLabelPositions(o, e);
551
+ if (ctx.doXDot && ctx.draws === undefined && !('_draw_' in o)) o._draw_ = [];
552
+ return o;
553
+ }
554
+
555
+ // ---------------------------------------------------------------------------
556
+ // Graph / subgraph object builder — @see write_graph / write_subgs
557
+ // ---------------------------------------------------------------------------
558
+
559
+ /** Member edges of a (sub)graph in AGSEQ order, as `_gvid` ints.
560
+ * @see write_edges (agfstnode/agfstout collection + agseqasc qsort) */
561
+ function memberEdgeGids(g: Graph, ctx: BuildCtx): number[] {
562
+ const edges: Edge[] = [];
563
+ for (const [, n] of g.nodes) {
564
+ for (const e of n.outEdges(g)) {
565
+ if (ctx.edgeGid.has(e)) edges.push(e);
566
+ }
567
+ }
568
+ edges.sort((a, b) => a.seq - b.seq);
569
+ return edges.map((e) => ctx.edgeGid.get(e)!);
570
+ }
571
+
572
+ /** Full edge objects for the top graph, AGSEQ-ordered. @see write_edges (top) */
573
+ function buildEdgesArray(g: Graph, ctx: BuildCtx): JObj[] {
574
+ const edges = canonicalRootEdges(g).map(({ e }) => e);
575
+ edges.sort((a, b) => a.seq - b.seq);
576
+ return edges.map((e) => buildEdgeObject(e, ctx));
577
+ }
578
+
579
+ /** @see plugin/core/gvrender_core_json.c:write_graph */
580
+ function buildGraphObject(g: Graph, top: boolean, ctx: BuildCtx): JObj {
581
+ const o: JObj = {};
582
+ // write_hdr
583
+ o.name = g.name;
584
+ if (top) {
585
+ o.directed = g.kind === 'directed' || g.kind === 'strict-directed';
586
+ o.strict = g.kind === 'strict-directed' || g.kind === 'strict-undirected';
587
+ }
588
+ // write_attrs (subgraphs inherit enclosing graph attrs via agxget)
589
+ const overlay = top ? ctx.draws?.graph : ctx.draws?.cluster.get(g);
590
+ emitAttrs(o, graphEffectiveAttrs(g, top), overlay, ctx);
591
+ attachGraphLabelGeom(o, g);
592
+ // A declared graph `label` symbol makes write_attrs emit `label` on every
593
+ // graph object — the empty value included. @see BuildCtx.graphLabelDeclared
594
+ if (ctx.graphLabelDeclared && !('label' in o)) o.label = '';
595
+ // _subgraph_cnt (top) / _gvid (subgraph)
596
+ if (top) {
597
+ o._subgraph_cnt = ctx.sgcnt;
598
+ } else {
599
+ o._gvid = ctx.subgGid.get(g)!;
600
+ }
601
+
602
+ if (top) {
603
+ // "objects": all subgraphs (DFS preorder) then all node objects. Emitted
604
+ // only when the graph has any subgraph or node. @see write_subgs/write_nodes
605
+ if (ctx.dfsSubs.length > 0 || g.nodes.size > 0) {
606
+ const objects: JObj[] = [];
607
+ for (const sg of ctx.dfsSubs) objects.push(buildGraphObject(sg, false, ctx));
608
+ for (const [, n] of g.nodes) objects.push(buildNodeObject(n, ctx));
609
+ o.objects = objects;
610
+ }
611
+ } else {
612
+ // Member reference lists (int _gvid arrays), each only when non-empty.
613
+ const childGids: number[] = [];
614
+ for (const [, sg] of g.subgraphs) childGids.push(ctx.subgGid.get(sg)!);
615
+ if (childGids.length > 0) o.subgraphs = childGids;
616
+ const nodeGids: number[] = [];
617
+ for (const [, n] of g.nodes) {
618
+ const gid = ctx.nodeGid.get(n);
619
+ if (gid !== undefined) nodeGids.push(gid);
620
+ }
621
+ if (nodeGids.length > 0) o.nodes = nodeGids;
622
+ const eGids = memberEdgeGids(g, ctx);
623
+ if (eGids.length > 0) o.edges = eGids;
624
+ }
625
+
626
+ // write_edges (top only — the flat full-edge array)
627
+ if (top) {
628
+ const edges = buildEdgesArray(g, ctx);
629
+ if (edges.length > 0) o.edges = edges;
630
+ }
631
+ return o;
632
+ }
633
+
634
+ // ---------------------------------------------------------------------------
635
+ // buildJson — @see plugin/core/gvrender_core_json.c:write_graph (top entry)
636
+ // ---------------------------------------------------------------------------
637
+
638
+ /**
639
+ * Reinterpret a string's UTF-8 bytes as Latin-1 code points. Mirrors C's
640
+ * `stoj` applying `latin1ToUTF8` a SECOND time to text that input processing
641
+ * already converted latin1→UTF-8, when `charset=latin1`. The double pass is a
642
+ * graphviz quirk (the SVG backend does not do it), so `-Tjson` on a latin1
643
+ * graph emits mojibake — `á` becomes `á`. No-op on pure ASCII.
644
+ * @see plugin/core/gvrender_core_json.c:82,121 stoj (sp->isLatin branch)
645
+ */
646
+ function latin1Reencode(s: string): string {
647
+ const bytes = new TextEncoder().encode(s);
648
+ let out = '';
649
+ for (const b of bytes) out += String.fromCharCode(b);
650
+ return out;
651
+ }
652
+
653
+ export function buildJson(g: Graph, doXDot: boolean): string {
654
+ const draws = doXDot ? collectDrawLookup(g) : undefined;
655
+ const ctx = assignIds(g, doXDot, draws);
656
+ const root = buildGraphObject(g, true, ctx);
657
+ return JSON.stringify(root, null, 2) + '\n';
658
+ }
659
+
660
+ // ---------------------------------------------------------------------------
661
+ // Json0Renderer
662
+ // ---------------------------------------------------------------------------
663
+
664
+ /**
665
+ * JSON0 renderer — position data only, no xdot draw operations.
666
+ *
667
+ * @see plugin/core/gvrender_core_json.c FORMAT_JSON0
668
+ */
669
+ export class Json0Renderer implements RendererPlugin {
670
+ readonly type = 'json0';
671
+ /** @see plugin/core/gvplugin_core.c registration table */
672
+ readonly quality = 0;
673
+
674
+ beginGraph(_g: Graph, _job: RenderJob): void { /* no-op */ }
675
+
676
+ endGraph(g: Graph, job: RenderJob): void {
677
+ job.write(buildJson(g, false));
678
+ }
679
+
680
+ beginNode(_n: Node, _job: RenderJob): void { /* no-op */ }
681
+ endNode(_n: Node, _job: RenderJob): void { /* no-op */ }
682
+ beginEdge(_e: Edge, _job: RenderJob): void { /* no-op */ }
683
+ endEdge(_e: Edge, _job: RenderJob): void { /* no-op */ }
684
+ textspan(_pos: Point, _span: TextSpan, _job: RenderJob): void { /* no-op */ }
685
+ ellipse(_c: Point, _rx: number, _ry: number, _f: boolean, _j: RenderJob): void { /* no-op */ }
686
+ polygon(_pts: Point[], _filled: boolean, _job: RenderJob): void { /* no-op */ }
687
+ bezier(_pts: Point[], _filled: boolean, _job: RenderJob): void { /* no-op */ }
688
+ polyline(_pts: Point[], _job: RenderJob): void { /* no-op */ }
689
+ }
690
+
691
+ // ---------------------------------------------------------------------------
692
+ // JsonRenderer
693
+ // ---------------------------------------------------------------------------
694
+
695
+ /**
696
+ * JSON renderer — position data plus _draw_ arrays.
697
+ *
698
+ * @see plugin/core/gvrender_core_json.c FORMAT_JSON
699
+ */
700
+ export class JsonRenderer implements RendererPlugin {
701
+ readonly type = 'json';
702
+ /** @see plugin/core/gvplugin_core.c registration table */
703
+ readonly quality = 0;
704
+
705
+ beginGraph(_g: Graph, _job: RenderJob): void { /* no-op */ }
706
+
707
+ endGraph(g: Graph, job: RenderJob): void {
708
+ job.write(buildJson(g, true));
709
+ }
710
+
711
+ beginNode(_n: Node, _job: RenderJob): void { /* no-op */ }
712
+ endNode(_n: Node, _job: RenderJob): void { /* no-op */ }
713
+ beginEdge(_e: Edge, _job: RenderJob): void { /* no-op */ }
714
+ endEdge(_e: Edge, _job: RenderJob): void { /* no-op */ }
715
+ textspan(_pos: Point, _span: TextSpan, _job: RenderJob): void { /* no-op */ }
716
+ ellipse(_c: Point, _rx: number, _ry: number, _f: boolean, _j: RenderJob): void { /* no-op */ }
717
+ polygon(_pts: Point[], _filled: boolean, _job: RenderJob): void { /* no-op */ }
718
+ bezier(_pts: Point[], _filled: boolean, _job: RenderJob): void { /* no-op */ }
719
+ polyline(_pts: Point[], _job: RenderJob): void { /* no-op */ }
720
+ }
721
+
722
+ // ---------------------------------------------------------------------------
723
+ // Factory functions
724
+ // ---------------------------------------------------------------------------
725
+
726
+ /** @see plugin/core/gvrender_core_json.c FORMAT_JSON0 */
727
+ export function createJson0Renderer(): RendererPlugin {
728
+ return new Json0Renderer();
729
+ }
730
+
731
+ /** @see plugin/core/gvrender_core_json.c FORMAT_JSON */
732
+ export function createJsonRenderer(): RendererPlugin {
733
+ return new JsonRenderer();
734
+ }