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.
Files changed (31) hide show
  1. package/README.md +94 -147
  2. package/README_en.md +14 -62
  3. package/dist/module.json +1 -1
  4. package/dist/module.mjs +8 -0
  5. package/dist/runtime/core/components/SvgIcon.vue +30 -21
  6. package/dist/runtime/core/components/editor/ImageBlock.vue +175 -0
  7. package/dist/runtime/core/components/editor/OlBlock.vue +135 -0
  8. package/dist/runtime/core/components/editor/TextBlock.vue +77 -31
  9. package/dist/runtime/core/components/icon/Accept.vue +5 -0
  10. package/dist/runtime/core/components/icon/ArrowDown.vue +3 -0
  11. package/dist/runtime/core/components/icon/ArrowUp.vue +3 -0
  12. package/dist/runtime/core/components/icon/Cancel.vue +5 -0
  13. package/dist/runtime/core/components/icon/Delete.vue +3 -0
  14. package/dist/runtime/core/style/common.css +320 -31
  15. package/dist/runtime/core/style/viewer.css +191 -0
  16. package/dist/runtime/core/utils/cursor.d.ts +1 -1
  17. package/dist/runtime/core/utils/cursor.mjs +16 -4
  18. package/dist/runtime/core/utils/element.d.ts +2 -1
  19. package/dist/runtime/core/utils/element.mjs +19 -4
  20. package/dist/runtime/core/utils/index.d.ts +2 -3
  21. package/dist/runtime/core/utils/index.mjs +62 -5
  22. package/dist/runtime/core/utils/keyboard.d.ts +1 -1
  23. package/dist/runtime/core/utils/keyboard.mjs +500 -41
  24. package/dist/runtime/core/utils/style.d.ts +6 -2
  25. package/dist/runtime/core/utils/style.mjs +140 -30
  26. package/dist/runtime/shared/components/DragonEditor.vue +488 -159
  27. package/dist/runtime/shared/components/DragonEditorComment.vue +42 -32
  28. package/dist/runtime/shared/components/DragonEditorViewer.vue +30 -2
  29. package/package.json +1 -1
  30. package/dist/runtime/core/style/main.d.ts +0 -1
  31. 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)}<span class="${className}">${text.substring(startIdx, endIdx)}</span>${text.substring(endIdx, textLength)}`;
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
- const cursorData = getCursor();
39
- const startNode = cursorData.startNode;
40
- const endNode = cursorData.endNode;
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
- const editableElement = findEditableElement(startNode);
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(parentNode.childNodes[childNumber], startOffset, endOffset, className);
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 = `<span class="${classList.join(" ")}">${text.substring(0, startOffset2)}</span><span class="${middleClassList.join(" ")}">${text.substring(startOffset2, endOffset2)}</span><span class="${classList.join(" ")}">${text.substring(endOffset2, text.length)}</span>`;
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 = `<span class="${classList.join(" ")}">${text.substring(0, startOffset2)}</span><span class="${classList.join(" ")} ${className}">${text.substring(startOffset2, endOffset2)}</span><span class="${classList.join(" ")}">${text.substring(endOffset2, text.length)}</span>`;
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 += `<span class="${className}">${child.textContent}</span>`;
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)}<span class="${className}">${text.substring(startOffset, text.length)}</span>`;
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 += `<span class="${className}">${text.substring(0, startOffset)}</span>${text.substring(startOffset, text.length)}`;
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 += `<span class="${childClassList.join(" ")}">${text.substring(0, startOffset)}</span>`;
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 += `<span class="${childClassList.join(" ")}">${text.substring(startOffset, text.length)}</span>`;
202
+ htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${childClassList.join(" ")}">${text.substring(startOffset, text.length)}</${tagName}>`;
172
203
  }
173
204
  } else {
174
- htmlStructure += `<span class="${childClassList.join(" ")}">${text.substring(0, startOffset)}</span>`;
175
- htmlStructure += `<span class="${childClassList.join(" ")} ${className}">${text.substring(startOffset, text.length)}</span>`;
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 += `<span class="${className}">${text.substring(0, endOffset)}</span>${text.substring(endOffset, text.length)}`;
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)}<span class="${className}">${text.substring(endOffset, text.length)}</span>`;
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 += `<span class="${newClassList.join(" ")}">${text.substring(0, endOffset)}</span>`;
191
- htmlStructure += `<span class="${childClassList.join(" ")}">${text.substring(endOffset, text.length)}</span>`;
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 += `<span class="${childClassList.join(" ")} ${className}">${text.substring(0, endOffset)}</span>`;
195
- htmlStructure += `<span class="${childClassList.join(" ")}">${text.substring(endOffset, text.length)}</span>`;
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(type, blockData, $target) {
268
+ export function styleSettings({ kind, blockData, $target, url, cursorData }) {
237
269
  let rawData = blockData;
238
- switch (type) {
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(rawData, $target, "d-deco-bold");
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(rawData, $target, "d-deco-italic");
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(rawData, $target, "d-deco-underline");
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(rawData, $target, "d-deco-through");
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(rawData, $target, type);
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
+ }