@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.
- package/LICENSE +277 -0
- package/README.md +292 -0
- package/dist/api/builder.d.ts +78 -0
- package/dist/api/builder.d.ts.map +1 -0
- package/dist/api/edge-ops.d.ts +45 -0
- package/dist/api/edge-ops.d.ts.map +1 -0
- package/dist/api/geometry.d.ts +159 -0
- package/dist/api/geometry.d.ts.map +1 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api.js +719 -0
- package/dist/api.js.map +7 -0
- package/dist/bundle.js +101 -0
- package/dist/cdt/bag.d.ts +58 -0
- package/dist/cdt/bag.d.ts.map +1 -0
- package/dist/cdt/hash-core.d.ts +40 -0
- package/dist/cdt/hash-core.d.ts.map +1 -0
- package/dist/cdt/hash.d.ts +74 -0
- package/dist/cdt/hash.d.ts.map +1 -0
- package/dist/cdt/index.d.ts +16 -0
- package/dist/cdt/index.d.ts.map +1 -0
- package/dist/cdt/splay-core.d.ts +78 -0
- package/dist/cdt/splay-core.d.ts.map +1 -0
- package/dist/cdt/splay.d.ts +63 -0
- package/dist/cdt/splay.d.ts.map +1 -0
- package/dist/cdt/strhash.d.ts +26 -0
- package/dist/cdt/strhash.d.ts.map +1 -0
- package/dist/cdt/types.d.ts +11 -0
- package/dist/cdt/types.d.ts.map +1 -0
- package/dist/common/arith.d.ts +35 -0
- package/dist/common/arith.d.ts.map +1 -0
- package/dist/common/arm-pow-data.d.ts +17 -0
- package/dist/common/arm-pow-data.d.ts.map +1 -0
- package/dist/common/arm-pow.d.ts +12 -0
- package/dist/common/arm-pow.d.ts.map +1 -0
- package/dist/common/arrows-constants.d.ts +97 -0
- package/dist/common/arrows-constants.d.ts.map +1 -0
- package/dist/common/arrows-geometry.d.ts +24 -0
- package/dist/common/arrows-geometry.d.ts.map +1 -0
- package/dist/common/arrows-miter.d.ts +24 -0
- package/dist/common/arrows-miter.d.ts.map +1 -0
- package/dist/common/arrows-shapes-poly.d.ts +24 -0
- package/dist/common/arrows-shapes-poly.d.ts.map +1 -0
- package/dist/common/arrows-shapes-util.d.ts +77 -0
- package/dist/common/arrows-shapes-util.d.ts.map +1 -0
- package/dist/common/arrows-shapes.d.ts +48 -0
- package/dist/common/arrows-shapes.d.ts.map +1 -0
- package/dist/common/arrows-types.d.ts +59 -0
- package/dist/common/arrows-types.d.ts.map +1 -0
- package/dist/common/arrows.d.ts +69 -0
- package/dist/common/arrows.d.ts.map +1 -0
- package/dist/common/color.d.ts +66 -0
- package/dist/common/color.d.ts.map +1 -0
- package/dist/common/colorData.d.ts +10 -0
- package/dist/common/colorData.d.ts.map +1 -0
- package/dist/common/compass-port.d.ts +39 -0
- package/dist/common/compass-port.d.ts.map +1 -0
- package/dist/common/crand.d.ts +42 -0
- package/dist/common/crand.d.ts.map +1 -0
- package/dist/common/edge-label-init.d.ts +51 -0
- package/dist/common/edge-label-init.d.ts.map +1 -0
- package/dist/common/edge-offset.d.ts +66 -0
- package/dist/common/edge-offset.d.ts.map +1 -0
- package/dist/common/ellipse-wedge.d.ts +10 -0
- package/dist/common/ellipse-wedge.d.ts.map +1 -0
- package/dist/common/emit-types.d.ts +255 -0
- package/dist/common/emit-types.d.ts.map +1 -0
- package/dist/common/fma.d.ts +10 -0
- package/dist/common/fma.d.ts.map +1 -0
- package/dist/common/graph-init.d.ts +61 -0
- package/dist/common/graph-init.d.ts.map +1 -0
- package/dist/common/html-entities.d.ts +17 -0
- package/dist/common/html-entities.d.ts.map +1 -0
- package/dist/common/html-string.d.ts +14 -0
- package/dist/common/html-string.d.ts.map +1 -0
- package/dist/common/htmltable-emit-fill.d.ts +84 -0
- package/dist/common/htmltable-emit-fill.d.ts.map +1 -0
- package/dist/common/htmltable-emit-rules.d.ts +79 -0
- package/dist/common/htmltable-emit-rules.d.ts.map +1 -0
- package/dist/common/htmltable-emit.d.ts +63 -0
- package/dist/common/htmltable-emit.d.ts.map +1 -0
- package/dist/common/htmltable-lex.d.ts +16 -0
- package/dist/common/htmltable-lex.d.ts.map +1 -0
- package/dist/common/htmltable-parse.d.ts +37 -0
- package/dist/common/htmltable-parse.d.ts.map +1 -0
- package/dist/common/htmltable-port.d.ts +15 -0
- package/dist/common/htmltable-port.d.ts.map +1 -0
- package/dist/common/htmltable-pos-runs.d.ts +88 -0
- package/dist/common/htmltable-pos-runs.d.ts.map +1 -0
- package/dist/common/htmltable-pos.d.ts +192 -0
- package/dist/common/htmltable-pos.d.ts.map +1 -0
- package/dist/common/htmltable-types.d.ts +237 -0
- package/dist/common/htmltable-types.d.ts.map +1 -0
- package/dist/common/htmltable.d.ts +74 -0
- package/dist/common/htmltable.d.ts.map +1 -0
- package/dist/common/layers.d.ts +20 -0
- package/dist/common/layers.d.ts.map +1 -0
- package/dist/common/make-label.d.ts +60 -0
- package/dist/common/make-label.d.ts.map +1 -0
- package/dist/common/multicolor.d.ts +46 -0
- package/dist/common/multicolor.d.ts.map +1 -0
- package/dist/common/nodeinit.d.ts +45 -0
- package/dist/common/nodeinit.d.ts.map +1 -0
- package/dist/common/poly-gencode.d.ts +40 -0
- package/dist/common/poly-gencode.d.ts.map +1 -0
- package/dist/common/poly-init.d.ts +51 -0
- package/dist/common/poly-init.d.ts.map +1 -0
- package/dist/common/poly-inside.d.ts +37 -0
- package/dist/common/poly-inside.d.ts.map +1 -0
- package/dist/common/poly-shapes-cases.d.ts +31 -0
- package/dist/common/poly-shapes-cases.d.ts.map +1 -0
- package/dist/common/poly-shapes-cases2.d.ts +25 -0
- package/dist/common/poly-shapes-cases2.d.ts.map +1 -0
- package/dist/common/poly-shapes-util.d.ts +42 -0
- package/dist/common/poly-shapes-util.d.ts.map +1 -0
- package/dist/common/poly-shapes.d.ts +39 -0
- package/dist/common/poly-shapes.d.ts.map +1 -0
- package/dist/common/poly-sizing.d.ts +189 -0
- package/dist/common/poly-sizing.d.ts.map +1 -0
- package/dist/common/poly-vertices.d.ts +42 -0
- package/dist/common/poly-vertices.d.ts.map +1 -0
- package/dist/common/postproc.d.ts +49 -0
- package/dist/common/postproc.d.ts.map +1 -0
- package/dist/common/ps-fontalias.d.ts +36 -0
- package/dist/common/ps-fontalias.d.ts.map +1 -0
- package/dist/common/random.d.ts +8 -0
- package/dist/common/random.d.ts.map +1 -0
- package/dist/common/record-port.d.ts +34 -0
- package/dist/common/record-port.d.ts.map +1 -0
- package/dist/common/record.d.ts +105 -0
- package/dist/common/record.d.ts.map +1 -0
- package/dist/common/shapeData.d.ts +186 -0
- package/dist/common/shapeData.d.ts.map +1 -0
- package/dist/common/shapes.d.ts +36 -0
- package/dist/common/shapes.d.ts.map +1 -0
- package/dist/common/spline-midpoint.d.ts +31 -0
- package/dist/common/spline-midpoint.d.ts.map +1 -0
- package/dist/common/splines-clip.d.ts +21 -0
- package/dist/common/splines-clip.d.ts.map +1 -0
- package/dist/common/splines-constants.d.ts +42 -0
- package/dist/common/splines-constants.d.ts.map +1 -0
- package/dist/common/splines-geom.d.ts +51 -0
- package/dist/common/splines-geom.d.ts.map +1 -0
- package/dist/common/splines-path-begin.d.ts +17 -0
- package/dist/common/splines-path-begin.d.ts.map +1 -0
- package/dist/common/splines-path-end.d.ts +17 -0
- package/dist/common/splines-path-end.d.ts.map +1 -0
- package/dist/common/splines-path-shared.d.ts +53 -0
- package/dist/common/splines-path-shared.d.ts.map +1 -0
- package/dist/common/splines-routespl.d.ts +40 -0
- package/dist/common/splines-routespl.d.ts.map +1 -0
- package/dist/common/splines-selfedge.d.ts +21 -0
- package/dist/common/splines-selfedge.d.ts.map +1 -0
- package/dist/common/splines.d.ts +18 -0
- package/dist/common/splines.d.ts.map +1 -0
- package/dist/common/style-resolve.d.ts +197 -0
- package/dist/common/style-resolve.d.ts.map +1 -0
- package/dist/common/subst.d.ts +31 -0
- package/dist/common/subst.d.ts.map +1 -0
- package/dist/common/taper.d.ts +23 -0
- package/dist/common/taper.d.ts.map +1 -0
- package/dist/common/textmeasure-factory.d.ts +33 -0
- package/dist/common/textmeasure-factory.d.ts.map +1 -0
- package/dist/common/textmeasure-lookup.d.ts +17 -0
- package/dist/common/textmeasure-lookup.d.ts.map +1 -0
- package/dist/common/textmeasure-lut-data-a.d.ts +13 -0
- package/dist/common/textmeasure-lut-data-a.d.ts.map +1 -0
- package/dist/common/textmeasure-lut-data-b.d.ts +12 -0
- package/dist/common/textmeasure-lut-data-b.d.ts.map +1 -0
- package/dist/common/textmeasure-lut-data-c.d.ts +13 -0
- package/dist/common/textmeasure-lut-data-c.d.ts.map +1 -0
- package/dist/common/textmeasure-lut-data.d.ts +27 -0
- package/dist/common/textmeasure-lut-data.d.ts.map +1 -0
- package/dist/common/textmeasure.d.ts +120 -0
- package/dist/common/textmeasure.d.ts.map +1 -0
- package/dist/common/types.d.ts +316 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/xlabels-place.d.ts +125 -0
- package/dist/common/xlabels-place.d.ts.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/errors.d.ts +63 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/gvc/anchor.d.ts +86 -0
- package/dist/gvc/anchor.d.ts.map +1 -0
- package/dist/gvc/context.d.ts +177 -0
- package/dist/gvc/context.d.ts.map +1 -0
- package/dist/gvc/default-context.d.ts +20 -0
- package/dist/gvc/default-context.d.ts.map +1 -0
- package/dist/gvc/device-cluster.d.ts +25 -0
- package/dist/gvc/device-cluster.d.ts.map +1 -0
- package/dist/gvc/device.d.ts +99 -0
- package/dist/gvc/device.d.ts.map +1 -0
- package/dist/gvc/edge-labels.d.ts +10 -0
- package/dist/gvc/edge-labels.d.ts.map +1 -0
- package/dist/gvc/emit-walk.d.ts +22 -0
- package/dist/gvc/emit-walk.d.ts.map +1 -0
- package/dist/gvc/image-resolver.d.ts +44 -0
- package/dist/gvc/image-resolver.d.ts.map +1 -0
- package/dist/gvc/job.d.ts +234 -0
- package/dist/gvc/job.d.ts.map +1 -0
- package/dist/gvc/textlayout.d.ts +33 -0
- package/dist/gvc/textlayout.d.ts.map +1 -0
- package/dist/gvc/textspan-emit.d.ts +41 -0
- package/dist/gvc/textspan-emit.d.ts.map +1 -0
- package/dist/gvc/usershape.d.ts +25 -0
- package/dist/gvc/usershape.d.ts.map +1 -0
- package/dist/gvc/viewport.d.ts +71 -0
- package/dist/gvc/viewport.d.ts.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52862 -0
- package/dist/index.js.map +7 -0
- package/dist/label/index.d.ts +74 -0
- package/dist/label/index.d.ts.map +1 -0
- package/dist/label/node.d.ts +108 -0
- package/dist/label/node.d.ts.map +1 -0
- package/dist/label/rectangle.d.ts +60 -0
- package/dist/label/rectangle.d.ts.map +1 -0
- package/dist/label/split-q.d.ts +13 -0
- package/dist/label/split-q.d.ts.map +1 -0
- package/dist/label/xlabels-geom.d.ts +46 -0
- package/dist/label/xlabels-geom.d.ts.map +1 -0
- package/dist/label/xlabels-intersect.d.ts +79 -0
- package/dist/label/xlabels-intersect.d.ts.map +1 -0
- package/dist/label/xlabels.d.ts +67 -0
- package/dist/label/xlabels.d.ts.map +1 -0
- package/dist/layout/circo/blockpath.d.ts +120 -0
- package/dist/layout/circo/blockpath.d.ts.map +1 -0
- package/dist/layout/circo/blocks.d.ts +135 -0
- package/dist/layout/circo/blocks.d.ts.map +1 -0
- package/dist/layout/circo/blocktree.d.ts +51 -0
- package/dist/layout/circo/blocktree.d.ts.map +1 -0
- package/dist/layout/circo/circular.d.ts +59 -0
- package/dist/layout/circo/circular.d.ts.map +1 -0
- package/dist/layout/circo/index.d.ts +35 -0
- package/dist/layout/circo/index.d.ts.map +1 -0
- package/dist/layout/circo/init.d.ts +50 -0
- package/dist/layout/circo/init.d.ts.map +1 -0
- package/dist/layout/circo/position-helpers.d.ts +33 -0
- package/dist/layout/circo/position-helpers.d.ts.map +1 -0
- package/dist/layout/circo/position.d.ts +66 -0
- package/dist/layout/circo/position.d.ts.map +1 -0
- package/dist/layout/dot/acyclic.d.ts +8 -0
- package/dist/layout/dot/acyclic.d.ts.map +1 -0
- package/dist/layout/dot/aspect.d.ts +17 -0
- package/dist/layout/dot/aspect.d.ts.map +1 -0
- package/dist/layout/dot/classify.d.ts +52 -0
- package/dist/layout/dot/classify.d.ts.map +1 -0
- package/dist/layout/dot/cluster-path.d.ts +38 -0
- package/dist/layout/dot/cluster-path.d.ts.map +1 -0
- package/dist/layout/dot/cluster.d.ts +102 -0
- package/dist/layout/dot/cluster.d.ts.map +1 -0
- package/dist/layout/dot/compound-clip.d.ts +69 -0
- package/dist/layout/dot/compound-clip.d.ts.map +1 -0
- package/dist/layout/dot/compound-geom.d.ts +115 -0
- package/dist/layout/dot/compound-geom.d.ts.map +1 -0
- package/dist/layout/dot/compound.d.ts +56 -0
- package/dist/layout/dot/compound.d.ts.map +1 -0
- package/dist/layout/dot/conc.d.ts +88 -0
- package/dist/layout/dot/conc.d.ts.map +1 -0
- package/dist/layout/dot/decomp.d.ts +66 -0
- package/dist/layout/dot/decomp.d.ts.map +1 -0
- package/dist/layout/dot/edge-order.d.ts +27 -0
- package/dist/layout/dot/edge-order.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-arrow.d.ts +46 -0
- package/dist/layout/dot/edge-route-arrow.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-boxes.d.ts +75 -0
- package/dist/layout/dot/edge-route-boxes.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-chain.d.ts +67 -0
- package/dist/layout/dot/edge-route-chain.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-clip.d.ts +88 -0
- package/dist/layout/dot/edge-route-clip.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-faithful.d.ts +94 -0
- package/dist/layout/dot/edge-route-faithful.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-geom.d.ts +43 -0
- package/dist/layout/dot/edge-route-geom.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-helpers.d.ts +50 -0
- package/dist/layout/dot/edge-route-helpers.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-poly.d.ts +48 -0
- package/dist/layout/dot/edge-route-poly.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-rank.d.ts +57 -0
- package/dist/layout/dot/edge-route-rank.d.ts.map +1 -0
- package/dist/layout/dot/edge-route-routing.d.ts +99 -0
- package/dist/layout/dot/edge-route-routing.d.ts.map +1 -0
- package/dist/layout/dot/edge-route.d.ts +57 -0
- package/dist/layout/dot/edge-route.d.ts.map +1 -0
- package/dist/layout/dot/fastgr.d.ts +147 -0
- package/dist/layout/dot/fastgr.d.ts.map +1 -0
- package/dist/layout/dot/flat-utils.d.ts +21 -0
- package/dist/layout/dot/flat-utils.d.ts.map +1 -0
- package/dist/layout/dot/flat.d.ts +152 -0
- package/dist/layout/dot/flat.d.ts.map +1 -0
- package/dist/layout/dot/graph-label.d.ts +18 -0
- package/dist/layout/dot/graph-label.d.ts.map +1 -0
- package/dist/layout/dot/index.d.ts +128 -0
- package/dist/layout/dot/index.d.ts.map +1 -0
- package/dist/layout/dot/init.d.ts +93 -0
- package/dist/layout/dot/init.d.ts.map +1 -0
- package/dist/layout/dot/label-order.d.ts +45 -0
- package/dist/layout/dot/label-order.d.ts.map +1 -0
- package/dist/layout/dot/mincross-build.d.ts +52 -0
- package/dist/layout/dot/mincross-build.d.ts.map +1 -0
- package/dist/layout/dot/mincross-cross.d.ts +80 -0
- package/dist/layout/dot/mincross-cross.d.ts.map +1 -0
- package/dist/layout/dot/mincross-flat.d.ts +27 -0
- package/dist/layout/dot/mincross-flat.d.ts.map +1 -0
- package/dist/layout/dot/mincross-order.d.ts +89 -0
- package/dist/layout/dot/mincross-order.d.ts.map +1 -0
- package/dist/layout/dot/mincross-utils.d.ts +60 -0
- package/dist/layout/dot/mincross-utils.d.ts.map +1 -0
- package/dist/layout/dot/mincross.d.ts +75 -0
- package/dist/layout/dot/mincross.d.ts.map +1 -0
- package/dist/layout/dot/ns-core.d.ts +37 -0
- package/dist/layout/dot/ns-core.d.ts.map +1 -0
- package/dist/layout/dot/ns-range.d.ts +17 -0
- package/dist/layout/dot/ns-range.d.ts.map +1 -0
- package/dist/layout/dot/ns-subtree.d.ts +78 -0
- package/dist/layout/dot/ns-subtree.d.ts.map +1 -0
- package/dist/layout/dot/ns.d.ts +86 -0
- package/dist/layout/dot/ns.d.ts.map +1 -0
- package/dist/layout/dot/ortho-adapter.d.ts +19 -0
- package/dist/layout/dot/ortho-adapter.d.ts.map +1 -0
- package/dist/layout/dot/pack-components.d.ts +100 -0
- package/dist/layout/dot/pack-components.d.ts.map +1 -0
- package/dist/layout/dot/position-aux.d.ts +110 -0
- package/dist/layout/dot/position-aux.d.ts.map +1 -0
- package/dist/layout/dot/position-bbox.d.ts +57 -0
- package/dist/layout/dot/position-bbox.d.ts.map +1 -0
- package/dist/layout/dot/position-cluster.d.ts +48 -0
- package/dist/layout/dot/position-cluster.d.ts.map +1 -0
- package/dist/layout/dot/position-ycoords.d.ts +42 -0
- package/dist/layout/dot/position-ycoords.d.ts.map +1 -0
- package/dist/layout/dot/position.d.ts +47 -0
- package/dist/layout/dot/position.d.ts.map +1 -0
- package/dist/layout/dot/rank-dot2.d.ts +114 -0
- package/dist/layout/dot/rank-dot2.d.ts.map +1 -0
- package/dist/layout/dot/rank.d.ts +119 -0
- package/dist/layout/dot/rank.d.ts.map +1 -0
- package/dist/layout/dot/sameport.d.ts +70 -0
- package/dist/layout/dot/sameport.d.ts.map +1 -0
- package/dist/layout/dot/self-loop.d.ts +54 -0
- package/dist/layout/dot/self-loop.d.ts.map +1 -0
- package/dist/layout/dot/splines-clone.d.ts +33 -0
- package/dist/layout/dot/splines-clone.d.ts.map +1 -0
- package/dist/layout/dot/splines-flat-labeled.d.ts +101 -0
- package/dist/layout/dot/splines-flat-labeled.d.ts.map +1 -0
- package/dist/layout/dot/splines-flat-multi.d.ts +35 -0
- package/dist/layout/dot/splines-flat-multi.d.ts.map +1 -0
- package/dist/layout/dot/splines-flat.d.ts +116 -0
- package/dist/layout/dot/splines-flat.d.ts.map +1 -0
- package/dist/layout/dot/splines-groups.d.ts +38 -0
- package/dist/layout/dot/splines-groups.d.ts.map +1 -0
- package/dist/layout/dot/splines-label.d.ts +105 -0
- package/dist/layout/dot/splines-label.d.ts.map +1 -0
- package/dist/layout/dot/splines-route-type.d.ts +28 -0
- package/dist/layout/dot/splines-route-type.d.ts.map +1 -0
- package/dist/layout/dot/splines-route.d.ts +99 -0
- package/dist/layout/dot/splines-route.d.ts.map +1 -0
- package/dist/layout/dot/splines.d.ts +157 -0
- package/dist/layout/dot/splines.d.ts.map +1 -0
- package/dist/layout/dot/straight-edges.d.ts +39 -0
- package/dist/layout/dot/straight-edges.d.ts.map +1 -0
- package/dist/layout/fdp/cluster-edges.d.ts +31 -0
- package/dist/layout/fdp/cluster-edges.d.ts.map +1 -0
- package/dist/layout/fdp/comp.d.ts +29 -0
- package/dist/layout/fdp/comp.d.ts.map +1 -0
- package/dist/layout/fdp/derive.d.ts +39 -0
- package/dist/layout/fdp/derive.d.ts.map +1 -0
- package/dist/layout/fdp/fdp-model.d.ts +101 -0
- package/dist/layout/fdp/fdp-model.d.ts.map +1 -0
- package/dist/layout/fdp/grid.d.ts +49 -0
- package/dist/layout/fdp/grid.d.ts.map +1 -0
- package/dist/layout/fdp/index.d.ts +36 -0
- package/dist/layout/fdp/index.d.ts.map +1 -0
- package/dist/layout/fdp/init.d.ts +26 -0
- package/dist/layout/fdp/init.d.ts.map +1 -0
- package/dist/layout/fdp/layout.d.ts +57 -0
- package/dist/layout/fdp/layout.d.ts.map +1 -0
- package/dist/layout/fdp/normalize.d.ts +18 -0
- package/dist/layout/fdp/normalize.d.ts.map +1 -0
- package/dist/layout/fdp/ports.d.ts +41 -0
- package/dist/layout/fdp/ports.d.ts.map +1 -0
- package/dist/layout/fdp/tlayout-init.d.ts +21 -0
- package/dist/layout/fdp/tlayout-init.d.ts.map +1 -0
- package/dist/layout/fdp/tlayout-parms.d.ts +98 -0
- package/dist/layout/fdp/tlayout-parms.d.ts.map +1 -0
- package/dist/layout/fdp/tlayout.d.ts +43 -0
- package/dist/layout/fdp/tlayout.d.ts.map +1 -0
- package/dist/layout/fdp/xlayout.d.ts +26 -0
- package/dist/layout/fdp/xlayout.d.ts.map +1 -0
- package/dist/layout/neato/bfs.d.ts +43 -0
- package/dist/layout/neato/bfs.d.ts.map +1 -0
- package/dist/layout/neato/cdt-surface.d.ts +16 -0
- package/dist/layout/neato/cdt-surface.d.ts.map +1 -0
- package/dist/layout/neato/conjgrad.d.ts +61 -0
- package/dist/layout/neato/conjgrad.d.ts.map +1 -0
- package/dist/layout/neato/delaunay.d.ts +28 -0
- package/dist/layout/neato/delaunay.d.ts.map +1 -0
- package/dist/layout/neato/dijkstra.d.ts +80 -0
- package/dist/layout/neato/dijkstra.d.ts.map +1 -0
- package/dist/layout/neato/fdp-adjust.d.ts +31 -0
- package/dist/layout/neato/fdp-adjust.d.ts.map +1 -0
- package/dist/layout/neato/index.d.ts +58 -0
- package/dist/layout/neato/index.d.ts.map +1 -0
- package/dist/layout/neato/init.d.ts +207 -0
- package/dist/layout/neato/init.d.ts.map +1 -0
- package/dist/layout/neato/legal.d.ts +7 -0
- package/dist/layout/neato/legal.d.ts.map +1 -0
- package/dist/layout/neato/matrix-ops.d.ts +28 -0
- package/dist/layout/neato/matrix-ops.d.ts.map +1 -0
- package/dist/layout/neato/multispline-router.d.ts +80 -0
- package/dist/layout/neato/multispline-router.d.ts.map +1 -0
- package/dist/layout/neato/multispline.d.ts +24 -0
- package/dist/layout/neato/multispline.d.ts.map +1 -0
- package/dist/layout/neato/overlap-prism.d.ts +26 -0
- package/dist/layout/neato/overlap-prism.d.ts.map +1 -0
- package/dist/layout/neato/overlap.d.ts +85 -0
- package/dist/layout/neato/overlap.d.ts.map +1 -0
- package/dist/layout/neato/sc-adjust.d.ts +33 -0
- package/dist/layout/neato/sc-adjust.d.ts.map +1 -0
- package/dist/layout/neato/sep-factor.d.ts +41 -0
- package/dist/layout/neato/sep-factor.d.ts.map +1 -0
- package/dist/layout/neato/set-aspect.d.ts +33 -0
- package/dist/layout/neato/set-aspect.d.ts.map +1 -0
- package/dist/layout/neato/sgd.d.ts +166 -0
- package/dist/layout/neato/sgd.d.ts.map +1 -0
- package/dist/layout/neato/splines.d.ts +153 -0
- package/dist/layout/neato/splines.d.ts.map +1 -0
- package/dist/layout/neato/stress-kernel.d.ts +53 -0
- package/dist/layout/neato/stress-kernel.d.ts.map +1 -0
- package/dist/layout/neato/stress.d.ts +158 -0
- package/dist/layout/neato/stress.d.ts.map +1 -0
- package/dist/layout/osage/index.d.ts +158 -0
- package/dist/layout/osage/index.d.ts.map +1 -0
- package/dist/layout/osage/layout.d.ts +49 -0
- package/dist/layout/osage/layout.d.ts.map +1 -0
- package/dist/layout/osage/types.d.ts +28 -0
- package/dist/layout/osage/types.d.ts.map +1 -0
- package/dist/layout/pack/array-pack.d.ts +114 -0
- package/dist/layout/pack/array-pack.d.ts.map +1 -0
- package/dist/layout/pack/index.d.ts +157 -0
- package/dist/layout/pack/index.d.ts.map +1 -0
- package/dist/layout/pack/poly-pack.d.ts +126 -0
- package/dist/layout/pack/poly-pack.d.ts.map +1 -0
- package/dist/layout/pack/poly-place.d.ts +27 -0
- package/dist/layout/pack/poly-place.d.ts.map +1 -0
- package/dist/layout/pack/spiral-search.d.ts +18 -0
- package/dist/layout/pack/spiral-search.d.ts.map +1 -0
- package/dist/layout/pack/test-helpers.d.ts +7 -0
- package/dist/layout/pack/test-helpers.d.ts.map +1 -0
- package/dist/layout/pack/types.d.ts +74 -0
- package/dist/layout/pack/types.d.ts.map +1 -0
- package/dist/layout/patchwork/index.d.ts +136 -0
- package/dist/layout/patchwork/index.d.ts.map +1 -0
- package/dist/layout/patchwork/tree-map.d.ts +32 -0
- package/dist/layout/patchwork/tree-map.d.ts.map +1 -0
- package/dist/layout/patchwork/tree-node.d.ts +46 -0
- package/dist/layout/patchwork/tree-node.d.ts.map +1 -0
- package/dist/layout/sfdp/index.d.ts +39 -0
- package/dist/layout/sfdp/index.d.ts.map +1 -0
- package/dist/layout/sfdp/init.d.ts +61 -0
- package/dist/layout/sfdp/init.d.ts.map +1 -0
- package/dist/layout/sfdp/multilevel.d.ts +23 -0
- package/dist/layout/sfdp/multilevel.d.ts.map +1 -0
- package/dist/layout/sfdp/quadtree.d.ts +45 -0
- package/dist/layout/sfdp/quadtree.d.ts.map +1 -0
- package/dist/layout/sfdp/sparse-matrix-multiply.d.ts +34 -0
- package/dist/layout/sfdp/sparse-matrix-multiply.d.ts.map +1 -0
- package/dist/layout/sfdp/sparse-matrix.d.ts +101 -0
- package/dist/layout/sfdp/sparse-matrix.d.ts.map +1 -0
- package/dist/layout/sfdp/sparse-solve.d.ts +14 -0
- package/dist/layout/sfdp/sparse-solve.d.ts.map +1 -0
- package/dist/layout/sfdp/spring-driver.d.ts +18 -0
- package/dist/layout/sfdp/spring-driver.d.ts.map +1 -0
- package/dist/layout/sfdp/spring-electrical.d.ts +61 -0
- package/dist/layout/sfdp/spring-electrical.d.ts.map +1 -0
- package/dist/layout/twopi/circle.d.ts +83 -0
- package/dist/layout/twopi/circle.d.ts.map +1 -0
- package/dist/layout/twopi/index.d.ts +24 -0
- package/dist/layout/twopi/index.d.ts.map +1 -0
- package/dist/layout/twopi/init.d.ts +85 -0
- package/dist/layout/twopi/init.d.ts.map +1 -0
- package/dist/layout/twopi/pipeline.d.ts +37 -0
- package/dist/layout/twopi/pipeline.d.ts.map +1 -0
- package/dist/layout/twopi/twopi-test-helpers.d.ts +12 -0
- package/dist/layout/twopi/twopi-test-helpers.d.ts.map +1 -0
- package/dist/model/algData.d.ts +175 -0
- package/dist/model/algData.d.ts.map +1 -0
- package/dist/model/cgraph-ops.d.ts +86 -0
- package/dist/model/cgraph-ops.d.ts.map +1 -0
- package/dist/model/edge.d.ts +80 -0
- package/dist/model/edge.d.ts.map +1 -0
- package/dist/model/edgeInfo.d.ts +299 -0
- package/dist/model/edgeInfo.d.ts.map +1 -0
- package/dist/model/geom.d.ts +149 -0
- package/dist/model/geom.d.ts.map +1 -0
- package/dist/model/graph.d.ts +135 -0
- package/dist/model/graph.d.ts.map +1 -0
- package/dist/model/graphInfo.d.ts +418 -0
- package/dist/model/graphInfo.d.ts.map +1 -0
- package/dist/model/index.d.ts +10 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/layoutParams.d.ts +85 -0
- package/dist/model/layoutParams.d.ts.map +1 -0
- package/dist/model/node.d.ts +101 -0
- package/dist/model/node.d.ts.map +1 -0
- package/dist/model/nodeInfo.d.ts +278 -0
- package/dist/model/nodeInfo.d.ts.map +1 -0
- package/dist/model/rankEntry.d.ts +80 -0
- package/dist/model/rankEntry.d.ts.map +1 -0
- package/dist/ortho/chan-dict.d.ts +82 -0
- package/dist/ortho/chan-dict.d.ts.map +1 -0
- package/dist/ortho/fpq.d.ts +54 -0
- package/dist/ortho/fpq.d.ts.map +1 -0
- package/dist/ortho/index.d.ts +35 -0
- package/dist/ortho/index.d.ts.map +1 -0
- package/dist/ortho/maze-channels.d.ts +47 -0
- package/dist/ortho/maze-channels.d.ts.map +1 -0
- package/dist/ortho/maze.d.ts +27 -0
- package/dist/ortho/maze.d.ts.map +1 -0
- package/dist/ortho/ortho-parallel.d.ts +26 -0
- package/dist/ortho/ortho-parallel.d.ts.map +1 -0
- package/dist/ortho/ortho-route.d.ts +31 -0
- package/dist/ortho/ortho-route.d.ts.map +1 -0
- package/dist/ortho/partition.d.ts +34 -0
- package/dist/ortho/partition.d.ts.map +1 -0
- package/dist/ortho/rawgraph.d.ts +41 -0
- package/dist/ortho/rawgraph.d.ts.map +1 -0
- package/dist/ortho/sgraph.d.ts +74 -0
- package/dist/ortho/sgraph.d.ts.map +1 -0
- package/dist/ortho/trap-query.d.ts +32 -0
- package/dist/ortho/trap-query.d.ts.map +1 -0
- package/dist/ortho/trap-segment.d.ts +23 -0
- package/dist/ortho/trap-segment.d.ts.map +1 -0
- package/dist/ortho/trap-types.d.ts +91 -0
- package/dist/ortho/trap-types.d.ts.map +1 -0
- package/dist/ortho/trap-update.d.ts +12 -0
- package/dist/ortho/trap-update.d.ts.map +1 -0
- package/dist/ortho/trapezoid.d.ts +18 -0
- package/dist/ortho/trapezoid.d.ts.map +1 -0
- package/dist/ortho/types.d.ts +241 -0
- package/dist/ortho/types.d.ts.map +1 -0
- package/dist/parser/ast.d.ts +49 -0
- package/dist/parser/ast.d.ts.map +1 -0
- package/dist/parser/builder.d.ts +75 -0
- package/dist/parser/builder.d.ts.map +1 -0
- package/dist/parser/index.d.ts +97 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/pathplan/index.d.ts +8 -0
- package/dist/pathplan/index.d.ts.map +1 -0
- package/dist/pathplan/route.d.ts +9 -0
- package/dist/pathplan/route.d.ts.map +1 -0
- package/dist/pathplan/shortest.d.ts +5 -0
- package/dist/pathplan/shortest.d.ts.map +1 -0
- package/dist/pathplan/solvers.d.ts +5 -0
- package/dist/pathplan/solvers.d.ts.map +1 -0
- package/dist/pathplan/triang.d.ts +25 -0
- package/dist/pathplan/triang.d.ts.map +1 -0
- package/dist/pathplan/types.d.ts +22 -0
- package/dist/pathplan/types.d.ts.map +1 -0
- package/dist/pathplan/visibility.d.ts +13 -0
- package/dist/pathplan/visibility.d.ts.map +1 -0
- package/dist/pathplan/vispath.d.ts +9 -0
- package/dist/pathplan/vispath.d.ts.map +1 -0
- package/dist/rbtree/index.d.ts +127 -0
- package/dist/rbtree/index.d.ts.map +1 -0
- package/dist/render/color-resolve.d.ts +38 -0
- package/dist/render/color-resolve.d.ts.map +1 -0
- package/dist/render/dot.d.ts +379 -0
- package/dist/render/dot.d.ts.map +1 -0
- package/dist/render/index.d.ts +24 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/json.d.ts +89 -0
- package/dist/render/json.d.ts.map +1 -0
- package/dist/render/map-test-helpers.d.ts +13 -0
- package/dist/render/map-test-helpers.d.ts.map +1 -0
- package/dist/render/map.d.ts +197 -0
- package/dist/render/map.d.ts.map +1 -0
- package/dist/render/public.d.ts +64 -0
- package/dist/render/public.d.ts.map +1 -0
- package/dist/render/svg-arrow-ops.d.ts +10 -0
- package/dist/render/svg-arrow-ops.d.ts.map +1 -0
- package/dist/render/svg-cluster.d.ts +9 -0
- package/dist/render/svg-cluster.d.ts.map +1 -0
- package/dist/render/svg-edge-ortho-radius.d.ts +31 -0
- package/dist/render/svg-edge-ortho-radius.d.ts.map +1 -0
- package/dist/render/svg-edge-split.d.ts +48 -0
- package/dist/render/svg-edge-split.d.ts.map +1 -0
- package/dist/render/svg-gradient.d.ts +46 -0
- package/dist/render/svg-gradient.d.ts.map +1 -0
- package/dist/render/svg-graph.d.ts +97 -0
- package/dist/render/svg-graph.d.ts.map +1 -0
- package/dist/render/svg-helpers.d.ts +122 -0
- package/dist/render/svg-helpers.d.ts.map +1 -0
- package/dist/render/svg-id.d.ts +28 -0
- package/dist/render/svg-id.d.ts.map +1 -0
- package/dist/render/svg-multicolor.d.ts +60 -0
- package/dist/render/svg-multicolor.d.ts.map +1 -0
- package/dist/render/svg-parallel-edge.d.ts +28 -0
- package/dist/render/svg-parallel-edge.d.ts.map +1 -0
- package/dist/render/svg-tapered-edge.d.ts +18 -0
- package/dist/render/svg-tapered-edge.d.ts.map +1 -0
- package/dist/render/svg.d.ts +104 -0
- package/dist/render/svg.d.ts.map +1 -0
- package/dist/render/xdot-public.d.ts +95 -0
- package/dist/render/xdot-public.d.ts.map +1 -0
- package/dist/render/xml-escape.d.ts +21 -0
- package/dist/render/xml-escape.d.ts.map +1 -0
- package/dist/render.js +52556 -0
- package/dist/render.js.map +7 -0
- package/dist/util/agxbuf.d.ts +72 -0
- package/dist/util/agxbuf.d.ts.map +1 -0
- package/dist/util/bsd-qsort.d.ts +22 -0
- package/dist/util/bsd-qsort.d.ts.map +1 -0
- package/dist/util/index.d.ts +11 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/list.d.ts +47 -0
- package/dist/util/list.d.ts.map +1 -0
- package/dist/util/math.d.ts +54 -0
- package/dist/util/math.d.ts.map +1 -0
- package/dist/util/mt19937.d.ts +40 -0
- package/dist/util/mt19937.d.ts.map +1 -0
- package/dist/util/printf-round.d.ts +45 -0
- package/dist/util/printf-round.d.ts.map +1 -0
- package/dist/util/xml.d.ts +24 -0
- package/dist/util/xml.d.ts.map +1 -0
- package/dist/vpsc/Block.d.ts +116 -0
- package/dist/vpsc/Block.d.ts.map +1 -0
- package/dist/vpsc/Blocks.d.ts +66 -0
- package/dist/vpsc/Blocks.d.ts.map +1 -0
- package/dist/vpsc/Constraint.d.ts +51 -0
- package/dist/vpsc/Constraint.d.ts.map +1 -0
- package/dist/vpsc/HeapUtils.d.ts +37 -0
- package/dist/vpsc/HeapUtils.d.ts.map +1 -0
- package/dist/vpsc/Solver.d.ts +107 -0
- package/dist/vpsc/Solver.d.ts.map +1 -0
- package/dist/vpsc/SweepLine.d.ts +38 -0
- package/dist/vpsc/SweepLine.d.ts.map +1 -0
- package/dist/vpsc/Variable.d.ts +38 -0
- package/dist/vpsc/Variable.d.ts.map +1 -0
- package/dist/vpsc/index.d.ts +54 -0
- package/dist/vpsc/index.d.ts.map +1 -0
- package/dist/vpsc/sweepTypes.d.ts +29 -0
- package/dist/vpsc/sweepTypes.d.ts.map +1 -0
- package/dist/xdot/index.d.ts +6 -0
- package/dist/xdot/index.d.ts.map +1 -0
- package/dist/xdot/lex.d.ts +22 -0
- package/dist/xdot/lex.d.ts.map +1 -0
- package/dist/xdot/misc.d.ts +13 -0
- package/dist/xdot/misc.d.ts.map +1 -0
- package/dist/xdot/parse.d.ts +21 -0
- package/dist/xdot/parse.d.ts.map +1 -0
- package/dist/xdot/types.d.ts +152 -0
- package/dist/xdot/types.d.ts.map +1 -0
- package/package.json +113 -0
- package/src/api/builder.ts +277 -0
- package/src/api/edge-ops.ts +113 -0
- package/src/api/geometry.ts +307 -0
- package/src/api/index.ts +46 -0
- package/src/cdt/bag.ts +196 -0
- package/src/cdt/hash-core.ts +84 -0
- package/src/cdt/hash.ts +207 -0
- package/src/cdt/index.ts +17 -0
- package/src/cdt/splay-core.ts +301 -0
- package/src/cdt/splay.ts +191 -0
- package/src/cdt/strhash.ts +52 -0
- package/src/cdt/types.ts +13 -0
- package/src/common/arith.ts +39 -0
- package/src/common/arm-pow-data.ts +201 -0
- package/src/common/arm-pow.ts +296 -0
- package/src/common/arrows-constants.ts +175 -0
- package/src/common/arrows-geometry.ts +62 -0
- package/src/common/arrows-miter.ts +84 -0
- package/src/common/arrows-shapes-poly.ts +241 -0
- package/src/common/arrows-shapes-util.ts +162 -0
- package/src/common/arrows-shapes.ts +360 -0
- package/src/common/arrows-types.ts +59 -0
- package/src/common/arrows.ts +209 -0
- package/src/common/color.ts +340 -0
- package/src/common/colorData.ts +264 -0
- package/src/common/compass-port.ts +384 -0
- package/src/common/crand.ts +79 -0
- package/src/common/edge-label-init.ts +310 -0
- package/src/common/edge-offset.ts +140 -0
- package/src/common/ellipse-wedge.ts +189 -0
- package/src/common/emit-types.ts +332 -0
- package/src/common/fma.ts +52 -0
- package/src/common/graph-init.ts +359 -0
- package/src/common/html-entities.ts +299 -0
- package/src/common/html-string.ts +22 -0
- package/src/common/htmltable-emit-fill.ts +367 -0
- package/src/common/htmltable-emit-rules.ts +293 -0
- package/src/common/htmltable-emit.ts +345 -0
- package/src/common/htmltable-lex.ts +138 -0
- package/src/common/htmltable-parse.ts +539 -0
- package/src/common/htmltable-port.ts +32 -0
- package/src/common/htmltable-pos-runs.ts +313 -0
- package/src/common/htmltable-pos.ts +601 -0
- package/src/common/htmltable-types.ts +262 -0
- package/src/common/htmltable.ts +477 -0
- package/src/common/layers.ts +113 -0
- package/src/common/make-label.ts +192 -0
- package/src/common/multicolor.ts +167 -0
- package/src/common/nodeinit.ts +339 -0
- package/src/common/poly-gencode.ts +475 -0
- package/src/common/poly-init.ts +133 -0
- package/src/common/poly-inside.ts +202 -0
- package/src/common/poly-shapes-cases.ts +253 -0
- package/src/common/poly-shapes-cases2.ts +170 -0
- package/src/common/poly-shapes-util.ts +124 -0
- package/src/common/poly-shapes.ts +181 -0
- package/src/common/poly-sizing.ts +639 -0
- package/src/common/poly-vertices.ts +237 -0
- package/src/common/postproc.ts +436 -0
- package/src/common/ps-fontalias.ts +112 -0
- package/src/common/random.ts +37 -0
- package/src/common/record-port.ts +89 -0
- package/src/common/record.ts +523 -0
- package/src/common/shapeData.ts +502 -0
- package/src/common/shapes.ts +187 -0
- package/src/common/spline-midpoint.ts +105 -0
- package/src/common/splines-clip.ts +449 -0
- package/src/common/splines-constants.ts +53 -0
- package/src/common/splines-geom.ts +194 -0
- package/src/common/splines-path-begin.ts +243 -0
- package/src/common/splines-path-end.ts +231 -0
- package/src/common/splines-path-shared.ts +258 -0
- package/src/common/splines-routespl.ts +444 -0
- package/src/common/splines-selfedge.ts +403 -0
- package/src/common/splines.ts +33 -0
- package/src/common/style-resolve.ts +481 -0
- package/src/common/subst.ts +126 -0
- package/src/common/taper.ts +219 -0
- package/src/common/textmeasure-factory.ts +86 -0
- package/src/common/textmeasure-lookup.ts +50 -0
- package/src/common/textmeasure-lut-data-a.ts +182 -0
- package/src/common/textmeasure-lut-data-b.ts +140 -0
- package/src/common/textmeasure-lut-data-c.ts +221 -0
- package/src/common/textmeasure-lut-data.ts +78 -0
- package/src/common/textmeasure.ts +321 -0
- package/src/common/types.ts +425 -0
- package/src/common/xlabels-place.ts +475 -0
- package/src/debug.ts +38 -0
- package/src/errors.ts +95 -0
- package/src/gvc/anchor.ts +530 -0
- package/src/gvc/context.ts +260 -0
- package/src/gvc/default-context.ts +70 -0
- package/src/gvc/device-cluster.ts +114 -0
- package/src/gvc/device.ts +598 -0
- package/src/gvc/edge-labels.ts +116 -0
- package/src/gvc/emit-walk.ts +98 -0
- package/src/gvc/image-resolver.ts +137 -0
- package/src/gvc/job.ts +401 -0
- package/src/gvc/textlayout.ts +44 -0
- package/src/gvc/textspan-emit.ts +100 -0
- package/src/gvc/usershape.ts +33 -0
- package/src/gvc/viewport.ts +203 -0
- package/src/index.ts +165 -0
- package/src/label/index.ts +302 -0
- package/src/label/node.ts +278 -0
- package/src/label/rectangle.ts +123 -0
- package/src/label/split-q.ts +237 -0
- package/src/label/xlabels-geom.ts +132 -0
- package/src/label/xlabels-intersect.ts +421 -0
- package/src/label/xlabels.ts +212 -0
- package/src/layout/circo/blockpath.ts +560 -0
- package/src/layout/circo/blocks.ts +234 -0
- package/src/layout/circo/blocktree.ts +246 -0
- package/src/layout/circo/circular.ts +227 -0
- package/src/layout/circo/index.ts +90 -0
- package/src/layout/circo/init.ts +84 -0
- package/src/layout/circo/position-helpers.ts +104 -0
- package/src/layout/circo/position.ts +196 -0
- package/src/layout/dot/__fixtures__/xcoord-pivot-divergence.gv +79 -0
- package/src/layout/dot/acyclic.ts +60 -0
- package/src/layout/dot/aspect.ts +22 -0
- package/src/layout/dot/classify.ts +462 -0
- package/src/layout/dot/cluster-path.ts +200 -0
- package/src/layout/dot/cluster.ts +480 -0
- package/src/layout/dot/compound-clip.ts +224 -0
- package/src/layout/dot/compound-geom.ts +282 -0
- package/src/layout/dot/compound.ts +294 -0
- package/src/layout/dot/conc.ts +433 -0
- package/src/layout/dot/decomp.ts +165 -0
- package/src/layout/dot/edge-order.ts +62 -0
- package/src/layout/dot/edge-route-arrow.ts +87 -0
- package/src/layout/dot/edge-route-boxes.ts +99 -0
- package/src/layout/dot/edge-route-chain.ts +420 -0
- package/src/layout/dot/edge-route-clip.ts +253 -0
- package/src/layout/dot/edge-route-faithful.ts +404 -0
- package/src/layout/dot/edge-route-geom.ts +90 -0
- package/src/layout/dot/edge-route-helpers.ts +170 -0
- package/src/layout/dot/edge-route-poly.ts +174 -0
- package/src/layout/dot/edge-route-rank.ts +136 -0
- package/src/layout/dot/edge-route-routing.ts +219 -0
- package/src/layout/dot/edge-route.ts +490 -0
- package/src/layout/dot/fastgr.ts +377 -0
- package/src/layout/dot/flat-utils.ts +52 -0
- package/src/layout/dot/flat.ts +518 -0
- package/src/layout/dot/graph-label.ts +114 -0
- package/src/layout/dot/index.ts +302 -0
- package/src/layout/dot/init.ts +300 -0
- package/src/layout/dot/label-order.ts +161 -0
- package/src/layout/dot/mincross-build.ts +373 -0
- package/src/layout/dot/mincross-cross.ts +409 -0
- package/src/layout/dot/mincross-flat.ts +213 -0
- package/src/layout/dot/mincross-order.ts +401 -0
- package/src/layout/dot/mincross-utils.ts +170 -0
- package/src/layout/dot/mincross.ts +386 -0
- package/src/layout/dot/ns-core.ts +122 -0
- package/src/layout/dot/ns-range.ts +228 -0
- package/src/layout/dot/ns-subtree.ts +347 -0
- package/src/layout/dot/ns.ts +506 -0
- package/src/layout/dot/ortho-adapter.ts +133 -0
- package/src/layout/dot/pack-components.ts +433 -0
- package/src/layout/dot/position-aux.ts +382 -0
- package/src/layout/dot/position-bbox.ts +221 -0
- package/src/layout/dot/position-cluster.ts +286 -0
- package/src/layout/dot/position-ycoords.ts +287 -0
- package/src/layout/dot/position.ts +194 -0
- package/src/layout/dot/rank-dot2.ts +528 -0
- package/src/layout/dot/rank.ts +547 -0
- package/src/layout/dot/sameport.ts +278 -0
- package/src/layout/dot/self-loop.ts +147 -0
- package/src/layout/dot/splines-clone.ts +121 -0
- package/src/layout/dot/splines-flat-labeled.ts +408 -0
- package/src/layout/dot/splines-flat-multi.ts +188 -0
- package/src/layout/dot/splines-flat.ts +598 -0
- package/src/layout/dot/splines-groups.ts +190 -0
- package/src/layout/dot/splines-label.ts +432 -0
- package/src/layout/dot/splines-route-type.ts +44 -0
- package/src/layout/dot/splines-route.ts +478 -0
- package/src/layout/dot/splines.ts +538 -0
- package/src/layout/dot/straight-edges.ts +332 -0
- package/src/layout/fdp/cluster-edges.ts +0 -0
- package/src/layout/fdp/comp.ts +160 -0
- package/src/layout/fdp/derive.ts +272 -0
- package/src/layout/fdp/fdp-model.ts +238 -0
- package/src/layout/fdp/grid.ts +77 -0
- package/src/layout/fdp/index.ts +113 -0
- package/src/layout/fdp/init.ts +116 -0
- package/src/layout/fdp/layout.ts +485 -0
- package/src/layout/fdp/normalize.ts +100 -0
- package/src/layout/fdp/ports.ts +161 -0
- package/src/layout/fdp/tlayout-init.ts +230 -0
- package/src/layout/fdp/tlayout-parms.ts +234 -0
- package/src/layout/fdp/tlayout.ts +317 -0
- package/src/layout/fdp/xlayout.ts +350 -0
- package/src/layout/neato/bfs.ts +131 -0
- package/src/layout/neato/cdt-surface.ts +693 -0
- package/src/layout/neato/conjgrad.ts +159 -0
- package/src/layout/neato/delaunay.ts +259 -0
- package/src/layout/neato/dijkstra.ts +296 -0
- package/src/layout/neato/fdp-adjust.ts +124 -0
- package/src/layout/neato/index.ts +310 -0
- package/src/layout/neato/init.ts +505 -0
- package/src/layout/neato/legal.ts +316 -0
- package/src/layout/neato/matrix-ops.ts +112 -0
- package/src/layout/neato/multispline-router.ts +417 -0
- package/src/layout/neato/multispline.ts +427 -0
- package/src/layout/neato/overlap-prism.ts +503 -0
- package/src/layout/neato/overlap.ts +158 -0
- package/src/layout/neato/sc-adjust.ts +206 -0
- package/src/layout/neato/sep-factor.ts +118 -0
- package/src/layout/neato/set-aspect.ts +178 -0
- package/src/layout/neato/sgd.ts +461 -0
- package/src/layout/neato/splines.ts +1014 -0
- package/src/layout/neato/stress-kernel.ts +362 -0
- package/src/layout/neato/stress.ts +420 -0
- package/src/layout/osage/index.ts +548 -0
- package/src/layout/osage/layout.ts +254 -0
- package/src/layout/osage/types.ts +31 -0
- package/src/layout/pack/array-pack.ts +254 -0
- package/src/layout/pack/index.ts +570 -0
- package/src/layout/pack/poly-pack.ts +266 -0
- package/src/layout/pack/poly-place.ts +426 -0
- package/src/layout/pack/spiral-search.ts +106 -0
- package/src/layout/pack/test-helpers.ts +46 -0
- package/src/layout/pack/types.ts +85 -0
- package/src/layout/patchwork/index.ts +441 -0
- package/src/layout/patchwork/tree-map.ts +183 -0
- package/src/layout/patchwork/tree-node.ts +120 -0
- package/src/layout/sfdp/index.ts +231 -0
- package/src/layout/sfdp/init.ts +224 -0
- package/src/layout/sfdp/multilevel.ts +262 -0
- package/src/layout/sfdp/quadtree.ts +267 -0
- package/src/layout/sfdp/sparse-matrix-multiply.ts +160 -0
- package/src/layout/sfdp/sparse-matrix.ts +367 -0
- package/src/layout/sfdp/sparse-solve.ts +122 -0
- package/src/layout/sfdp/spring-driver.ts +209 -0
- package/src/layout/sfdp/spring-electrical.ts +431 -0
- package/src/layout/twopi/circle.ts +339 -0
- package/src/layout/twopi/index.ts +78 -0
- package/src/layout/twopi/init.ts +174 -0
- package/src/layout/twopi/pipeline.ts +98 -0
- package/src/layout/twopi/twopi-test-helpers.ts +44 -0
- package/src/model/algData.ts +194 -0
- package/src/model/cgraph-ops.ts +175 -0
- package/src/model/edge.ts +104 -0
- package/src/model/edgeInfo.ts +431 -0
- package/src/model/geom.ts +204 -0
- package/src/model/graph.ts +172 -0
- package/src/model/graphInfo.ts +528 -0
- package/src/model/index.ts +10 -0
- package/src/model/layoutParams.ts +127 -0
- package/src/model/node.ts +138 -0
- package/src/model/nodeInfo.ts +424 -0
- package/src/model/rankEntry.ts +95 -0
- package/src/ortho/chan-dict.ts +236 -0
- package/src/ortho/fpq.ts +149 -0
- package/src/ortho/index.ts +206 -0
- package/src/ortho/maze-channels.ts +196 -0
- package/src/ortho/maze.ts +311 -0
- package/src/ortho/ortho-parallel.ts +254 -0
- package/src/ortho/ortho-route.ts +349 -0
- package/src/ortho/partition.ts +303 -0
- package/src/ortho/rawgraph.ts +119 -0
- package/src/ortho/sgraph.ts +283 -0
- package/src/ortho/trap-query.ts +174 -0
- package/src/ortho/trap-segment.ts +303 -0
- package/src/ortho/trap-types.ts +171 -0
- package/src/ortho/trap-update.ts +89 -0
- package/src/ortho/trapezoid.ts +120 -0
- package/src/ortho/types.ts +286 -0
- package/src/parser/__fixtures__/directed.dot +10 -0
- package/src/parser/__fixtures__/simple.dot +7 -0
- package/src/parser/__fixtures__/subgraph.dot +17 -0
- package/src/parser/ast.ts +64 -0
- package/src/parser/builder.ts +401 -0
- package/src/parser/dot.d.ts +208 -0
- package/src/parser/dot.js +3321 -0
- package/src/parser/dot.pegjs +263 -0
- package/src/parser/index.ts +353 -0
- package/src/pathplan/index.ts +9 -0
- package/src/pathplan/route.ts +284 -0
- package/src/pathplan/shortest.ts +268 -0
- package/src/pathplan/solvers.ts +65 -0
- package/src/pathplan/triang.ts +221 -0
- package/src/pathplan/types.ts +16 -0
- package/src/pathplan/visibility.ts +170 -0
- package/src/pathplan/vispath.ts +118 -0
- package/src/rbtree/index.ts +418 -0
- package/src/render/color-resolve.ts +171 -0
- package/src/render/dot.ts +1514 -0
- package/src/render/index.ts +29 -0
- package/src/render/json.ts +734 -0
- package/src/render/map-test-helpers.ts +61 -0
- package/src/render/map.ts +528 -0
- package/src/render/public.ts +131 -0
- package/src/render/svg-arrow-ops.ts +113 -0
- package/src/render/svg-cluster.ts +24 -0
- package/src/render/svg-edge-ortho-radius.ts +228 -0
- package/src/render/svg-edge-split.ts +180 -0
- package/src/render/svg-gradient.ts +185 -0
- package/src/render/svg-graph.ts +415 -0
- package/src/render/svg-helpers.ts +623 -0
- package/src/render/svg-id.ts +76 -0
- package/src/render/svg-multicolor.ts +313 -0
- package/src/render/svg-parallel-edge.ts +123 -0
- package/src/render/svg-tapered-edge.ts +56 -0
- package/src/render/svg.ts +307 -0
- package/src/render/xdot-public.ts +164 -0
- package/src/render/xml-escape.ts +56 -0
- package/src/util/agxbuf.ts +138 -0
- package/src/util/bsd-qsort.ts +251 -0
- package/src/util/index.ts +25 -0
- package/src/util/list.ts +122 -0
- package/src/util/math.ts +104 -0
- package/src/util/mt19937.ts +143 -0
- package/src/util/printf-round.ts +163 -0
- package/src/util/xml.ts +184 -0
- package/src/vpsc/Block.ts +375 -0
- package/src/vpsc/Blocks.ts +164 -0
- package/src/vpsc/Constraint.ts +94 -0
- package/src/vpsc/HeapUtils.ts +88 -0
- package/src/vpsc/Solver.ts +274 -0
- package/src/vpsc/SweepLine.ts +214 -0
- package/src/vpsc/Variable.ts +54 -0
- package/src/vpsc/index.ts +122 -0
- package/src/vpsc/sweepTypes.ts +31 -0
- package/src/xdot/index.ts +7 -0
- package/src/xdot/lex.ts +151 -0
- package/src/xdot/misc.ts +226 -0
- package/src/xdot/parse.ts +349 -0
- package/src/xdot/types.ts +158 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SVG renderer plugin.
|
|
5
|
+
*
|
|
6
|
+
* Faithful TypeScript port of plugin/core/gvrender_core_svg.c.
|
|
7
|
+
* Implements RendererPlugin to produce SVG 1.1 output.
|
|
8
|
+
*
|
|
9
|
+
* Y-coordinate investigation: The C svg_bzptarray and all shape emitters
|
|
10
|
+
* negate Y with -A[i].y because they receive raw PostScript (Y-up)
|
|
11
|
+
* coordinates and must convert to SVG (Y-down). In this TypeScript port
|
|
12
|
+
* the Y-flip is applied upstream via transformPoint with devscale.y = -1
|
|
13
|
+
* (src/gvc/device.ts). Coordinates received in all renderer callbacks are
|
|
14
|
+
* therefore already in SVG Y-down space; no additional negation is needed.
|
|
15
|
+
*
|
|
16
|
+
* @see plugin/core/gvrender_core_svg.c
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { Graph } from '../model/graph.js';
|
|
20
|
+
import type { Node } from '../model/node.js';
|
|
21
|
+
import type { Edge } from '../model/edge.js';
|
|
22
|
+
import type { Point, Box } from '../model/geom.js';
|
|
23
|
+
import { boxOverlap } from '../model/geom.js';
|
|
24
|
+
import type { TextlabelT } from '../common/types.js';
|
|
25
|
+
import type { TextSpan } from '../common/emit-types.js';
|
|
26
|
+
import type { RendererPlugin, LabelType } from '../gvc/context.js';
|
|
27
|
+
import type { RenderJob } from '../gvc/job.js';
|
|
28
|
+
import { renderEdgeLabels } from '../gvc/edge-labels.js';
|
|
29
|
+
import { beginAnchorIf } from '../gvc/anchor.js';
|
|
30
|
+
import {
|
|
31
|
+
svgBeginGraph,
|
|
32
|
+
svgEndGraph,
|
|
33
|
+
svgBeginPage,
|
|
34
|
+
svgPageBackground,
|
|
35
|
+
svgEndPage,
|
|
36
|
+
svgBeginLayer,
|
|
37
|
+
svgEndLayer,
|
|
38
|
+
svgBeginNode,
|
|
39
|
+
svgEndNode,
|
|
40
|
+
svgBeginEdge,
|
|
41
|
+
svgEndEdge,
|
|
42
|
+
svgBeginAnchor,
|
|
43
|
+
svgEndAnchor,
|
|
44
|
+
svgTextspan,
|
|
45
|
+
svgEllipse,
|
|
46
|
+
svgPolygon,
|
|
47
|
+
svgBezier,
|
|
48
|
+
svgPolyline,
|
|
49
|
+
svgComment,
|
|
50
|
+
svgEdgePath,
|
|
51
|
+
svgEdgePathOrthoRounded,
|
|
52
|
+
orthoRoundedRadius,
|
|
53
|
+
svgArrowPolygons,
|
|
54
|
+
emitParallelEdgePaths,
|
|
55
|
+
escapeXml,
|
|
56
|
+
emitPoints,
|
|
57
|
+
} from './svg-helpers.js';
|
|
58
|
+
import { emitArrowOps } from './svg-arrow-ops.js';
|
|
59
|
+
import { resolveRenderColor, colorOpacity, colorPaint } from './color-resolve.js';
|
|
60
|
+
import { svgBeginCluster, svgEndCluster } from './svg-cluster.js';
|
|
61
|
+
import { emitSplitEdgePaths } from './svg-edge-split.js';
|
|
62
|
+
import { edgeIsTapered, svgTaperedEdge } from './svg-tapered-edge.js';
|
|
63
|
+
import { findImageBytes, toDataUri } from '../gvc/image-resolver.js';
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Multicolor arrow helpers
|
|
67
|
+
// @see lib/common/emit.c:2508-2528 (tail/head arrow with headcolor/tailcolor)
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
/** Emit tail arrow with tailColor and head arrow with headColor (multicolor). */
|
|
71
|
+
function emitMulticolorArrows(e: Edge, job: RenderJob, headColor: string, tailColor: string): void {
|
|
72
|
+
const obj = job.obj;
|
|
73
|
+
const pw = obj !== null ? obj.penWidth : 1.0;
|
|
74
|
+
const tailOps = e.info.tailArrowOps;
|
|
75
|
+
if (tailOps?.length) {
|
|
76
|
+
emitArrowOps(tailOps, tailColor, job, pw, colorOpacity(resolveRenderColor(tailColor)));
|
|
77
|
+
}
|
|
78
|
+
const headOps = e.info.headArrowOps;
|
|
79
|
+
if (headOps?.length) {
|
|
80
|
+
emitArrowOps(headOps, headColor, job, pw, colorOpacity(resolveRenderColor(headColor)));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// SvgRenderer — delegates all work to module-level helpers in svg-helpers.ts
|
|
86
|
+
// @see plugin/core/gvrender_core_svg.c:svg_engine
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
|
|
89
|
+
/** overlap_label: does the label's box (pos ± dimen/2) overlap clip box b?
|
|
90
|
+
* @see lib/common/utils.c:overlap_label */
|
|
91
|
+
function overlapLabel(lp: TextlabelT, b: Box): boolean {
|
|
92
|
+
const sx = lp.dimen.x / 2;
|
|
93
|
+
const sy = lp.dimen.y / 2;
|
|
94
|
+
const bb: Box = {
|
|
95
|
+
ll: { x: lp.pos.x - sx, y: lp.pos.y - sy },
|
|
96
|
+
ur: { x: lp.pos.x + sx, y: lp.pos.y + sy },
|
|
97
|
+
};
|
|
98
|
+
return boxOverlap(b, bb);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Faithful-to-outcome `edge_in_box`: true when the edge has something to draw.
|
|
103
|
+
* C's gvrender defers the `<g>` until a draw op, so an edge whose content falls
|
|
104
|
+
* entirely outside the clip emits no group (emit.c:edge_in_box tests each piece
|
|
105
|
+
* vs job->clip via boxf_overlap/overlap_label).
|
|
106
|
+
*
|
|
107
|
+
* The only piece that can legitimately fall OUTSIDE the clip on this corpus is a
|
|
108
|
+
* degenerate labeled-flat label: it is spline-less, so map_edge leaves it at its
|
|
109
|
+
* internal (un-normalized) x-frame position while the clip is the final frame.
|
|
110
|
+
* The `overlapLabel` test on the main label reproduces C's draw-iff-overlap for
|
|
111
|
+
* exactly that case — on-canvas (2368) → drawn; off-canvas (2368_1, negative
|
|
112
|
+
* un-normalized x) → suppressed. A present spline always lies within the clip
|
|
113
|
+
* (GD_bb contains it), and head/tail/xlabels are positioned at on-canvas
|
|
114
|
+
* endpoints, so those keep their existing unconditional triggers — adding an
|
|
115
|
+
* overlap test there only risks suppressing legitimately-drawn content (it
|
|
116
|
+
* regressed neato/circo edges whose spl.bb is computed differently). The `set`
|
|
117
|
+
* guard on the main label is kept: the port retains an unplaced (`pos=0,0`,
|
|
118
|
+
* `set=false`) label on merged back-edges where C has none.
|
|
119
|
+
* @see lib/common/emit.c:edge_in_box, lib/common/utils.c:overlap_label
|
|
120
|
+
*/
|
|
121
|
+
export function edgeHasDrawableContent(e: Edge, clip: Box): boolean {
|
|
122
|
+
const i = e.info;
|
|
123
|
+
return i.spl !== undefined
|
|
124
|
+
|| (i.label !== undefined && i.label.set && overlapLabel(i.label, clip))
|
|
125
|
+
|| i.xlabel !== undefined
|
|
126
|
+
|| i.head_label !== undefined || i.tail_label !== undefined;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export class SvgRenderer implements RendererPlugin {
|
|
130
|
+
readonly type = 'svg';
|
|
131
|
+
/** @see plugin/core/gvplugin_core.c registration table */
|
|
132
|
+
readonly quality = 0;
|
|
133
|
+
/** Whether the current edge's <g> group was opened (deferred-emit state). */
|
|
134
|
+
private edgeGroupOpen = false;
|
|
135
|
+
|
|
136
|
+
beginGraph(g: Graph, job: RenderJob): void { svgBeginGraph(g, job); }
|
|
137
|
+
endGraph(_g: Graph, job: RenderJob): void { svgEndGraph(job); }
|
|
138
|
+
beginPage(g: Graph, job: RenderJob): void { svgBeginPage(g, job); }
|
|
139
|
+
|
|
140
|
+
pageBackground(g: Graph, job: RenderJob): void { svgPageBackground(g, job); }
|
|
141
|
+
endPage(_g: Graph, job: RenderJob): void { svgEndPage(job); }
|
|
142
|
+
beginLayer(name: string, job: RenderJob): void { svgBeginLayer(name, job); }
|
|
143
|
+
endLayer(job: RenderJob): void { svgEndLayer(job); }
|
|
144
|
+
beginNode(n: Node, job: RenderJob): void { svgBeginNode(n, job); }
|
|
145
|
+
endNode(_n: Node, job: RenderJob): void { svgEndNode(job); }
|
|
146
|
+
beginEdge(e: Edge, job: RenderJob): void {
|
|
147
|
+
// job.bb is the final drawing bbox (= GD_bb / job->clip); emit_edge gates
|
|
148
|
+
// all edge drawing on edge_in_box(e, job->clip). @see lib/common/emit.c:emit_edge
|
|
149
|
+
this.edgeGroupOpen = edgeHasDrawableContent(e, job.bb);
|
|
150
|
+
if (this.edgeGroupOpen) svgBeginEdge(e, job);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Close the edge group. Edge graphics (path + arrowhead) are emitted here
|
|
155
|
+
* because the full spline is available on e.info.spl only after layout has
|
|
156
|
+
* run routeDotEdges.
|
|
157
|
+
*
|
|
158
|
+
* For multi-color edges (color="c1:c2:…"), emits parallel offset Béziers
|
|
159
|
+
* (one per color, SEP=2.0 apart) then arrows in headcolor/tailcolor.
|
|
160
|
+
* Single-color edges use the T4 path unchanged.
|
|
161
|
+
*
|
|
162
|
+
* @see plugin/core/gvrender_core_svg.c:svg_end_edge
|
|
163
|
+
* @see lib/common/emit.c:2442-2528 (else if numc parallel-bezier branch)
|
|
164
|
+
*/
|
|
165
|
+
endEdge(e: Edge, job: RenderJob): void {
|
|
166
|
+
// No <g> opened (no spline/label) → nothing to draw or close, matching C's
|
|
167
|
+
// deferred group emission for content-less edges.
|
|
168
|
+
if (!this.edgeGroupOpen) return;
|
|
169
|
+
this.edgeGroupOpen = false;
|
|
170
|
+
// Whole-edge anchor wraps the spline + arrows only; it closes before the
|
|
171
|
+
// labels, which carry their own sub-anchors (siblings, not nested).
|
|
172
|
+
// @see lib/common/emit.c:2877 (begin) / emit_end_edge:2970 (end)
|
|
173
|
+
const anchored = beginAnchorIf(this, job);
|
|
174
|
+
const colorAttr = e.attrs.get('color') ?? '';
|
|
175
|
+
const numc = (colorAttr.match(/:/g) ?? []).length;
|
|
176
|
+
const numsemi = (colorAttr.match(/;/g) ?? []).length;
|
|
177
|
+
if (numsemi > 0 && numc > 0) {
|
|
178
|
+
// Split-along-length branch (semicolon syntax).
|
|
179
|
+
// Arrow rule is inverted: tail = first color, head = endcolor.
|
|
180
|
+
// @see lib/common/emit.c:2390 if (numsemi && numc) multicolor()
|
|
181
|
+
const { firstColor, endColor } = emitSplitEdgePaths(e, job, colorAttr);
|
|
182
|
+
emitMulticolorArrows(e, job, endColor, firstColor);
|
|
183
|
+
} else if (edgeIsTapered(e)) {
|
|
184
|
+
// Tapered edge: a filled taper polygon + arrows. Takes precedence over
|
|
185
|
+
// colon-multicolor, matching C's `if (tapered) ... else if (numc)`.
|
|
186
|
+
// @see lib/common/emit.c:2422
|
|
187
|
+
svgTaperedEdge(e, job);
|
|
188
|
+
} else if (numc > 0) {
|
|
189
|
+
// Multicolor parallel-bezier branch
|
|
190
|
+
// @see lib/common/emit.c:2443 else if (numc)
|
|
191
|
+
const { headColor, tailColor } = emitParallelEdgePaths(e, job, colorAttr);
|
|
192
|
+
emitMulticolorArrows(e, job, headColor, tailColor);
|
|
193
|
+
} else {
|
|
194
|
+
// Single-color branch. Ortho edges with rounded corners (splines=ortho +
|
|
195
|
+
// radius/style=rounded) emit polyline segments + corner arcs; all other
|
|
196
|
+
// edges keep the byte-stable bezier <path>. @see lib/common/emit.c:2553
|
|
197
|
+
const orthoRadius = orthoRoundedRadius(e, job);
|
|
198
|
+
// svgEdgePath interleaves each bezier's arrowheads per C's emit loop;
|
|
199
|
+
// the rounded-ortho variant keeps the trailing arrow pass (its arrows
|
|
200
|
+
// always sit on the single ortho bezier). @see lib/common/emit.c:2668
|
|
201
|
+
if (orthoRadius !== null) {
|
|
202
|
+
svgEdgePathOrthoRounded(e, orthoRadius, job);
|
|
203
|
+
svgArrowPolygons(e, job);
|
|
204
|
+
} else {
|
|
205
|
+
svgEdgePath(e, job);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (anchored) this.endAnchor(job);
|
|
209
|
+
// Edge labels go inside the group, after path + arrows.
|
|
210
|
+
// @see lib/common/emit.c:emit_end_edge (3010-3025)
|
|
211
|
+
renderEdgeLabels(e, this, job);
|
|
212
|
+
svgEndEdge(job);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
beginAnchor(
|
|
216
|
+
href: string,
|
|
217
|
+
tooltip: string,
|
|
218
|
+
target: string,
|
|
219
|
+
id: string,
|
|
220
|
+
job: RenderJob,
|
|
221
|
+
): void {
|
|
222
|
+
svgBeginAnchor(href, tooltip, target, id, job);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
endAnchor(job: RenderJob): void { svgEndAnchor(job); }
|
|
226
|
+
|
|
227
|
+
textspan(pos: Point, span: TextSpan, job: RenderJob): void {
|
|
228
|
+
svgTextspan(pos, span, job);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
ellipse(
|
|
232
|
+
center: Point,
|
|
233
|
+
rx: number,
|
|
234
|
+
ry: number,
|
|
235
|
+
filled: boolean,
|
|
236
|
+
job: RenderJob,
|
|
237
|
+
): void {
|
|
238
|
+
svgEllipse(center, rx, ry, filled, job);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
polygon(pts: Point[], filled: boolean, job: RenderJob): void {
|
|
242
|
+
svgPolygon(pts, filled, job);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
bezier(pts: Point[], filled: boolean, job: RenderJob): void {
|
|
246
|
+
svgBezier(pts, filled, job);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
polyline(pts: Point[], job: RenderJob): void { svgPolyline(pts, job); }
|
|
250
|
+
// C resets to the default line style and the label's fontcolor before the
|
|
251
|
+
// attachment polyline (emit.c:1886-1893) — the edge's own dash/width must
|
|
252
|
+
// not leak onto it.
|
|
253
|
+
attachmentPolyline(pts: Point[], pencolor: string, job: RenderJob): void {
|
|
254
|
+
// Resolve the label fontcolor through the SVG known-color gate before
|
|
255
|
+
// emission, mirroring C's gvrender_set_pencolor in emit_attachment; a raw
|
|
256
|
+
// attribute value must never reach stroke="..." unresolved/unescaped.
|
|
257
|
+
job.write('<polyline fill="none" stroke="' + colorPaint(resolveRenderColor(pencolor)) + '" points="');
|
|
258
|
+
emitPoints(job, pts);
|
|
259
|
+
job.write('"/>\n');
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Emit an <image> element. C formats numbers with %g here (not the
|
|
264
|
+
* svg_printdouble used elsewhere); toPrecision(6) reproduces %g.
|
|
265
|
+
* Deviation: C writes us->name raw (gvputs); the port XML-escapes the
|
|
266
|
+
* src so metacharacter paths cannot produce invalid SVG.
|
|
267
|
+
*
|
|
268
|
+
* AD-1 (image-api, additive): when job.inlineImages is set AND the
|
|
269
|
+
* registered image resolver (`setImageResolver`) resolves `src`, emit a
|
|
270
|
+
* self-contained `data:` URI instead of the raw src passthrough. This is
|
|
271
|
+
* not a C behavior — native Graphviz never inlines image bytes. Default
|
|
272
|
+
* off (job.inlineImages unset/false, or no resolver registered, or the
|
|
273
|
+
* resolver misses) reproduces the byte-identical pre-AD-1 output below.
|
|
274
|
+
* @see plugin/core/gvloadimage_core.c:core_loadimage_svg
|
|
275
|
+
* @see src/gvc/image-resolver.ts
|
|
276
|
+
*/
|
|
277
|
+
usershape(src: string, b: Box, job: RenderJob): void {
|
|
278
|
+
const g = (n: number): string => String(parseFloat(n.toPrecision(6)));
|
|
279
|
+
const width = b.ur.x - b.ll.x;
|
|
280
|
+
const height = b.ur.y - b.ll.y;
|
|
281
|
+
const originx = (b.ur.x + b.ll.x - width) / 2;
|
|
282
|
+
const originy = (b.ur.y + b.ll.y + height) / 2;
|
|
283
|
+
let href = src;
|
|
284
|
+
if (job.inlineImages === true) {
|
|
285
|
+
const found = findImageBytes(src);
|
|
286
|
+
if (found !== null) href = toDataUri(found.bytes, found.mime);
|
|
287
|
+
}
|
|
288
|
+
job.write('<image xlink:href="' + escapeXml(href) + '" width="' + g(width)
|
|
289
|
+
+ 'px" height="' + g(height) + 'px" preserveAspectRatio="xMinYMin meet" x="'
|
|
290
|
+
+ g(originx) + '" y="' + g(-originy) + '"/>\n');
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
comment(text: string, job: RenderJob): void { svgComment(text, job); }
|
|
294
|
+
|
|
295
|
+
beginLabel(_type: LabelType, _job: RenderJob): void { /* no-op */ }
|
|
296
|
+
endLabel(_job: RenderJob): void { /* no-op */ }
|
|
297
|
+
beginCluster(sg: Graph, job: RenderJob): void { svgBeginCluster(sg, job); }
|
|
298
|
+
endCluster(_sg: Graph, job: RenderJob): void { svgEndCluster(job); }
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
// Factory — @see plugin/core/gvrender_core_svg.c:gvrender_svg_types
|
|
303
|
+
// ---------------------------------------------------------------------------
|
|
304
|
+
|
|
305
|
+
export function createSvgRenderer(): RendererPlugin {
|
|
306
|
+
return new SvgRenderer();
|
|
307
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Public API for structured xdot draw-op access.
|
|
5
|
+
*
|
|
6
|
+
* Lays out a Graph, renders it to the xdot format, parses the xdot
|
|
7
|
+
* attribute strings back into typed XdotOp values, and returns a flat
|
|
8
|
+
* op stream the caller can feed to any drawing backend (canvas, WebGL,
|
|
9
|
+
* PDF, native UI) without touching SVG.
|
|
10
|
+
*
|
|
11
|
+
* This wrapper is a thin, faithful exposure of whatever the xdot renderer
|
|
12
|
+
* emits — it adds no draw ops of its own.
|
|
13
|
+
*
|
|
14
|
+
* KNOWN LIMITATION (xdot renderer, not this wrapper): the underlying xdot
|
|
15
|
+
* renderer (`createXdotRenderer` in `render/dot.ts`) is currently
|
|
16
|
+
* integration-incomplete relative to native `dot -Txdot`:
|
|
17
|
+
* - edges emit no `_draw_` ops (no spline/arrowhead draw ops surface here);
|
|
18
|
+
* - custom node pen/fill colors are not applied to the emitted ops;
|
|
19
|
+
* - node draw-op coordinates can be mismatched between nodes.
|
|
20
|
+
* Node shape ops (ellipse/polygon), text/label ops, and font ops are
|
|
21
|
+
* emitted and surface correctly. The geometry itself is fully computed
|
|
22
|
+
* (the SVG renderer draws the same graph correctly); only the xdot
|
|
23
|
+
* emission path is incomplete. A faithful fix is tracked as a follow-on
|
|
24
|
+
* mission (see plans/expose-library-api/decision-journal.md, 2026-06-21).
|
|
25
|
+
*
|
|
26
|
+
* @see lib/xdot/xdot.h
|
|
27
|
+
* @see plugin/core/gvrender_core_dot.c (FORMAT_XDOT)
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import type { XdotOp } from '../xdot/types.js';
|
|
31
|
+
import { Graph } from '../model/graph.js';
|
|
32
|
+
import { parse } from '../parser/index.js';
|
|
33
|
+
import { render as gvcRender } from '../gvc/device.js';
|
|
34
|
+
import { createDefaultContext } from '../gvc/default-context.js';
|
|
35
|
+
import { parseXDot } from '../xdot/index.js';
|
|
36
|
+
import type { EngineName } from '../gvc/context.js';
|
|
37
|
+
import { RenderError } from '../errors.js';
|
|
38
|
+
import type { GvError } from '../errors.js';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* `Xdot` — the parsed result of one xdot attribute stream: `ops` (the
|
|
42
|
+
* decoded draw-op array) plus `flags` (parse status bits).
|
|
43
|
+
*
|
|
44
|
+
* `XdotOp` — a single decoded xdot drawing operation, discriminated by its
|
|
45
|
+
* `kind` field (e.g. `filled_ellipse`, `filled_polygon`, `filled_bezier`,
|
|
46
|
+
* `polyline`, `text`, `fill_color`, `pen_color`, `grad_fill_color`,
|
|
47
|
+
* `grad_pen_color`, `font`, `style`, `image`, `fontchar`). Each variant
|
|
48
|
+
* carries one payload property named for its shape (`ellipse`, `polygon`,
|
|
49
|
+
* `bezier`, `polyline`, `text`, `color`, `gradColor`, `font`, `style`,
|
|
50
|
+
* `image`, `fontchar`) — narrow on `kind` in a switch to access it safely.
|
|
51
|
+
*
|
|
52
|
+
* `XdotColor` — a resolved xdot fill/pen color: `{ type: 'none', clr }` for
|
|
53
|
+
* a solid color, or a linear/radial gradient (`{ type: 'linear', ling }` /
|
|
54
|
+
* `{ type: 'radial', ring }`).
|
|
55
|
+
*
|
|
56
|
+
* @see lib/xdot/xdot.h:xdot
|
|
57
|
+
* @see lib/xdot/xdot.h:xdot_op (`_xdot_op`)
|
|
58
|
+
* @see lib/xdot/xdot.h:xdot_color
|
|
59
|
+
*/
|
|
60
|
+
export type { Xdot, XdotOp, XdotColor } from '../xdot/index.js';
|
|
61
|
+
|
|
62
|
+
/** Options for {@link getDrawOps}. */
|
|
63
|
+
export interface DrawOpsOptions {
|
|
64
|
+
/** Layout engine to use. Defaults to `'dot'`. */
|
|
65
|
+
engine?: EngineName;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Default layout engine used by {@link getDrawOps}. */
|
|
69
|
+
export const DEFAULT_DRAW_ENGINE: EngineName = 'dot';
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* xdot attribute keys that carry draw-op streams.
|
|
73
|
+
* @see plugin/core/gvrender_core_dot.c xdot_obj_attr_names
|
|
74
|
+
*/
|
|
75
|
+
const XDOT_DRAW_ATTRS = [
|
|
76
|
+
'_draw_', '_ldraw_', '_hdraw_', '_tdraw_', '_hldraw_', '_tldraw_',
|
|
77
|
+
] as const;
|
|
78
|
+
|
|
79
|
+
function isGvErrorLike(err: unknown): err is GvError {
|
|
80
|
+
return (
|
|
81
|
+
typeof err === 'object' &&
|
|
82
|
+
err !== null &&
|
|
83
|
+
typeof (err as { type?: unknown }).type === 'string' &&
|
|
84
|
+
typeof (err as { code?: unknown }).code === 'string'
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Re-throw GvError-like values; otherwise wrap as RENDER_ERROR. */
|
|
89
|
+
function rethrowAsRender(err: unknown): never {
|
|
90
|
+
if (isGvErrorLike(err)) throw err;
|
|
91
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
92
|
+
throw new RenderError(msg, 'RENDER_ERROR');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Append XdotOps found in `attrs` for each xdot draw key into `out`. */
|
|
96
|
+
function appendAttrsOps(attrs: Map<string, string>, out: XdotOp[]): void {
|
|
97
|
+
for (const key of XDOT_DRAW_ATTRS) {
|
|
98
|
+
const val = attrs.get(key);
|
|
99
|
+
if (val === undefined) continue;
|
|
100
|
+
const parsed = parseXDot(val);
|
|
101
|
+
if (parsed !== null) out.push(...parsed.ops);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function collectGraphOps(xdotGraph: Graph): XdotOp[] {
|
|
106
|
+
const ops: XdotOp[] = [];
|
|
107
|
+
appendAttrsOps(xdotGraph.attrs, ops);
|
|
108
|
+
for (const n of xdotGraph.nodes.values()) appendAttrsOps(n.attrs, ops);
|
|
109
|
+
for (const e of xdotGraph.edges) appendAttrsOps(e.attrs, ops);
|
|
110
|
+
return ops;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function layoutAndRenderXdot(g: Graph, engine: EngineName): string {
|
|
114
|
+
const ctx = createDefaultContext();
|
|
115
|
+
try {
|
|
116
|
+
ctx.layout(g, engine);
|
|
117
|
+
const src = gvcRender(ctx, g, 'xdot');
|
|
118
|
+
ctx.freeLayout(g, engine);
|
|
119
|
+
return src;
|
|
120
|
+
} catch (err: unknown) {
|
|
121
|
+
rethrowAsRender(err);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Lay out `g`, render to xdot, parse every draw-attribute stream, and
|
|
127
|
+
* return all ops as a flat `XdotOp[]` in paint order (graph → node → edge).
|
|
128
|
+
*
|
|
129
|
+
* Consumers discriminate on the `kind` field of the `XdotOp` union —
|
|
130
|
+
* no string parsing required.
|
|
131
|
+
*
|
|
132
|
+
* @param g - A Graph from `parse()` or the builder API.
|
|
133
|
+
* @param opts - Optional: `{ engine }` overrides the default `'dot'`.
|
|
134
|
+
* @returns Flat typed draw-op array covering the full graph.
|
|
135
|
+
* @throws ParseError if the xdot DOT output cannot be re-parsed.
|
|
136
|
+
* @throws RenderError if layout or rendering fails.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```ts
|
|
140
|
+
* import { parse } from '@knowvah/dot-engine';
|
|
141
|
+
* import { getDrawOps } from 'graphviz-ts/render';
|
|
142
|
+
*
|
|
143
|
+
* const g = parse('digraph { a -> b; }');
|
|
144
|
+
* for (const op of getDrawOps(g)) {
|
|
145
|
+
* switch (op.kind) {
|
|
146
|
+
* case 'filled_ellipse':
|
|
147
|
+
* case 'unfilled_ellipse':
|
|
148
|
+
* drawEllipse(op.ellipse);
|
|
149
|
+
* break;
|
|
150
|
+
* case 'text':
|
|
151
|
+
* drawText(op.text);
|
|
152
|
+
* break;
|
|
153
|
+
* // ...handle the remaining XdotOp kinds
|
|
154
|
+
* }
|
|
155
|
+
* }
|
|
156
|
+
* ```
|
|
157
|
+
*
|
|
158
|
+
* @see lib/xdot/xdot.h
|
|
159
|
+
* @see lib/gvc/gvc.h:gvRender
|
|
160
|
+
*/
|
|
161
|
+
export function getDrawOps(g: Graph, opts?: DrawOpsOptions): XdotOp[] {
|
|
162
|
+
const engine = opts?.engine ?? DEFAULT_DRAW_ENGINE;
|
|
163
|
+
return collectGraphOps(parse(layoutAndRenderXdot(g, engine)));
|
|
164
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
//
|
|
3
|
+
// XML escaping faithful to graphviz's gv_xml_escape (lib/util/xml.c). '<', '>',
|
|
4
|
+
// '"', and "'" are always escaped; '&' is escaped to & only when it does
|
|
5
|
+
// not begin a valid entity (&name; / &#NNN; / &#xHH;). The text/tooltip variant
|
|
6
|
+
// additionally honors the {raw, dash, nbsp} flags used by the SVG plugin.
|
|
7
|
+
|
|
8
|
+
// Regexes for quote chars: /"/g and /'/g break Lizard's quote-tracker.
|
|
9
|
+
// Use these named patterns instead to avoid the parser bug.
|
|
10
|
+
const RE_DQUOTE = new RegExp('"', 'g');
|
|
11
|
+
const RE_SQUOTE = new RegExp("'", 'g');
|
|
12
|
+
// A bare '&' that does NOT begin a valid entity (&name; / &#NNN; / &#xHH;).
|
|
13
|
+
// Mirrors xml_isentity (lib/util/xml.c): only such '&' are escaped to &.
|
|
14
|
+
const RE_AMP_NONENTITY = /&(?![A-Za-z]+;|#[0-9]+;|#x[0-9A-Fa-f]+;)/g;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Base XML escape (gv_xml_escape with flags {0}): ids, titles, hrefs.
|
|
18
|
+
* @see lib/util/xml.c gv_xml_escape / xml_core / xml_isentity
|
|
19
|
+
*/
|
|
20
|
+
export function escapeXml(s: string): string {
|
|
21
|
+
let r = s.replace(RE_AMP_NONENTITY, '&');
|
|
22
|
+
r = r.replace(/</g, '<');
|
|
23
|
+
r = r.replace(/>/g, '>');
|
|
24
|
+
r = r.replace(RE_DQUOTE, '"');
|
|
25
|
+
r = r.replace(RE_SQUOTE, ''');
|
|
26
|
+
return r;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Title/id/class XML escape (gv_xml_escape with flags {dash, nbsp} — C's
|
|
31
|
+
* gvputs_xml): base escaping plus '-'→- and 2nd+ consecutive
|
|
32
|
+
* spaces→ , WITHOUT the raw flag (entity-aware '&', no \n/\r
|
|
33
|
+
* escapes). Used for <title> content and id/class attribute values.
|
|
34
|
+
* @see lib/gvc/gvdevice.c:gvputs_xml, lib/util/xml.c:xml_core
|
|
35
|
+
*/
|
|
36
|
+
export function escapeXmlTitle(s: string): string {
|
|
37
|
+
let r = escapeXml(s);
|
|
38
|
+
r = r.replace(/-/g, '-');
|
|
39
|
+
r = r.replace(/ {2,}/g, (m) => ' ' + ' '.repeat(m.length - 1));
|
|
40
|
+
return r;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Text/tooltip XML escape (gv_xml_escape with flags {raw, dash, nbsp}):
|
|
45
|
+
* additionally escapes '-'→-, newline/CR→ / , and 2nd+ consecutive
|
|
46
|
+
* spaces→ . Used for textspans and tooltips.
|
|
47
|
+
* @see plugin/core/gvrender_core_svg.c:546 (svg_textspan flags)
|
|
48
|
+
*/
|
|
49
|
+
export function escapeXmlText(s: string): string {
|
|
50
|
+
let r = escapeXml(s);
|
|
51
|
+
r = r.replace(/-/g, '-');
|
|
52
|
+
r = r.replace(/\n/g, ' ');
|
|
53
|
+
r = r.replace(/\r/g, ' ');
|
|
54
|
+
r = r.replace(/ {2,}/g, (m) => ' ' + ' '.repeat(m.length - 1));
|
|
55
|
+
return r;
|
|
56
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EPL-2.0
|
|
2
|
+
/**
|
|
3
|
+
* @see lib/util/agxbuf.h
|
|
4
|
+
* @see lib/util/agxbuf.c (agxbuf_trim_zeros)
|
|
5
|
+
*
|
|
6
|
+
* Dynamically expanding string buffer. SSO threshold need not be
|
|
7
|
+
* replicated — only the observable contract matters.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Extensible string buffer, analogous to C's agxbuf.
|
|
12
|
+
*
|
|
13
|
+
* @see cgraph/agxbuf.h:agxbuf
|
|
14
|
+
*/
|
|
15
|
+
export class AgBuffer {
|
|
16
|
+
private _data: string = "";
|
|
17
|
+
|
|
18
|
+
/** @see cgraph/agxbuf.h:agxbput */
|
|
19
|
+
append(s: string): this {
|
|
20
|
+
this._data += s;
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** @see cgraph/agxbuf.h:agxbputc */
|
|
25
|
+
appendChar(c: string): this {
|
|
26
|
+
this._data += c[0] ?? "";
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Append first n characters of s.
|
|
32
|
+
* @see cgraph/agxbuf.h:agxbput_n
|
|
33
|
+
*/
|
|
34
|
+
appendN(s: string, n: number): this {
|
|
35
|
+
this._data += s.slice(0, n);
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** @see cgraph/agxbuf.h:agxbclear */
|
|
40
|
+
clear(): void {
|
|
41
|
+
this._data = "";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Matches agxbuse semantics: resets the buffer and returns the content.
|
|
46
|
+
* The returned string is valid only until the next write.
|
|
47
|
+
* @see cgraph/agxbuf.h:agxbuse
|
|
48
|
+
*/
|
|
49
|
+
str(): string {
|
|
50
|
+
const result = this._data;
|
|
51
|
+
this._data = "";
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Caller takes ownership; buffer is reset.
|
|
57
|
+
* @see cgraph/agxbuf.h:agxbdisown
|
|
58
|
+
*/
|
|
59
|
+
disown(): string {
|
|
60
|
+
return this.str();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** @see cgraph/agxbuf.h:agxblen */
|
|
64
|
+
length(): number {
|
|
65
|
+
return this._data.length;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Removes and returns the last character (UTF-16 charCodeAt semantics
|
|
70
|
+
* matching C char-pop), or null if empty.
|
|
71
|
+
* @see cgraph/agxbuf.h:agxbpop
|
|
72
|
+
*/
|
|
73
|
+
pop(): string | null {
|
|
74
|
+
if (this._data.length === 0) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const c = this._data[this._data.length - 1];
|
|
78
|
+
this._data = this._data.slice(0, -1);
|
|
79
|
+
return c;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Trim trailing fractional zeros from a printed floating-point value.
|
|
84
|
+
*
|
|
85
|
+
* Examples:
|
|
86
|
+
* "42.00" → "42"
|
|
87
|
+
* "42.01" → "42.01"
|
|
88
|
+
* "42.10" → "42.1"
|
|
89
|
+
* "-0.0" → "0"
|
|
90
|
+
*
|
|
91
|
+
* @see cgraph/agxbuf.h:agxbuf_trim_zeros
|
|
92
|
+
*/
|
|
93
|
+
trimZeros(): void {
|
|
94
|
+
const period = this._lastPeriodIndex();
|
|
95
|
+
if (period < 0) return;
|
|
96
|
+
const trimmed = this._trimFractional(period);
|
|
97
|
+
if (trimmed !== null) this._data = trimmed;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Return index of last '.' in _data, or -1 if none. */
|
|
101
|
+
private _lastPeriodIndex(): number {
|
|
102
|
+
for (let i = this._data.length - 1; i >= 0; i--) {
|
|
103
|
+
if (this._data[i] === ".") return i;
|
|
104
|
+
}
|
|
105
|
+
return -1;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Walk backwards from end; trim trailing '0' digits then the '.' if all
|
|
110
|
+
* fractional digits were zero. Returns the trimmed string, or null when
|
|
111
|
+
* no trimming is needed.
|
|
112
|
+
* @see cgraph/agxbuf.h:agxbuf_trim_zeros (truncate loop)
|
|
113
|
+
*/
|
|
114
|
+
private _trimFractional(period: number): string | null {
|
|
115
|
+
const s = this._data;
|
|
116
|
+
let end = s.length;
|
|
117
|
+
while (end > period + 1 && s[end - 1] === "0") {
|
|
118
|
+
end--;
|
|
119
|
+
}
|
|
120
|
+
if (end === s.length) return null; // no trailing zeros
|
|
121
|
+
if (end === period + 1) {
|
|
122
|
+
return AgBuffer._fixNegativeZero(s.slice(0, period));
|
|
123
|
+
}
|
|
124
|
+
return s.slice(0, end);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Replace trailing "-0" with "0".
|
|
129
|
+
* @see cgraph/agxbuf.h:agxbuf_trim_zeros (-0 fix)
|
|
130
|
+
*/
|
|
131
|
+
private static _fixNegativeZero(s: string): string {
|
|
132
|
+
const n = s.length;
|
|
133
|
+
if (n >= 2 && s[n - 2] === "-" && s[n - 1] === "0") {
|
|
134
|
+
return s.slice(0, n - 2) + "0";
|
|
135
|
+
}
|
|
136
|
+
return s;
|
|
137
|
+
}
|
|
138
|
+
}
|