@yltrcc/vditor 0.1.1 → 0.3.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.
@@ -0,0 +1,166 @@
1
+ import {hasClosestByMatchTag} from "./hasClosest";
2
+ import {getMarkdown} from "../markdown/getMarkdown";
3
+
4
+ export const initImageResize = (vditor: IVditor) => {
5
+ const editorElement = vditor.wysiwyg.element;
6
+ let currentResizeState: {
7
+ isResizing: boolean;
8
+ imgElement: HTMLImageElement;
9
+ startX: number;
10
+ startY: number;
11
+ startWidth: number;
12
+ startHeight: number;
13
+ corner: string;
14
+ } | null = null;
15
+
16
+ // 检测鼠标是否在图片的四个角附近
17
+ const getResizeCorner = (imgElement: HTMLImageElement, mouseX: number, mouseY: number): string | null => {
18
+ const rect = imgElement.getBoundingClientRect();
19
+ const cornerSize = 20; // 角落检测区域大小
20
+
21
+ // 左上角
22
+ if (mouseX >= rect.left && mouseX <= rect.left + cornerSize &&
23
+ mouseY >= rect.top && mouseY <= rect.top + cornerSize) {
24
+ return 'nw';
25
+ }
26
+ // 右上角
27
+ if (mouseX >= rect.right - cornerSize && mouseX <= rect.right &&
28
+ mouseY >= rect.top && mouseY <= rect.top + cornerSize) {
29
+ return 'ne';
30
+ }
31
+ // 左下角
32
+ if (mouseX >= rect.left && mouseX <= rect.left + cornerSize &&
33
+ mouseY >= rect.bottom - cornerSize && mouseY <= rect.bottom) {
34
+ return 'sw';
35
+ }
36
+ // 右下角
37
+ if (mouseX >= rect.right - cornerSize && mouseX <= rect.right &&
38
+ mouseY >= rect.bottom - cornerSize && mouseY <= rect.bottom) {
39
+ return 'se';
40
+ }
41
+
42
+ return null;
43
+ };
44
+
45
+ // 根据角落设置鼠标样式
46
+ const getCursorStyle = (corner: string | null): string => {
47
+ switch (corner) {
48
+ case 'nw':
49
+ case 'se':
50
+ return 'nwse-resize';
51
+ case 'ne':
52
+ case 'sw':
53
+ return 'nesw-resize';
54
+ default:
55
+ return 'default';
56
+ }
57
+ };
58
+
59
+ // 鼠标移动处理
60
+ const handleMouseMove = (e: MouseEvent) => {
61
+ if (currentResizeState && currentResizeState.isResizing) {
62
+ // 正在调整大小
63
+ const { imgElement, startX, startY, startWidth, startHeight, corner } = currentResizeState;
64
+
65
+ const deltaX = e.clientX - startX;
66
+ const deltaY = e.clientY - startY;
67
+
68
+ let newWidth = startWidth;
69
+ let newHeight = startHeight;
70
+
71
+ switch (corner) {
72
+ case "se": // 右下角
73
+ newWidth = Math.max(50, startWidth + deltaX);
74
+ newHeight = Math.max(50, startHeight + deltaY);
75
+ break;
76
+ case "sw": // 左下角
77
+ newWidth = Math.max(50, startWidth - deltaX);
78
+ newHeight = Math.max(50, startHeight + deltaY);
79
+ break;
80
+ case "ne": // 右上角
81
+ newWidth = Math.max(50, startWidth + deltaX);
82
+ newHeight = Math.max(50, startHeight - deltaY);
83
+ break;
84
+ case "nw": // 左上角
85
+ newWidth = Math.max(50, startWidth - deltaX);
86
+ newHeight = Math.max(50, startHeight - deltaY);
87
+ break;
88
+ }
89
+
90
+ imgElement.style.width = newWidth + "px";
91
+ imgElement.style.height = newHeight + "px";
92
+
93
+ e.preventDefault();
94
+ e.stopPropagation();
95
+ } else {
96
+ // 检测鼠标是否在角落,改变鼠标样式
97
+ const target = e.target as HTMLElement;
98
+ const imgElement = hasClosestByMatchTag(target, "IMG") as HTMLImageElement;
99
+
100
+ if (imgElement && imgElement.getAttribute("data-resizable")) {
101
+ const corner = getResizeCorner(imgElement, e.clientX, e.clientY);
102
+ imgElement.style.cursor = getCursorStyle(corner);
103
+ }
104
+ }
105
+ };
106
+
107
+ // 鼠标按下处理
108
+ const handleMouseDown = (e: MouseEvent) => {
109
+ const target = e.target as HTMLElement;
110
+ const imgElement = hasClosestByMatchTag(target, "IMG") as HTMLImageElement;
111
+
112
+ if (imgElement && imgElement.getAttribute("data-resizable")) {
113
+ const corner = getResizeCorner(imgElement, e.clientX, e.clientY);
114
+
115
+ if (corner) {
116
+ console.log('Start resizing from corner:', corner);
117
+
118
+ e.preventDefault();
119
+ e.stopPropagation();
120
+
121
+ currentResizeState = {
122
+ isResizing: true,
123
+ imgElement,
124
+ startX: e.clientX,
125
+ startY: e.clientY,
126
+ startWidth: imgElement.offsetWidth,
127
+ startHeight: imgElement.offsetHeight,
128
+ corner
129
+ };
130
+
131
+ imgElement.classList.add("resizing");
132
+ }
133
+ }
134
+ };
135
+
136
+ // 鼠标释放处理
137
+ const handleMouseUp = () => {
138
+ if (currentResizeState && currentResizeState.isResizing) {
139
+ console.log('Stop resizing');
140
+
141
+ const { imgElement } = currentResizeState;
142
+
143
+ currentResizeState.isResizing = false;
144
+ imgElement.classList.remove("resizing");
145
+
146
+ const finalWidth = parseInt(imgElement.style.width) || imgElement.offsetWidth;
147
+ const finalHeight = parseInt(imgElement.style.height) || imgElement.offsetHeight;
148
+
149
+ imgElement.setAttribute("width", finalWidth.toString());
150
+ imgElement.setAttribute("height", finalHeight.toString());
151
+
152
+ if (typeof vditor.options.input === "function") {
153
+ setTimeout(() => {
154
+ vditor.options.input(getMarkdown(vditor));
155
+ }, 0);
156
+ }
157
+
158
+ currentResizeState = null;
159
+ }
160
+ };
161
+
162
+ // 添加事件监听器
163
+ editorElement.addEventListener("mousemove", handleMouseMove);
164
+ editorElement.addEventListener("mousedown", handleMouseDown);
165
+ document.addEventListener("mouseup", handleMouseUp);
166
+ };