@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,192 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * Label construction for plain-text and HTML node labels.
5
+ * Unified entry point mirrors C labels.c:make_label which branches
6
+ * internally on is_html.
7
+ *
8
+ * @see lib/common/labels.c:make_label
9
+ * @see lib/common/htmltable.c:make_html_label
10
+ */
11
+
12
+ import type { TextlabelT } from './types.js';
13
+ import type { TextMeasurer, TextSize } from './textmeasure.js';
14
+ import type { TextSpan } from './emit-types.js';
15
+ import { makeHtmlLabel } from './htmltable-pos.js';
16
+ import { substObj, type GraphObj } from './subst.js';
17
+ import { htmlEntityUTF8 } from './html-entities.js';
18
+
19
+ export const DEFAULT_FONTSIZE = 14.0;
20
+ export const DEFAULT_FONTNAME = 'Times,serif';
21
+ export const DEFAULT_COLOR = 'black';
22
+
23
+ // htmlEntityUTF8 moved to html-entities.ts (a leaf module) so the HTML lexer
24
+ // can decode entities in text runs without an import cycle. Re-exported here
25
+ // for existing callers. @see lib/common/utils.c:htmlEntityUTF8 / htmlEntity
26
+ export { htmlEntityUTF8 };
27
+
28
+ /**
29
+ * The object's pen color: `pencolor` attr, else `color` attr, else undefined
30
+ * (no default). An HTML table/cell border with no explicit COLOR inherits it.
31
+ * @see lib/common/htmltable.c:getPenColor
32
+ */
33
+ function getPenColor(obj?: GraphObj): string | undefined {
34
+ if (obj === undefined) return undefined;
35
+ const pc = obj.attrs.get('pencolor');
36
+ if (pc !== undefined && pc !== '') return pc;
37
+ const c = obj.attrs.get('color');
38
+ if (c !== undefined && c !== '') return c;
39
+ return undefined;
40
+ }
41
+
42
+ /** Font attributes bundle — mirrors C fontinfo_t fields used in label init. */
43
+ export interface FontInfo {
44
+ fontname: string;
45
+ fontsize: number;
46
+ fontcolor: string;
47
+ }
48
+
49
+ function buildSpan(
50
+ text: string,
51
+ font: FontInfo,
52
+ measured: TextSize,
53
+ ): TextSpan {
54
+ return {
55
+ str: text,
56
+ fontName: font.fontname,
57
+ fontSize: font.fontsize,
58
+ fontColor: font.fontcolor,
59
+ fontFlags: 0,
60
+ yoffset_layout: 0,
61
+ yoffset_centerline: measured.yoffsetCenterline ?? 0.05 * font.fontsize,
62
+ size: { x: measured.w, y: measured.h },
63
+ just: 'n',
64
+ };
65
+ }
66
+
67
+ /** One line split out of a label, with its justification terminator. */
68
+ interface LabelLine { text: string; just: 'n' | 'l' | 'r'; }
69
+
70
+ const isJust = (c: string | undefined): c is 'n' | 'l' | 'r' =>
71
+ c === 'n' || c === 'l' || c === 'r';
72
+
73
+ /**
74
+ * Split label text into lines at \n / \l / \r escapes and literal
75
+ * newlines; the terminator becomes the line's justification. Any other
76
+ * escape drops its backslash and keeps the following character
77
+ * (including \\ → \) — the lexer delivers escapes verbatim and this
78
+ * is where C interprets them.
79
+ * @see lib/common/labels.c:make_simple_label
80
+ */
81
+ export function splitLabelLines(text: string): LabelLine[] {
82
+ const lines: LabelLine[] = [];
83
+ let cur = '';
84
+ for (let i = 0; i < text.length; i++) {
85
+ const c = text[i]!;
86
+ if (c === '\\' && i + 1 < text.length) {
87
+ const e = text[++i]!;
88
+ if (isJust(e)) {
89
+ lines.push({ text: cur, just: e });
90
+ cur = '';
91
+ } else {
92
+ cur += e; // C default: agxbputc(&line, *p) — backslash dropped
93
+ }
94
+ } else if (c === '\n') {
95
+ lines.push({ text: cur, just: 'n' });
96
+ cur = '';
97
+ } else {
98
+ cur += c;
99
+ }
100
+ }
101
+ if (cur.length > 0) lines.push({ text: cur, just: 'n' });
102
+ return lines;
103
+ }
104
+
105
+ /** C LINESPACING — empty lines take (int)(fontsize * 1.2). @see const.h:LINESPACING */
106
+ const LINESPACING = 1.2;
107
+
108
+ /** Build one measured span for a label line. @see labels.c:storeline */
109
+ function buildLineSpan(line: LabelLine, font: FontInfo, measurer: TextMeasurer): TextSpan {
110
+ const measured = line.text.length > 0
111
+ ? measurer.measure(line.text, font.fontname, font.fontsize)
112
+ : { w: 0, h: Math.trunc(font.fontsize * LINESPACING) };
113
+ const span = buildSpan(line.text, font, measured);
114
+ span.just = line.just;
115
+ return span;
116
+ }
117
+
118
+ /** @see lib/common/labels.c:make_simple_label / storeline */
119
+ function makePlainLabel(
120
+ text: string,
121
+ font: FontInfo,
122
+ measurer: TextMeasurer,
123
+ ): TextlabelT {
124
+ const spans = splitLabelLines(text).map((ln) => buildLineSpan(ln, font, measurer));
125
+ // dimen.x = max line width; dimen.y accumulates heights; space = dimen.
126
+ const w = spans.reduce((a, sp) => Math.max(a, sp.size.x), 0);
127
+ const h = spans.reduce((a, sp) => a + sp.size.y, 0);
128
+ return {
129
+ text, ...font, charset: 0,
130
+ dimen: { x: w, y: h },
131
+ space: { x: w, y: h },
132
+ pos: { x: 0, y: 0 },
133
+ u: { kind: 'txt', span: spans, nspans: spans.length },
134
+ valign: 'c'.charCodeAt(0),
135
+ set: false, html: false,
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Create a TextlabelT for a plain-text label string.
141
+ * @see lib/common/labels.c:make_label
142
+ */
143
+ export function makeLabel(
144
+ text: string,
145
+ fontname: string,
146
+ fontsize: number,
147
+ fontcolor: string,
148
+ measurer: TextMeasurer,
149
+ ): TextlabelT {
150
+ return makePlainLabel(text, { fontname, fontsize, fontcolor }, measurer);
151
+ }
152
+
153
+ /**
154
+ * Unified label entry mirroring C labels.c:make_label(obj, str, kind).
155
+ *
156
+ * C branches on `kind & LT_HTML` (labels.c:145,147). isHtml is the port
157
+ * equivalent (aghtmlstr / HTML_STRING_MARK).
158
+ *
159
+ * Empty-string case (labels.c:119): "disregard HTML intent for empty
160
+ * string labels" — C: is_html &= !streq(str, "");
161
+ *
162
+ * Parse-failure fallback (htmltable.c:1884-1907): "Parse of label failed;
163
+ * revert to simple text label" — C sets lp->html=false and substitutes the
164
+ * object name. The port has no object context so it keeps the markup text,
165
+ * matching makeHtmlLabel's existing fallback contract.
166
+ *
167
+ * @see lib/common/labels.c:make_label
168
+ * @see lib/common/htmltable.c:make_html_label
169
+ */
170
+ export function makeAnyLabel(
171
+ content: string,
172
+ isHtml: boolean,
173
+ font: FontInfo,
174
+ measurer: TextMeasurer,
175
+ obj?: GraphObj,
176
+ ): TextlabelT {
177
+ // labels.c:119 — is_html &= !streq(str, "");
178
+ if (isHtml && content !== '') {
179
+ // labels.c:145-161; htmltable.c:1856 — on parse failure falls back to
180
+ // plain text (html=false) per htmltable.c:1892. Thread the owning object's
181
+ // pen color so an HTML table/cell border with no explicit COLOR inherits
182
+ // it (htmltable.c:1911 getPenColor). @see getPenColor
183
+ return makeHtmlLabel(content, { ...font, pencolor: getPenColor(obj) }, measurer);
184
+ }
185
+ // Plain path: resolve \G \N \E \T \H \L against the owning object
186
+ // BEFORE measuring, as C does (labels.c:169, escBackslash=0; the
187
+ // formatting escapes \n \l \r are handled separately), then decode HTML
188
+ // entities (labels.c:174 htmlEntityUTF8, UTF-8 default branch).
189
+ const subst = obj !== undefined ? substObj(content, obj, false) : content;
190
+ const text = htmlEntityUTF8(subst);
191
+ return makePlainLabel(text, font, measurer);
192
+ }
@@ -0,0 +1,167 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+
3
+ /**
4
+ * Shared multicolor color-list parser (AD4).
5
+ *
6
+ * Ports the colorseg_t / colorsegs_t types and the parseSegs function
7
+ * from lib/common/emit.c. Pure data-in / data-out — no rendering, no
8
+ * ObjState mutation. Consumed by findStopColor (style-resolve.ts),
9
+ * stripedBox / wedgedEllipse (S1), and multicolor edges (M1).
10
+ *
11
+ * @see lib/common/emit.c:411 colorseg_t
12
+ * @see lib/common/emit.c:422 colorsegs_t
13
+ * @see lib/common/emit.c:470 parseSegs
14
+ */
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Types
18
+ // ---------------------------------------------------------------------------
19
+
20
+ /**
21
+ * One color segment in a colon-separated color list.
22
+ * @see lib/common/emit.c:411 colorseg_t
23
+ */
24
+ export interface ColorSeg {
25
+ /** Color name/spec; null when the token was empty. */
26
+ color: string | null;
27
+ /** Fractional width of this segment in [0, 1]. */
28
+ t: number;
29
+ /**
30
+ * True when the segment carried an explicit positive fraction (`;f`).
31
+ * False when no semicolon was present or the fraction was 0.
32
+ * @see lib/common/emit.c:488-489
33
+ */
34
+ hasFraction: boolean;
35
+ }
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Constants
39
+ // ---------------------------------------------------------------------------
40
+
41
+ /** @see lib/common/emit.c:451 EPS */
42
+ const EPS = 1e-5;
43
+
44
+ // ---------------------------------------------------------------------------
45
+ // Helpers
46
+ // ---------------------------------------------------------------------------
47
+
48
+ /** True when |x| < EPS. @see lib/common/emit.c:452 AEQ0 */
49
+ function aeq0(x: number): boolean {
50
+ return x < EPS && x > -EPS;
51
+ }
52
+
53
+ /**
54
+ * Parse "color;fraction" or "color" into { color, v }.
55
+ * v === 0 → no semicolon (no explicit fraction).
56
+ * v > 0 → valid non-negative fraction.
57
+ * v === -1 → semicolon present but no valid non-negative float.
58
+ * @see lib/common/emit.c:429 getSegLen
59
+ */
60
+ function getSegLen(token: string): { color: string; v: number } {
61
+ const semi = token.indexOf(';');
62
+ if (semi === -1) return { color: token, v: 0 };
63
+ const color = token.slice(0, semi);
64
+ const rest = token.slice(semi + 1);
65
+ if (rest.length === 0) return { color, v: -1 };
66
+ const parsed = parseFloat(rest);
67
+ return !isNaN(parsed) && parsed >= 0 ? { color, v: parsed } : { color, v: -1 };
68
+ }
69
+
70
+ /**
71
+ * Clamp one token against `left`, append to `segs`, return updated `left`.
72
+ * Returns null on a parse error (bad float after semicolon).
73
+ * @see lib/common/emit.c:476-506
74
+ */
75
+ function appendSeg(
76
+ token: string,
77
+ left: number,
78
+ segs: ColorSeg[],
79
+ warnedExceeded: { v: boolean },
80
+ ): { left: number; rval: 0 | 3 } | null {
81
+ const { color, v } = getSegLen(token);
82
+ if (v < 0) return null;
83
+
84
+ let t = v;
85
+ let rval: 0 | 3 = 0;
86
+ const del = t - left;
87
+ if (del > 0) {
88
+ if (!aeq0(del) && !warnedExceeded.v) {
89
+ warnedExceeded.v = true;
90
+ rval = 3;
91
+ }
92
+ t = left;
93
+ }
94
+ left -= t;
95
+ segs.push({ color: color.length > 0 ? color : null, t, hasFraction: t > 0 && v > 0 });
96
+ return { left, rval };
97
+ }
98
+
99
+ /**
100
+ * Distribute `left` weight among zero-t segments; if none, add to last.
101
+ * @see lib/common/emit.c:509-526
102
+ */
103
+ function distributeLeft(segs: ColorSeg[], left: number): void {
104
+ if (left <= 0) return;
105
+ const zeroCount = segs.filter(s => s.t <= 0).length;
106
+ if (zeroCount > 0) {
107
+ const delta = left / zeroCount;
108
+ for (const s of segs) {
109
+ if (s.t <= 0) s.t = delta;
110
+ }
111
+ } else if (segs.length > 0) {
112
+ segs[segs.length - 1]!.t += left;
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Drop trailing zero-t segments (mirrors C's LIST_DROP_BACK loop).
118
+ * @see lib/common/emit.c:528-532
119
+ */
120
+ function trimTrailing(segs: ColorSeg[]): void {
121
+ while (segs.length > 0 && (segs[segs.length - 1]?.t ?? 0) <= 0) {
122
+ segs.pop();
123
+ }
124
+ }
125
+
126
+ // ---------------------------------------------------------------------------
127
+ // Public API
128
+ // ---------------------------------------------------------------------------
129
+
130
+ /**
131
+ * Parse `"c1;f1:c2;f2:…"` into segments.
132
+ *
133
+ * Fractions are optional and non-negative; their sum must not exceed 1.
134
+ * Segments without an explicit fraction share the remaining weight equally;
135
+ * if none exist the remainder is added to the last segment.
136
+ *
137
+ * Return codes (mirror C):
138
+ * 0 → ok; 1 → silent error; 2 → error with message; 3 → warning (sum > 1).
139
+ * On rv 1 or 2 the returned segs array is empty.
140
+ *
141
+ * @see lib/common/emit.c:470 parseSegs
142
+ */
143
+ export function parseSegs(
144
+ colorlist: string,
145
+ ): { segs: ColorSeg[]; error: 0 | 1 | 2 | 3 } {
146
+ const segs: ColorSeg[] = [];
147
+ let left = 1;
148
+ let rval: 0 | 3 = 0;
149
+ let badFloatCount = 0;
150
+ const warnedExceeded = { v: false };
151
+
152
+ for (const token of colorlist.split(':')) {
153
+ const result = appendSeg(token, left, segs, warnedExceeded);
154
+ if (result === null) {
155
+ const errCode: 1 | 2 = badFloatCount === 0 ? 2 : 1;
156
+ badFloatCount++;
157
+ return { segs: [], error: errCode };
158
+ }
159
+ if (result.rval === 3) rval = 3;
160
+ left = result.left;
161
+ if (aeq0(left)) { left = 0; break; }
162
+ }
163
+
164
+ distributeLeft(segs, left);
165
+ trimTrailing(segs);
166
+ return { segs, error: rval };
167
+ }
@@ -0,0 +1,339 @@
1
+ // SPDX-License-Identifier: EPL-2.0
2
+ /**
3
+ * Common node geometry initialisation shared by all layout engines.
4
+ * Ports common_init_node / gv_nodesize from lib/common/utils.c: binds
5
+ * the shape, builds the label (text/html/record), and sizes the node
6
+ * from the label via the poly_init port.
7
+ *
8
+ * @see lib/common/utils.c:common_init_node
9
+ * @see lib/common/utils.c:gv_nodesize
10
+ */
11
+
12
+ import type { Graph } from '../model/graph.js';
13
+ import type { Node } from '../model/node.js';
14
+ import type { TextMeasurer } from './textmeasure.js';
15
+ import type { PolygonT, ShapeDesc, TextlabelT } from './types.js';
16
+ import { ShapeKind } from './types.js';
17
+ import { bindShape } from './shapes.js';
18
+ import { assignShapeInfo, buildNodeLabel, nodeAttr, readFontAttrs } from './poly-init.js';
19
+ import { makeAnyLabel } from './make-label.js';
20
+ import { isHtmlValue, htmlValueContent } from './html-string.js';
21
+ import { NODE_XLABEL } from '../layout/dot/rank.js';
22
+ import { recordInit, recordMakeLabel } from './record.js';
23
+ import {
24
+ GAP,
25
+ gvNodesize,
26
+ polySize,
27
+ type PolySizeParams,
28
+ type PolySizeResult,
29
+ } from './poly-sizing.js';
30
+
31
+ /** Default node half-width in points. C: DEFAULT_NODEWIDTH=0.75in/2 * 72 = 27 */
32
+ export const DEFAULT_NODE_LW = 27;
33
+ /** Default node full-height in points. C: DEFAULT_NODEHEIGHT=0.5in * 72 = 36 */
34
+ export const DEFAULT_NODE_HT = 36;
35
+
36
+ /** @see lib/common/const.h:DEFAULT_NODEWIDTH / MIN_NODEWIDTH */
37
+ const DEFAULT_NODEWIDTH = 0.75;
38
+ const MIN_NODEWIDTH = 0.01;
39
+ /** @see lib/common/const.h:DEFAULT_NODEHEIGHT / MIN_NODEHEIGHT */
40
+ const DEFAULT_NODEHEIGHT = 0.5;
41
+ const MIN_NODEHEIGHT = 0.02;
42
+
43
+ /** Points per inch. @see lib/common/geom.h:POINTS_PER_INCH */
44
+ const POINTS_PER_INCH = 72;
45
+ /** Default point size in inches (3.6pt). @see lib/common/shapes.c:42 DEF_POINT */
46
+ const DEF_POINT = 0.05;
47
+ /** Minimum point size in inches. @see lib/common/shapes.c:47 MIN_POINT */
48
+ const MIN_POINT = 0.0003;
49
+ /** Default / minimum node penwidth. @see lib/common/const.h DEFAULT_NODEPENWIDTH */
50
+ const DEFAULT_NODEPENWIDTH = 1;
51
+ const MIN_NODEPENWIDTH = 0;
52
+
53
+ /** Parse a double attr with default and minimum. @see lib/common/utils.c:late_double */
54
+ export function lateDouble(
55
+ s: string | undefined,
56
+ defaultValue: number,
57
+ minimum: number,
58
+ ): number {
59
+ if (s === undefined || s === '') return defaultValue;
60
+ const rv = parseFloat(s);
61
+ if (Number.isNaN(rv)) return defaultValue;
62
+ return rv < minimum ? minimum : rv;
63
+ }
64
+
65
+ /** Parse an int attr with default and minimum. @see lib/common/utils.c:late_int */
66
+ export function lateInt(
67
+ s: string | undefined,
68
+ defaultValue: number,
69
+ minimum: number,
70
+ ): number {
71
+ if (s === undefined || s === '') return defaultValue;
72
+ const rv = parseInt(s, 10);
73
+ if (Number.isNaN(rv)) return defaultValue;
74
+ return rv < minimum ? minimum : rv;
75
+ }
76
+
77
+ /** @see lib/common/utils.c:mapbool */
78
+ function mapbool(s: string | undefined): boolean {
79
+ if (!s || s.toLowerCase() === 'false' || s.toLowerCase() === 'no') return false;
80
+ if (s.toLowerCase() === 'true' || s.toLowerCase() === 'yes') return true;
81
+ const n = parseInt(s, 10);
82
+ return !Number.isNaN(n) && n !== 0;
83
+ }
84
+
85
+ /** The text measurer threaded through the GVC context, if any. */
86
+ export function layoutMeasurer(g: Graph): TextMeasurer | undefined {
87
+ return g.root.info.gvc?.textMeasurer;
88
+ }
89
+
90
+ /**
91
+ * Resolve sides/skew/distortion: builtin descriptors win; shape=polygon
92
+ * (sides == 0) reads the attrs. @see lib/common/shapes.c:poly_init
93
+ */
94
+ function resolvePolyGeometry(
95
+ n: Node,
96
+ g: Graph,
97
+ poly: PolygonT,
98
+ ): { sides: number; skew: number; distortion: number } {
99
+ if (poly.sides !== 0) {
100
+ return { sides: poly.sides, skew: poly.skew, distortion: poly.distortion };
101
+ }
102
+ return {
103
+ skew: lateDouble(nodeAttr(n, g, 'skew'), 0.0, -100.0),
104
+ sides: lateInt(nodeAttr(n, g, 'sides'), 4, 0),
105
+ distortion: lateDouble(nodeAttr(n, g, 'distortion'), 0.0, -100.0),
106
+ };
107
+ }
108
+
109
+ /** User size in points: max of set width/height attrs, 0 when unset. @see shapes.c:userSize */
110
+ function userSizePts(n: Node, g: Graph): number {
111
+ const uw = lateDouble(nodeAttr(n, g, 'width'), 0.0, MIN_NODEWIDTH);
112
+ const uh = lateDouble(nodeAttr(n, g, 'height'), 0.0, MIN_NODEHEIGHT);
113
+ return 72 * Math.max(uw, uh);
114
+ }
115
+
116
+ /** Size-related plain attrs read by poly_init. */
117
+ function sizeAttrs(
118
+ n: Node,
119
+ g: Graph,
120
+ ): Pick<PolySizeParams, 'widthIn' | 'heightIn' | 'userSizePts' | 'margin' | 'fixedsize' | 'labelloc' | 'quantumIn'> {
121
+ return {
122
+ widthIn: lateDouble(nodeAttr(n, g, 'width'), DEFAULT_NODEWIDTH, MIN_NODEWIDTH),
123
+ heightIn: lateDouble(nodeAttr(n, g, 'height'), DEFAULT_NODEHEIGHT, MIN_NODEHEIGHT),
124
+ userSizePts: userSizePts(n, g),
125
+ margin: nodeAttr(n, g, 'margin'),
126
+ fixedsize: nodeAttr(n, g, 'fixedsize') ?? 'false',
127
+ labelloc: nodeAttr(n, g, 'labelloc'),
128
+ quantumIn: lateDouble(g.root.attrs.get('quantum'), 0.0, 0.0),
129
+ };
130
+ }
131
+
132
+ /**
133
+ * Resolve poly_init's sizing inputs from node attrs and the bound
134
+ * polygon descriptor.
135
+ * @see lib/common/shapes.c:poly_init (attribute resolution)
136
+ */
137
+ export function polySizeParamsFromNode(
138
+ n: Node,
139
+ g: Graph,
140
+ shape: ShapeDesc & { polygon: PolygonT },
141
+ labelDimen: { x: number; y: number },
142
+ flip: boolean,
143
+ ): PolySizeParams {
144
+ const poly = shape.polygon;
145
+ return {
146
+ labelDimen,
147
+ ...resolvePolyGeometry(n, g, poly),
148
+ ...sizeAttrs(n, g),
149
+ peripheries: lateInt(nodeAttr(n, g, 'peripheries'), poly.peripheries, 0),
150
+ orientation: poly.orientation + lateDouble(nodeAttr(n, g, 'orientation'), 0.0, -360.0),
151
+ // @see lib/common/shapes.c:poly_init — late_double(n, N_penwidth, 1.0, 0.0)
152
+ penwidth: lateDouble(nodeAttr(n, g, 'penwidth'), 1.0, 0.0),
153
+ regular: poly.regular || mapbool(nodeAttr(n, g, 'regular')),
154
+ isPlain: shape.name === 'plain',
155
+ optionShape: poly.option.shape, // size_gen discriminant (STAR/CYLINDER)
156
+ nojustify: mapbool(nodeAttr(n, g, 'nojustify')), // shapes.c:2133
157
+ flip,
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Create ND_xlabel when the xlabel attr is non-empty and set NODE_XLABEL.
163
+ * @see lib/common/utils.c:443-447
164
+ * @see lib/common/utils.c:447 — GD_has_labels scoped to agraphof(n) root
165
+ */
166
+ function initNodeXLabel(n: Node, g: Graph, measurer: TextMeasurer): void {
167
+ const str = nodeAttr(n, g, 'xlabel');
168
+ if (!str || str.length === 0) return;
169
+ const font = readFontAttrs(n, g);
170
+ const isHtml = isHtmlValue(str);
171
+ const content = isHtml ? htmlValueContent(str) : str;
172
+ // utils.c:444 — make_label(n, str, aghtmlstr(str), false, ...)
173
+ n.info.xlabel = makeAnyLabel(content, isHtml, font, measurer, n);
174
+ g.root.info.has_labels = (g.root.info.has_labels ?? 0) | NODE_XLABEL;
175
+ }
176
+
177
+ /**
178
+ * Point diameter in inches per point_init: w = min(width, height); if
179
+ * neither attr is user-set use DEF_POINT, else clamp positive widths to
180
+ * MIN_POINT. The (suppressed) label never drives the size.
181
+ * @see lib/common/shapes.c:point_init (width/height block)
182
+ */
183
+ function pointWidthInches(n: Node, g: Graph): number {
184
+ const w = lateDouble(nodeAttr(n, g, 'width'), Number.MAX_VALUE, MIN_NODEWIDTH);
185
+ const h = lateDouble(nodeAttr(n, g, 'height'), Number.MAX_VALUE, MIN_NODEHEIGHT);
186
+ const m = Math.min(w, h);
187
+ if (m === Number.MAX_VALUE) return DEF_POINT; // neither width nor height set
188
+ return m > 0.0 ? Math.max(m, MIN_POINT) : m;
189
+ }
190
+
191
+ /**
192
+ * point_init's size math: the dot diameter `sz0` grown by GAP per extra
193
+ * periphery, plus the outline ring at half the penwidth each side.
194
+ * @see lib/common/shapes.c:point_init (periphery/outline blocks)
195
+ */
196
+ function pointSizeResult(
197
+ sz0: number, peripheries: number, penwidth: number,
198
+ ): Omit<PolySizeResult, 'space' | 'valign'> {
199
+ const sz = peripheries > 1 ? sz0 + 2 * GAP * (peripheries - 1) : sz0;
200
+ const szOutline = peripheries >= 1 && penwidth > 0 ? sz + penwidth : sz;
201
+ return {
202
+ ...gvNodesize(sz, sz, false),
203
+ outlineW: szOutline, outlineH: szOutline, baseW: sz0, baseH: sz0,
204
+ };
205
+ }
206
+
207
+ /**
208
+ * Size a `shape=point` node per point_init: a filled dot, DEF_POINT (or
209
+ * the min set width/height) wide, bypassing label-driven sizing. Reuses
210
+ * the ellipse vertex/periphery path (AD-5): the resolved sides=2 polygon
211
+ * renders via the existing `sides<=2` ellipse branch.
212
+ * @see lib/common/shapes.c:point_init
213
+ */
214
+ function initPointSize(n: Node, g: Graph, shape: ShapeDesc & { polygon: PolygonT }): void {
215
+ const flip = g.root.info.flip === true;
216
+ const peripheries = lateInt(nodeAttr(n, g, 'peripheries'), shape.polygon.peripheries, 0);
217
+ const penwidth = lateDouble(nodeAttr(n, g, 'penwidth'), DEFAULT_NODEPENWIDTH, MIN_NODEPENWIDTH);
218
+ const sz0 = pointWidthInches(n, g) * POINTS_PER_INCH;
219
+ storeNodeSize(n, pointSizeResult(sz0, peripheries, penwidth), flip);
220
+ assignShapeInfo(n, { ...shape.polygon, peripheries, sides: 2, penwidth, vertices: null });
221
+ }
222
+
223
+ /**
224
+ * Build the label and size the node from it, mirroring
225
+ * common_init_node + the shape initfn. Returns false when the shape
226
+ * has no polygon descriptor to size against.
227
+ * @see lib/common/utils.c:common_init_node
228
+ */
229
+ function initNodeFromLabel(n: Node, g: Graph, measurer: TextMeasurer): boolean {
230
+ const shape = bindShape(nodeAttr(n, g, 'shape') ?? 'ellipse', nodeAttr(n, g, 'shapefile'));
231
+ n.info.shape = shape;
232
+ if (shape.kind === ShapeKind.SH_RECORD) {
233
+ // C runs the SAME three steps for every shape: make_label (with the
234
+ // is_record flag), then ND_xlabel, then the shape's initfn. SH_RECORD
235
+ // only selects make_label's is_record flag and initfn=record_init — it is
236
+ // NOT a reason to skip the xlabel (utils.c:441/443/453).
237
+ recordMakeLabel(n, g, measurer);
238
+ initNodeXLabel(n, g, measurer);
239
+ recordInit(n, g, measurer); // initfn: sets lw/rw/ht from the field tree
240
+ return true;
241
+ }
242
+ buildNodeLabel(n, g, measurer);
243
+ initNodeXLabel(n, g, measurer);
244
+ const poly = shape.polygon;
245
+ if (poly === null) return false;
246
+ if (shape.kind === ShapeKind.SH_POINT) {
247
+ // point_init overrides sizing independent of the label (AD-2).
248
+ initPointSize(n, g, { ...shape, polygon: poly });
249
+ return true;
250
+ }
251
+ const label = n.info.label as TextlabelT;
252
+ const flip = g.root.info.flip === true;
253
+ const params = polySizeParamsFromNode(n, g, { ...shape, polygon: poly }, label.dimen, flip);
254
+ // Unflipped size first so width/height (inches) match C's ND_width/ND_height.
255
+ const sz = polySize({ ...params, flip: false });
256
+ // Install the label's justification borders + valign, as C's poly_init mutates
257
+ // ND_label(n)->space / ->valign in place — consumed by emit_label/renderLabel
258
+ // for labelloc top/bottom and left/right justification.
259
+ label.space = sz.space;
260
+ label.valign = sz.valign.charCodeAt(0);
261
+ storeNodeSize(n, sz, flip);
262
+ // C poly_init installs the ATTR-RESOLVED polygon into ND_shape_info
263
+ // (sides/orientation/skew/distortion/peripheries/regular); edge
264
+ // clipping and rendering read it.
265
+ assignShapeInfo(n, effectivePolygon(poly, params));
266
+ return true;
267
+ }
268
+
269
+ /** The attr-resolved polygon poly_init stores. @see shapes.c:poly_init (poly->... assignments) */
270
+ function effectivePolygon(poly: PolygonT, p: PolySizeParams): PolygonT {
271
+ let sides = p.sides;
272
+ // ellipses with distortion/skew become 120-gons
273
+ if (sides <= 2 && (p.distortion !== 0 || p.skew !== 0)) sides = 120;
274
+ return {
275
+ ...poly,
276
+ regular: p.regular,
277
+ peripheries: p.peripheries,
278
+ sides,
279
+ orientation: p.orientation,
280
+ distortion: p.distortion,
281
+ skew: p.skew,
282
+ penwidth: p.penwidth ?? 1,
283
+ };
284
+ }
285
+
286
+ /** Write polySize results onto the node (gv_nodesize flip applied last). */
287
+ function storeNodeSize(
288
+ n: Node, unflipped: Omit<PolySizeResult, 'space' | 'valign'>, flip: boolean,
289
+ ): void {
290
+ const widthPts = unflipped.lw + unflipped.rw;
291
+ n.info.width = widthPts / 72;
292
+ n.info.height = unflipped.ht / 72;
293
+ n.info.outline_width = unflipped.outlineW / 72;
294
+ n.info.outline_height = unflipped.outlineH / 72;
295
+ n.info.base_width = unflipped.baseW / 72;
296
+ n.info.base_height = unflipped.baseH / 72;
297
+ // C gv_nodesize derives lw/rw/ht from INCH2PS(ND_width/ND_height), i.e. it
298
+ // round-trips the points size through the PS2INCH inch value it just stored
299
+ // (shapes.c:2372 ND_width=PS2INCH(bb.x); utils.c:1543 w=INCH2PS(ND_width)).
300
+ // Passing the raw poly points here skips that round-trip, so ND_xsize
301
+ // (lw+rw) would differ from INCH2PS(ND_width) by 1 ULP — which in osage
302
+ // desyncs the packing-box centre from addNodeObj's coord-sz/2 and flips a
303
+ // floor() in objplpmks. Round-trip to match C exactly.
304
+ const size = gvNodesize(
305
+ n.info.width * POINTS_PER_INCH, n.info.height * POINTS_PER_INCH, flip,
306
+ );
307
+ n.info.lw = size.lw;
308
+ n.info.rw = size.rw;
309
+ n.info.ht = size.ht;
310
+ }
311
+
312
+ /** Pre-T1 fallback sizing from width/height attrs only (no measurer). */
313
+ function initNodeDefaults(n: Node, g: Graph): void {
314
+ const widthIn = lateDouble(nodeAttr(n, g, 'width'), DEFAULT_NODEWIDTH, MIN_NODEWIDTH);
315
+ const heightIn = lateDouble(nodeAttr(n, g, 'height'), DEFAULT_NODEHEIGHT, MIN_NODEHEIGHT);
316
+ const flip = g.root.info.flip === true;
317
+ const w = flip ? heightIn : widthIn;
318
+ const h = flip ? widthIn : heightIn;
319
+ if (!n.info.lw) n.info.lw = Math.max((w * 72) / 2, DEFAULT_NODE_LW);
320
+ if (!n.info.rw) n.info.rw = Math.max((w * 72) / 2, DEFAULT_NODE_LW);
321
+ if (!n.info.ht) n.info.ht = Math.max(h * 72, DEFAULT_NODE_HT);
322
+ }
323
+
324
+ /**
325
+ * Initialise per-node geometry: shape-aware, label-driven sizing when a
326
+ * text measurer is available; width/height attr defaults otherwise.
327
+ * @see lib/common/utils.c:common_init_node
328
+ * @see lib/common/utils.c:gv_nodesize
329
+ */
330
+ export function commonInitNode(n: Node, g: Graph): void {
331
+ const measurer = layoutMeasurer(g);
332
+ if (measurer !== undefined && initNodeFromLabel(n, g, measurer)) return;
333
+ initNodeDefaults(n, g);
334
+ }
335
+
336
+ /** Call commonInitNode for every node in the graph. */
337
+ export function commonInitNodeEdge(g: Graph): void {
338
+ for (const n of g.nodes.values()) commonInitNode(n, g);
339
+ }