dragon-editor 2.0.0-beta.1.4 → 2.0.0-beta.2

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