dragon-editor 2.0.0-beta.1.4 → 2.0.0-beta.2.1
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 +94 -147
- package/README_en.md +14 -62
- package/dist/module.json +1 -1
- package/dist/module.mjs +8 -0
- package/dist/runtime/core/components/SvgIcon.vue +30 -21
- package/dist/runtime/core/components/editor/ImageBlock.vue +175 -0
- package/dist/runtime/core/components/editor/OlBlock.vue +135 -0
- package/dist/runtime/core/components/editor/TextBlock.vue +77 -31
- package/dist/runtime/core/components/icon/Accept.vue +5 -0
- package/dist/runtime/core/components/icon/ArrowDown.vue +3 -0
- package/dist/runtime/core/components/icon/ArrowUp.vue +3 -0
- package/dist/runtime/core/components/icon/Cancel.vue +5 -0
- package/dist/runtime/core/components/icon/Delete.vue +3 -0
- package/dist/runtime/core/style/common.css +320 -31
- package/dist/runtime/core/style/viewer.css +191 -0
- package/dist/runtime/core/utils/cursor.d.ts +1 -1
- package/dist/runtime/core/utils/cursor.mjs +16 -4
- package/dist/runtime/core/utils/element.d.ts +2 -1
- package/dist/runtime/core/utils/element.mjs +19 -4
- package/dist/runtime/core/utils/index.d.ts +2 -3
- package/dist/runtime/core/utils/index.mjs +62 -5
- package/dist/runtime/core/utils/keyboard.d.ts +1 -1
- package/dist/runtime/core/utils/keyboard.mjs +500 -41
- package/dist/runtime/core/utils/style.d.ts +6 -2
- package/dist/runtime/core/utils/style.mjs +140 -30
- package/dist/runtime/shared/components/DragonEditor.vue +488 -159
- package/dist/runtime/shared/components/DragonEditorComment.vue +42 -32
- package/dist/runtime/shared/components/DragonEditorViewer.vue +30 -2
- package/package.json +1 -1
- package/dist/runtime/core/style/main.d.ts +0 -1
- package/dist/runtime/core/style/main.mjs +0 -24
|
@@ -13,6 +13,19 @@ function arrangementAlignClass(originList, className) {
|
|
|
13
13
|
}
|
|
14
14
|
return array;
|
|
15
15
|
}
|
|
16
|
+
const headingClassList = ["d-h1", "d-h2", "d-h3", "d-h4", "d-h5", "d-h6"];
|
|
17
|
+
function arrangementHeadingClass(originList, className) {
|
|
18
|
+
const hasClass = originList.indexOf(className) > -1;
|
|
19
|
+
let array = originList;
|
|
20
|
+
if (hasClass) {
|
|
21
|
+
originList.splice(originList.indexOf(className), 1);
|
|
22
|
+
array = originList;
|
|
23
|
+
} else {
|
|
24
|
+
array = originList.filter((item) => headingClassList.indexOf(item) === -1);
|
|
25
|
+
array.push(className);
|
|
26
|
+
}
|
|
27
|
+
return array;
|
|
28
|
+
}
|
|
16
29
|
function getNextNode($target, node) {
|
|
17
30
|
const childNode = $target.childNodes;
|
|
18
31
|
let idx = -1;
|
|
@@ -23,7 +36,7 @@ function getNextNode($target, node) {
|
|
|
23
36
|
});
|
|
24
37
|
return childNode[idx + 1];
|
|
25
38
|
}
|
|
26
|
-
function warpStyleNode(node, startOffset, endOffset, className) {
|
|
39
|
+
function warpStyleNode({ node, startOffset, endOffset, className, url, tagName }) {
|
|
27
40
|
const text = node.textContent;
|
|
28
41
|
const textLength = text.length;
|
|
29
42
|
let startIdx = startOffset;
|
|
@@ -32,14 +45,23 @@ function warpStyleNode(node, startOffset, endOffset, className) {
|
|
|
32
45
|
startIdx = endOffset;
|
|
33
46
|
endIdx = startOffset;
|
|
34
47
|
}
|
|
35
|
-
return `${text.substring(0, startIdx)}
|
|
48
|
+
return `${text.substring(0, startIdx)}<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${className}">${text.substring(startIdx, endIdx)}</${tagName}>${text.substring(endIdx, textLength)}`;
|
|
36
49
|
}
|
|
37
|
-
function defaultDecorationMake(originData, $target, className) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
function defaultDecorationMake({ originData, $target, className, tagName = "span", url, parentCursorData }) {
|
|
51
|
+
let cursorData = getCursor();
|
|
52
|
+
if (cursorData.startNode === null) {
|
|
53
|
+
cursorData = parentCursorData;
|
|
54
|
+
}
|
|
55
|
+
let startNode = cursorData.startNode;
|
|
56
|
+
let endNode = cursorData.endNode;
|
|
41
57
|
if (startNode !== null) {
|
|
42
|
-
|
|
58
|
+
let editableElement = findEditableElement(startNode);
|
|
59
|
+
if (editableElement === null) {
|
|
60
|
+
cursorData = parentCursorData;
|
|
61
|
+
startNode = cursorData.startNode;
|
|
62
|
+
endNode = cursorData.endNode;
|
|
63
|
+
editableElement = findEditableElement(startNode);
|
|
64
|
+
}
|
|
43
65
|
if (cursorData.type === "Range") {
|
|
44
66
|
if (startNode === endNode) {
|
|
45
67
|
const parentNode = startNode.parentNode;
|
|
@@ -51,7 +73,14 @@ function defaultDecorationMake(originData, $target, className) {
|
|
|
51
73
|
}
|
|
52
74
|
if (parentNode === editableElement) {
|
|
53
75
|
const childNumber = findChildNumber(editableElement, startNode);
|
|
54
|
-
const wrpStructure = warpStyleNode(
|
|
76
|
+
const wrpStructure = warpStyleNode({
|
|
77
|
+
node: parentNode.childNodes[childNumber],
|
|
78
|
+
startOffset,
|
|
79
|
+
endOffset,
|
|
80
|
+
className,
|
|
81
|
+
tagName,
|
|
82
|
+
url
|
|
83
|
+
});
|
|
55
84
|
let htmlStructure = "";
|
|
56
85
|
parentNode.childNodes.forEach((child, count) => {
|
|
57
86
|
if (count === childNumber) {
|
|
@@ -74,6 +103,7 @@ function defaultDecorationMake(originData, $target, className) {
|
|
|
74
103
|
setCursor($cursorTarget, cursorLength);
|
|
75
104
|
}, 100);
|
|
76
105
|
} else {
|
|
106
|
+
const originTag = getTagName(parentNode);
|
|
77
107
|
const childNumber = findChildNumber(editableElement, parentNode);
|
|
78
108
|
const classList = [...parentNode.classList];
|
|
79
109
|
const text = parentNode.textContent;
|
|
@@ -88,9 +118,9 @@ function defaultDecorationMake(originData, $target, className) {
|
|
|
88
118
|
if (hasClassIdx > -1) {
|
|
89
119
|
const middleClassList = [...parentNode.classList];
|
|
90
120
|
middleClassList.splice(hasClassIdx, 1);
|
|
91
|
-
htmlStructure =
|
|
121
|
+
htmlStructure = `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${classList.join(" ")}">${text.substring(0, startOffset2)}</${originTag.name}><${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${middleClassList.join(" ")}">${text.substring(startOffset2, endOffset2)}</${tagName}><${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${classList.join(" ")}">${text.substring(endOffset2, text.length)}</${originTag.name}>`;
|
|
92
122
|
} else {
|
|
93
|
-
htmlStructure =
|
|
123
|
+
htmlStructure = `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${classList.join(" ")}">${text.substring(0, startOffset2)}</${originTag.name}><${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${classList.join(" ")} ${className}">${text.substring(startOffset2, endOffset2)}</${tagName}><${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${classList.join(" ")}">${text.substring(endOffset2, text.length)}</${originTag.name}>`;
|
|
94
124
|
}
|
|
95
125
|
parentNode.insertAdjacentHTML("afterend", htmlStructure);
|
|
96
126
|
parentNode.remove();
|
|
@@ -142,7 +172,7 @@ function defaultDecorationMake(originData, $target, className) {
|
|
|
142
172
|
const text = child.textContent;
|
|
143
173
|
if (count > startIdx && count < endIdx) {
|
|
144
174
|
if (type === "Text") {
|
|
145
|
-
htmlStructure +=
|
|
175
|
+
htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${className}">${child.textContent}</${tagName}>`;
|
|
146
176
|
} else {
|
|
147
177
|
if (hasClassName) {
|
|
148
178
|
if (child.classList.length === 1) {
|
|
@@ -158,41 +188,43 @@ function defaultDecorationMake(originData, $target, className) {
|
|
|
158
188
|
}
|
|
159
189
|
} else if (count === startIdx) {
|
|
160
190
|
if (type === "Text") {
|
|
161
|
-
htmlStructure += `${text.substring(0, startOffset)}
|
|
191
|
+
htmlStructure += `${text.substring(0, startOffset)}<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${className}">${text.substring(startOffset, text.length)}</${tagName}>`;
|
|
162
192
|
} else {
|
|
163
193
|
const childClassList = [...child.classList];
|
|
194
|
+
const originTag = getTagName(child);
|
|
164
195
|
if (hasClassName) {
|
|
165
196
|
if (childClassList.length === 1) {
|
|
166
|
-
htmlStructure +=
|
|
197
|
+
htmlStructure += `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${className}">${text.substring(0, startOffset)}</${originTag.name}>${text.substring(startOffset, text.length)}`;
|
|
167
198
|
} else {
|
|
168
199
|
const classIdx = childClassList.indexOf(className);
|
|
169
|
-
htmlStructure +=
|
|
200
|
+
htmlStructure += `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${childClassList.join(" ")}">${text.substring(0, startOffset)}</${originTag.name}>`;
|
|
170
201
|
childClassList.splice(classIdx, 1);
|
|
171
|
-
htmlStructure +=
|
|
202
|
+
htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${childClassList.join(" ")}">${text.substring(startOffset, text.length)}</${tagName}>`;
|
|
172
203
|
}
|
|
173
204
|
} else {
|
|
174
|
-
htmlStructure +=
|
|
175
|
-
htmlStructure +=
|
|
205
|
+
htmlStructure += `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${childClassList.join(" ")}">${text.substring(0, startOffset)}</${originTag.name}>`;
|
|
206
|
+
htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${childClassList.join(" ")} ${className}">${text.substring(startOffset, text.length)}</${tagName}>`;
|
|
176
207
|
}
|
|
177
208
|
}
|
|
178
209
|
} else if (count === endIdx) {
|
|
179
210
|
if (type === "Text") {
|
|
180
|
-
htmlStructure +=
|
|
211
|
+
htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${className}">${text.substring(0, endOffset)}</${tagName}>${text.substring(endOffset, text.length)}`;
|
|
181
212
|
} else {
|
|
182
213
|
const childClassList = [...child.classList];
|
|
214
|
+
const originTag = getTagName(child);
|
|
183
215
|
if (hasClassName) {
|
|
184
216
|
if (childClassList.length === 1) {
|
|
185
|
-
htmlStructure += `${text.substring(0, endOffset)}
|
|
217
|
+
htmlStructure += `${text.substring(0, endOffset)}<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${className}">${text.substring(endOffset, text.length)}</${originTag.name}>`;
|
|
186
218
|
} else {
|
|
187
219
|
const classIdx = childClassList.indexOf(className);
|
|
188
220
|
const newClassList = [...child.classList];
|
|
189
221
|
newClassList.splice(classIdx, 1);
|
|
190
|
-
htmlStructure +=
|
|
191
|
-
htmlStructure +=
|
|
222
|
+
htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${newClassList.join(" ")}">${text.substring(0, endOffset)}</${tagName}>`;
|
|
223
|
+
htmlStructure += `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${childClassList.join(" ")}">${text.substring(endOffset, text.length)}</${originTag.name}>`;
|
|
192
224
|
}
|
|
193
225
|
} else {
|
|
194
|
-
htmlStructure +=
|
|
195
|
-
htmlStructure +=
|
|
226
|
+
htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${childClassList.join(" ")} ${className}">${text.substring(0, endOffset)}</${tagName}>`;
|
|
227
|
+
htmlStructure += `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${childClassList.join(" ")}">${text.substring(endOffset, text.length)}</${originTag.name}>`;
|
|
196
228
|
}
|
|
197
229
|
}
|
|
198
230
|
} else {
|
|
@@ -233,9 +265,9 @@ function defaultDecorationMake(originData, $target, className) {
|
|
|
233
265
|
}
|
|
234
266
|
return originData;
|
|
235
267
|
}
|
|
236
|
-
export function styleSettings(
|
|
268
|
+
export function styleSettings({ kind, blockData, $target, url, cursorData }) {
|
|
237
269
|
let rawData = blockData;
|
|
238
|
-
switch (
|
|
270
|
+
switch (kind) {
|
|
239
271
|
case "alignLeft":
|
|
240
272
|
rawData.classList = arrangementAlignClass(rawData.classList, "d-align-left");
|
|
241
273
|
break;
|
|
@@ -246,19 +278,97 @@ export function styleSettings(type, blockData, $target) {
|
|
|
246
278
|
rawData.classList = arrangementAlignClass(rawData.classList, "d-align-right");
|
|
247
279
|
break;
|
|
248
280
|
case "decorationBold":
|
|
249
|
-
rawData = defaultDecorationMake(
|
|
281
|
+
rawData = defaultDecorationMake({
|
|
282
|
+
originData: rawData,
|
|
283
|
+
$target,
|
|
284
|
+
className: "d-deco-bold",
|
|
285
|
+
parentCursorData: cursorData
|
|
286
|
+
});
|
|
250
287
|
break;
|
|
251
288
|
case "decorationItalic":
|
|
252
|
-
rawData = defaultDecorationMake(
|
|
289
|
+
rawData = defaultDecorationMake({
|
|
290
|
+
originData: rawData,
|
|
291
|
+
$target,
|
|
292
|
+
className: "d-deco-italic",
|
|
293
|
+
parentCursorData: cursorData
|
|
294
|
+
});
|
|
253
295
|
break;
|
|
254
296
|
case "decorationUnderline":
|
|
255
|
-
rawData = defaultDecorationMake(
|
|
297
|
+
rawData = defaultDecorationMake({
|
|
298
|
+
originData: rawData,
|
|
299
|
+
$target,
|
|
300
|
+
className: "d-deco-underline",
|
|
301
|
+
parentCursorData: cursorData
|
|
302
|
+
});
|
|
256
303
|
break;
|
|
257
304
|
case "decorationStrikethrough":
|
|
258
|
-
rawData = defaultDecorationMake(
|
|
305
|
+
rawData = defaultDecorationMake({
|
|
306
|
+
originData: rawData,
|
|
307
|
+
$target,
|
|
308
|
+
className: "d-deco-through",
|
|
309
|
+
parentCursorData: cursorData
|
|
310
|
+
});
|
|
311
|
+
break;
|
|
312
|
+
case "decorationCode":
|
|
313
|
+
rawData = defaultDecorationMake({
|
|
314
|
+
originData: rawData,
|
|
315
|
+
$target,
|
|
316
|
+
className: "d-deco-code",
|
|
317
|
+
tagName: "code",
|
|
318
|
+
parentCursorData: cursorData
|
|
319
|
+
});
|
|
320
|
+
break;
|
|
321
|
+
case "decorationLink":
|
|
322
|
+
rawData = defaultDecorationMake({
|
|
323
|
+
originData: rawData,
|
|
324
|
+
$target,
|
|
325
|
+
className: "d-deco-link",
|
|
326
|
+
tagName: "a",
|
|
327
|
+
url,
|
|
328
|
+
parentCursorData: cursorData
|
|
329
|
+
});
|
|
330
|
+
break;
|
|
331
|
+
case "heading-1":
|
|
332
|
+
rawData.classList = arrangementHeadingClass(rawData.classList, "d-h1");
|
|
333
|
+
break;
|
|
334
|
+
case "heading-2":
|
|
335
|
+
rawData.classList = arrangementHeadingClass(rawData.classList, "d-h2");
|
|
336
|
+
break;
|
|
337
|
+
case "heading-3":
|
|
338
|
+
rawData.classList = arrangementHeadingClass(rawData.classList, "d-h3");
|
|
339
|
+
break;
|
|
340
|
+
case "heading-4":
|
|
341
|
+
rawData.classList = arrangementHeadingClass(rawData.classList, "d-h4");
|
|
342
|
+
break;
|
|
343
|
+
case "heading-5":
|
|
344
|
+
rawData.classList = arrangementHeadingClass(rawData.classList, "d-h5");
|
|
345
|
+
break;
|
|
346
|
+
case "heading-6":
|
|
347
|
+
rawData.classList = arrangementHeadingClass(rawData.classList, "d-h6");
|
|
259
348
|
break;
|
|
260
349
|
default:
|
|
261
|
-
rawData = defaultDecorationMake(
|
|
350
|
+
rawData = defaultDecorationMake({
|
|
351
|
+
originData: rawData,
|
|
352
|
+
$target,
|
|
353
|
+
className: kind,
|
|
354
|
+
parentCursorData: cursorData
|
|
355
|
+
});
|
|
262
356
|
}
|
|
263
357
|
return rawData;
|
|
264
358
|
}
|
|
359
|
+
export function getTagName(node) {
|
|
360
|
+
const value = {
|
|
361
|
+
name: "span",
|
|
362
|
+
href: null
|
|
363
|
+
};
|
|
364
|
+
switch (node.tagName) {
|
|
365
|
+
case "CODE":
|
|
366
|
+
value.name = "code";
|
|
367
|
+
break;
|
|
368
|
+
case "A":
|
|
369
|
+
value.name = "a";
|
|
370
|
+
value.href = node.getAttribute("href");
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
return value;
|
|
374
|
+
}
|