@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/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/multicolor.ts
9435
- var EPS = 1e-5;
9436
- function aeq0(x) {
9437
- return x < EPS && x > -EPS;
9438
- }
9439
- function getSegLen(token) {
9440
- const semi = token.indexOf(";");
9441
- if (semi === -1) return { color: token, v: 0 };
9442
- const color = token.slice(0, semi);
9443
- const rest = token.slice(semi + 1);
9444
- if (rest.length === 0) return { color, v: -1 };
9445
- const parsed = parseFloat(rest);
9446
- return !isNaN(parsed) && parsed >= 0 ? { color, v: parsed } : { color, v: -1 };
9447
- }
9448
- function appendSeg(token, left2, segs, warnedExceeded) {
9449
- const { color, v } = getSegLen(token);
9450
- if (v < 0) return null;
9451
- let t = v;
9452
- let rval = 0;
9453
- const del = t - left2;
9454
- if (del > 0) {
9455
- if (!aeq0(del) && !warnedExceeded.v) {
9456
- warnedExceeded.v = true;
9457
- rval = 3;
9458
- }
9459
- t = left2;
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 flags;
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
- if (style2 !== void 0 && style2.includes("dashed")) return 1 /* Dashed */;
9763
- if (style2 !== void 0 && style2.includes("dotted")) return 2 /* Dotted */;
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 (parseStyleFlags(style2).rounded) {
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 !== void 0 && ctx.style.includes("radial"),
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 (parseStyleFlags(ctx.style).rounded) {
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 (htmlStyleInvisible(cell2.style)) {
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 = htmlStyleInvisible(placed.style);
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 styleTokens2(v) {
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 styleTokens2(v)) {
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 DEFAULT_COLOR2 = "black";
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") ?? DEFAULT_COLOR2
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") ?? DEFAULT_COLOR2
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 = styleTokens(styleAttr);
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") || DEFAULT_COLOR2
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 = styleTokens(e.attrs.get("style"));
28294
+ obj.rawStyle = styleTokens2(e.attrs.get("style"));
28270
28295
  }
28271
28296
  function renderEdge(e, renderer, job) {
28272
28297
  emitEdgeComments(e, renderer, job);