stickyflow 0.9.2 → 0.10.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/CHANGELOG.md +16 -0
- package/README.md +1 -1
- package/dist/binding/index.cjs +9 -9
- package/dist/binding/index.d.cts +3 -3
- package/dist/binding/index.d.ts +3 -3
- package/dist/binding/index.js +3 -3
- package/dist/{chunk-EURX7QT3.cjs → chunk-5PJ55GPG.cjs} +883 -830
- package/dist/chunk-5PJ55GPG.cjs.map +1 -0
- package/dist/{chunk-AAP24GBG.js → chunk-EGUPN56K.js} +3 -3
- package/dist/chunk-EGUPN56K.js.map +1 -0
- package/dist/{chunk-Q6FBISNP.js → chunk-HRU6VOEC.js} +545 -331
- package/dist/chunk-HRU6VOEC.js.map +1 -0
- package/dist/{chunk-3EOG34QN.cjs → chunk-KRSX4UZ7.cjs} +308 -252
- package/dist/chunk-KRSX4UZ7.cjs.map +1 -0
- package/dist/{chunk-XNNNIOJU.js → chunk-L7CEX5JV.js} +5 -5
- package/dist/{chunk-XNNNIOJU.js.map → chunk-L7CEX5JV.js.map} +1 -1
- package/dist/{chunk-C25NWWIH.cjs → chunk-LSEMXRB5.cjs} +549 -331
- package/dist/chunk-LSEMXRB5.cjs.map +1 -0
- package/dist/{chunk-MR32IJQO.cjs → chunk-SCD3AHMY.cjs} +15 -15
- package/dist/chunk-SCD3AHMY.cjs.map +1 -0
- package/dist/{chunk-G2N3KJYJ.js → chunk-SDOHUNBW.js} +237 -184
- package/dist/chunk-SDOHUNBW.js.map +1 -0
- package/dist/{chunk-2GKXPZRL.cjs → chunk-TECWZVIM.cjs} +23 -23
- package/dist/chunk-TECWZVIM.cjs.map +1 -0
- package/dist/{chunk-C3LVKPWQ.js → chunk-VPNOVRWP.js} +279 -223
- package/dist/chunk-VPNOVRWP.js.map +1 -0
- package/dist/index.cjs +36 -36
- package/dist/index.d.cts +33 -28
- package/dist/index.d.ts +33 -28
- package/dist/index.js +5 -5
- package/dist/interaction/index.cjs +358 -337
- package/dist/interaction/index.cjs.map +1 -1
- package/dist/interaction/index.js +133 -112
- package/dist/interaction/index.js.map +1 -1
- package/dist/{runtime-DG8X3Fwf.d.cts → runtime-Bkv7QW7H.d.cts} +1 -1
- package/dist/{runtime-kqD1RS17.d.ts → runtime-DJ4K4_HZ.d.ts} +1 -1
- package/dist/{runtimeTypes-CvjlBZds.d.cts → runtimeTypes-BvJBZLkr.d.cts} +1 -1
- package/dist/{runtimeTypes-vRaHOIHi.d.ts → runtimeTypes-C1shzoyr.d.ts} +1 -1
- package/dist/stickyflow-diagram.global.js +41 -41
- package/dist/stickyflow-diagram.global.js.map +1 -1
- package/dist/viewer/index.cjs +9 -9
- package/dist/viewer/index.d.cts +1 -1
- package/dist/viewer/index.d.ts +1 -1
- package/dist/viewer/index.js +4 -4
- package/dist/web-component/index.cjs +6 -6
- package/dist/web-component/index.cjs.map +1 -1
- package/dist/web-component/index.js +4 -4
- package/dist/web-component/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-2GKXPZRL.cjs.map +0 -1
- package/dist/chunk-3EOG34QN.cjs.map +0 -1
- package/dist/chunk-AAP24GBG.js.map +0 -1
- package/dist/chunk-C25NWWIH.cjs.map +0 -1
- package/dist/chunk-C3LVKPWQ.js.map +0 -1
- package/dist/chunk-EURX7QT3.cjs.map +0 -1
- package/dist/chunk-G2N3KJYJ.js.map +0 -1
- package/dist/chunk-MR32IJQO.cjs.map +0 -1
- package/dist/chunk-Q6FBISNP.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { screenRectOf, Emitter, resolveOwner, isCameraGesture, pointerUserPoint, clearAlignmentGuides, updateAlignmentGuides, pxPerUnit, findOwnerNode, isPrimary, SVG_NAMESPACE, isTextLabel, findSnapCandidateBounds, symbolDeclaredBounds, updateQuickDuplicateBubbles, isometricGeometryOf,
|
|
2
|
-
import { sflToCanvasState, isIsometricObject, tokenizeSource, roundedOrthogonalPathData, seriesLabelOffsetXProp, seriesLabelOffsetYProp, radarVertexPoint, AXIS_SIN, AXIS_COS, freeformPathData, CORNER_RADIUS_ATTR, isometricFaces, roundedPolygonPath, isometricTopFaceCenter, calculateLinkRoute, pointAtPort, roundedBarPath, barShapePath, formatBarLabel, LABEL_WIDTH, LEADER_INSET, clipSegmentToRect, radarValueAtPoint, radarSeriesPath, estimateTextWidth, wrapText, personLabelArea, isometricFaceCenter, PATH_POINT_INDEX_ATTR, linePathData, barLabelSize, BAR_LABEL, pillPath, getLineMidpoint, labelGapDash, pillCornerRadius, SQUARE_CORNER_ATTR, cornersRoundedRectPath, localShapePath, relativeOffsetOnRectangleSide, edgePointToward, SYMBOL_POINTS_ATTR, SYMBOL_TENSION_ATTR } from '../chunk-
|
|
1
|
+
import { screenRectOf, Emitter, resolveOwner, isCameraGesture, pointerUserPoint, clearAlignmentGuides, updateAlignmentGuides, pxPerUnit, findOwnerNode, isPrimary, SVG_NAMESPACE, isTextLabel, findSnapCandidateBounds, symbolDeclaredBounds, updateQuickDuplicateBubbles, isometricGeometryOf, updateHalo, axisArrowPlacements, updateAxisArrowGroup, PATH_HALO_ATTR, findAllOwnerNodes, findIsometricApexCandidates, DERIVED_HEIGHT_ROLES, resizeHandlePositions, ISO_HALO_ATTR, ISO_DUPLICATE_BUBBLES_ATTR, pathGeometryOf } from '../chunk-EGUPN56K.js';
|
|
2
|
+
import { sflToCanvasState, isIsometricObject, rgbToHex, parseHexRgb, rgbToHsv, tokenizeSource, roundedOrthogonalPathData, seriesLabelOffsetXProp, seriesLabelOffsetYProp, radarVertexPoint, AXIS_SIN, AXIS_COS, freeformPathData, CORNER_RADIUS_ATTR, isometricFaces, roundedPolygonPath, isometricTopFaceCenter, calculateLinkRoute, pointAtPort, roundedBarPath, barShapePath, formatBarLabel, LABEL_WIDTH, LEADER_INSET, clipSegmentToRect, radarValueAtPoint, radarSeriesPath, hsvToRgb, estimateTextWidth, wrapText, personLabelArea, isometricFaceCenter, PATH_POINT_INDEX_ATTR, linePathData, barLabelSize, BAR_LABEL, pillPath, getLineMidpoint, labelGapDash, pillCornerRadius, SQUARE_CORNER_ATTR, cornersRoundedRectPath, localShapePath, relativeOffsetOnRectangleSide, edgePointToward, SYMBOL_POINTS_ATTR, SYMBOL_TENSION_ATTR } from '../chunk-HRU6VOEC.js';
|
|
3
3
|
|
|
4
4
|
// src/runtime/interaction/chartValue/coordinates.ts
|
|
5
5
|
function pointerUserY(svg, event) {
|
|
@@ -455,16 +455,9 @@ function bindChartValueDrag(viewer, emitter) {
|
|
|
455
455
|
}
|
|
456
456
|
|
|
457
457
|
// src/runtime/interaction/colorEdit/color.ts
|
|
458
|
-
var HEX = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
459
458
|
function normalizeHex(value) {
|
|
460
|
-
const
|
|
461
|
-
|
|
462
|
-
if (!HEX.test(withHash)) {
|
|
463
|
-
return null;
|
|
464
|
-
}
|
|
465
|
-
const body = withHash.slice(1);
|
|
466
|
-
const full = body.length === 3 ? body.split("").map((char) => char + char).join("") : body;
|
|
467
|
-
return `#${full.toLowerCase()}`;
|
|
459
|
+
const channels = parseHexRgb(value);
|
|
460
|
+
return channels && rgbToHex(...channels);
|
|
468
461
|
}
|
|
469
462
|
var COLOR_FUNCTION = /^rgba?\(\s*(\d{1,3})\s*[, ]\s*(\d{1,3})\s*[, ]\s*(\d{1,3})\s*(?:[,/]\s*(\d*\.?\d+)(%?)\s*)?\)$/i;
|
|
470
463
|
var HEX_WITH_ALPHA = /^#([0-9a-f]{6})([0-9a-f]{2})$/i;
|
|
@@ -474,7 +467,7 @@ function parseColorAlpha(value) {
|
|
|
474
467
|
if (fn) {
|
|
475
468
|
const alpha = fn[4] === void 0 ? 1 : Number(fn[4]) / (fn[5] ? 100 : 1);
|
|
476
469
|
return {
|
|
477
|
-
hex:
|
|
470
|
+
hex: rgbToHex2({ r: Number(fn[1]), g: Number(fn[2]), b: Number(fn[3]) }),
|
|
478
471
|
alpha: Math.max(0, Math.min(1, alpha))
|
|
479
472
|
};
|
|
480
473
|
}
|
|
@@ -503,63 +496,28 @@ function clampChannel(value) {
|
|
|
503
496
|
return Math.max(0, Math.min(255, Math.round(value)));
|
|
504
497
|
}
|
|
505
498
|
function hexToRgb(hex) {
|
|
506
|
-
const
|
|
507
|
-
return {
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
const x = c * (1 - Math.abs(h / 60 % 2 - 1));
|
|
523
|
-
const m = v - c;
|
|
524
|
-
const sector = Math.floor(h / 60);
|
|
525
|
-
const table = [
|
|
526
|
-
[c, x, 0],
|
|
527
|
-
[x, c, 0],
|
|
528
|
-
[0, c, x],
|
|
529
|
-
[0, x, c],
|
|
530
|
-
[x, 0, c],
|
|
531
|
-
[c, 0, x]
|
|
532
|
-
];
|
|
533
|
-
const [r, g, b] = table[sector] ?? table[0];
|
|
534
|
-
return { r: Math.round((r + m) * 255), g: Math.round((g + m) * 255), b: Math.round((b + m) * 255) };
|
|
535
|
-
}
|
|
536
|
-
function rgbToHsv(rgb) {
|
|
537
|
-
const r = clampChannel(rgb.r) / 255;
|
|
538
|
-
const g = clampChannel(rgb.g) / 255;
|
|
539
|
-
const b = clampChannel(rgb.b) / 255;
|
|
540
|
-
const max = Math.max(r, g, b);
|
|
541
|
-
const min = Math.min(r, g, b);
|
|
542
|
-
const delta = max - min;
|
|
543
|
-
let h = 0;
|
|
544
|
-
if (delta !== 0) {
|
|
545
|
-
if (max === r) {
|
|
546
|
-
h = 60 * ((g - b) / delta % 6);
|
|
547
|
-
} else if (max === g) {
|
|
548
|
-
h = 60 * ((b - r) / delta + 2);
|
|
549
|
-
} else {
|
|
550
|
-
h = 60 * ((r - g) / delta + 4);
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
if (h < 0) {
|
|
554
|
-
h += 360;
|
|
555
|
-
}
|
|
556
|
-
return { h, s: max === 0 ? 0 : delta / max, v: max };
|
|
499
|
+
const [r, g, b] = parseHexRgb(hex) ?? [0, 0, 0];
|
|
500
|
+
return { r, g, b };
|
|
501
|
+
}
|
|
502
|
+
function rgbToHex2(rgb) {
|
|
503
|
+
return rgbToHex(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));
|
|
504
|
+
}
|
|
505
|
+
function hsvToRgb2(hsv) {
|
|
506
|
+
const { r, g, b } = hsvToRgb(
|
|
507
|
+
(hsv.h % 360 + 360) % 360,
|
|
508
|
+
Math.max(0, Math.min(1, hsv.s)),
|
|
509
|
+
Math.max(0, Math.min(1, hsv.v))
|
|
510
|
+
);
|
|
511
|
+
return { r, g, b };
|
|
512
|
+
}
|
|
513
|
+
function rgbToHsv2(rgb) {
|
|
514
|
+
return rgbToHsv(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));
|
|
557
515
|
}
|
|
558
516
|
function hexToHsv(hex) {
|
|
559
|
-
return
|
|
517
|
+
return rgbToHsv2(hexToRgb(hex));
|
|
560
518
|
}
|
|
561
519
|
function hsvToHex(hsv) {
|
|
562
|
-
return
|
|
520
|
+
return rgbToHex2(hsvToRgb2(hsv));
|
|
563
521
|
}
|
|
564
522
|
|
|
565
523
|
// src/runtime/interaction/colorEdit/gradientValue.ts
|
|
@@ -1000,9 +958,9 @@ function bindChannel(picker, channel) {
|
|
|
1000
958
|
return;
|
|
1001
959
|
}
|
|
1002
960
|
const next = { ...hexToRgb(activeHex(picker)), [channel]: value };
|
|
1003
|
-
const nextHsv =
|
|
961
|
+
const nextHsv = rgbToHsv2(next);
|
|
1004
962
|
picker.state.hsv = nextHsv.s === 0 ? { ...nextHsv, h: picker.state.hsv.h } : nextHsv;
|
|
1005
|
-
setActiveColor(picker,
|
|
963
|
+
setActiveColor(picker, rgbToHex2(next));
|
|
1006
964
|
picker.render();
|
|
1007
965
|
};
|
|
1008
966
|
const read = (event) => event.target.value;
|
|
@@ -2268,19 +2226,40 @@ function collectNodes(svg, ownerId) {
|
|
|
2268
2226
|
labelGuide: bySuffix("-label-guide")
|
|
2269
2227
|
};
|
|
2270
2228
|
}
|
|
2271
|
-
function
|
|
2229
|
+
function findResizeHandle(event) {
|
|
2272
2230
|
const target = event.target;
|
|
2273
2231
|
const captureTarget = target?.closest?.("[data-sf-resize-handle]");
|
|
2274
2232
|
const handleAttr = captureTarget?.getAttribute("data-sf-resize-handle");
|
|
2275
2233
|
if (!captureTarget || !handleAttr?.startsWith("iso-")) {
|
|
2276
2234
|
return null;
|
|
2277
2235
|
}
|
|
2278
|
-
const axis = handleAttr.slice(4);
|
|
2279
2236
|
const overlay = captureTarget.closest("[data-sf-selection-overlay]");
|
|
2280
2237
|
const ownerId = overlay?.getAttribute("data-sf-selection-overlay");
|
|
2281
|
-
if (!ownerId) {
|
|
2238
|
+
if (!overlay || !ownerId) {
|
|
2282
2239
|
return null;
|
|
2283
2240
|
}
|
|
2241
|
+
return { captureTarget, axis: handleAttr.slice(4), overlay, ownerId };
|
|
2242
|
+
}
|
|
2243
|
+
function overlayPartsOf(overlay) {
|
|
2244
|
+
const overlayHalo = overlay.querySelector(`[${ISO_HALO_ATTR}]`) ?? null;
|
|
2245
|
+
const overlayArrows = Object.fromEntries(
|
|
2246
|
+
AXES.map((axis) => [
|
|
2247
|
+
axis,
|
|
2248
|
+
overlay.querySelector(`[data-sf-resize-handle="iso-${axis}"]`) ?? null
|
|
2249
|
+
])
|
|
2250
|
+
);
|
|
2251
|
+
const overlayDuplicateBubbles = overlay.querySelector(`[${ISO_DUPLICATE_BUBBLES_ATTR}]`) ?? null;
|
|
2252
|
+
if (overlayDuplicateBubbles) {
|
|
2253
|
+
overlayDuplicateBubbles.style.display = "none";
|
|
2254
|
+
}
|
|
2255
|
+
return { overlayHalo, overlayArrows, overlayDuplicateBubbles };
|
|
2256
|
+
}
|
|
2257
|
+
function createIsometricAxisDragState(svg, event) {
|
|
2258
|
+
const handle = findResizeHandle(event);
|
|
2259
|
+
if (!handle) {
|
|
2260
|
+
return null;
|
|
2261
|
+
}
|
|
2262
|
+
const { captureTarget, axis, overlay, ownerId } = handle;
|
|
2284
2263
|
const primary = findOwnerNode(svg, ownerId, isPrimary);
|
|
2285
2264
|
const owner = primary && resolveOwner(primary);
|
|
2286
2265
|
if (!primary || owner?.role !== "isometric") {
|
|
@@ -2297,17 +2276,6 @@ function createIsometricAxisDragState(svg, event) {
|
|
|
2297
2276
|
node?.removeAttribute("clip-path");
|
|
2298
2277
|
});
|
|
2299
2278
|
captureTarget.setPointerCapture?.(event.pointerId);
|
|
2300
|
-
const overlayHalo = overlay?.querySelector(`[${ISO_HALO_ATTR}]`) ?? null;
|
|
2301
|
-
const overlayArrows = Object.fromEntries(
|
|
2302
|
-
AXES.map((axis2) => [
|
|
2303
|
-
axis2,
|
|
2304
|
-
overlay?.querySelector(`[data-sf-resize-handle="iso-${axis2}"]`) ?? null
|
|
2305
|
-
])
|
|
2306
|
-
);
|
|
2307
|
-
const overlayDuplicateBubbles = overlay?.querySelector(`[${ISO_DUPLICATE_BUBBLES_ATTR}]`) ?? null;
|
|
2308
|
-
if (overlayDuplicateBubbles) {
|
|
2309
|
-
overlayDuplicateBubbles.style.display = "none";
|
|
2310
|
-
}
|
|
2311
2279
|
const start = {
|
|
2312
2280
|
x: bounds.x,
|
|
2313
2281
|
y: bounds.y,
|
|
@@ -2323,9 +2291,7 @@ function createIsometricAxisDragState(svg, event) {
|
|
|
2323
2291
|
start,
|
|
2324
2292
|
cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(CORNER_RADIUS_ATTR)) ?? 0,
|
|
2325
2293
|
nodes,
|
|
2326
|
-
|
|
2327
|
-
overlayArrows,
|
|
2328
|
-
overlayDuplicateBubbles,
|
|
2294
|
+
...overlayPartsOf(overlay),
|
|
2329
2295
|
liveFaceLinks: findLiveFaceLinks(svg, ownerId),
|
|
2330
2296
|
moved: false,
|
|
2331
2297
|
current: start
|
|
@@ -2686,25 +2652,12 @@ function crossedEndpointDragThreshold(drag, event) {
|
|
|
2686
2652
|
}
|
|
2687
2653
|
|
|
2688
2654
|
// src/runtime/interaction/linkEndpoint/preview.ts
|
|
2689
|
-
function previewLink2(fromSide, toSide) {
|
|
2690
|
-
return {
|
|
2691
|
-
id: "preview",
|
|
2692
|
-
fromId: "",
|
|
2693
|
-
toId: "",
|
|
2694
|
-
layerGroup: "",
|
|
2695
|
-
orderKey: "",
|
|
2696
|
-
isVisible: true,
|
|
2697
|
-
isLocked: false,
|
|
2698
|
-
fromPoint: { kind: "side", side: fromSide, offset: 0.5 },
|
|
2699
|
-
toPoint: { kind: "side", side: toSide, offset: 0.5 }
|
|
2700
|
-
};
|
|
2701
|
-
}
|
|
2702
2655
|
function updateEndpointPreview(drag, draggedPoint, draggedSide) {
|
|
2703
2656
|
const fromPoint = drag.end === "from" ? draggedPoint : drag.fixedPoint;
|
|
2704
2657
|
const toPoint = drag.end === "to" ? draggedPoint : drag.fixedPoint;
|
|
2705
2658
|
const fromSide = drag.end === "from" ? draggedSide : drag.fixedSide;
|
|
2706
2659
|
const toSide = drag.end === "to" ? draggedSide : drag.fixedSide;
|
|
2707
|
-
const { points, segments } = calculateLinkRoute(
|
|
2660
|
+
const { points, segments } = calculateLinkRoute(previewLink(fromSide, toSide), fromPoint, toPoint, drag.pathType);
|
|
2708
2661
|
drag.path.setAttribute("d", previewPathData(points, segments, drag.pathType, drag.strokeWidth));
|
|
2709
2662
|
}
|
|
2710
2663
|
|
|
@@ -5007,21 +4960,8 @@ function createDuplicatePreviewPath(svg) {
|
|
|
5007
4960
|
path.style.pointerEvents = "none";
|
|
5008
4961
|
return path;
|
|
5009
4962
|
}
|
|
5010
|
-
function previewLink3(fromSide, toSide) {
|
|
5011
|
-
return {
|
|
5012
|
-
id: "preview",
|
|
5013
|
-
fromId: "",
|
|
5014
|
-
toId: "",
|
|
5015
|
-
layerGroup: "",
|
|
5016
|
-
orderKey: "",
|
|
5017
|
-
isVisible: true,
|
|
5018
|
-
isLocked: false,
|
|
5019
|
-
fromPoint: { kind: "side", side: fromSide, offset: 0.5 },
|
|
5020
|
-
toPoint: { kind: "side", side: toSide, offset: 0.5 }
|
|
5021
|
-
};
|
|
5022
|
-
}
|
|
5023
4963
|
function updateDuplicatePreview(drag, toPoint, toSide) {
|
|
5024
|
-
const link =
|
|
4964
|
+
const link = previewLink(drag.direction, toSide);
|
|
5025
4965
|
const { points, segments } = calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);
|
|
5026
4966
|
drag.previewPath.setAttribute("d", previewPathData(points, segments, NEW_LINK_PATH_TYPE, 2));
|
|
5027
4967
|
}
|
|
@@ -6808,6 +6748,78 @@ function findReferencingLinkRanges(lines, canvasObjectId) {
|
|
|
6808
6748
|
return ranges;
|
|
6809
6749
|
}
|
|
6810
6750
|
|
|
6751
|
+
// src/runtime/interaction/sflPatch/canvasObjectPatch/madeBlocks.ts
|
|
6752
|
+
var REPEAT_HEADER = /^(\s*)Repeat\s+[A-Za-z_]\w*\s*\{\s*$/;
|
|
6753
|
+
var TEMPLATE_HEADER = /^\s*[A-Z]\w*\s+([A-Za-z_]\w*)\b[^{]*\{/;
|
|
6754
|
+
var PROPERTY = /^\s*[A-Za-z_]\w*\s*:/;
|
|
6755
|
+
var WHERE = /^(\s*)where\s*:\s*(.+?)\s*$/;
|
|
6756
|
+
var escaped = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
6757
|
+
function excludeRepeatCell(lines, id) {
|
|
6758
|
+
const masked = maskLines(lines);
|
|
6759
|
+
if (masked === null) {
|
|
6760
|
+
return null;
|
|
6761
|
+
}
|
|
6762
|
+
for (let start = 0; start < masked.length; start++) {
|
|
6763
|
+
const header = masked[start].match(REPEAT_HEADER);
|
|
6764
|
+
if (!header) {
|
|
6765
|
+
continue;
|
|
6766
|
+
}
|
|
6767
|
+
const end = blockEndLine(lines, start);
|
|
6768
|
+
let depth = 0;
|
|
6769
|
+
let cell = null;
|
|
6770
|
+
let whereLine = -1;
|
|
6771
|
+
let lastProperty = start;
|
|
6772
|
+
let seenTemplate = false;
|
|
6773
|
+
for (let i = start; i <= end; i++) {
|
|
6774
|
+
if (depth === 1 && i > start) {
|
|
6775
|
+
const template = masked[i].match(TEMPLATE_HEADER);
|
|
6776
|
+
if (template) {
|
|
6777
|
+
seenTemplate = true;
|
|
6778
|
+
const made = id.match(new RegExp(`^${escaped(template[1])}_(\\d+)(?:_(\\d+))?(?:_[A-Za-z]\\w*)?$`));
|
|
6779
|
+
if (made) {
|
|
6780
|
+
cell = { col: Number(made[1]), row: made[2] === void 0 ? 0 : Number(made[2]) };
|
|
6781
|
+
}
|
|
6782
|
+
} else if (WHERE.test(masked[i])) {
|
|
6783
|
+
whereLine = i;
|
|
6784
|
+
} else if (!seenTemplate && PROPERTY.test(masked[i])) {
|
|
6785
|
+
lastProperty = i;
|
|
6786
|
+
}
|
|
6787
|
+
}
|
|
6788
|
+
depth += braceDelta(masked[i]);
|
|
6789
|
+
}
|
|
6790
|
+
if (!cell) {
|
|
6791
|
+
continue;
|
|
6792
|
+
}
|
|
6793
|
+
const keep = `(col != ${cell.col} || row != ${cell.row})`;
|
|
6794
|
+
const out = [...lines];
|
|
6795
|
+
if (whereLine >= 0) {
|
|
6796
|
+
const where = lines[whereLine].match(WHERE);
|
|
6797
|
+
if (where) {
|
|
6798
|
+
out[whereLine] = `${where[1]}where: (${where[2]}) && ${keep}`;
|
|
6799
|
+
return out;
|
|
6800
|
+
}
|
|
6801
|
+
}
|
|
6802
|
+
out.splice(lastProperty + 1, 0, `${header[1]} where: ${keep}`);
|
|
6803
|
+
return out;
|
|
6804
|
+
}
|
|
6805
|
+
return null;
|
|
6806
|
+
}
|
|
6807
|
+
var USE_HEADER = /^\s*Use\s+([A-Za-z_]\w*)\s*:/;
|
|
6808
|
+
function findUseBlock(lines, id) {
|
|
6809
|
+
const masked = maskLines(lines);
|
|
6810
|
+
if (masked === null) {
|
|
6811
|
+
return null;
|
|
6812
|
+
}
|
|
6813
|
+
let found = null;
|
|
6814
|
+
for (let start = 0; start < masked.length; start++) {
|
|
6815
|
+
const header = masked[start].match(USE_HEADER);
|
|
6816
|
+
if (header && id.startsWith(`${header[1]}_`) && (found === null || header[1].length > found.length)) {
|
|
6817
|
+
found = { start, end: blockEndLine(lines, start), length: header[1].length };
|
|
6818
|
+
}
|
|
6819
|
+
}
|
|
6820
|
+
return found && { start: found.start, end: found.end };
|
|
6821
|
+
}
|
|
6822
|
+
|
|
6811
6823
|
// src/runtime/interaction/sflPatch/canvasObjectPatch/removalRanges.ts
|
|
6812
6824
|
function containsRange(container, candidate) {
|
|
6813
6825
|
const sameRange = container.start === candidate.start && container.end === candidate.end;
|
|
@@ -6824,6 +6836,15 @@ function removeCanvasObject(sfl, id, options = {}) {
|
|
|
6824
6836
|
const lines = sfl.split("\n");
|
|
6825
6837
|
const canvasObjectRange = findOwnerBlock(lines, id);
|
|
6826
6838
|
if (!canvasObjectRange) {
|
|
6839
|
+
const cell = excludeRepeatCell(lines, id);
|
|
6840
|
+
if (cell) {
|
|
6841
|
+
return cell.join("\n");
|
|
6842
|
+
}
|
|
6843
|
+
const use = findUseBlock(lines, id);
|
|
6844
|
+
if (use) {
|
|
6845
|
+
lines.splice(use.start, use.end - use.start + 1);
|
|
6846
|
+
return lines.join("\n");
|
|
6847
|
+
}
|
|
6827
6848
|
return sfl;
|
|
6828
6849
|
}
|
|
6829
6850
|
const ranges = [canvasObjectRange];
|