@plait/draw 0.50.1 → 0.51.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/README.md +13 -1
- package/constants/line.d.ts +1 -0
- package/engines/basic-shapes/ellipse.d.ts +1 -10
- package/engines/flowchart/terminal.d.ts +1 -0
- package/esm2022/constants/line.mjs +2 -1
- package/esm2022/engines/basic-shapes/comment.mjs +4 -5
- package/esm2022/engines/basic-shapes/ellipse.mjs +5 -29
- package/esm2022/engines/basic-shapes/parallelogram.mjs +3 -2
- package/esm2022/engines/basic-shapes/pentagon.mjs +3 -3
- package/esm2022/engines/basic-shapes/polygon.mjs +20 -4
- package/esm2022/engines/basic-shapes/process-arrow.mjs +3 -3
- package/esm2022/engines/basic-shapes/rectangle.mjs +4 -4
- package/esm2022/engines/basic-shapes/round-comment.mjs +4 -5
- package/esm2022/engines/basic-shapes/round-rectangle.mjs +3 -3
- package/esm2022/engines/basic-shapes/star.mjs +3 -3
- package/esm2022/engines/basic-shapes/trapezoid.mjs +3 -2
- package/esm2022/engines/basic-shapes/triangle.mjs +5 -4
- package/esm2022/engines/flowchart/delay.mjs +6 -6
- package/esm2022/engines/flowchart/manual-input.mjs +5 -4
- package/esm2022/engines/flowchart/manual-loop.mjs +3 -2
- package/esm2022/engines/flowchart/merge.mjs +4 -4
- package/esm2022/engines/flowchart/stored-data.mjs +16 -10
- package/esm2022/engines/flowchart/terminal.mjs +37 -27
- package/esm2022/generators/geometry-shape.generator.mjs +3 -3
- package/esm2022/generators/line-active.generator.mjs +52 -68
- package/esm2022/generators/line.generator.mjs +2 -2
- package/esm2022/geometry.component.mjs +4 -4
- package/esm2022/interfaces/geometry.mjs +1 -1
- package/esm2022/interfaces/line.mjs +2 -2
- package/esm2022/line.component.mjs +39 -9
- package/esm2022/plugins/with-draw-fragment.mjs +3 -3
- package/esm2022/plugins/with-draw-hotkey.mjs +6 -6
- package/esm2022/plugins/with-draw-resize.mjs +149 -0
- package/esm2022/plugins/with-draw.mjs +14 -8
- package/esm2022/plugins/with-geometry-create.mjs +10 -10
- package/esm2022/plugins/with-geometry-resize.mjs +27 -74
- package/esm2022/plugins/with-line-auto-complete.mjs +17 -5
- package/esm2022/plugins/with-line-bound-reaction.mjs +6 -5
- package/esm2022/plugins/with-line-create.mjs +2 -2
- package/esm2022/plugins/with-line-resize.mjs +105 -19
- package/esm2022/plugins/with-line-text-move.mjs +5 -4
- package/esm2022/plugins/with-line-text.mjs +7 -5
- package/esm2022/transforms/geometry.mjs +4 -4
- package/esm2022/transforms/line.mjs +6 -8
- package/esm2022/utils/clipboard.mjs +2 -2
- package/esm2022/utils/geometry.mjs +16 -33
- package/esm2022/utils/hit.mjs +18 -10
- package/esm2022/utils/index.mjs +2 -2
- package/esm2022/utils/line/elbow.mjs +101 -0
- package/esm2022/utils/line/index.mjs +6 -0
- package/esm2022/utils/line/line-arrow.mjs +123 -0
- package/esm2022/utils/line/line-basic.mjs +258 -0
- package/esm2022/utils/line/line-common.mjs +111 -0
- package/esm2022/utils/line/line-resize.mjs +313 -0
- package/esm2022/utils/polygon.mjs +30 -0
- package/esm2022/utils/position/geometry.mjs +5 -6
- package/esm2022/utils/position/line.mjs +38 -15
- package/esm2022/utils/resize-align-reaction.mjs +316 -0
- package/esm2022/utils/resize-align.mjs +37 -0
- package/fesm2022/plait-draw.mjs +2108 -1143
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/line-active.generator.d.ts +4 -2
- package/interfaces/geometry.d.ts +1 -0
- package/interfaces/line.d.ts +4 -0
- package/package.json +1 -1
- package/plugins/with-draw-resize.d.ts +13 -0
- package/utils/geometry.d.ts +1 -3
- package/utils/hit.d.ts +3 -1
- package/utils/index.d.ts +1 -1
- package/utils/line/elbow.d.ts +19 -0
- package/utils/line/index.d.ts +5 -0
- package/utils/{line-arrow.d.ts → line/line-arrow.d.ts} +1 -1
- package/utils/line/line-basic.d.ts +13 -0
- package/utils/line/line-common.d.ts +35 -0
- package/utils/line/line-resize.d.ts +23 -0
- package/utils/polygon.d.ts +4 -0
- package/utils/position/geometry.d.ts +2 -3
- package/utils/position/line.d.ts +4 -2
- package/utils/resize-align-reaction.d.ts +42 -0
- package/utils/resize-align.d.ts +8 -0
- package/esm2022/utils/line-arrow.mjs +0 -123
- package/esm2022/utils/line.mjs +0 -392
- package/utils/line.d.ts +0 -25
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Point } from '@plait/core';
|
|
2
2
|
import { PlaitLine } from '../interfaces';
|
|
3
3
|
import { Generator } from '@plait/common';
|
|
4
4
|
export interface ActiveData {
|
|
5
5
|
selected: boolean;
|
|
6
|
+
linePoints: Point[];
|
|
6
7
|
}
|
|
7
8
|
export declare class LineActiveGenerator extends Generator<PlaitLine, ActiveData> {
|
|
9
|
+
onlySelectedCurrentLine: boolean;
|
|
8
10
|
canDraw(element: PlaitLine, data: ActiveData): boolean;
|
|
9
11
|
draw(element: PlaitLine, data: ActiveData): SVGGElement;
|
|
12
|
+
needUpdate(): boolean;
|
|
10
13
|
}
|
|
11
|
-
export declare function getMiddlePoints(board: PlaitBoard, element: PlaitLine): Point[];
|
package/interfaces/geometry.d.ts
CHANGED
|
@@ -64,6 +64,7 @@ export declare const PlaitGeometry: {};
|
|
|
64
64
|
export interface ShapeEngine {
|
|
65
65
|
isHit: (rectangle: RectangleClient, point: Point) => boolean;
|
|
66
66
|
getNearestPoint: (rectangle: RectangleClient, point: Point) => Point;
|
|
67
|
+
getNearestCrossingPoint?: (rectangle: RectangleClient, point: Point) => Point;
|
|
67
68
|
getConnectorPoints: (rectangle: RectangleClient) => Point[];
|
|
68
69
|
getCornerPoints: (rectangle: RectangleClient) => Point[];
|
|
69
70
|
getEdgeByConnectionPoint?: (rectangle: RectangleClient, point: PointOfRectangle) => [Point, Point] | null;
|
package/interfaces/line.d.ts
CHANGED
|
@@ -41,6 +41,10 @@ export interface LineHandleRef {
|
|
|
41
41
|
vector: Vector;
|
|
42
42
|
boundElement?: PlaitGeometry;
|
|
43
43
|
}
|
|
44
|
+
export interface LineHandleRefPair {
|
|
45
|
+
source: LineHandleRef;
|
|
46
|
+
target: LineHandleRef;
|
|
47
|
+
}
|
|
44
48
|
export interface PlaitLine extends PlaitElement {
|
|
45
49
|
type: 'line';
|
|
46
50
|
shape: LineShape;
|
package/package.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ResizeRef, ResizeState } from '@plait/common';
|
|
2
|
+
import { PlaitBoard, Point } from '@plait/core';
|
|
3
|
+
import { PlaitDrawElement } from '../interfaces';
|
|
4
|
+
export declare function withDrawResize(board: PlaitBoard): PlaitBoard;
|
|
5
|
+
export declare const getResizeOriginPointAndHandlePoint: (board: PlaitBoard, resizeRef: ResizeRef<PlaitDrawElement | PlaitDrawElement[]>) => {
|
|
6
|
+
originPoint: Point;
|
|
7
|
+
handlePoint: Point;
|
|
8
|
+
};
|
|
9
|
+
export declare const getResizeZoom: (resizeState: ResizeState, resizeOriginPoint: Point, resizeHandlePoint: Point, isFromCorner: boolean, isAspectRatio: boolean) => {
|
|
10
|
+
xZoom: number;
|
|
11
|
+
yZoom: number;
|
|
12
|
+
};
|
|
13
|
+
export declare const movePointByZoomAndOriginPoint: (p: Point, resizeOriginPoint: Point, xZoom: number, yZoom: number) => Point;
|
package/utils/geometry.d.ts
CHANGED
|
@@ -11,7 +11,6 @@ export type TextProperties = Partial<CustomText> & {
|
|
|
11
11
|
textHeight?: number;
|
|
12
12
|
};
|
|
13
13
|
export declare const createGeometryElement: (shape: GeometryShapes, points: [Point, Point], text: string | Element, options?: GeometryStyleOptions, textProperties?: TextProperties) => PlaitGeometry;
|
|
14
|
-
export declare const getPointsByCenterPoint: (point: Point, width: number, height: number) => [Point, Point];
|
|
15
14
|
export declare const getTextRectangle: (element: PlaitGeometry) => {
|
|
16
15
|
height: number;
|
|
17
16
|
width: number;
|
|
@@ -20,9 +19,8 @@ export declare const getTextRectangle: (element: PlaitGeometry) => {
|
|
|
20
19
|
};
|
|
21
20
|
export declare const drawBoundMask: (board: PlaitBoard, element: PlaitGeometry) => SVGGElement;
|
|
22
21
|
export declare const drawGeometry: (board: PlaitBoard, outerRectangle: RectangleClient, shape: GeometryShapes, options: Options) => SVGGElement;
|
|
23
|
-
export declare const getNearestPoint: (element: PlaitShape, point: Point
|
|
22
|
+
export declare const getNearestPoint: (element: PlaitShape, point: Point) => Point;
|
|
24
23
|
export declare const getCenterPointsOnPolygon: (points: Point[]) => Point[];
|
|
25
|
-
export declare const getEdgeOnPolygonByPoint: (corners: Point[], point: Point) => [Point, Point] | null;
|
|
26
24
|
export declare const getDefaultFlowchartProperty: (symbol: FlowchartSymbols) => {
|
|
27
25
|
width: number;
|
|
28
26
|
height: number;
|
package/utils/hit.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { PlaitElement, Selection, PlaitBoard, Point } from '@plait/core';
|
|
2
|
-
import { PlaitGeometry } from '../interfaces';
|
|
2
|
+
import { PlaitGeometry, PlaitLine } from '../interfaces';
|
|
3
3
|
export declare const isTextExceedingBounds: (geometry: PlaitGeometry) => boolean;
|
|
4
|
+
export declare const isHitLineText: (board: PlaitBoard, element: PlaitLine, point: Point) => boolean;
|
|
5
|
+
export declare const isHitPolyLine: (pathPoints: Point[], point: Point, strokeWidth: number, expand?: number) => boolean;
|
|
4
6
|
export declare const isRectangleHitDrawElement: (board: PlaitBoard, element: PlaitElement, selection: Selection) => boolean | null;
|
|
5
7
|
export declare const isHitDrawElement: (board: PlaitBoard, element: PlaitElement, point: Point) => boolean | null;
|
package/utils/index.d.ts
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Point, PlaitBoard } from '@plait/core';
|
|
2
|
+
import { LineHandleRefPair, PlaitLine } from '../../interfaces';
|
|
3
|
+
export declare const getElbowPoints: (board: PlaitBoard, element: PlaitLine) => Point[];
|
|
4
|
+
export declare const getNextSourceAndTargetPoints: (board: PlaitBoard, element: PlaitLine) => Point[];
|
|
5
|
+
export declare const getSourceAndTargetRectangle: (board: PlaitBoard, element: PlaitLine, handleRefPair: LineHandleRefPair) => {
|
|
6
|
+
sourceRectangle: {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
};
|
|
12
|
+
targetRectangle: {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export declare function getNextRenderPoints(board: PlaitBoard, element: PlaitLine, renderPoints?: Point[]): Point[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Point } from '@plait/core';
|
|
2
|
-
import { PlaitLine } from '
|
|
2
|
+
import { PlaitLine } from '../../interfaces';
|
|
3
3
|
import { Options } from 'roughjs/bin/core';
|
|
4
4
|
export declare const drawLineArrow: (element: PlaitLine, points: Point[], options: Options) => SVGGElement | null;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Point, PlaitBoard, RectangleClient } from '@plait/core';
|
|
2
|
+
import { LineHandle, LineShape, LineText, PlaitLine, PlaitShape } from '../../interfaces';
|
|
3
|
+
export declare const createLineElement: (shape: LineShape, points: [Point, Point], source: LineHandle, target: LineHandle, texts?: LineText[], options?: Pick<PlaitLine, 'strokeColor' | 'strokeWidth'>) => PlaitLine;
|
|
4
|
+
export declare const getLinePoints: (board: PlaitBoard, element: PlaitLine) => Point[];
|
|
5
|
+
export declare const getCurvePoints: (board: PlaitBoard, element: PlaitLine) => Point[];
|
|
6
|
+
export declare function getMiddlePoints(board: PlaitBoard, element: PlaitLine): Point[];
|
|
7
|
+
export declare const drawLine: (board: PlaitBoard, element: PlaitLine) => SVGGElement;
|
|
8
|
+
export declare const getConnectionByNearestPoint: (board: PlaitBoard, point: Point, hitElement: PlaitShape) => Point;
|
|
9
|
+
export declare const getHitConnectorPoint: (point: Point, hitElement: PlaitShape, rectangle: RectangleClient) => Point | undefined;
|
|
10
|
+
export declare const getLineTextRectangle: (board: PlaitBoard, element: PlaitLine, index: number) => RectangleClient;
|
|
11
|
+
export declare const getLines: (board: PlaitBoard) => PlaitLine[];
|
|
12
|
+
export declare const Q2C: (points: Point[]) => Point[];
|
|
13
|
+
export declare const handleLineCreating: (board: PlaitBoard, lineShape: LineShape, sourcePoint: Point, movingPoint: Point, sourceElement: PlaitShape | null, lineShapeG: SVGGElement) => PlaitLine;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Point, PlaitBoard, PointOfRectangle, Direction, Vector } from '@plait/core';
|
|
2
|
+
import { LineHandleRefPair, PlaitGeometry, PlaitLine } from '../../interfaces';
|
|
3
|
+
export declare const getLineHandleRefPair: (board: PlaitBoard, element: PlaitLine) => LineHandleRefPair;
|
|
4
|
+
export declare const getConnectionPoint: (geometry: PlaitGeometry, connection: Point, direction?: Direction, delta?: number) => Point;
|
|
5
|
+
export declare const getVectorByConnection: (boundElement: PlaitGeometry, connection: PointOfRectangle) => Vector;
|
|
6
|
+
export declare const getElbowLineRouteOptions: (board: PlaitBoard, element: PlaitLine, handleRefPair?: LineHandleRefPair) => {
|
|
7
|
+
sourcePoint: PointOfRectangle;
|
|
8
|
+
nextSourcePoint: Point;
|
|
9
|
+
sourceRectangle: {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
};
|
|
15
|
+
sourceOuterRectangle: {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
};
|
|
21
|
+
targetPoint: PointOfRectangle;
|
|
22
|
+
nextTargetPoint: Point;
|
|
23
|
+
targetRectangle: {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
};
|
|
29
|
+
targetOuterRectangle: {
|
|
30
|
+
x: number;
|
|
31
|
+
y: number;
|
|
32
|
+
width: number;
|
|
33
|
+
height: number;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ElbowLineRouteOptions, ResizeState } from '@plait/common';
|
|
2
|
+
import { PlaitBoard, Point } from '@plait/core';
|
|
3
|
+
import { PlaitLine } from '../../interfaces';
|
|
4
|
+
export declare const alignPoints: (basePoint: Point, movingPoint: Point) => Point;
|
|
5
|
+
export declare function getResizedPreviousAndNextPoint(nextRenderPoints: Point[], sourcePoint: Point, targetPoint: Point, handleIndex: number): {
|
|
6
|
+
previous: Point | null;
|
|
7
|
+
next: Point | null;
|
|
8
|
+
};
|
|
9
|
+
export declare function alignElbowSegment(startKeyPoint: Point, endKeyPoint: Point, resizeState: ResizeState, resizedPreviousAndNextPoint: {
|
|
10
|
+
previous: Point | null;
|
|
11
|
+
next: Point | null;
|
|
12
|
+
}): Point[];
|
|
13
|
+
export declare function getIndexAndDeleteCountByKeyPoint(board: PlaitBoard, element: PlaitLine, dataPoints: Point[], nextRenderPoints: Point[], handleIndex: number): {
|
|
14
|
+
index: null;
|
|
15
|
+
deleteCount: null;
|
|
16
|
+
} | {
|
|
17
|
+
index: number;
|
|
18
|
+
deleteCount: number | null;
|
|
19
|
+
};
|
|
20
|
+
export declare function getMirrorDataPoints(board: PlaitBoard, nextDataPoints: Point[], nextKeyPoints: Point[], params: ElbowLineRouteOptions): Point[];
|
|
21
|
+
export declare function isUpdatedHandleIndex(board: PlaitBoard, element: PlaitLine, dataPoints: Point[], nextRenderPoints: Point[], handleIndex: number): boolean;
|
|
22
|
+
export declare function getMidKeyPoints(simplifiedNextKeyPoints: Point[], startPoint: Point, endPoint: Point): Point[];
|
|
23
|
+
export declare const hasIllegalElbowPoint: (midDataPoints: Point[]) => boolean;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Point } from '@plait/core';
|
|
2
|
+
export declare const getCenterPointsOnPolygon: (points: Point[]) => Point[];
|
|
3
|
+
export declare const getCrossingPointBetweenPointAndPolygon: (corners: Point[], point: Point) => Point[];
|
|
4
|
+
export declare const getPolygonEdgeByConnectionPoint: (corners: Point[], point: Point) => [Point, Point] | null;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { PlaitBoard, Point } from '@plait/core';
|
|
1
|
+
import { PlaitBoard, Point, RectangleClient } from '@plait/core';
|
|
2
2
|
import { PlaitGeometry } from '../../interfaces';
|
|
3
3
|
import { ResizeHandle } from '@plait/common';
|
|
4
|
-
|
|
5
|
-
export declare const getHitGeometryResizeHandleRef: (board: PlaitBoard, element: PlaitGeometry | PlaitImage, point: Point) => {
|
|
4
|
+
export declare const getHitRectangleResizeHandleRef: (board: PlaitBoard, rectangle: RectangleClient, point: Point) => {
|
|
6
5
|
rectangle: {
|
|
7
6
|
x: number;
|
|
8
7
|
y: number;
|
package/utils/position/line.d.ts
CHANGED
|
@@ -7,8 +7,10 @@ export declare enum LineResizeHandle {
|
|
|
7
7
|
}
|
|
8
8
|
export declare const getHitLineResizeHandleRef: (board: PlaitBoard, element: PlaitLine, point: Point) => {
|
|
9
9
|
handle: LineResizeHandle;
|
|
10
|
-
|
|
10
|
+
handleIndex: number;
|
|
11
11
|
} | {
|
|
12
|
-
|
|
12
|
+
handleIndex: number;
|
|
13
13
|
handle?: undefined;
|
|
14
14
|
} | undefined;
|
|
15
|
+
export declare function getHitPointIndex(points: Point[], movingPoint: Point): number;
|
|
16
|
+
export declare const getHitLineTextIndex: (board: PlaitBoard, element: PlaitLine, point: Point) => number;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ResizeState } from '@plait/common';
|
|
2
|
+
import { DirectionFactors, PlaitBoard, PlaitElement, Point, RectangleClient } from '@plait/core';
|
|
3
|
+
export interface ResizeAlignDelta {
|
|
4
|
+
deltaX: number;
|
|
5
|
+
deltaY: number;
|
|
6
|
+
}
|
|
7
|
+
export interface AlignLineRef extends ResizeAlignDelta {
|
|
8
|
+
xZoom: number;
|
|
9
|
+
yZoom: number;
|
|
10
|
+
activePoints: Point[];
|
|
11
|
+
}
|
|
12
|
+
export interface ResizeAlignRef extends AlignLineRef {
|
|
13
|
+
alignG: SVGGElement;
|
|
14
|
+
}
|
|
15
|
+
export interface ResizeAlignOptions {
|
|
16
|
+
resizeState: ResizeState;
|
|
17
|
+
resizeOriginPoints: Point[];
|
|
18
|
+
activeRectangle: RectangleClient;
|
|
19
|
+
directionFactors: DirectionFactors;
|
|
20
|
+
originPoint: Point;
|
|
21
|
+
handlePoint: Point;
|
|
22
|
+
isFromCorner: boolean;
|
|
23
|
+
isAspectRatio: boolean;
|
|
24
|
+
}
|
|
25
|
+
type TripleAlignAxis = [number, number, number];
|
|
26
|
+
export declare class ResizeAlignReaction {
|
|
27
|
+
private board;
|
|
28
|
+
private activeElements;
|
|
29
|
+
alignRectangles: RectangleClient[];
|
|
30
|
+
constructor(board: PlaitBoard, activeElements: PlaitElement[]);
|
|
31
|
+
getAlignRectangle(): RectangleClient[];
|
|
32
|
+
getAlignLineRef(resizeAlignDelta: ResizeAlignDelta, resizeAlignOptions: ResizeAlignOptions): AlignLineRef;
|
|
33
|
+
getEqualLineDelta(resizeAlignOptions: ResizeAlignOptions): ResizeAlignDelta;
|
|
34
|
+
drawEqualLines(activePoints: Point[], resizeAlignOptions: ResizeAlignOptions): SVGGElement;
|
|
35
|
+
getAlignLineDelta(resizeAlignOptions: ResizeAlignOptions): ResizeAlignDelta;
|
|
36
|
+
drawAlignLines(activePoints: Point[], resizeAlignOptions: ResizeAlignOptions): SVGGElement;
|
|
37
|
+
handleResizeAlign(resizeAlignOptions: ResizeAlignOptions): ResizeAlignRef;
|
|
38
|
+
}
|
|
39
|
+
export declare const getTripleAlignAxis: (rectangle: RectangleClient, isHorizontal: boolean) => TripleAlignAxis;
|
|
40
|
+
export declare const isAlign: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => boolean;
|
|
41
|
+
export declare const getClosestDelta: (axis: number, rectangle: RectangleClient, isHorizontal: boolean) => number;
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PlaitBoard, Point } from '@plait/core';
|
|
2
|
+
import { ResizeRef, ResizeState } from '@plait/common';
|
|
3
|
+
import { PlaitDrawElement } from '../interfaces';
|
|
4
|
+
import { ResizeAlignRef } from './resize-align-reaction';
|
|
5
|
+
export declare function getResizeAlignRef(board: PlaitBoard, resizeRef: ResizeRef<PlaitDrawElement | PlaitDrawElement[]>, resizeState: ResizeState, resizeOriginPointAndHandlePoint: {
|
|
6
|
+
originPoint: Point;
|
|
7
|
+
handlePoint: Point;
|
|
8
|
+
}, isAspectRatio: boolean, isFromCorner: boolean): ResizeAlignRef;
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { arrowPoints, createG, createPath, distanceBetweenPointAndPoint, drawLinearPath, rotate } from '@plait/core';
|
|
2
|
-
import { LineMarkerType, PlaitLine } from '../interfaces';
|
|
3
|
-
import { getFactorByPoints, getExtendPoint } from '@plait/common';
|
|
4
|
-
import { getStrokeWidthByElement } from './style';
|
|
5
|
-
const ARROW_LENGTH = 20;
|
|
6
|
-
export const drawLineArrow = (element, points, options) => {
|
|
7
|
-
const arrowG = createG();
|
|
8
|
-
if (PlaitLine.isSourceMark(element, LineMarkerType.none) && PlaitLine.isTargetMark(element, LineMarkerType.none)) {
|
|
9
|
-
return null;
|
|
10
|
-
}
|
|
11
|
-
const strokeWidth = getStrokeWidthByElement(element);
|
|
12
|
-
const offset = (strokeWidth * strokeWidth) / 3;
|
|
13
|
-
if (points.length === 1) {
|
|
14
|
-
points = [points[0], [points[0][0] + 0.1, points[0][1]]];
|
|
15
|
-
}
|
|
16
|
-
if (!PlaitLine.isSourceMark(element, LineMarkerType.none)) {
|
|
17
|
-
const source = getExtendPoint(points[0], points[1], ARROW_LENGTH + offset);
|
|
18
|
-
const sourceArrow = getArrow(element, { marker: element.source.marker, source, target: points[0], isSource: true }, options);
|
|
19
|
-
sourceArrow && arrowG.appendChild(sourceArrow);
|
|
20
|
-
}
|
|
21
|
-
if (!PlaitLine.isTargetMark(element, LineMarkerType.none)) {
|
|
22
|
-
const source = getExtendPoint(points[points.length - 1], points[points.length - 2], ARROW_LENGTH + offset);
|
|
23
|
-
const arrow = getArrow(element, { marker: element.target.marker, source, target: points[points.length - 1], isSource: false }, options);
|
|
24
|
-
arrow && arrowG.appendChild(arrow);
|
|
25
|
-
}
|
|
26
|
-
return arrowG;
|
|
27
|
-
};
|
|
28
|
-
const getArrow = (element, arrowOptions, options) => {
|
|
29
|
-
const { marker, target, source, isSource } = arrowOptions;
|
|
30
|
-
let targetArrow;
|
|
31
|
-
switch (marker) {
|
|
32
|
-
case LineMarkerType.openTriangle: {
|
|
33
|
-
targetArrow = drawOpenTriangle(element, source, target, options);
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
case LineMarkerType.solidTriangle: {
|
|
37
|
-
targetArrow = drawSolidTriangle(source, target, options);
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
case LineMarkerType.arrow: {
|
|
41
|
-
targetArrow = drawArrow(element, source, target, options);
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
case LineMarkerType.sharpArrow: {
|
|
45
|
-
targetArrow = drawSharpArrow(source, target, options);
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
case LineMarkerType.oneSideUp: {
|
|
49
|
-
targetArrow = drawOneSideArrow(source, target, isSource ? 'down' : 'up', options);
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
case LineMarkerType.oneSideDown: {
|
|
53
|
-
targetArrow = drawOneSideArrow(source, target, isSource ? 'up' : 'down', options);
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
case LineMarkerType.hollowTriangle: {
|
|
57
|
-
targetArrow = drawHollowTriangleArrow(source, target, options);
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
case LineMarkerType.singleSlash: {
|
|
61
|
-
targetArrow = drawSingleSlash(source, target, isSource, options);
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return targetArrow;
|
|
66
|
-
};
|
|
67
|
-
const drawSharpArrow = (source, target, options) => {
|
|
68
|
-
const startPoint = target;
|
|
69
|
-
const { pointLeft, pointRight } = arrowPoints(source, target, 20);
|
|
70
|
-
const g = createG();
|
|
71
|
-
const path = createPath();
|
|
72
|
-
let polylinePath = `M${pointRight[0]},${pointRight[1]}A25,25,20,0,1,${pointLeft[0]},${pointLeft[1]}L${startPoint[0]},${startPoint[1]}Z`;
|
|
73
|
-
path.setAttribute('d', polylinePath);
|
|
74
|
-
path.setAttribute('stroke', `${options?.stroke}`);
|
|
75
|
-
path.setAttribute('stroke-width', `${options?.strokeWidth}`);
|
|
76
|
-
path.setAttribute('fill', `${options?.stroke}`);
|
|
77
|
-
g.appendChild(path);
|
|
78
|
-
return g;
|
|
79
|
-
};
|
|
80
|
-
const drawArrow = (element, source, target, options) => {
|
|
81
|
-
const directionFactor = getFactorByPoints(source, target);
|
|
82
|
-
const strokeWidth = getStrokeWidthByElement(element);
|
|
83
|
-
const endPoint = [target[0] + (strokeWidth * directionFactor.x) / 2, target[1] + (strokeWidth * directionFactor.y) / 2];
|
|
84
|
-
const distance = distanceBetweenPointAndPoint(...source, ...endPoint);
|
|
85
|
-
const middlePoint = [
|
|
86
|
-
endPoint[0] - (((distance * 3) / 5 + strokeWidth) / 2) * directionFactor.x,
|
|
87
|
-
endPoint[1] - (((distance * 3) / 5 + strokeWidth) / 2) * directionFactor.y
|
|
88
|
-
];
|
|
89
|
-
const { pointLeft, pointRight } = arrowPoints(source, endPoint, 30);
|
|
90
|
-
const arrowG = drawLinearPath([pointLeft, endPoint, pointRight, middlePoint], { ...options, fill: options.stroke }, true);
|
|
91
|
-
const path = arrowG.querySelector('path');
|
|
92
|
-
path.setAttribute('stroke-linejoin', 'round');
|
|
93
|
-
return arrowG;
|
|
94
|
-
};
|
|
95
|
-
const drawSolidTriangle = (source, target, options) => {
|
|
96
|
-
const endPoint = target;
|
|
97
|
-
const { pointLeft, pointRight } = arrowPoints(source, endPoint, 30);
|
|
98
|
-
return drawLinearPath([pointLeft, endPoint, pointRight], { ...options, fill: options.stroke }, true);
|
|
99
|
-
};
|
|
100
|
-
const drawOpenTriangle = (element, source, target, options) => {
|
|
101
|
-
const directionFactor = getFactorByPoints(source, target);
|
|
102
|
-
const strokeWidth = getStrokeWidthByElement(element);
|
|
103
|
-
const endPoint = [target[0] + (strokeWidth * directionFactor.x) / 2, target[1] + (strokeWidth * directionFactor.y) / 2];
|
|
104
|
-
const { pointLeft, pointRight } = arrowPoints(source, endPoint, 40);
|
|
105
|
-
return drawLinearPath([pointLeft, endPoint, pointRight], options);
|
|
106
|
-
};
|
|
107
|
-
const drawOneSideArrow = (source, target, side, options) => {
|
|
108
|
-
const { pointLeft, pointRight } = arrowPoints(source, target, 40);
|
|
109
|
-
return drawLinearPath([side === 'up' ? pointRight : pointLeft, target], options);
|
|
110
|
-
};
|
|
111
|
-
const drawSingleSlash = (source, target, isSource, options) => {
|
|
112
|
-
const length = distanceBetweenPointAndPoint(...source, ...target);
|
|
113
|
-
const middlePoint = getExtendPoint(target, source, length / 2);
|
|
114
|
-
const angle = isSource ? 120 : 60;
|
|
115
|
-
const start = rotate(...source, ...middlePoint, (angle * Math.PI) / 180);
|
|
116
|
-
const end = rotate(...target, ...middlePoint, (angle * Math.PI) / 180);
|
|
117
|
-
return drawLinearPath([start, end], options);
|
|
118
|
-
};
|
|
119
|
-
const drawHollowTriangleArrow = (source, target, options) => {
|
|
120
|
-
const { pointLeft, pointRight } = arrowPoints(source, target, 30);
|
|
121
|
-
return drawLinearPath([pointLeft, pointRight, target], { ...options, fill: 'white' }, true);
|
|
122
|
-
};
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1hcnJvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUtYXJyb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFTLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLDRCQUE0QixFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFRbEQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBRXhCLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWtCLEVBQUUsTUFBZSxFQUFFLE9BQWdCLEVBQUUsRUFBRTtJQUNuRixNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUN6QixJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDOUcsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBVSxDQUFDO0lBQ2xGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFVLENBQUM7SUFDaEYsT0FBTyxjQUFjLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakQsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE1BQWEsRUFBRSxNQUFhLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO0lBQy9FLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEUsT0FBTyxjQUFjLENBQUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50LCBhcnJvd1BvaW50cywgY3JlYXRlRywgY3JlYXRlUGF0aCwgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCwgZHJhd0xpbmVhclBhdGgsIHJvdGF0ZSB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IExpbmVNYXJrZXJUeXBlLCBQbGFpdExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcbmltcG9ydCB7IGdldEZhY3RvckJ5UG9pbnRzLCBnZXRFeHRlbmRQb2ludCB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQgfSBmcm9tICcuL3N0eWxlJztcblxuaW50ZXJmYWNlIEFycm93T3B0aW9ucyB7XG4gICAgbWFya2VyOiBMaW5lTWFya2VyVHlwZTtcbiAgICBzb3VyY2U6IFBvaW50O1xuICAgIHRhcmdldDogUG9pbnQ7XG4gICAgaXNTb3VyY2U6IGJvb2xlYW47XG59XG5jb25zdCBBUlJPV19MRU5HVEggPSAyMDtcblxuZXhwb3J0IGNvbnN0IGRyYXdMaW5lQXJyb3cgPSAoZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludHM6IFBvaW50W10sIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBhcnJvd0cgPSBjcmVhdGVHKCk7XG4gICAgaWYgKFBsYWl0TGluZS5pc1NvdXJjZU1hcmsoZWxlbWVudCwgTGluZU1hcmtlclR5cGUubm9uZSkgJiYgUGxhaXRMaW5lLmlzVGFyZ2V0TWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5ub25lKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBvZmZzZXQgPSAoc3Ryb2tlV2lkdGggKiBzdHJva2VXaWR0aCkgLyAzO1xuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHBvaW50cyA9IFtwb2ludHNbMF0sIFtwb2ludHNbMF1bMF0gKyAwLjEsIHBvaW50c1swXVsxXV1dO1xuICAgIH1cblxuICAgIGlmICghUGxhaXRMaW5lLmlzU291cmNlTWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5ub25lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRFeHRlbmRQb2ludChwb2ludHNbMF0sIHBvaW50c1sxXSwgQVJST1dfTEVOR1RIICsgb2Zmc2V0KTtcbiAgICAgICAgY29uc3Qgc291cmNlQXJyb3cgPSBnZXRBcnJvdyhlbGVtZW50LCB7IG1hcmtlcjogZWxlbWVudC5zb3VyY2UubWFya2VyLCBzb3VyY2UsIHRhcmdldDogcG9pbnRzWzBdLCBpc1NvdXJjZTogdHJ1ZSB9LCBvcHRpb25zKTtcbiAgICAgICAgc291cmNlQXJyb3cgJiYgYXJyb3dHLmFwcGVuZENoaWxkKHNvdXJjZUFycm93KTtcbiAgICB9XG4gICAgaWYgKCFQbGFpdExpbmUuaXNUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldEV4dGVuZFBvaW50KHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0sIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0sIEFSUk9XX0xFTkdUSCArIG9mZnNldCk7XG4gICAgICAgIGNvbnN0IGFycm93ID0gZ2V0QXJyb3coXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgeyBtYXJrZXI6IGVsZW1lbnQudGFyZ2V0Lm1hcmtlciwgc291cmNlLCB0YXJnZXQ6IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0sIGlzU291cmNlOiBmYWxzZSB9LFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIGFycm93ICYmIGFycm93Ry5hcHBlbmRDaGlsZChhcnJvdyk7XG4gICAgfVxuICAgIHJldHVybiBhcnJvd0c7XG59O1xuXG5jb25zdCBnZXRBcnJvdyA9IChlbGVtZW50OiBQbGFpdExpbmUsIGFycm93T3B0aW9uczogQXJyb3dPcHRpb25zLCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBtYXJrZXIsIHRhcmdldCwgc291cmNlLCBpc1NvdXJjZSB9ID0gYXJyb3dPcHRpb25zO1xuICAgIGxldCB0YXJnZXRBcnJvdztcbiAgICBzd2l0Y2ggKG1hcmtlcikge1xuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLm9wZW5UcmlhbmdsZToge1xuICAgICAgICAgICAgdGFyZ2V0QXJyb3cgPSBkcmF3T3BlblRyaWFuZ2xlKGVsZW1lbnQsIHNvdXJjZSwgdGFyZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZU1hcmtlclR5cGUuc29saWRUcmlhbmdsZToge1xuICAgICAgICAgICAgdGFyZ2V0QXJyb3cgPSBkcmF3U29saWRUcmlhbmdsZShzb3VyY2UsIHRhcmdldCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLmFycm93OiB7XG4gICAgICAgICAgICB0YXJnZXRBcnJvdyA9IGRyYXdBcnJvdyhlbGVtZW50LCBzb3VyY2UsIHRhcmdldCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLnNoYXJwQXJyb3c6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd1NoYXJwQXJyb3coc291cmNlLCB0YXJnZXQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBMaW5lTWFya2VyVHlwZS5vbmVTaWRlVXA6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd09uZVNpZGVBcnJvdyhzb3VyY2UsIHRhcmdldCwgaXNTb3VyY2UgPyAnZG93bicgOiAndXAnLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZU1hcmtlclR5cGUub25lU2lkZURvd246IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd09uZVNpZGVBcnJvdyhzb3VyY2UsIHRhcmdldCwgaXNTb3VyY2UgPyAndXAnIDogJ2Rvd24nLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZU1hcmtlclR5cGUuaG9sbG93VHJpYW5nbGU6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd0hvbGxvd1RyaWFuZ2xlQXJyb3coc291cmNlLCB0YXJnZXQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBMaW5lTWFya2VyVHlwZS5zaW5nbGVTbGFzaDoge1xuICAgICAgICAgICAgdGFyZ2V0QXJyb3cgPSBkcmF3U2luZ2xlU2xhc2goc291cmNlLCB0YXJnZXQsIGlzU291cmNlLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRBcnJvdztcbn07XG5cbmNvbnN0IGRyYXdTaGFycEFycm93ID0gKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBzdGFydFBvaW50OiBQb2ludCA9IHRhcmdldDtcbiAgICBjb25zdCB7IHBvaW50TGVmdCwgcG9pbnRSaWdodCB9ID0gYXJyb3dQb2ludHMoc291cmNlLCB0YXJnZXQsIDIwKTtcbiAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHBhdGggPSBjcmVhdGVQYXRoKCk7XG4gICAgbGV0IHBvbHlsaW5lUGF0aCA9IGBNJHtwb2ludFJpZ2h0WzBdfSwke3BvaW50UmlnaHRbMV19QTI1LDI1LDIwLDAsMSwke3BvaW50TGVmdFswXX0sJHtwb2ludExlZnRbMV19TCR7c3RhcnRQb2ludFswXX0sJHtzdGFydFBvaW50WzFdfVpgO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgcG9seWxpbmVQYXRoKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgYCR7b3B0aW9ucz8uc3Ryb2tlfWApO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBgJHtvcHRpb25zPy5zdHJva2VXaWR0aH1gKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGAke29wdGlvbnM/LnN0cm9rZX1gKTtcbiAgICBnLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgIHJldHVybiBnO1xufTtcblxuY29uc3QgZHJhd0Fycm93ID0gKGVsZW1lbnQ6IFBsYWl0TGluZSwgc291cmNlOiBQb2ludCwgdGFyZ2V0OiBQb2ludCwgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGdldEZhY3RvckJ5UG9pbnRzKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IGVuZFBvaW50OiBQb2ludCA9IFt0YXJnZXRbMF0gKyAoc3Ryb2tlV2lkdGggKiBkaXJlY3Rpb25GYWN0b3IueCkgLyAyLCB0YXJnZXRbMV0gKyAoc3Ryb2tlV2lkdGggKiBkaXJlY3Rpb25GYWN0b3IueSkgLyAyXTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uc291cmNlLCAuLi5lbmRQb2ludCk7XG4gICAgY29uc3QgbWlkZGxlUG9pbnQ6IFBvaW50ID0gW1xuICAgICAgICBlbmRQb2ludFswXSAtICgoKGRpc3RhbmNlICogMykgLyA1ICsgc3Ryb2tlV2lkdGgpIC8gMikgKiBkaXJlY3Rpb25GYWN0b3IueCxcbiAgICAgICAgZW5kUG9pbnRbMV0gLSAoKChkaXN0YW5jZSAqIDMpIC8gNSArIHN0cm9rZVdpZHRoKSAvIDIpICogZGlyZWN0aW9uRmFjdG9yLnlcbiAgICBdO1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIGVuZFBvaW50LCAzMCk7XG4gICAgY29uc3QgYXJyb3dHID0gZHJhd0xpbmVhclBhdGgoW3BvaW50TGVmdCwgZW5kUG9pbnQsIHBvaW50UmlnaHQsIG1pZGRsZVBvaW50XSwgeyAuLi5vcHRpb25zLCBmaWxsOiBvcHRpb25zLnN0cm9rZSB9LCB0cnVlKTtcbiAgICBjb25zdCBwYXRoID0gYXJyb3dHLnF1ZXJ5U2VsZWN0b3IoJ3BhdGgnKTtcbiAgICBwYXRoIS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lam9pbicsICdyb3VuZCcpO1xuICAgIHJldHVybiBhcnJvd0c7XG59O1xuXG5jb25zdCBkcmF3U29saWRUcmlhbmdsZSA9IChzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZW5kUG9pbnQ6IFBvaW50ID0gdGFyZ2V0O1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIGVuZFBvaW50LCAzMCk7XG4gICAgcmV0dXJuIGRyYXdMaW5lYXJQYXRoKFtwb2ludExlZnQsIGVuZFBvaW50LCBwb2ludFJpZ2h0XSwgeyAuLi5vcHRpb25zLCBmaWxsOiBvcHRpb25zLnN0cm9rZSB9LCB0cnVlKTtcbn07XG5cbmNvbnN0IGRyYXdPcGVuVHJpYW5nbGUgPSAoZWxlbWVudDogUGxhaXRMaW5lLCBzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZGlyZWN0aW9uRmFjdG9yID0gZ2V0RmFjdG9yQnlQb2ludHMoc291cmNlLCB0YXJnZXQpO1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3QgZW5kUG9pbnQ6IFBvaW50ID0gW3RhcmdldFswXSArIChzdHJva2VXaWR0aCAqIGRpcmVjdGlvbkZhY3Rvci54KSAvIDIsIHRhcmdldFsxXSArIChzdHJva2VXaWR0aCAqIGRpcmVjdGlvbkZhY3Rvci55KSAvIDJdO1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIGVuZFBvaW50LCA0MCk7XG4gICAgcmV0dXJuIGRyYXdMaW5lYXJQYXRoKFtwb2ludExlZnQsIGVuZFBvaW50LCBwb2ludFJpZ2h0XSwgb3B0aW9ucyk7XG59O1xuXG5jb25zdCBkcmF3T25lU2lkZUFycm93ID0gKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQsIHNpZGU6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIHRhcmdldCwgNDApO1xuICAgIHJldHVybiBkcmF3TGluZWFyUGF0aChbc2lkZSA9PT0gJ3VwJyA/IHBvaW50UmlnaHQgOiBwb2ludExlZnQsIHRhcmdldF0sIG9wdGlvbnMpO1xufTtcblxuY29uc3QgZHJhd1NpbmdsZVNsYXNoID0gKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQsIGlzU291cmNlOiBib29sZWFuLCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgbGVuZ3RoID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5zb3VyY2UsIC4uLnRhcmdldCk7XG4gICAgY29uc3QgbWlkZGxlUG9pbnQgPSBnZXRFeHRlbmRQb2ludCh0YXJnZXQsIHNvdXJjZSwgbGVuZ3RoIC8gMik7XG4gICAgY29uc3QgYW5nbGUgPSBpc1NvdXJjZSA/IDEyMCA6IDYwO1xuICAgIGNvbnN0IHN0YXJ0ID0gcm90YXRlKC4uLnNvdXJjZSwgLi4ubWlkZGxlUG9pbnQsIChhbmdsZSAqIE1hdGguUEkpIC8gMTgwKSBhcyBQb2ludDtcbiAgICBjb25zdCBlbmQgPSByb3RhdGUoLi4udGFyZ2V0LCAuLi5taWRkbGVQb2ludCwgKGFuZ2xlICogTWF0aC5QSSkgLyAxODApIGFzIFBvaW50O1xuICAgIHJldHVybiBkcmF3TGluZWFyUGF0aChbc3RhcnQsIGVuZF0sIG9wdGlvbnMpO1xufTtcblxuY29uc3QgZHJhd0hvbGxvd1RyaWFuZ2xlQXJyb3cgPSAoc291cmNlOiBQb2ludCwgdGFyZ2V0OiBQb2ludCwgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIHRhcmdldCwgMzApO1xuICAgIHJldHVybiBkcmF3TGluZWFyUGF0aChbcG9pbnRMZWZ0LCBwb2ludFJpZ2h0LCB0YXJnZXRdLCB7IC4uLm9wdGlvbnMsIGZpbGw6ICd3aGl0ZScgfSwgdHJ1ZSk7XG59O1xuIl19
|