@knowvah/dot-engine 2.5.0 → 2.6.1
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/dist/common/bezier-arrows.d.ts +14 -0
- package/dist/common/bezier-arrows.d.ts.map +1 -0
- package/dist/common/postproc.d.ts.map +1 -1
- package/dist/common/splines-clip.d.ts.map +1 -1
- package/dist/index.js +83 -36
- package/dist/index.js.map +4 -4
- package/dist/layout/dot/splines.d.ts.map +1 -1
- package/dist/layout/pack/index.d.ts.map +1 -1
- package/dist/model/geom.d.ts +9 -0
- package/dist/model/geom.d.ts.map +1 -1
- package/dist/render/dot.d.ts.map +1 -1
- package/dist/render/svg-edge-arrows.d.ts +30 -0
- package/dist/render/svg-edge-arrows.d.ts.map +1 -0
- package/dist/render/svg-helpers.d.ts.map +1 -1
- package/dist/render.js +83 -36
- package/dist/render.js.map +4 -4
- package/package.json +1 -1
- package/src/common/bezier-arrows.ts +58 -0
- package/src/common/postproc.ts +9 -13
- package/src/common/splines-clip.ts +12 -8
- package/src/layout/dot/splines.ts +4 -0
- package/src/layout/pack/index.ts +4 -0
- package/src/model/geom.ts +10 -0
- package/src/render/dot.ts +6 -0
- package/src/render/svg-edge-arrows.ts +54 -0
- package/src/render/svg-helpers.ts +10 -44
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Edge } from '../model/edge.js';
|
|
2
|
+
import type { Bezier } from '../model/geom.js';
|
|
3
|
+
import type { ArrowDrawOp } from './arrows-types.js';
|
|
4
|
+
/** Edge end: `tail` pairs with a bezier's sflag/sp, `head` with eflag/ep. */
|
|
5
|
+
export type ArrowEnd = 'head' | 'tail';
|
|
6
|
+
/**
|
|
7
|
+
* The ops C's per-bezier loop draws right after `bz` for `end`, when the edge
|
|
8
|
+
* has several beziers flagged at that end; undefined otherwise (the caller's
|
|
9
|
+
* edge-level path applies).
|
|
10
|
+
*/
|
|
11
|
+
export declare function bezierEndOps(e: Edge, bz: Bezier, end: ArrowEnd): ArrowDrawOp[] | undefined;
|
|
12
|
+
/** Every arrow to draw for `end`, one op list per arrow, in bezier order. */
|
|
13
|
+
export declare function endArrowOps(e: Edge, end: ArrowEnd): ArrowDrawOp[][];
|
|
14
|
+
//# sourceMappingURL=bezier-arrows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bezier-arrows.d.ts","sourceRoot":"","sources":["../../src/common/bezier-arrows.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,6EAA6E;AAC7E,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAkBvC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,WAAW,EAAE,GAAG,SAAS,CAG1F;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,GAAG,WAAW,EAAE,EAAE,CAKnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postproc.d.ts","sourceRoot":"","sources":["../../src/common/postproc.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"postproc.d.ts","sourceRoot":"","sources":["../../src/common/postproc.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAmJ/C;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAQ3D;AAyMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAO9E;AAOD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,UAAO,GAAG,IAAI,CAiBrE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splines-clip.d.ts","sourceRoot":"","sources":["../../src/common/splines-clip.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAO,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAS7C,gFAAgF;AAChF,eAAO,MAAM,QAAQ,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"splines-clip.d.ts","sourceRoot":"","sources":["../../src/common/splines-clip.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAO,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAS7C,gFAAgF;AAChF,eAAO,MAAM,QAAQ,IAAI,CAAC;AAqa1B,2CAA2C;AAC3C,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAQrD;AAMD,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CA6BlG;AAED;;;GAGG;AACH,KAAK,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAGxF,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAEvD"}
|
package/dist/index.js
CHANGED
|
@@ -18589,8 +18589,8 @@ var SplineClipHelper = class _SplineClipHelper {
|
|
|
18589
18589
|
sflag,
|
|
18590
18590
|
eflag
|
|
18591
18591
|
);
|
|
18592
|
-
if (sflag) _SplineClipHelper.stashArrow(orig, newspl.sp, ps[bounds.start], true, startEnd);
|
|
18593
|
-
if (eflag) _SplineClipHelper.stashArrow(orig, newspl.ep, ps[bounds.end + 3], false, endEnd);
|
|
18592
|
+
if (sflag) _SplineClipHelper.stashArrow(orig, newspl, newspl.sp, ps[bounds.start], true, startEnd);
|
|
18593
|
+
if (eflag) _SplineClipHelper.stashArrow(orig, newspl, newspl.ep, ps[bounds.end + 3], false, endEnd);
|
|
18594
18594
|
}
|
|
18595
18595
|
return;
|
|
18596
18596
|
}
|
|
@@ -18604,7 +18604,7 @@ var SplineClipHelper = class _SplineClipHelper {
|
|
|
18604
18604
|
sflag,
|
|
18605
18605
|
startEnd
|
|
18606
18606
|
);
|
|
18607
|
-
_SplineClipHelper.stashArrow(orig, newspl.sp, ps[bounds.start], true, startEnd);
|
|
18607
|
+
_SplineClipHelper.stashArrow(orig, newspl, newspl.sp, ps[bounds.start], true, startEnd);
|
|
18608
18608
|
}
|
|
18609
18609
|
if (eflag) {
|
|
18610
18610
|
bounds.end = _SplineClipHelper.arrowEndClip(
|
|
@@ -18616,7 +18616,7 @@ var SplineClipHelper = class _SplineClipHelper {
|
|
|
18616
18616
|
eflag,
|
|
18617
18617
|
endEnd
|
|
18618
18618
|
);
|
|
18619
|
-
_SplineClipHelper.stashArrow(orig, newspl.ep, ps[bounds.end + 3], false, endEnd);
|
|
18619
|
+
_SplineClipHelper.stashArrow(orig, newspl, newspl.ep, ps[bounds.end + 3], false, endEnd);
|
|
18620
18620
|
}
|
|
18621
18621
|
}
|
|
18622
18622
|
/**
|
|
@@ -18714,13 +18714,22 @@ var SplineClipHelper = class _SplineClipHelper {
|
|
|
18714
18714
|
spl.sp = p;
|
|
18715
18715
|
}
|
|
18716
18716
|
}
|
|
18717
|
-
/**
|
|
18718
|
-
|
|
18717
|
+
/**
|
|
18718
|
+
* Record an arrow on the edge end and on the bezier being installed. The
|
|
18719
|
+
* edge slot holds the latest arrow; the bezier keeps its own, since C draws
|
|
18720
|
+
* one per flagged bezier (see common/bezier-arrows.ts).
|
|
18721
|
+
*/
|
|
18722
|
+
static stashArrow(e, bz, tip2, base, isTail, attrEnd) {
|
|
18719
18723
|
const dir = { x: base.x - tip2.x, y: base.y - tip2.y };
|
|
18720
18724
|
const end = attrEnd ?? (isTail ? "tail" : "head");
|
|
18721
18725
|
const ops = arrowDrawOpsForEnd(e, end, tip2, dir, _SplineClipHelper.renderPenwidth(e));
|
|
18722
|
-
if (isTail)
|
|
18723
|
-
|
|
18726
|
+
if (isTail) {
|
|
18727
|
+
e.info.tailArrowOps = ops;
|
|
18728
|
+
bz.sArrowOps = ops;
|
|
18729
|
+
} else {
|
|
18730
|
+
e.info.headArrowOps = ops;
|
|
18731
|
+
bz.eArrowOps = ops;
|
|
18732
|
+
}
|
|
18724
18733
|
}
|
|
18725
18734
|
static clipSide(n, box, ps, pn, tail) {
|
|
18726
18735
|
const fn = _SplineClipHelper.getInsideFn(n);
|
|
@@ -25497,6 +25506,47 @@ function orthoRoundedPolylines(pts, radius) {
|
|
|
25497
25506
|
return [...segmentPolylines(pts, corners), ...cornerArcPolylines(corners, radius)];
|
|
25498
25507
|
}
|
|
25499
25508
|
|
|
25509
|
+
// src/common/bezier-arrows.ts
|
|
25510
|
+
var flagOf = (bz, end) => end === "head" ? bz.eflag : bz.sflag;
|
|
25511
|
+
var ownOps = (bz, end) => end === "head" ? bz.eArrowOps : bz.sArrowOps;
|
|
25512
|
+
var edgeOps = (e, end) => end === "head" ? e.info.headArrowOps : e.info.tailArrowOps;
|
|
25513
|
+
function flaggedBeziers(e, end) {
|
|
25514
|
+
const list = e.info.spl?.list ?? [];
|
|
25515
|
+
return list.filter((bz) => bz !== void 0 && flagOf(bz, end) !== 0);
|
|
25516
|
+
}
|
|
25517
|
+
function multiFlagged(e, end) {
|
|
25518
|
+
return flaggedBeziers(e, end).length > 1;
|
|
25519
|
+
}
|
|
25520
|
+
function bezierEndOps(e, bz, end) {
|
|
25521
|
+
if (flagOf(bz, end) === 0 || !multiFlagged(e, end)) return void 0;
|
|
25522
|
+
return ownOps(bz, end) ?? edgeOps(e, end);
|
|
25523
|
+
}
|
|
25524
|
+
function endArrowOps(e, end) {
|
|
25525
|
+
const lists = multiFlagged(e, end) ? flaggedBeziers(e, end).map((bz) => ownOps(bz, end) ?? edgeOps(e, end)) : [edgeOps(e, end)];
|
|
25526
|
+
return lists.filter((ops) => ops !== void 0 && ops.length > 0);
|
|
25527
|
+
}
|
|
25528
|
+
|
|
25529
|
+
// src/render/svg-edge-arrows.ts
|
|
25530
|
+
function emitBezierEndArrow(e, bz, end, st, p) {
|
|
25531
|
+
const tail = end === "tail";
|
|
25532
|
+
const flag = tail ? bz.sflag : bz.eflag;
|
|
25533
|
+
const done = tail ? st.tailDone : st.headDone;
|
|
25534
|
+
const edgeOps2 = tail ? e.info.tailArrowOps : e.info.headArrowOps;
|
|
25535
|
+
const ops = bezierEndOps(e, bz, end) ?? (flag !== 0 && !done && edgeOps2?.length ? edgeOps2 : void 0);
|
|
25536
|
+
if (ops === void 0) return;
|
|
25537
|
+
emitArrowOps(ops, p.penColor, p.job, p.pw, p.opacity);
|
|
25538
|
+
if (tail) st.tailDone = true;
|
|
25539
|
+
else st.headDone = true;
|
|
25540
|
+
}
|
|
25541
|
+
function emitRemainingArrows(e, st, p) {
|
|
25542
|
+
if (!st.tailDone && e.info.tailArrowOps?.length) {
|
|
25543
|
+
emitArrowOps(e.info.tailArrowOps, p.penColor, p.job, p.pw, p.opacity);
|
|
25544
|
+
}
|
|
25545
|
+
if (!st.headDone && e.info.headArrowOps?.length) {
|
|
25546
|
+
emitArrowOps(e.info.headArrowOps, p.penColor, p.job, p.pw, p.opacity);
|
|
25547
|
+
}
|
|
25548
|
+
}
|
|
25549
|
+
|
|
25500
25550
|
// src/render/svg-graph.ts
|
|
25501
25551
|
var SVG_XML_DECL = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n';
|
|
25502
25552
|
var SVG_DOCTYPE = '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"\n "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n';
|
|
@@ -26028,40 +26078,21 @@ function svgEdgePath(e, job) {
|
|
|
26028
26078
|
if (spl === void 0 || spl.size === 0) return;
|
|
26029
26079
|
const obj = job.obj;
|
|
26030
26080
|
const stroke = obj !== null ? paintStr(obj, false) : "black";
|
|
26081
|
+
const paint = {
|
|
26082
|
+
job,
|
|
26083
|
+
penColor: stroke,
|
|
26084
|
+
opacity: obj !== null ? colorOpacity(obj.penColor) : null,
|
|
26085
|
+
pw: obj !== null ? obj.penWidth : 1
|
|
26086
|
+
};
|
|
26031
26087
|
const st = { tailDone: false, headDone: false };
|
|
26032
26088
|
for (let si = 0; si < spl.size; si++) {
|
|
26033
26089
|
const bz = spl.list[si];
|
|
26034
26090
|
if (bz === void 0 || bz.size < 4) continue;
|
|
26035
26091
|
emitOneBezierPath(bz, stroke, job);
|
|
26036
|
-
|
|
26037
|
-
|
|
26038
|
-
emitRemainingArrows(e, job, st);
|
|
26039
|
-
}
|
|
26040
|
-
function emitBezierArrows(e, bz, job, st) {
|
|
26041
|
-
const obj = job.obj;
|
|
26042
|
-
const penColor = obj !== null ? paintStr(obj, false) : "black";
|
|
26043
|
-
const opacity = obj !== null ? colorOpacity(obj.penColor) : null;
|
|
26044
|
-
const pw = obj !== null ? obj.penWidth : 1;
|
|
26045
|
-
if (bz.sflag !== 0 && !st.tailDone && e.info.tailArrowOps?.length) {
|
|
26046
|
-
emitArrowOps(e.info.tailArrowOps, penColor, job, pw, opacity);
|
|
26047
|
-
st.tailDone = true;
|
|
26048
|
-
}
|
|
26049
|
-
if (bz.eflag !== 0 && !st.headDone && e.info.headArrowOps?.length) {
|
|
26050
|
-
emitArrowOps(e.info.headArrowOps, penColor, job, pw, opacity);
|
|
26051
|
-
st.headDone = true;
|
|
26052
|
-
}
|
|
26053
|
-
}
|
|
26054
|
-
function emitRemainingArrows(e, job, st) {
|
|
26055
|
-
const obj = job.obj;
|
|
26056
|
-
const penColor = obj !== null ? paintStr(obj, false) : "black";
|
|
26057
|
-
const opacity = obj !== null ? colorOpacity(obj.penColor) : null;
|
|
26058
|
-
const pw = obj !== null ? obj.penWidth : 1;
|
|
26059
|
-
if (!st.tailDone && e.info.tailArrowOps?.length) {
|
|
26060
|
-
emitArrowOps(e.info.tailArrowOps, penColor, job, pw, opacity);
|
|
26061
|
-
}
|
|
26062
|
-
if (!st.headDone && e.info.headArrowOps?.length) {
|
|
26063
|
-
emitArrowOps(e.info.headArrowOps, penColor, job, pw, opacity);
|
|
26092
|
+
emitBezierEndArrow(e, bz, "tail", st, paint);
|
|
26093
|
+
emitBezierEndArrow(e, bz, "head", st, paint);
|
|
26064
26094
|
}
|
|
26095
|
+
emitRemainingArrows(e, st, paint);
|
|
26065
26096
|
}
|
|
26066
26097
|
function emitOneBezierPath(bz, stroke, job) {
|
|
26067
26098
|
const obj = job.obj;
|
|
@@ -33420,6 +33451,10 @@ function mapEdge(e) {
|
|
|
33420
33451
|
mapLabelPos(e.info.tail_label);
|
|
33421
33452
|
e.info.headArrowOps = mapArrowOps(e.info.headArrowOps);
|
|
33422
33453
|
e.info.tailArrowOps = mapArrowOps(e.info.tailArrowOps);
|
|
33454
|
+
for (const bz of spl.list) {
|
|
33455
|
+
if (bz.sArrowOps) bz.sArrowOps = mapArrowOps(bz.sArrowOps);
|
|
33456
|
+
if (bz.eArrowOps) bz.eArrowOps = mapArrowOps(bz.eArrowOps);
|
|
33457
|
+
}
|
|
33423
33458
|
}
|
|
33424
33459
|
function rotateBb(bb, rankdir) {
|
|
33425
33460
|
if (rankdir === RANKDIR_LR || rankdir === RANKDIR_BT) {
|
|
@@ -37345,6 +37380,11 @@ function swapBezier(b) {
|
|
|
37345
37380
|
const sp = b.sp;
|
|
37346
37381
|
b.sp = b.ep;
|
|
37347
37382
|
b.ep = sp;
|
|
37383
|
+
if (b.sArrowOps !== void 0 || b.eArrowOps !== void 0) {
|
|
37384
|
+
const so = b.sArrowOps;
|
|
37385
|
+
b.sArrowOps = b.eArrowOps;
|
|
37386
|
+
b.eArrowOps = so;
|
|
37387
|
+
}
|
|
37348
37388
|
}
|
|
37349
37389
|
function swapSpline(s) {
|
|
37350
37390
|
s.list.reverse();
|
|
@@ -38471,6 +38511,10 @@ function shiftEdgePoints(e, dx, dy) {
|
|
|
38471
38511
|
const shiftOps = (ops) => ops?.map((op) => mapArrowOpPoints(op, (p) => ({ x: p.x + dx, y: p.y + dy })));
|
|
38472
38512
|
e.info.headArrowOps = shiftOps(e.info.headArrowOps);
|
|
38473
38513
|
e.info.tailArrowOps = shiftOps(e.info.tailArrowOps);
|
|
38514
|
+
for (const bz of spl.list) {
|
|
38515
|
+
if (bz.sArrowOps) bz.sArrowOps = shiftOps(bz.sArrowOps);
|
|
38516
|
+
if (bz.eArrowOps) bz.eArrowOps = shiftOps(bz.eArrowOps);
|
|
38517
|
+
}
|
|
38474
38518
|
}
|
|
38475
38519
|
function shiftOneGraph(g, dx, dy) {
|
|
38476
38520
|
for (const n of g.nodes.values()) {
|
|
@@ -54113,6 +54157,9 @@ var XdotRenderer = class extends EdgeDrawBase {
|
|
|
54113
54157
|
headArrowColor = c.headColor;
|
|
54114
54158
|
} else {
|
|
54115
54159
|
this.emitPlainSpline(e, spl.list, edraw, job);
|
|
54160
|
+
for (const ops of endArrowOps(e, "tail")) this.emitArrows(this.bufs[2 /* TDraw */], ops, job, 2 /* TDraw */);
|
|
54161
|
+
for (const ops of endArrowOps(e, "head")) this.emitArrows(this.bufs[3 /* HDraw */], ops, job, 3 /* HDraw */);
|
|
54162
|
+
return;
|
|
54116
54163
|
}
|
|
54117
54164
|
this.emitArrows(this.bufs[2 /* TDraw */], e.info.tailArrowOps, job, 2 /* TDraw */, tailArrowColor);
|
|
54118
54165
|
this.emitArrows(this.bufs[3 /* HDraw */], e.info.headArrowOps, job, 3 /* HDraw */, headArrowColor);
|