@knowvah/dot-engine 2.0.0 → 2.0.2
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/async/collect.d.ts.map +1 -1
- package/dist/async/render-async.d.ts.map +1 -1
- package/dist/gvc/device-labels.d.ts +30 -0
- package/dist/gvc/device-labels.d.ts.map +1 -0
- package/dist/gvc/device-transform.d.ts +22 -0
- package/dist/gvc/device-transform.d.ts.map +1 -0
- package/dist/gvc/device.d.ts +2 -42
- package/dist/gvc/device.d.ts.map +1 -1
- package/dist/index.js +174 -137
- package/dist/index.js.map +4 -4
- package/dist/layout/dot/graph-label.d.ts +10 -0
- package/dist/layout/dot/graph-label.d.ts.map +1 -1
- package/dist/layout/fdp/normalize.d.ts +2 -1
- package/dist/layout/fdp/normalize.d.ts.map +1 -1
- package/dist/layout/fdp/xlayout.d.ts +1 -1
- package/dist/layout/fdp/xlayout.d.ts.map +1 -1
- package/dist/layout/neato/dijkstra.d.ts +0 -32
- package/dist/layout/neato/dijkstra.d.ts.map +1 -1
- package/dist/layout/neato/fdp-adjust.d.ts +14 -3
- package/dist/layout/neato/fdp-adjust.d.ts.map +1 -1
- package/dist/layout/neato/index.d.ts +5 -5
- package/dist/layout/neato/index.d.ts.map +1 -1
- package/dist/layout/neato/sc-adjust.d.ts +2 -9
- package/dist/layout/neato/sc-adjust.d.ts.map +1 -1
- package/dist/layout/neato/simple-scale.d.ts +15 -0
- package/dist/layout/neato/simple-scale.d.ts.map +1 -0
- package/dist/layout/sfdp/index.d.ts.map +1 -1
- package/dist/render/public.d.ts +5 -0
- package/dist/render/public.d.ts.map +1 -1
- package/dist/render.js +171 -134
- package/dist/render.js.map +4 -4
- package/package.json +1 -1
- package/src/async/collect.ts +2 -14
- package/src/async/render-async.ts +1 -9
- package/src/gvc/device-labels.ts +98 -0
- package/src/gvc/device-transform.ts +58 -0
- package/src/gvc/device.ts +8 -132
- package/src/layout/dot/graph-label.ts +6 -1
- package/src/layout/fdp/normalize.ts +12 -8
- package/src/layout/fdp/xlayout.ts +8 -6
- package/src/layout/neato/dijkstra.ts +0 -141
- package/src/layout/neato/fdp-adjust.ts +33 -8
- package/src/layout/neato/index.ts +13 -12
- package/src/layout/neato/sc-adjust.ts +2 -16
- package/src/layout/neato/simple-scale.ts +54 -0
- package/src/layout/sfdp/index.ts +2 -1
- package/src/render/public.ts +6 -5
- package/dist/layout/neato/overlap.d.ts +0 -85
- package/dist/layout/neato/overlap.d.ts.map +0 -1
- package/src/layout/neato/overlap.ts +0 -158
package/dist/render.js
CHANGED
|
@@ -19277,10 +19277,7 @@ function walkNodesAndEdges(g, renderer, job, info) {
|
|
|
19277
19277
|
}
|
|
19278
19278
|
}
|
|
19279
19279
|
|
|
19280
|
-
// src/gvc/device.ts
|
|
19281
|
-
function renderClusterLabel(sg, renderer, job) {
|
|
19282
|
-
renderOneLabel(sg.info.label, renderer, job, false);
|
|
19283
|
-
}
|
|
19280
|
+
// src/gvc/device-transform.ts
|
|
19284
19281
|
function transformPoint(p, job) {
|
|
19285
19282
|
if ((job.flags & GVRENDER_DOES_TRANSFORM) !== 0) {
|
|
19286
19283
|
return p;
|
|
@@ -19300,6 +19297,50 @@ function buildPoint(x, y) {
|
|
|
19300
19297
|
const pt = { x, y };
|
|
19301
19298
|
return pt;
|
|
19302
19299
|
}
|
|
19300
|
+
|
|
19301
|
+
// src/gvc/device-labels.ts
|
|
19302
|
+
var VALIGN_TOP = "t".charCodeAt(0);
|
|
19303
|
+
var VALIGN_BOTTOM = "b".charCodeAt(0);
|
|
19304
|
+
function labelFirstSpanY(lp) {
|
|
19305
|
+
if (lp.valign === VALIGN_TOP) return lp.pos.y + lp.space.y / 2 - lp.fontsize;
|
|
19306
|
+
if (lp.valign === VALIGN_BOTTOM) {
|
|
19307
|
+
return lp.pos.y - lp.space.y / 2 + lp.dimen.y - lp.fontsize;
|
|
19308
|
+
}
|
|
19309
|
+
return lp.pos.y + lp.dimen.y / 2 - lp.fontsize;
|
|
19310
|
+
}
|
|
19311
|
+
function labelSpanX(lp, just) {
|
|
19312
|
+
if (just === "l") return lp.pos.x - lp.space.x / 2;
|
|
19313
|
+
if (just === "r") return lp.pos.x + lp.space.x / 2;
|
|
19314
|
+
return lp.pos.x;
|
|
19315
|
+
}
|
|
19316
|
+
function renderOneLabel(lp, renderer, job, requireSet = true) {
|
|
19317
|
+
if (!lp) return;
|
|
19318
|
+
if (requireSet && !lp.set) return;
|
|
19319
|
+
if (lp.html) {
|
|
19320
|
+
if (lp.u.kind === "html") {
|
|
19321
|
+
const html = lp.u.html;
|
|
19322
|
+
const pos = lp.pos;
|
|
19323
|
+
withLabelEmitState(job, () => emitHtmlLabel(html, pos, renderer, job));
|
|
19324
|
+
}
|
|
19325
|
+
return;
|
|
19326
|
+
}
|
|
19327
|
+
if (lp.u.kind !== "txt" || lp.u.nspans < 1) return;
|
|
19328
|
+
let y = labelFirstSpanY(lp);
|
|
19329
|
+
for (let i = 0; i < lp.u.nspans; i++) {
|
|
19330
|
+
const span = lp.u.span[i];
|
|
19331
|
+
if (!span) break;
|
|
19332
|
+
gvrenderTextspan(renderer, { x: labelSpanX(lp, span.just), y }, span, job);
|
|
19333
|
+
y -= span.size.y;
|
|
19334
|
+
}
|
|
19335
|
+
}
|
|
19336
|
+
function renderNodeXLabel(n, renderer, job) {
|
|
19337
|
+
renderOneLabel(n.info.xlabel, renderer, job);
|
|
19338
|
+
}
|
|
19339
|
+
function renderClusterLabel(sg, renderer, job) {
|
|
19340
|
+
renderOneLabel(sg.info.label, renderer, job, false);
|
|
19341
|
+
}
|
|
19342
|
+
|
|
19343
|
+
// src/gvc/device.ts
|
|
19303
19344
|
function labelTextOf2(lp) {
|
|
19304
19345
|
return lp?.text ?? null;
|
|
19305
19346
|
}
|
|
@@ -19374,43 +19415,6 @@ function renderEdge(e, renderer, job) {
|
|
|
19374
19415
|
job.popObj();
|
|
19375
19416
|
}
|
|
19376
19417
|
}
|
|
19377
|
-
var VALIGN_TOP = "t".charCodeAt(0);
|
|
19378
|
-
var VALIGN_BOTTOM = "b".charCodeAt(0);
|
|
19379
|
-
function labelFirstSpanY(lp) {
|
|
19380
|
-
if (lp.valign === VALIGN_TOP) return lp.pos.y + lp.space.y / 2 - lp.fontsize;
|
|
19381
|
-
if (lp.valign === VALIGN_BOTTOM) {
|
|
19382
|
-
return lp.pos.y - lp.space.y / 2 + lp.dimen.y - lp.fontsize;
|
|
19383
|
-
}
|
|
19384
|
-
return lp.pos.y + lp.dimen.y / 2 - lp.fontsize;
|
|
19385
|
-
}
|
|
19386
|
-
function labelSpanX(lp, just) {
|
|
19387
|
-
if (just === "l") return lp.pos.x - lp.space.x / 2;
|
|
19388
|
-
if (just === "r") return lp.pos.x + lp.space.x / 2;
|
|
19389
|
-
return lp.pos.x;
|
|
19390
|
-
}
|
|
19391
|
-
function renderOneLabel(lp, renderer, job, requireSet = true) {
|
|
19392
|
-
if (!lp) return;
|
|
19393
|
-
if (requireSet && !lp.set) return;
|
|
19394
|
-
if (lp.html) {
|
|
19395
|
-
if (lp.u.kind === "html") {
|
|
19396
|
-
const html = lp.u.html;
|
|
19397
|
-
const pos = lp.pos;
|
|
19398
|
-
withLabelEmitState(job, () => emitHtmlLabel(html, pos, renderer, job));
|
|
19399
|
-
}
|
|
19400
|
-
return;
|
|
19401
|
-
}
|
|
19402
|
-
if (lp.u.kind !== "txt" || lp.u.nspans < 1) return;
|
|
19403
|
-
let y = labelFirstSpanY(lp);
|
|
19404
|
-
for (let i = 0; i < lp.u.nspans; i++) {
|
|
19405
|
-
const span = lp.u.span[i];
|
|
19406
|
-
if (!span) break;
|
|
19407
|
-
gvrenderTextspan(renderer, { x: labelSpanX(lp, span.just), y }, span, job);
|
|
19408
|
-
y -= span.size.y;
|
|
19409
|
-
}
|
|
19410
|
-
}
|
|
19411
|
-
function renderNodeXLabel(n, renderer, job) {
|
|
19412
|
-
renderOneLabel(n.info.xlabel, renderer, job);
|
|
19413
|
-
}
|
|
19414
19418
|
function renderGraphLabel(g, renderer, job) {
|
|
19415
19419
|
setHtmlAnchorObj(svgGraphId(g, job), labelTextOf2(g.info.label), job.obj ?? void 0);
|
|
19416
19420
|
renderOneLabel(g.info.label, renderer, job, false);
|
|
@@ -41737,6 +41741,102 @@ function scAdjust(g, equal) {
|
|
|
41737
41741
|
return 1;
|
|
41738
41742
|
}
|
|
41739
41743
|
|
|
41744
|
+
// src/layout/neato/simple-scale.ts
|
|
41745
|
+
var ISZERO = (d) => Math.abs(d) < 1e-9;
|
|
41746
|
+
var LF = /^\s*([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?)/;
|
|
41747
|
+
function scanPair(p) {
|
|
41748
|
+
const m1 = LF.exec(p);
|
|
41749
|
+
if (m1 === null) return [];
|
|
41750
|
+
const rest = p.slice(m1[0].length);
|
|
41751
|
+
if (!rest.startsWith(",")) return [parseFloat(m1[1])];
|
|
41752
|
+
const m2 = LF.exec(rest.slice(1));
|
|
41753
|
+
return m2 === null ? [parseFloat(m1[1])] : [parseFloat(m1[1]), parseFloat(m2[1])];
|
|
41754
|
+
}
|
|
41755
|
+
function simpleScale(g) {
|
|
41756
|
+
const p = aggetGraph(g, "scale");
|
|
41757
|
+
if (p === void 0) return 0;
|
|
41758
|
+
const sc = scanPair(p);
|
|
41759
|
+
if (sc.length === 0) return 0;
|
|
41760
|
+
const x = sc[0];
|
|
41761
|
+
if (ISZERO(x)) return 0;
|
|
41762
|
+
const y = sc.length === 1 ? x : sc[1];
|
|
41763
|
+
if (ISZERO(y)) return 0;
|
|
41764
|
+
if (y === 1 && x === 1) return 0;
|
|
41765
|
+
for (const n of g.nodes.values()) {
|
|
41766
|
+
n.info.pos[0] *= x;
|
|
41767
|
+
n.info.pos[1] *= y;
|
|
41768
|
+
}
|
|
41769
|
+
return 1;
|
|
41770
|
+
}
|
|
41771
|
+
|
|
41772
|
+
// src/layout/fdp/normalize.ts
|
|
41773
|
+
function mapbool5(s) {
|
|
41774
|
+
const t = s.toLowerCase();
|
|
41775
|
+
if (t === "false" || t === "no") return false;
|
|
41776
|
+
if (t === "true" || t === "yes") return true;
|
|
41777
|
+
const v = parseInt(s, 10);
|
|
41778
|
+
return !Number.isNaN(v) && v !== 0;
|
|
41779
|
+
}
|
|
41780
|
+
function angleSet(g) {
|
|
41781
|
+
const a = aggetGraph(g, "normalize");
|
|
41782
|
+
if (a === void 0 || a === "") return null;
|
|
41783
|
+
const ang = parseAngle2(a);
|
|
41784
|
+
if (ang === null) return null;
|
|
41785
|
+
return wrapDegrees(ang) / 180 * Math.PI;
|
|
41786
|
+
}
|
|
41787
|
+
function parseAngle2(a) {
|
|
41788
|
+
const m = /^\s*[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?/.exec(a);
|
|
41789
|
+
if (m !== null) return parseFloat(m[0]);
|
|
41790
|
+
return mapbool5(a) ? 0 : null;
|
|
41791
|
+
}
|
|
41792
|
+
function wrapDegrees(ang) {
|
|
41793
|
+
while (ang > 180) ang -= 360;
|
|
41794
|
+
while (ang <= -180) ang += 360;
|
|
41795
|
+
return ang;
|
|
41796
|
+
}
|
|
41797
|
+
function normalizeG(g) {
|
|
41798
|
+
const phi0 = angleSet(g);
|
|
41799
|
+
if (phi0 === null) return 0;
|
|
41800
|
+
const nodes = [...g.nodes.values()];
|
|
41801
|
+
const first = nodes[0];
|
|
41802
|
+
if (first === void 0) return 0;
|
|
41803
|
+
const px = first.info.pos[0];
|
|
41804
|
+
const py = first.info.pos[1];
|
|
41805
|
+
for (const v of nodes) {
|
|
41806
|
+
v.info.pos[0] -= px;
|
|
41807
|
+
v.info.pos[1] -= py;
|
|
41808
|
+
}
|
|
41809
|
+
const ret = px || py ? 1 : 0;
|
|
41810
|
+
let e = null;
|
|
41811
|
+
for (const v of nodes) {
|
|
41812
|
+
const out = v.outEdges(g);
|
|
41813
|
+
if (out.length > 0) {
|
|
41814
|
+
e = out[0];
|
|
41815
|
+
break;
|
|
41816
|
+
}
|
|
41817
|
+
}
|
|
41818
|
+
if (e === null) return ret;
|
|
41819
|
+
const phi = phi0 - Math.atan2(
|
|
41820
|
+
e.head.info.pos[1] - e.tail.info.pos[1],
|
|
41821
|
+
e.head.info.pos[0] - e.tail.info.pos[0]
|
|
41822
|
+
);
|
|
41823
|
+
if (!phi) return ret;
|
|
41824
|
+
rotateAll(nodes, e.tail, phi);
|
|
41825
|
+
return 1;
|
|
41826
|
+
}
|
|
41827
|
+
function rotateAll(nodes, orig, phi) {
|
|
41828
|
+
const ox = orig.info.pos[0];
|
|
41829
|
+
const oy = orig.info.pos[1];
|
|
41830
|
+
const cosv = Math.cos(phi);
|
|
41831
|
+
const sinv = Math.sin(phi);
|
|
41832
|
+
for (const v of nodes) {
|
|
41833
|
+
const x = v.info.pos[0] - ox;
|
|
41834
|
+
const y = v.info.pos[1] - oy;
|
|
41835
|
+
v.info.pos[0] = x * cosv - y * sinv + ox;
|
|
41836
|
+
v.info.pos[1] = x * sinv + y * cosv + oy;
|
|
41837
|
+
}
|
|
41838
|
+
}
|
|
41839
|
+
|
|
41740
41840
|
// src/layout/neato/constraint-adjust.ts
|
|
41741
41841
|
var AM_ORTHO = 5;
|
|
41742
41842
|
var AM_ORTHO_YX = 6;
|
|
@@ -43597,7 +43697,15 @@ var ADJUST_MODES = /* @__PURE__ */ new Map([
|
|
|
43597
43697
|
["porthoxy", [AM_PORTHOXY, "xy pseudo-orthogonal constraints"]],
|
|
43598
43698
|
["porthoyx", [AM_PORTHOYX, "yx pseudo-orthogonal constraints"]]
|
|
43599
43699
|
]);
|
|
43700
|
+
function warnUnrecognizedOverlap(flag) {
|
|
43701
|
+
if (flag === void 0 || flag === "") return;
|
|
43702
|
+
const s = flag.toLowerCase();
|
|
43703
|
+
if (s.startsWith("prism") || NAMED_MODES.has(s)) return;
|
|
43704
|
+
if (mapBoolDflt(flag, false) === mapBoolDflt(flag, true)) return;
|
|
43705
|
+
console.warn(`Unrecognized overlap value "${flag}" - using false`);
|
|
43706
|
+
}
|
|
43600
43707
|
function getAdjustMode(flag) {
|
|
43708
|
+
warnUnrecognizedOverlap(flag);
|
|
43601
43709
|
const ntry = overlapPrismTries(flag);
|
|
43602
43710
|
if (ntry !== null) return { mode: AM_PRISM, print: "prism", value: ntry };
|
|
43603
43711
|
const named = ADJUST_MODES.get((flag ?? "").toLowerCase());
|
|
@@ -43640,13 +43748,17 @@ function adjustVoronoi(g, am) {
|
|
|
43640
43748
|
}
|
|
43641
43749
|
function removeOverlapWith(g, am) {
|
|
43642
43750
|
if (g.nodes.size < 2) return 0;
|
|
43643
|
-
|
|
43644
|
-
if (am.mode
|
|
43645
|
-
|
|
43751
|
+
const nret = normalizeG(g) + simpleScale(g);
|
|
43752
|
+
if (am.mode === AM_NONE) return nret;
|
|
43753
|
+
if (am.mode > AM_SCALE) return nret + adjustLate(g, am);
|
|
43754
|
+
return nret + (am.mode === AM_SCALE ? sAdjustGraph(g) : adjustVoronoi(g, am));
|
|
43646
43755
|
}
|
|
43647
43756
|
function adjustNodesFull(g) {
|
|
43648
|
-
|
|
43649
|
-
return removeOverlapWith(g,
|
|
43757
|
+
if (g.nodes.size < 2) return 0;
|
|
43758
|
+
return removeOverlapWith(g, graphAdjustMode(g));
|
|
43759
|
+
}
|
|
43760
|
+
function graphAdjustMode(g) {
|
|
43761
|
+
return getAdjustMode(g.attrs.get("overlap") ?? g.root.attrs.get("overlap"));
|
|
43650
43762
|
}
|
|
43651
43763
|
|
|
43652
43764
|
// src/layout/twopi/init.ts
|
|
@@ -44013,8 +44125,8 @@ function parseModel(g) {
|
|
|
44013
44125
|
if (!s) return MODEL_SHORTPATH2;
|
|
44014
44126
|
return MODEL_MAP[s] ?? MODEL_SHORTPATH2;
|
|
44015
44127
|
}
|
|
44016
|
-
function maybeRemoveOverlap(g) {
|
|
44017
|
-
|
|
44128
|
+
function maybeRemoveOverlap(g, am) {
|
|
44129
|
+
removeOverlapWith(g, am);
|
|
44018
44130
|
}
|
|
44019
44131
|
function neatoLayout(g) {
|
|
44020
44132
|
graphInit(g, false);
|
|
@@ -44029,13 +44141,14 @@ function neatoLayout(g) {
|
|
|
44029
44141
|
for (const e of g.edges) initEdgeLabels(e, g, measurer);
|
|
44030
44142
|
}
|
|
44031
44143
|
const mode = parseMode(g);
|
|
44144
|
+
const am = graphAdjustMode(g);
|
|
44032
44145
|
const model = parseModel(g);
|
|
44033
44146
|
const { graphs: comps, pinned } = neatoPack(g, mode) >= 0 ? pccomps(g, "_neato_cc") : { graphs: [g], pinned: false };
|
|
44034
44147
|
if (comps.length > 1) {
|
|
44035
|
-
layoutComponents(g, comps, mode, model, pinned);
|
|
44148
|
+
layoutComponents(g, comps, { mode, model, am }, pinned);
|
|
44036
44149
|
} else {
|
|
44037
44150
|
solveModel2(g, mode, model);
|
|
44038
|
-
maybeRemoveOverlap(g);
|
|
44151
|
+
maybeRemoveOverlap(g, am);
|
|
44039
44152
|
splineEdgesShifted(g);
|
|
44040
44153
|
}
|
|
44041
44154
|
addClusters(g);
|
|
@@ -44071,11 +44184,11 @@ function addClusters(g) {
|
|
|
44071
44184
|
g.info.clust = clusters;
|
|
44072
44185
|
g.info.n_cluster = clusters.length;
|
|
44073
44186
|
}
|
|
44074
|
-
function layoutComponents(g, comps,
|
|
44187
|
+
function layoutComponents(g, comps, solve2, pinned) {
|
|
44075
44188
|
for (const gc of comps) {
|
|
44076
44189
|
setEdgeTypeFromAttr(gc, EDGETYPE_LINE);
|
|
44077
|
-
solveModel2(gc, mode, model);
|
|
44078
|
-
maybeRemoveOverlap(gc);
|
|
44190
|
+
solveModel2(gc, solve2.mode, solve2.model);
|
|
44191
|
+
maybeRemoveOverlap(gc, solve2.am);
|
|
44079
44192
|
splineEdgesShifted(gc);
|
|
44080
44193
|
}
|
|
44081
44194
|
const pinfo = {
|
|
@@ -44778,71 +44891,6 @@ function fdpTLayout(g, xpms) {
|
|
|
44778
44891
|
if (reset2) resetParams();
|
|
44779
44892
|
}
|
|
44780
44893
|
|
|
44781
|
-
// src/layout/fdp/normalize.ts
|
|
44782
|
-
function mapbool5(s) {
|
|
44783
|
-
const t = s.toLowerCase();
|
|
44784
|
-
if (t === "false" || t === "no") return false;
|
|
44785
|
-
if (t === "true" || t === "yes") return true;
|
|
44786
|
-
const v = parseInt(s, 10);
|
|
44787
|
-
return !Number.isNaN(v) && v !== 0;
|
|
44788
|
-
}
|
|
44789
|
-
function angleSet(g) {
|
|
44790
|
-
const a = aggetGraph(g, "normalize");
|
|
44791
|
-
if (a === void 0 || a === "") return null;
|
|
44792
|
-
const ang = parseAngle2(a);
|
|
44793
|
-
if (ang === null) return null;
|
|
44794
|
-
return wrapDegrees(ang) * (Math.PI / 180);
|
|
44795
|
-
}
|
|
44796
|
-
function parseAngle2(a) {
|
|
44797
|
-
const m = /^-?[\d.]+(?:[eE][-+]?\d+)?/.exec(a);
|
|
44798
|
-
if (m !== null) return parseFloat(m[0]);
|
|
44799
|
-
return mapbool5(a) ? 0 : null;
|
|
44800
|
-
}
|
|
44801
|
-
function wrapDegrees(ang) {
|
|
44802
|
-
while (ang > 180) ang -= 360;
|
|
44803
|
-
while (ang <= -180) ang += 360;
|
|
44804
|
-
return ang;
|
|
44805
|
-
}
|
|
44806
|
-
function normalizeG(g) {
|
|
44807
|
-
const phi0 = angleSet(g);
|
|
44808
|
-
if (phi0 === null) return;
|
|
44809
|
-
const nodes = [...g.nodes.values()];
|
|
44810
|
-
const first = nodes[0];
|
|
44811
|
-
if (first === void 0) return;
|
|
44812
|
-
const px = first.info.pos[0];
|
|
44813
|
-
const py = first.info.pos[1];
|
|
44814
|
-
for (const v of nodes) {
|
|
44815
|
-
v.info.pos[0] -= px;
|
|
44816
|
-
v.info.pos[1] -= py;
|
|
44817
|
-
}
|
|
44818
|
-
let e = null;
|
|
44819
|
-
for (const v of nodes) {
|
|
44820
|
-
const out = v.outEdges(g);
|
|
44821
|
-
if (out.length > 0) {
|
|
44822
|
-
e = out[0];
|
|
44823
|
-
break;
|
|
44824
|
-
}
|
|
44825
|
-
}
|
|
44826
|
-
if (e === null) return;
|
|
44827
|
-
const phi = phi0 - Math.atan2(
|
|
44828
|
-
e.head.info.pos[1] - e.tail.info.pos[1],
|
|
44829
|
-
e.head.info.pos[0] - e.tail.info.pos[0]
|
|
44830
|
-
);
|
|
44831
|
-
if (phi) rotateAll(nodes, e.tail, phi);
|
|
44832
|
-
}
|
|
44833
|
-
function rotateAll(nodes, orig, phi) {
|
|
44834
|
-
const ox = orig.info.pos[0];
|
|
44835
|
-
const oy = orig.info.pos[1];
|
|
44836
|
-
const cosv = Math.cos(phi);
|
|
44837
|
-
const sinv = Math.sin(phi);
|
|
44838
|
-
for (const v of nodes) {
|
|
44839
|
-
const x = v.info.pos[0] - ox;
|
|
44840
|
-
const y = v.info.pos[1] - oy;
|
|
44841
|
-
v.info.pos[0] = x * cosv - y * sinv + ox;
|
|
44842
|
-
v.info.pos[1] = x * sinv + y * cosv + oy;
|
|
44843
|
-
}
|
|
44844
|
-
}
|
|
44845
|
-
|
|
44846
44894
|
// src/layout/fdp/xlayout.ts
|
|
44847
44895
|
var DFLT_OVERLAP = "9:prism";
|
|
44848
44896
|
var PS2INCH3 = (x) => x / 72;
|
|
@@ -45018,7 +45066,9 @@ function fdpXLayout(g, xpms) {
|
|
|
45018
45066
|
}
|
|
45019
45067
|
function removeOverlapAs(g, flag) {
|
|
45020
45068
|
if (g.nodes.size < 2) return;
|
|
45069
|
+
warnUnrecognizedOverlap(flag);
|
|
45021
45070
|
normalizeG(g);
|
|
45071
|
+
simpleScale(g);
|
|
45022
45072
|
const ntry = overlapPrismTries(flag);
|
|
45023
45073
|
if (ntry !== null) {
|
|
45024
45074
|
fdpAdjust(g, ntry);
|
|
@@ -46167,6 +46217,7 @@ function resolveControl(g) {
|
|
|
46167
46217
|
const pad = { x: DFLT_MARGIN / 72, y: DFLT_MARGIN / 72 };
|
|
46168
46218
|
const overlap5 = aggetGraph(g, "overlap");
|
|
46169
46219
|
const flag = overlap5 === void 0 ? "prism0" : overlap5;
|
|
46220
|
+
warnUnrecognizedOverlap(flag);
|
|
46170
46221
|
const ntry = overlapPrismTries(flag);
|
|
46171
46222
|
if (ntry !== null) {
|
|
46172
46223
|
ctrl.overlap = ntry;
|
|
@@ -55087,16 +55138,9 @@ function collectEdge(acc, e) {
|
|
|
55087
55138
|
addLabel(acc, e.attrs.get("headlabel"), lfi);
|
|
55088
55139
|
addLabel(acc, e.attrs.get("taillabel"), lfi);
|
|
55089
55140
|
}
|
|
55090
|
-
function graphLabelFont(sg) {
|
|
55091
|
-
const get = (k) => sg.attrs.get(k) ?? sg.graphDefaultsSnapshot?.get(k);
|
|
55092
|
-
return {
|
|
55093
|
-
fontname: get("fontname") ?? DEFAULT_FONTNAME,
|
|
55094
|
-
fontsize: parseFloat(get("fontsize") ?? "") || DEFAULT_FONTSIZE2
|
|
55095
|
-
};
|
|
55096
|
-
}
|
|
55097
55141
|
function collectGraphLabels(acc, sg, root) {
|
|
55098
55142
|
if (isACluster(sg)) {
|
|
55099
|
-
addLabel(acc, sg.attrs.get("label") ?? sg.graphDefaultsSnapshot?.get("label"),
|
|
55143
|
+
addLabel(acc, sg.attrs.get("label") ?? sg.graphDefaultsSnapshot?.get("label"), readFontParams(sg));
|
|
55100
55144
|
}
|
|
55101
55145
|
for (const child of sg.subgraphs.values()) collectGraphLabels(acc, child, root);
|
|
55102
55146
|
}
|
|
@@ -55156,13 +55200,6 @@ async function loadFonts(fontSet, fonts, timeoutMs) {
|
|
|
55156
55200
|
|
|
55157
55201
|
// src/async/render-async.ts
|
|
55158
55202
|
var DEFAULT_FONT_TIMEOUT_MS = 3e3;
|
|
55159
|
-
function checkRenderArgs2(g, format, opts) {
|
|
55160
|
-
if (typeof g !== "object" || g === null) throw invalidArgType("g", "object", g);
|
|
55161
|
-
if (typeof format !== "string") throw invalidArgType("format", "string", format);
|
|
55162
|
-
if (opts !== void 0 && (typeof opts !== "object" || opts === null)) {
|
|
55163
|
-
throw invalidArgType("opts", "object or undefined", opts);
|
|
55164
|
-
}
|
|
55165
|
-
}
|
|
55166
55203
|
function defaultFontSet() {
|
|
55167
55204
|
const doc = Reflect.get(globalThis, "document");
|
|
55168
55205
|
if (typeof doc !== "object" || doc === null) return void 0;
|
|
@@ -55198,7 +55235,7 @@ async function prefetchAll(g, opts) {
|
|
|
55198
55235
|
return { fontIssues, sizes, bytes };
|
|
55199
55236
|
}
|
|
55200
55237
|
async function renderAsync(g, format, opts) {
|
|
55201
|
-
|
|
55238
|
+
checkRenderArgs(g, format, opts);
|
|
55202
55239
|
const engine = opts?.engine ?? "dot";
|
|
55203
55240
|
try {
|
|
55204
55241
|
const { fontIssues, sizes, bytes } = await prefetchAll(g, opts);
|