dragon-editor 2.0.0-beta.1.3 → 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 (45) 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 +9 -1
  5. package/dist/runtime/core/components/SvgIcon.vue +175 -0
  6. package/dist/runtime/core/components/editor/ImageBlock.vue +174 -0
  7. package/dist/runtime/core/components/editor/TextBlock.vue +137 -0
  8. package/dist/runtime/core/components/icon/Accept.vue +5 -0
  9. package/dist/runtime/core/components/icon/AlignCenter.vue +6 -0
  10. package/dist/runtime/core/components/icon/AlignLeft.vue +6 -0
  11. package/dist/runtime/core/components/icon/AlignRight.vue +6 -0
  12. package/dist/runtime/core/components/icon/ArrowDown.vue +3 -0
  13. package/dist/runtime/core/components/icon/ArrowUp.vue +3 -0
  14. package/dist/runtime/core/components/icon/Cancel.vue +5 -0
  15. package/dist/runtime/core/components/icon/CodeBlock.vue +6 -0
  16. package/dist/runtime/core/components/icon/DecorationBold.vue +6 -0
  17. package/dist/runtime/core/components/icon/DecorationItalic.vue +6 -0
  18. package/dist/runtime/core/components/icon/DecorationStrikethrough.vue +6 -0
  19. package/dist/runtime/core/components/icon/DecorationUnderline.vue +6 -0
  20. package/dist/runtime/core/components/icon/Delete.vue +3 -0
  21. package/dist/runtime/core/components/icon/ImageBlock.vue +5 -0
  22. package/dist/runtime/core/components/icon/LinkPath.vue +6 -0
  23. package/dist/runtime/core/components/icon/OlBlock.vue +6 -0
  24. package/dist/runtime/core/components/icon/QuotationBlock.vue +6 -0
  25. package/dist/runtime/core/components/icon/TableBlock.vue +8 -0
  26. package/dist/runtime/core/components/icon/TextBlock.vue +5 -0
  27. package/dist/runtime/core/components/icon/UlBlock.vue +6 -0
  28. package/dist/runtime/core/style/common.css +419 -0
  29. package/dist/runtime/core/style/viewer.css +191 -0
  30. package/dist/runtime/core/utils/cursor.d.ts +4 -0
  31. package/dist/runtime/core/utils/cursor.mjs +84 -0
  32. package/dist/runtime/core/utils/element.d.ts +2 -0
  33. package/dist/runtime/core/utils/element.mjs +29 -0
  34. package/dist/runtime/core/utils/index.d.ts +6 -0
  35. package/dist/runtime/core/utils/index.mjs +67 -0
  36. package/dist/runtime/core/utils/keyboard.d.ts +6 -0
  37. package/dist/runtime/core/utils/keyboard.mjs +322 -0
  38. package/dist/runtime/core/utils/style.d.ts +6 -0
  39. package/dist/runtime/core/utils/style.mjs +359 -0
  40. package/dist/runtime/shared/components/DragonEditor.vue +560 -0
  41. package/dist/runtime/{components → shared/components}/DragonEditorComment.vue +33 -11
  42. package/dist/runtime/shared/components/DragonEditorViewer.vue +29 -0
  43. package/package.json +1 -1
  44. package/dist/runtime/components/DragonEditor.vue +0 -361
  45. package/dist/runtime/components/DragonEditorViewer.vue +0 -3
@@ -0,0 +1,359 @@
1
+ import { getCursor, setCursor } from "./cursor.mjs";
2
+ import { findEditableElement, findChildNumber } from "./element.mjs";
3
+ const alignClassList = ["d-align-left", "d-align-center", "d-align-right"];
4
+ function arrangementAlignClass(originList, className) {
5
+ const hasClass = originList.indexOf(className) > -1;
6
+ let array = originList;
7
+ if (hasClass) {
8
+ originList.splice(originList.indexOf(className), 1);
9
+ array = originList;
10
+ } else {
11
+ array = originList.filter((item) => alignClassList.indexOf(item) === -1);
12
+ array.push(className);
13
+ }
14
+ return array;
15
+ }
16
+ function getNextNode($target, node) {
17
+ const childNode = $target.childNodes;
18
+ let idx = -1;
19
+ childNode.forEach((item, index) => {
20
+ if (item === node) {
21
+ idx = index;
22
+ }
23
+ });
24
+ return childNode[idx + 1];
25
+ }
26
+ function warpStyleNode({ node, startOffset, endOffset, className, url, tagName }) {
27
+ const text = node.textContent;
28
+ const textLength = text.length;
29
+ let startIdx = startOffset;
30
+ let endIdx = endOffset;
31
+ if (endOffset < startOffset) {
32
+ startIdx = endOffset;
33
+ endIdx = startOffset;
34
+ }
35
+ return `${text.substring(0, startIdx)}<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${className}">${text.substring(startIdx, endIdx)}</${tagName}>${text.substring(endIdx, textLength)}`;
36
+ }
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;
44
+ if (startNode !== null) {
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
+ }
52
+ if (cursorData.type === "Range") {
53
+ if (startNode === endNode) {
54
+ const parentNode = startNode.parentNode;
55
+ let startOffset = cursorData.startOffset;
56
+ let endOffset = cursorData.endOffset;
57
+ if (startOffset > endOffset) {
58
+ startOffset = cursorData.endOffset;
59
+ endOffset = cursorData.startOffset;
60
+ }
61
+ if (parentNode === editableElement) {
62
+ const childNumber = findChildNumber(editableElement, startNode);
63
+ const wrpStructure = warpStyleNode({
64
+ node: parentNode.childNodes[childNumber],
65
+ startOffset,
66
+ endOffset,
67
+ className,
68
+ tagName,
69
+ url
70
+ });
71
+ let htmlStructure = "";
72
+ parentNode.childNodes.forEach((child, count) => {
73
+ if (count === childNumber) {
74
+ htmlStructure += wrpStructure;
75
+ } else {
76
+ if (child.constructor.name === "Text") {
77
+ htmlStructure += child.textContent;
78
+ } else {
79
+ htmlStructure += child.outerHTML;
80
+ }
81
+ }
82
+ });
83
+ parentNode.innerHTML = htmlStructure;
84
+ setTimeout(() => {
85
+ let $cursorTarget = editableElement.childNodes[childNumber + 1];
86
+ if (!$cursorTarget) {
87
+ $cursorTarget = editableElement.childNodes[childNumber];
88
+ }
89
+ const cursorLength = $cursorTarget.textContent.length;
90
+ setCursor($cursorTarget, cursorLength);
91
+ }, 100);
92
+ } else {
93
+ const originTag = getTagName(parentNode);
94
+ const childNumber = findChildNumber(editableElement, parentNode);
95
+ const classList = [...parentNode.classList];
96
+ const text = parentNode.textContent;
97
+ const hasClassIdx = classList.indexOf(className);
98
+ let startOffset2 = cursorData.startOffset;
99
+ let endOffset2 = cursorData.endOffset;
100
+ let htmlStructure = "";
101
+ if (startOffset2 > endOffset2) {
102
+ startOffset2 = cursorData.endOffset;
103
+ endOffset2 = cursorData.startOffset;
104
+ }
105
+ if (hasClassIdx > -1) {
106
+ const middleClassList = [...parentNode.classList];
107
+ middleClassList.splice(hasClassIdx, 1);
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}>`;
109
+ } else {
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}>`;
111
+ }
112
+ parentNode.insertAdjacentHTML("afterend", htmlStructure);
113
+ parentNode.remove();
114
+ setTimeout(() => {
115
+ setCursor(editableElement.childNodes[childNumber + 1], text.substring(startOffset2, endOffset2).length);
116
+ }, 100);
117
+ }
118
+ } else {
119
+ let startChild = startNode;
120
+ let endChild = endNode;
121
+ if (startNode.parentNode !== editableElement) {
122
+ startChild = startNode.parentNode;
123
+ }
124
+ if (endNode.parentNode !== editableElement) {
125
+ endChild = endNode.parentNode;
126
+ }
127
+ const startChildIdx = findChildNumber(editableElement, startChild);
128
+ const endChildIdx = findChildNumber(editableElement, endChild);
129
+ let startIdx = 0;
130
+ let endIdx = 0;
131
+ let startOffset = 0;
132
+ let endOffset = 0;
133
+ let hasClassName = true;
134
+ let htmlStructure = "";
135
+ if (startChildIdx > endChildIdx) {
136
+ startIdx = endChildIdx;
137
+ endIdx = startChildIdx;
138
+ startOffset = cursorData.endOffset;
139
+ endOffset = cursorData.startOffset;
140
+ } else {
141
+ startIdx = startChildIdx;
142
+ endIdx = endChildIdx;
143
+ startOffset = cursorData.startOffset;
144
+ endOffset = cursorData.endOffset;
145
+ }
146
+ editableElement.childNodes.forEach((item, count) => {
147
+ if (count >= startIdx && count <= endIdx) {
148
+ if (item.constructor.name === "Text") {
149
+ hasClassName = false;
150
+ } else {
151
+ if ([...item.classList].indexOf(className) === -1) {
152
+ hasClassName = false;
153
+ }
154
+ }
155
+ }
156
+ });
157
+ editableElement.childNodes.forEach((child, count) => {
158
+ const type = child.constructor.name;
159
+ const text = child.textContent;
160
+ if (count > startIdx && count < endIdx) {
161
+ if (type === "Text") {
162
+ htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${className}">${child.textContent}</${tagName}>`;
163
+ } else {
164
+ if (hasClassName) {
165
+ if (child.classList.length === 1) {
166
+ htmlStructure += child.textContent;
167
+ } else {
168
+ child.classList.remove(className);
169
+ htmlStructure += child.outerHTML;
170
+ }
171
+ } else {
172
+ child.classList.add(className);
173
+ htmlStructure += child.outerHTML;
174
+ }
175
+ }
176
+ } else if (count === startIdx) {
177
+ if (type === "Text") {
178
+ htmlStructure += `${text.substring(0, startOffset)}<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${className}">${text.substring(startOffset, text.length)}</${tagName}>`;
179
+ } else {
180
+ const childClassList = [...child.classList];
181
+ const originTag = getTagName(child);
182
+ if (hasClassName) {
183
+ if (childClassList.length === 1) {
184
+ htmlStructure += `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${className}">${text.substring(0, startOffset)}</${originTag.name}>${text.substring(startOffset, text.length)}`;
185
+ } else {
186
+ const classIdx = childClassList.indexOf(className);
187
+ htmlStructure += `<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${childClassList.join(" ")}">${text.substring(0, startOffset)}</${originTag.name}>`;
188
+ childClassList.splice(classIdx, 1);
189
+ htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${childClassList.join(" ")}">${text.substring(startOffset, text.length)}</${tagName}>`;
190
+ }
191
+ } else {
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}>`;
194
+ }
195
+ }
196
+ } else if (count === endIdx) {
197
+ if (type === "Text") {
198
+ htmlStructure += `<${tagName} ${url ? `href="${url}" rel="nofollow"` : ""} class="${className}">${text.substring(0, endOffset)}</${tagName}>${text.substring(endOffset, text.length)}`;
199
+ } else {
200
+ const childClassList = [...child.classList];
201
+ const originTag = getTagName(child);
202
+ if (hasClassName) {
203
+ if (childClassList.length === 1) {
204
+ htmlStructure += `${text.substring(0, endOffset)}<${originTag.name} ${originTag.href ? `href="${originTag.href}" rel="nofollow"` : ""} class="${className}">${text.substring(endOffset, text.length)}</${originTag.name}>`;
205
+ } else {
206
+ const classIdx = childClassList.indexOf(className);
207
+ const newClassList = [...child.classList];
208
+ newClassList.splice(classIdx, 1);
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}>`;
211
+ }
212
+ } else {
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}>`;
215
+ }
216
+ }
217
+ } else {
218
+ if (type === "Text") {
219
+ htmlStructure += child.textContent;
220
+ } else {
221
+ htmlStructure += child.outerHTML;
222
+ }
223
+ }
224
+ });
225
+ editableElement.innerHTML = htmlStructure;
226
+ setTimeout(() => {
227
+ const $target2 = editableElement.childNodes[endIdx + 1];
228
+ const length = $target2.textContent.length;
229
+ setCursor($target2, length);
230
+ }, 100);
231
+ }
232
+ } else {
233
+ if (startNode.constructor.name === "Text") {
234
+ const parentNode = startNode.parentNode;
235
+ const parentNodeClassList = [...parentNode.classList];
236
+ if (parentNodeClassList.indexOf(className) > -1) {
237
+ if (parentNodeClassList.length === 1) {
238
+ const textContent = parentNode.textContent;
239
+ parentNode.insertAdjacentText("afterend", textContent);
240
+ setCursor(getNextNode($target, parentNode), textContent.length);
241
+ parentNode.remove();
242
+ } else {
243
+ parentNode.classList.remove(className);
244
+ }
245
+ } else {
246
+ parentNode.classList.add(className);
247
+ }
248
+ } else {
249
+ startNode.classList.toggle(className);
250
+ }
251
+ }
252
+ }
253
+ return originData;
254
+ }
255
+ export function styleSettings({
256
+ kind,
257
+ blockData,
258
+ $target,
259
+ url,
260
+ cursorData
261
+ }) {
262
+ let rawData = blockData;
263
+ switch (kind) {
264
+ case "alignLeft":
265
+ rawData.classList = arrangementAlignClass(rawData.classList, "d-align-left");
266
+ break;
267
+ case "alignCenter":
268
+ rawData.classList = arrangementAlignClass(rawData.classList, "d-align-center");
269
+ break;
270
+ case "alignRight":
271
+ rawData.classList = arrangementAlignClass(rawData.classList, "d-align-right");
272
+ break;
273
+ case "decorationBold":
274
+ rawData = defaultDecorationMake(
275
+ {
276
+ originData: rawData,
277
+ $target,
278
+ className: "d-deco-bold",
279
+ parentCursorData: cursorData
280
+ }
281
+ );
282
+ break;
283
+ case "decorationItalic":
284
+ rawData = defaultDecorationMake(
285
+ {
286
+ originData: rawData,
287
+ $target,
288
+ className: "d-deco-italic",
289
+ parentCursorData: cursorData
290
+ }
291
+ );
292
+ break;
293
+ case "decorationUnderline":
294
+ rawData = defaultDecorationMake(
295
+ {
296
+ originData: rawData,
297
+ $target,
298
+ className: "d-deco-underline",
299
+ parentCursorData: cursorData
300
+ }
301
+ );
302
+ break;
303
+ case "decorationStrikethrough":
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
+ });
331
+ break;
332
+ default:
333
+ rawData = defaultDecorationMake(
334
+ {
335
+ originData: rawData,
336
+ $target,
337
+ className: kind,
338
+ parentCursorData: cursorData
339
+ }
340
+ );
341
+ }
342
+ return rawData;
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
+ }