@knowvah/dot-engine 2.6.9 → 2.6.10
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/htmltable-emit-fill.d.ts +1 -1
- package/dist/common/htmltable-emit-fill.d.ts.map +1 -1
- package/dist/common/htmltable-emit.d.ts +8 -0
- package/dist/common/htmltable-emit.d.ts.map +1 -1
- package/dist/common/htmltable-style.d.ts +22 -0
- package/dist/common/htmltable-style.d.ts.map +1 -0
- package/dist/index.js +289 -264
- package/dist/index.js.map +4 -4
- package/dist/render.js +39 -14
- package/dist/render.js.map +4 -4
- package/package.json +1 -1
- package/src/common/htmltable-emit-fill.ts +7 -6
- package/src/common/htmltable-emit.ts +5 -22
- package/src/common/htmltable-style.ts +38 -0
package/dist/index.js
CHANGED
|
@@ -9431,250 +9431,35 @@ function underlineDraw(ring, coord, filled, ctx) {
|
|
|
9431
9431
|
renderShapePolyline([ring[2], ring[3]], coord, ctx);
|
|
9432
9432
|
}
|
|
9433
9433
|
|
|
9434
|
-
// src/common/
|
|
9435
|
-
|
|
9436
|
-
|
|
9437
|
-
|
|
9438
|
-
|
|
9439
|
-
|
|
9440
|
-
|
|
9441
|
-
|
|
9442
|
-
|
|
9443
|
-
|
|
9444
|
-
|
|
9445
|
-
|
|
9446
|
-
|
|
9447
|
-
|
|
9448
|
-
|
|
9449
|
-
|
|
9450
|
-
|
|
9451
|
-
|
|
9452
|
-
|
|
9453
|
-
|
|
9454
|
-
|
|
9455
|
-
|
|
9456
|
-
|
|
9457
|
-
|
|
9458
|
-
|
|
9459
|
-
|
|
9460
|
-
}
|
|
9461
|
-
left2 -= t;
|
|
9462
|
-
segs.push({ color: color.length > 0 ? color : null, t, hasFraction: t > 0 && v > 0 });
|
|
9463
|
-
return { left: left2, rval };
|
|
9464
|
-
}
|
|
9465
|
-
function distributeLeft(segs, left2) {
|
|
9466
|
-
if (left2 <= 0) return;
|
|
9467
|
-
const zeroCount = segs.filter((s) => s.t <= 0).length;
|
|
9468
|
-
if (zeroCount > 0) {
|
|
9469
|
-
const delta2 = left2 / zeroCount;
|
|
9470
|
-
for (const s of segs) {
|
|
9471
|
-
if (s.t <= 0) s.t = delta2;
|
|
9472
|
-
}
|
|
9473
|
-
} else if (segs.length > 0) {
|
|
9474
|
-
segs[segs.length - 1].t += left2;
|
|
9475
|
-
}
|
|
9476
|
-
}
|
|
9477
|
-
function trimTrailing(segs) {
|
|
9478
|
-
while (segs.length > 0 && (segs[segs.length - 1]?.t ?? 0) <= 0) {
|
|
9479
|
-
segs.pop();
|
|
9480
|
-
}
|
|
9481
|
-
}
|
|
9482
|
-
function parseSegs(colorlist) {
|
|
9483
|
-
const segs = [];
|
|
9484
|
-
let left2 = 1;
|
|
9485
|
-
let rval = 0;
|
|
9486
|
-
let badFloatCount = 0;
|
|
9487
|
-
const warnedExceeded = { v: false };
|
|
9488
|
-
for (const token of colorlist.split(":")) {
|
|
9489
|
-
const result = appendSeg(token, left2, segs, warnedExceeded);
|
|
9490
|
-
if (result === null) {
|
|
9491
|
-
const errCode = badFloatCount === 0 ? 2 : 1;
|
|
9492
|
-
badFloatCount++;
|
|
9493
|
-
return { segs: [], error: errCode };
|
|
9494
|
-
}
|
|
9495
|
-
if (result.rval === 3) rval = 3;
|
|
9496
|
-
left2 = result.left;
|
|
9497
|
-
if (aeq0(left2)) {
|
|
9498
|
-
left2 = 0;
|
|
9499
|
-
break;
|
|
9500
|
-
}
|
|
9501
|
-
}
|
|
9502
|
-
distributeLeft(segs, left2);
|
|
9503
|
-
trimTrailing(segs);
|
|
9504
|
-
return { segs, error: rval };
|
|
9505
|
-
}
|
|
9506
|
-
|
|
9507
|
-
// src/common/style-resolve.ts
|
|
9508
|
-
var DEFAULT_COLOR = "black";
|
|
9509
|
-
var DEFAULT_FILL = "lightgrey";
|
|
9510
|
-
var PENWIDTH_BOLD = 2;
|
|
9511
|
-
var TOKEN_FLAG = {
|
|
9512
|
-
filled: "filled",
|
|
9513
|
-
dashed: "dashed",
|
|
9514
|
-
dotted: "dotted",
|
|
9515
|
-
bold: "bold",
|
|
9516
|
-
invis: "invis",
|
|
9517
|
-
diagonals: "diagonals",
|
|
9518
|
-
rounded: "rounded",
|
|
9519
|
-
striped: "striped",
|
|
9520
|
-
wedged: "wedged",
|
|
9521
|
-
underline: "underline"
|
|
9522
|
-
};
|
|
9523
|
-
function zeroFlags() {
|
|
9524
|
-
return {
|
|
9525
|
-
filled: false,
|
|
9526
|
-
dashed: false,
|
|
9527
|
-
dotted: false,
|
|
9528
|
-
bold: false,
|
|
9529
|
-
invis: false,
|
|
9530
|
-
diagonals: false,
|
|
9531
|
-
rounded: false,
|
|
9532
|
-
radial: false,
|
|
9533
|
-
striped: false,
|
|
9534
|
-
wedged: false,
|
|
9535
|
-
underline: false,
|
|
9536
|
-
setLineWidth: null
|
|
9537
|
-
};
|
|
9538
|
-
}
|
|
9539
|
-
var FUNLIMIT = 64;
|
|
9540
|
-
function styleTokens(style2) {
|
|
9541
|
-
if (!style2) return [];
|
|
9542
|
-
const out = [];
|
|
9543
|
-
let fun = 0;
|
|
9544
|
-
for (const raw of style2.split(",")) {
|
|
9545
|
-
const token = raw.trim();
|
|
9546
|
-
if (token.length === 0) continue;
|
|
9547
|
-
if (fun === FUNLIMIT - 1) return [];
|
|
9548
|
-
fun++;
|
|
9549
|
-
out.push(token);
|
|
9550
|
-
}
|
|
9551
|
-
return out;
|
|
9552
|
-
}
|
|
9553
|
-
function parseSetLineWidth(token) {
|
|
9554
|
-
const m = /^setlinewidth\s*\(\s*([^)]*)\)\s*$/.exec(token);
|
|
9555
|
-
if (m === null) return null;
|
|
9556
|
-
const v = parseFloat(m[1]);
|
|
9557
|
-
return Number.isNaN(v) ? 0 : v;
|
|
9558
|
-
}
|
|
9559
|
-
function applyToken(flags, token) {
|
|
9560
|
-
if (token === "radial") {
|
|
9561
|
-
flags.radial = true;
|
|
9562
|
-
flags.filled = true;
|
|
9563
|
-
return;
|
|
9564
|
-
}
|
|
9565
|
-
const key = TOKEN_FLAG[token];
|
|
9566
|
-
if (key !== void 0) flags[key] = true;
|
|
9567
|
-
}
|
|
9568
|
-
function nonEmpty(s) {
|
|
9569
|
-
return s !== void 0 && s.length > 0;
|
|
9570
|
-
}
|
|
9571
|
-
function orElse(s, fallback) {
|
|
9572
|
-
return nonEmpty(s) ? s : fallback;
|
|
9573
|
-
}
|
|
9574
|
-
function firstSolidColor(raw) {
|
|
9575
|
-
const grad = parseGradientSpec(raw);
|
|
9576
|
-
return grad !== null ? grad[0] : raw;
|
|
9577
|
-
}
|
|
9578
|
-
function parseStyleFlags(style2) {
|
|
9579
|
-
const flags = zeroFlags();
|
|
9580
|
-
if (!style2) return flags;
|
|
9581
|
-
let fun = 0;
|
|
9582
|
-
for (const raw of style2.split(",")) {
|
|
9583
|
-
const token = raw.trim();
|
|
9584
|
-
if (token.length === 0) continue;
|
|
9585
|
-
if (fun === FUNLIMIT - 1) return zeroFlags();
|
|
9586
|
-
fun++;
|
|
9587
|
-
const lw = parseSetLineWidth(token);
|
|
9588
|
-
if (lw !== null) {
|
|
9589
|
-
flags.setLineWidth = lw;
|
|
9590
|
-
continue;
|
|
9434
|
+
// src/common/htmltable-style.ts
|
|
9435
|
+
function htmlStyle(style2) {
|
|
9436
|
+
const s = { radial: false, rounded: false, invisible: false, dotted: false, dashed: false };
|
|
9437
|
+
if (style2 === void 0) return s;
|
|
9438
|
+
for (const tk of style2.split(/[ ,]+/)) {
|
|
9439
|
+
switch (tk.toUpperCase()) {
|
|
9440
|
+
case "ROUNDED":
|
|
9441
|
+
s.rounded = true;
|
|
9442
|
+
break;
|
|
9443
|
+
case "RADIAL":
|
|
9444
|
+
s.radial = true;
|
|
9445
|
+
break;
|
|
9446
|
+
case "SOLID":
|
|
9447
|
+
s.dotted = false;
|
|
9448
|
+
s.dashed = false;
|
|
9449
|
+
break;
|
|
9450
|
+
case "INVISIBLE":
|
|
9451
|
+
case "INVIS":
|
|
9452
|
+
s.invisible = true;
|
|
9453
|
+
break;
|
|
9454
|
+
case "DOTTED":
|
|
9455
|
+
s.dotted = true;
|
|
9456
|
+
break;
|
|
9457
|
+
case "DASHED":
|
|
9458
|
+
s.dashed = true;
|
|
9459
|
+
break;
|
|
9591
9460
|
}
|
|
9592
|
-
if (!token.includes("(")) applyToken(flags, token);
|
|
9593
9461
|
}
|
|
9594
|
-
return
|
|
9595
|
-
}
|
|
9596
|
-
function styleHasInvisibleAlias(style2) {
|
|
9597
|
-
if (!style2) return false;
|
|
9598
|
-
let fun = 0;
|
|
9599
|
-
for (const raw of style2.split(",")) {
|
|
9600
|
-
const token = raw.trim();
|
|
9601
|
-
if (token.length === 0) continue;
|
|
9602
|
-
if (fun === FUNLIMIT - 1) return false;
|
|
9603
|
-
fun++;
|
|
9604
|
-
if (token === "invisible") return true;
|
|
9605
|
-
}
|
|
9606
|
-
return false;
|
|
9607
|
-
}
|
|
9608
|
-
function resolvePenType(flags) {
|
|
9609
|
-
if (flags.invis) return 0 /* None */;
|
|
9610
|
-
if (flags.dashed) return 1 /* Dashed */;
|
|
9611
|
-
if (flags.dotted) return 2 /* Dotted */;
|
|
9612
|
-
return 3 /* Solid */;
|
|
9613
|
-
}
|
|
9614
|
-
function resolvePenWidth(flags, penwidthAttr) {
|
|
9615
|
-
if (penwidthAttr && penwidthAttr.length > 0) {
|
|
9616
|
-
const v = parseFloat(penwidthAttr);
|
|
9617
|
-
if (isFinite(v)) return v;
|
|
9618
|
-
}
|
|
9619
|
-
if (flags.setLineWidth !== null) return flags.setLineWidth;
|
|
9620
|
-
if (flags.bold) return PENWIDTH_BOLD;
|
|
9621
|
-
return 1;
|
|
9622
|
-
}
|
|
9623
|
-
function resolvePenColor(colorAttr) {
|
|
9624
|
-
if (!colorAttr || colorAttr.length === 0) return DEFAULT_COLOR;
|
|
9625
|
-
return firstSolidColor(colorAttr);
|
|
9626
|
-
}
|
|
9627
|
-
function clusterColorAttrs(attrs) {
|
|
9628
|
-
const base = nonEmpty(attrs.color) ? attrs.color : void 0;
|
|
9629
|
-
const pencolor = orElse(attrs.pencolor, base ?? "");
|
|
9630
|
-
const fillcolor = orElse(attrs.fillcolor, base ?? "");
|
|
9631
|
-
return {
|
|
9632
|
-
fillcolor: nonEmpty(fillcolor) ? fillcolor : void 0,
|
|
9633
|
-
pencolor: nonEmpty(pencolor) ? pencolor : void 0
|
|
9634
|
-
};
|
|
9635
|
-
}
|
|
9636
|
-
function applyBgcolor(attrs, filled, fillcolor) {
|
|
9637
|
-
if ((!filled || !fillcolor) && nonEmpty(attrs.bgcolor)) {
|
|
9638
|
-
return { filled: true, fillcolor: attrs.bgcolor };
|
|
9639
|
-
}
|
|
9640
|
-
return { filled, fillcolor };
|
|
9641
|
-
}
|
|
9642
|
-
function findStopColor(colorlist) {
|
|
9643
|
-
const { segs, error } = parseSegs(colorlist);
|
|
9644
|
-
if (error === 1 || error === 2) return null;
|
|
9645
|
-
if (segs.length < 2) return null;
|
|
9646
|
-
const seg0 = segs[0];
|
|
9647
|
-
const seg1 = segs[1];
|
|
9648
|
-
if (seg0.color === null) return null;
|
|
9649
|
-
const fillColor = seg0.color;
|
|
9650
|
-
const stopColor = seg1.color ?? DEFAULT_COLOR;
|
|
9651
|
-
const frac = seg0.hasFraction ? seg0.t : seg1.hasFraction ? 1 - seg1.t : 0;
|
|
9652
|
-
return { fillColor, stopColor, frac };
|
|
9653
|
-
}
|
|
9654
|
-
function parseAngle(gradientangle2) {
|
|
9655
|
-
if (!gradientangle2 || gradientangle2.length === 0) return 0;
|
|
9656
|
-
const v = parseInt(gradientangle2, 10);
|
|
9657
|
-
return isFinite(v) ? v : 0;
|
|
9658
|
-
}
|
|
9659
|
-
function buildResolvedFill(rawColor, flags, angle) {
|
|
9660
|
-
const stop = findStopColor(rawColor);
|
|
9661
|
-
if (stop === null) return { kind: "solid", color: rawColor };
|
|
9662
|
-
const kind = flags.radial ? "radial" : "linear";
|
|
9663
|
-
return { kind, fillColor: stop.fillColor, stopColor: stop.stopColor, frac: stop.frac, angle };
|
|
9664
|
-
}
|
|
9665
|
-
function resolveNodeFillEx(attrs) {
|
|
9666
|
-
const flags = parseStyleFlags(attrs.style);
|
|
9667
|
-
if (!flags.filled) return { kind: "none" };
|
|
9668
|
-
const raw = nonEmpty(attrs.fillcolor) ? attrs.fillcolor : nonEmpty(attrs.color) ? attrs.color : DEFAULT_FILL;
|
|
9669
|
-
return buildResolvedFill(raw, flags, parseAngle(attrs.gradientangle));
|
|
9670
|
-
}
|
|
9671
|
-
function resolveClusterFillEx(attrs) {
|
|
9672
|
-
const flags = parseStyleFlags(attrs.style);
|
|
9673
|
-
const colors = clusterColorAttrs(attrs);
|
|
9674
|
-
const bg = applyBgcolor(attrs, flags.filled, colors.fillcolor);
|
|
9675
|
-
if (!bg.filled) return { kind: "none" };
|
|
9676
|
-
const raw = bg.fillcolor ?? DEFAULT_FILL;
|
|
9677
|
-
return buildResolvedFill(raw, flags, parseAngle(attrs.gradientangle));
|
|
9462
|
+
return s;
|
|
9678
9463
|
}
|
|
9679
9464
|
|
|
9680
9465
|
// src/common/htmltable-types.ts
|
|
@@ -9759,8 +9544,9 @@ function resetHtmlFillPenWidth() {
|
|
|
9759
9544
|
htmlFillPen = 1;
|
|
9760
9545
|
}
|
|
9761
9546
|
function penTypeOf(style2) {
|
|
9762
|
-
|
|
9763
|
-
if (
|
|
9547
|
+
const st = htmlStyle(style2);
|
|
9548
|
+
if (st.dashed) return 1 /* Dashed */;
|
|
9549
|
+
if (st.dotted) return 2 /* Dotted */;
|
|
9764
9550
|
return 3 /* Solid */;
|
|
9765
9551
|
}
|
|
9766
9552
|
function withHtmlPaint(paint, job, drawFn) {
|
|
@@ -9827,7 +9613,7 @@ function doBorder(spec, renderer, job) {
|
|
|
9827
9613
|
const { box, pos, border: border2, color, sides: sides2, style: style2 } = spec;
|
|
9828
9614
|
htmlFillPen = border2;
|
|
9829
9615
|
withHtmlPaint({ pen: color, penWidth: border2, penStyle: style2 }, job, () => {
|
|
9830
|
-
if (
|
|
9616
|
+
if (htmlStyle(style2).rounded) {
|
|
9831
9617
|
emitRoundedBezier(mkPts(box, border2, pos), { x: 0, y: 0 }, false, { renderer, job });
|
|
9832
9618
|
return;
|
|
9833
9619
|
}
|
|
@@ -10032,14 +9818,14 @@ function bgFillPaint(ctx) {
|
|
|
10032
9818
|
fill: spec[0],
|
|
10033
9819
|
stop: spec[1],
|
|
10034
9820
|
gradientAngle: ctx.gradientangle ?? 0,
|
|
10035
|
-
radial: ctx.style
|
|
9821
|
+
radial: htmlStyle(ctx.style).radial,
|
|
10036
9822
|
penWidth
|
|
10037
9823
|
};
|
|
10038
9824
|
}
|
|
10039
9825
|
function emitBgFill(ctx) {
|
|
10040
9826
|
const { box, pos, border: border2, renderer, job } = ctx;
|
|
10041
9827
|
withHtmlPaint(bgFillPaint(ctx), job, () => {
|
|
10042
|
-
if (
|
|
9828
|
+
if (htmlStyle(ctx.style).rounded) {
|
|
10043
9829
|
emitRoundedBezier(mkPts(box, border2, pos), { x: 0, y: 0 }, true, { renderer, job });
|
|
10044
9830
|
return;
|
|
10045
9831
|
}
|
|
@@ -10105,13 +9891,6 @@ function emitHtmlImg(img, pos, renderer, job) {
|
|
|
10105
9891
|
}
|
|
10106
9892
|
renderer.usershape?.(img.src, b, job);
|
|
10107
9893
|
}
|
|
10108
|
-
function htmlStyleInvisible(style2) {
|
|
10109
|
-
if (style2 === void 0) return false;
|
|
10110
|
-
return style2.split(/[ ,]+/).some((tok) => {
|
|
10111
|
-
const t = tok.toUpperCase();
|
|
10112
|
-
return t === "INVIS" || t === "INVISIBLE";
|
|
10113
|
-
});
|
|
10114
|
-
}
|
|
10115
9894
|
function emitHtmlCell(cell2, pos, renderer, job) {
|
|
10116
9895
|
const inAnchor = initHtmlAnchor(
|
|
10117
9896
|
{ href: cell2.href, title: cell2.title, target: cell2.target, id: cell2.id },
|
|
@@ -10119,7 +9898,7 @@ function emitHtmlCell(cell2, pos, renderer, job) {
|
|
|
10119
9898
|
renderer,
|
|
10120
9899
|
job
|
|
10121
9900
|
);
|
|
10122
|
-
if (
|
|
9901
|
+
if (htmlStyle(cell2.style).invisible) {
|
|
10123
9902
|
if (inAnchor) endHtmlAnchor(renderer, job);
|
|
10124
9903
|
return;
|
|
10125
9904
|
}
|
|
@@ -10155,7 +9934,7 @@ function emitHtmlLabel(placed, pos, renderer, job) {
|
|
|
10155
9934
|
const tblBox = absBox(placed.box, pos);
|
|
10156
9935
|
const clustersLast = (job.flags & EMIT_CLUSTERS_LAST) !== 0;
|
|
10157
9936
|
const inAnchor = clustersLast ? false : initHtmlAnchor(anchorData, tblBox, renderer, job);
|
|
10158
|
-
const tblInvisible =
|
|
9937
|
+
const tblInvisible = htmlStyle(placed.style).invisible;
|
|
10159
9938
|
if (!tblInvisible) {
|
|
10160
9939
|
if (placed.bgcolor !== void 0) {
|
|
10161
9940
|
emitBgFill({
|
|
@@ -10232,7 +10011,7 @@ var sides = (v) => {
|
|
|
10232
10011
|
};
|
|
10233
10012
|
var STYLE_WORDS = ["rounded", "radial", "solid", "invisible", "invis", "dotted", "dashed"];
|
|
10234
10013
|
var STYLE_DELIM = " ,";
|
|
10235
|
-
function
|
|
10014
|
+
function styleTokens(v) {
|
|
10236
10015
|
const out = [];
|
|
10237
10016
|
const span = (from, member) => {
|
|
10238
10017
|
let i = from;
|
|
@@ -10251,7 +10030,7 @@ function styleTokens2(v) {
|
|
|
10251
10030
|
var style = (v) => {
|
|
10252
10031
|
const legal = [];
|
|
10253
10032
|
const text = [];
|
|
10254
|
-
for (const tk of
|
|
10033
|
+
for (const tk of styleTokens(v)) {
|
|
10255
10034
|
if (STYLE_WORDS.includes(lower(tk))) legal.push(tk);
|
|
10256
10035
|
else text.push(warning(`Illegal value ${tk} for STYLE - ignored
|
|
10257
10036
|
`));
|
|
@@ -17996,7 +17775,7 @@ function preprocessTooltip(s) {
|
|
|
17996
17775
|
// src/common/make-label.ts
|
|
17997
17776
|
var DEFAULT_FONTSIZE2 = 14;
|
|
17998
17777
|
var DEFAULT_FONTNAME = "Times-Roman";
|
|
17999
|
-
var
|
|
17778
|
+
var DEFAULT_COLOR = "black";
|
|
18000
17779
|
function getPenColor(obj) {
|
|
18001
17780
|
if (obj === void 0) return void 0;
|
|
18002
17781
|
const pc = obj.attrs.get("pencolor");
|
|
@@ -18618,6 +18397,252 @@ function assembleResult(p, dimen, grown, fixedshape) {
|
|
|
18618
18397
|
};
|
|
18619
18398
|
}
|
|
18620
18399
|
|
|
18400
|
+
// src/common/multicolor.ts
|
|
18401
|
+
var EPS = 1e-5;
|
|
18402
|
+
function aeq0(x) {
|
|
18403
|
+
return x < EPS && x > -EPS;
|
|
18404
|
+
}
|
|
18405
|
+
function getSegLen(token) {
|
|
18406
|
+
const semi = token.indexOf(";");
|
|
18407
|
+
if (semi === -1) return { color: token, v: 0 };
|
|
18408
|
+
const color = token.slice(0, semi);
|
|
18409
|
+
const rest = token.slice(semi + 1);
|
|
18410
|
+
if (rest.length === 0) return { color, v: -1 };
|
|
18411
|
+
const parsed = parseFloat(rest);
|
|
18412
|
+
return !isNaN(parsed) && parsed >= 0 ? { color, v: parsed } : { color, v: -1 };
|
|
18413
|
+
}
|
|
18414
|
+
function appendSeg(token, left2, segs, warnedExceeded) {
|
|
18415
|
+
const { color, v } = getSegLen(token);
|
|
18416
|
+
if (v < 0) return null;
|
|
18417
|
+
let t = v;
|
|
18418
|
+
let rval = 0;
|
|
18419
|
+
const del = t - left2;
|
|
18420
|
+
if (del > 0) {
|
|
18421
|
+
if (!aeq0(del) && !warnedExceeded.v) {
|
|
18422
|
+
warnedExceeded.v = true;
|
|
18423
|
+
rval = 3;
|
|
18424
|
+
}
|
|
18425
|
+
t = left2;
|
|
18426
|
+
}
|
|
18427
|
+
left2 -= t;
|
|
18428
|
+
segs.push({ color: color.length > 0 ? color : null, t, hasFraction: t > 0 && v > 0 });
|
|
18429
|
+
return { left: left2, rval };
|
|
18430
|
+
}
|
|
18431
|
+
function distributeLeft(segs, left2) {
|
|
18432
|
+
if (left2 <= 0) return;
|
|
18433
|
+
const zeroCount = segs.filter((s) => s.t <= 0).length;
|
|
18434
|
+
if (zeroCount > 0) {
|
|
18435
|
+
const delta2 = left2 / zeroCount;
|
|
18436
|
+
for (const s of segs) {
|
|
18437
|
+
if (s.t <= 0) s.t = delta2;
|
|
18438
|
+
}
|
|
18439
|
+
} else if (segs.length > 0) {
|
|
18440
|
+
segs[segs.length - 1].t += left2;
|
|
18441
|
+
}
|
|
18442
|
+
}
|
|
18443
|
+
function trimTrailing(segs) {
|
|
18444
|
+
while (segs.length > 0 && (segs[segs.length - 1]?.t ?? 0) <= 0) {
|
|
18445
|
+
segs.pop();
|
|
18446
|
+
}
|
|
18447
|
+
}
|
|
18448
|
+
function parseSegs(colorlist) {
|
|
18449
|
+
const segs = [];
|
|
18450
|
+
let left2 = 1;
|
|
18451
|
+
let rval = 0;
|
|
18452
|
+
let badFloatCount = 0;
|
|
18453
|
+
const warnedExceeded = { v: false };
|
|
18454
|
+
for (const token of colorlist.split(":")) {
|
|
18455
|
+
const result = appendSeg(token, left2, segs, warnedExceeded);
|
|
18456
|
+
if (result === null) {
|
|
18457
|
+
const errCode = badFloatCount === 0 ? 2 : 1;
|
|
18458
|
+
badFloatCount++;
|
|
18459
|
+
return { segs: [], error: errCode };
|
|
18460
|
+
}
|
|
18461
|
+
if (result.rval === 3) rval = 3;
|
|
18462
|
+
left2 = result.left;
|
|
18463
|
+
if (aeq0(left2)) {
|
|
18464
|
+
left2 = 0;
|
|
18465
|
+
break;
|
|
18466
|
+
}
|
|
18467
|
+
}
|
|
18468
|
+
distributeLeft(segs, left2);
|
|
18469
|
+
trimTrailing(segs);
|
|
18470
|
+
return { segs, error: rval };
|
|
18471
|
+
}
|
|
18472
|
+
|
|
18473
|
+
// src/common/style-resolve.ts
|
|
18474
|
+
var DEFAULT_COLOR2 = "black";
|
|
18475
|
+
var DEFAULT_FILL = "lightgrey";
|
|
18476
|
+
var PENWIDTH_BOLD = 2;
|
|
18477
|
+
var TOKEN_FLAG = {
|
|
18478
|
+
filled: "filled",
|
|
18479
|
+
dashed: "dashed",
|
|
18480
|
+
dotted: "dotted",
|
|
18481
|
+
bold: "bold",
|
|
18482
|
+
invis: "invis",
|
|
18483
|
+
diagonals: "diagonals",
|
|
18484
|
+
rounded: "rounded",
|
|
18485
|
+
striped: "striped",
|
|
18486
|
+
wedged: "wedged",
|
|
18487
|
+
underline: "underline"
|
|
18488
|
+
};
|
|
18489
|
+
function zeroFlags() {
|
|
18490
|
+
return {
|
|
18491
|
+
filled: false,
|
|
18492
|
+
dashed: false,
|
|
18493
|
+
dotted: false,
|
|
18494
|
+
bold: false,
|
|
18495
|
+
invis: false,
|
|
18496
|
+
diagonals: false,
|
|
18497
|
+
rounded: false,
|
|
18498
|
+
radial: false,
|
|
18499
|
+
striped: false,
|
|
18500
|
+
wedged: false,
|
|
18501
|
+
underline: false,
|
|
18502
|
+
setLineWidth: null
|
|
18503
|
+
};
|
|
18504
|
+
}
|
|
18505
|
+
var FUNLIMIT = 64;
|
|
18506
|
+
function styleTokens2(style2) {
|
|
18507
|
+
if (!style2) return [];
|
|
18508
|
+
const out = [];
|
|
18509
|
+
let fun = 0;
|
|
18510
|
+
for (const raw of style2.split(",")) {
|
|
18511
|
+
const token = raw.trim();
|
|
18512
|
+
if (token.length === 0) continue;
|
|
18513
|
+
if (fun === FUNLIMIT - 1) return [];
|
|
18514
|
+
fun++;
|
|
18515
|
+
out.push(token);
|
|
18516
|
+
}
|
|
18517
|
+
return out;
|
|
18518
|
+
}
|
|
18519
|
+
function parseSetLineWidth(token) {
|
|
18520
|
+
const m = /^setlinewidth\s*\(\s*([^)]*)\)\s*$/.exec(token);
|
|
18521
|
+
if (m === null) return null;
|
|
18522
|
+
const v = parseFloat(m[1]);
|
|
18523
|
+
return Number.isNaN(v) ? 0 : v;
|
|
18524
|
+
}
|
|
18525
|
+
function applyToken(flags, token) {
|
|
18526
|
+
if (token === "radial") {
|
|
18527
|
+
flags.radial = true;
|
|
18528
|
+
flags.filled = true;
|
|
18529
|
+
return;
|
|
18530
|
+
}
|
|
18531
|
+
const key = TOKEN_FLAG[token];
|
|
18532
|
+
if (key !== void 0) flags[key] = true;
|
|
18533
|
+
}
|
|
18534
|
+
function nonEmpty(s) {
|
|
18535
|
+
return s !== void 0 && s.length > 0;
|
|
18536
|
+
}
|
|
18537
|
+
function orElse(s, fallback) {
|
|
18538
|
+
return nonEmpty(s) ? s : fallback;
|
|
18539
|
+
}
|
|
18540
|
+
function firstSolidColor(raw) {
|
|
18541
|
+
const grad = parseGradientSpec(raw);
|
|
18542
|
+
return grad !== null ? grad[0] : raw;
|
|
18543
|
+
}
|
|
18544
|
+
function parseStyleFlags(style2) {
|
|
18545
|
+
const flags = zeroFlags();
|
|
18546
|
+
if (!style2) return flags;
|
|
18547
|
+
let fun = 0;
|
|
18548
|
+
for (const raw of style2.split(",")) {
|
|
18549
|
+
const token = raw.trim();
|
|
18550
|
+
if (token.length === 0) continue;
|
|
18551
|
+
if (fun === FUNLIMIT - 1) return zeroFlags();
|
|
18552
|
+
fun++;
|
|
18553
|
+
const lw = parseSetLineWidth(token);
|
|
18554
|
+
if (lw !== null) {
|
|
18555
|
+
flags.setLineWidth = lw;
|
|
18556
|
+
continue;
|
|
18557
|
+
}
|
|
18558
|
+
if (!token.includes("(")) applyToken(flags, token);
|
|
18559
|
+
}
|
|
18560
|
+
return flags;
|
|
18561
|
+
}
|
|
18562
|
+
function styleHasInvisibleAlias(style2) {
|
|
18563
|
+
if (!style2) return false;
|
|
18564
|
+
let fun = 0;
|
|
18565
|
+
for (const raw of style2.split(",")) {
|
|
18566
|
+
const token = raw.trim();
|
|
18567
|
+
if (token.length === 0) continue;
|
|
18568
|
+
if (fun === FUNLIMIT - 1) return false;
|
|
18569
|
+
fun++;
|
|
18570
|
+
if (token === "invisible") return true;
|
|
18571
|
+
}
|
|
18572
|
+
return false;
|
|
18573
|
+
}
|
|
18574
|
+
function resolvePenType(flags) {
|
|
18575
|
+
if (flags.invis) return 0 /* None */;
|
|
18576
|
+
if (flags.dashed) return 1 /* Dashed */;
|
|
18577
|
+
if (flags.dotted) return 2 /* Dotted */;
|
|
18578
|
+
return 3 /* Solid */;
|
|
18579
|
+
}
|
|
18580
|
+
function resolvePenWidth(flags, penwidthAttr) {
|
|
18581
|
+
if (penwidthAttr && penwidthAttr.length > 0) {
|
|
18582
|
+
const v = parseFloat(penwidthAttr);
|
|
18583
|
+
if (isFinite(v)) return v;
|
|
18584
|
+
}
|
|
18585
|
+
if (flags.setLineWidth !== null) return flags.setLineWidth;
|
|
18586
|
+
if (flags.bold) return PENWIDTH_BOLD;
|
|
18587
|
+
return 1;
|
|
18588
|
+
}
|
|
18589
|
+
function resolvePenColor(colorAttr) {
|
|
18590
|
+
if (!colorAttr || colorAttr.length === 0) return DEFAULT_COLOR2;
|
|
18591
|
+
return firstSolidColor(colorAttr);
|
|
18592
|
+
}
|
|
18593
|
+
function clusterColorAttrs(attrs) {
|
|
18594
|
+
const base = nonEmpty(attrs.color) ? attrs.color : void 0;
|
|
18595
|
+
const pencolor = orElse(attrs.pencolor, base ?? "");
|
|
18596
|
+
const fillcolor = orElse(attrs.fillcolor, base ?? "");
|
|
18597
|
+
return {
|
|
18598
|
+
fillcolor: nonEmpty(fillcolor) ? fillcolor : void 0,
|
|
18599
|
+
pencolor: nonEmpty(pencolor) ? pencolor : void 0
|
|
18600
|
+
};
|
|
18601
|
+
}
|
|
18602
|
+
function applyBgcolor(attrs, filled, fillcolor) {
|
|
18603
|
+
if ((!filled || !fillcolor) && nonEmpty(attrs.bgcolor)) {
|
|
18604
|
+
return { filled: true, fillcolor: attrs.bgcolor };
|
|
18605
|
+
}
|
|
18606
|
+
return { filled, fillcolor };
|
|
18607
|
+
}
|
|
18608
|
+
function findStopColor(colorlist) {
|
|
18609
|
+
const { segs, error } = parseSegs(colorlist);
|
|
18610
|
+
if (error === 1 || error === 2) return null;
|
|
18611
|
+
if (segs.length < 2) return null;
|
|
18612
|
+
const seg0 = segs[0];
|
|
18613
|
+
const seg1 = segs[1];
|
|
18614
|
+
if (seg0.color === null) return null;
|
|
18615
|
+
const fillColor = seg0.color;
|
|
18616
|
+
const stopColor = seg1.color ?? DEFAULT_COLOR2;
|
|
18617
|
+
const frac = seg0.hasFraction ? seg0.t : seg1.hasFraction ? 1 - seg1.t : 0;
|
|
18618
|
+
return { fillColor, stopColor, frac };
|
|
18619
|
+
}
|
|
18620
|
+
function parseAngle(gradientangle2) {
|
|
18621
|
+
if (!gradientangle2 || gradientangle2.length === 0) return 0;
|
|
18622
|
+
const v = parseInt(gradientangle2, 10);
|
|
18623
|
+
return isFinite(v) ? v : 0;
|
|
18624
|
+
}
|
|
18625
|
+
function buildResolvedFill(rawColor, flags, angle) {
|
|
18626
|
+
const stop = findStopColor(rawColor);
|
|
18627
|
+
if (stop === null) return { kind: "solid", color: rawColor };
|
|
18628
|
+
const kind = flags.radial ? "radial" : "linear";
|
|
18629
|
+
return { kind, fillColor: stop.fillColor, stopColor: stop.stopColor, frac: stop.frac, angle };
|
|
18630
|
+
}
|
|
18631
|
+
function resolveNodeFillEx(attrs) {
|
|
18632
|
+
const flags = parseStyleFlags(attrs.style);
|
|
18633
|
+
if (!flags.filled) return { kind: "none" };
|
|
18634
|
+
const raw = nonEmpty(attrs.fillcolor) ? attrs.fillcolor : nonEmpty(attrs.color) ? attrs.color : DEFAULT_FILL;
|
|
18635
|
+
return buildResolvedFill(raw, flags, parseAngle(attrs.gradientangle));
|
|
18636
|
+
}
|
|
18637
|
+
function resolveClusterFillEx(attrs) {
|
|
18638
|
+
const flags = parseStyleFlags(attrs.style);
|
|
18639
|
+
const colors = clusterColorAttrs(attrs);
|
|
18640
|
+
const bg = applyBgcolor(attrs, flags.filled, colors.fillcolor);
|
|
18641
|
+
if (!bg.filled) return { kind: "none" };
|
|
18642
|
+
const raw = bg.fillcolor ?? DEFAULT_FILL;
|
|
18643
|
+
return buildResolvedFill(raw, flags, parseAngle(attrs.gradientangle));
|
|
18644
|
+
}
|
|
18645
|
+
|
|
18621
18646
|
// src/layout/dot/fastgr.ts
|
|
18622
18647
|
var VIRTUAL = 1;
|
|
18623
18648
|
var NORMAL = 0;
|
|
@@ -20727,7 +20752,7 @@ function readFontParams(sg) {
|
|
|
20727
20752
|
return {
|
|
20728
20753
|
fontsize: parseFloat(graphAttrInherited(sg, "fontsize") ?? "") || DEFAULT_FONTSIZE2,
|
|
20729
20754
|
fontname: graphAttrInherited(sg, "fontname") ?? DEFAULT_FONTNAME,
|
|
20730
|
-
fontcolor: graphAttrInherited(sg, "fontcolor") ??
|
|
20755
|
+
fontcolor: graphAttrInherited(sg, "fontcolor") ?? DEFAULT_COLOR
|
|
20731
20756
|
};
|
|
20732
20757
|
}
|
|
20733
20758
|
function applyLabelBorder(sg, dimen) {
|
|
@@ -24644,7 +24669,7 @@ function readFontAttrs(n, g) {
|
|
|
24644
24669
|
return {
|
|
24645
24670
|
fontname: nodeAttr(n, g, "fontname") ?? DEFAULT_FONTNAME,
|
|
24646
24671
|
fontsize: parseFloat(nodeAttr(n, g, "fontsize") ?? String(DEFAULT_FONTSIZE2)),
|
|
24647
|
-
fontcolor: nodeAttr(n, g, "fontcolor") ??
|
|
24672
|
+
fontcolor: nodeAttr(n, g, "fontcolor") ?? DEFAULT_COLOR
|
|
24648
24673
|
};
|
|
24649
24674
|
}
|
|
24650
24675
|
function assignShapeInfo(n, polyDesc) {
|
|
@@ -25234,7 +25259,7 @@ function applyPenState(obj, styleAttr, colorAttr, penwidthAttr) {
|
|
|
25234
25259
|
obj.penColor = resolveRenderColor(resolvePenColor(colorAttr));
|
|
25235
25260
|
obj.pen = resolvePenType(flags);
|
|
25236
25261
|
obj.penWidth = resolvePenWidth(flags, penwidthAttr);
|
|
25237
|
-
obj.rawStyle =
|
|
25262
|
+
obj.rawStyle = styleTokens2(styleAttr);
|
|
25238
25263
|
}
|
|
25239
25264
|
function applyNodeStyle(obj, n, job) {
|
|
25240
25265
|
const styleAttr = nodeAttr(n, n.root, "style");
|
|
@@ -25457,7 +25482,7 @@ function initFontEdgeAttr(e) {
|
|
|
25457
25482
|
return {
|
|
25458
25483
|
fontsize: lateDouble(e.attrs.get("fontsize"), DEFAULT_FONTSIZE2, MIN_FONTSIZE),
|
|
25459
25484
|
fontname: e.attrs.get("fontname") || DEFAULT_FONTNAME,
|
|
25460
|
-
fontcolor: e.attrs.get("fontcolor") ||
|
|
25485
|
+
fontcolor: e.attrs.get("fontcolor") || DEFAULT_COLOR
|
|
25461
25486
|
};
|
|
25462
25487
|
}
|
|
25463
25488
|
function initFontLabelEdgeAttr(e, fi) {
|
|
@@ -28266,7 +28291,7 @@ function setEdgePen(e, job) {
|
|
|
28266
28291
|
);
|
|
28267
28292
|
obj.pen = resolvePenType(flags);
|
|
28268
28293
|
obj.penWidth = resolvePenWidth(flags, e.attrs.get("penwidth"));
|
|
28269
|
-
obj.rawStyle =
|
|
28294
|
+
obj.rawStyle = styleTokens2(e.attrs.get("style"));
|
|
28270
28295
|
}
|
|
28271
28296
|
function renderEdge(e, renderer, job) {
|
|
28272
28297
|
emitEdgeComments(e, renderer, job);
|