@syncfusion/ej2-richtexteditor 21.2.9 → 22.1.34

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 (147) hide show
  1. package/.eslintrc.json +1 -0
  2. package/CHANGELOG.md +30 -0
  3. package/dist/ej2-richtexteditor.min.js +2 -2
  4. package/dist/ej2-richtexteditor.umd.min.js +2 -2
  5. package/dist/ej2-richtexteditor.umd.min.js.map +1 -1
  6. package/dist/es6/ej2-richtexteditor.es2015.js +1592 -196
  7. package/dist/es6/ej2-richtexteditor.es2015.js.map +1 -1
  8. package/dist/es6/ej2-richtexteditor.es5.js +1605 -199
  9. package/dist/es6/ej2-richtexteditor.es5.js.map +1 -1
  10. package/dist/global/ej2-richtexteditor.min.js +2 -2
  11. package/dist/global/ej2-richtexteditor.min.js.map +1 -1
  12. package/dist/global/index.d.ts +1 -1
  13. package/package.json +12 -12
  14. package/src/common/config.js +2 -2
  15. package/src/common/constant.d.ts +6 -0
  16. package/src/common/constant.js +6 -0
  17. package/src/common/interface.d.ts +2 -2
  18. package/src/common/util.js +2 -0
  19. package/src/editor-manager/base/editor-manager.d.ts +4 -3
  20. package/src/editor-manager/base/editor-manager.js +6 -1
  21. package/src/editor-manager/base/interface.d.ts +44 -9
  22. package/src/editor-manager/plugin/clearformat.d.ts +1 -0
  23. package/src/editor-manager/plugin/clearformat.js +1 -0
  24. package/src/editor-manager/plugin/dom-node.js +10 -6
  25. package/src/editor-manager/plugin/emoji-picker-action.d.ts +8 -0
  26. package/src/editor-manager/plugin/emoji-picker-action.js +62 -0
  27. package/src/editor-manager/plugin/format-painter-actions.d.ts +19 -36
  28. package/src/editor-manager/plugin/format-painter-actions.js +224 -81
  29. package/src/editor-manager/plugin/inserthtml.js +6 -1
  30. package/src/editor-manager/plugin/link.js +1 -1
  31. package/src/editor-manager/plugin/ms-word-clean-up.d.ts +3 -0
  32. package/src/editor-manager/plugin/ms-word-clean-up.js +66 -14
  33. package/src/editor-manager/plugin/selection-commands.d.ts +2 -1
  34. package/src/editor-manager/plugin/selection-commands.js +48 -23
  35. package/src/editor-manager/plugin/table.js +2 -2
  36. package/src/editor-manager/plugin/toolbar-status.js +6 -0
  37. package/src/editor-manager/plugin/undo.d.ts +1 -0
  38. package/src/editor-manager/plugin/undo.js +26 -5
  39. package/src/editor-manager/plugin.d.ts +1 -0
  40. package/src/editor-manager/plugin.js +1 -0
  41. package/src/global.js +1 -1
  42. package/src/rich-text-editor/actions/base-quick-toolbar.js +10 -3
  43. package/src/rich-text-editor/actions/base-toolbar.js +3 -2
  44. package/src/rich-text-editor/actions/emoji-picker.d.ts +48 -0
  45. package/src/rich-text-editor/actions/emoji-picker.js +778 -0
  46. package/src/rich-text-editor/actions/enter-key.js +2 -2
  47. package/src/rich-text-editor/actions/execute-command-callback.js +3 -1
  48. package/src/rich-text-editor/actions/file-manager.js +1 -0
  49. package/src/rich-text-editor/actions/format-painter.d.ts +2 -2
  50. package/src/rich-text-editor/actions/format-painter.js +11 -9
  51. package/src/rich-text-editor/actions/full-screen.js +6 -0
  52. package/src/rich-text-editor/actions/html-editor.js +17 -3
  53. package/src/rich-text-editor/actions/paste-clean-up.js +1 -0
  54. package/src/rich-text-editor/actions/resize.js +1 -1
  55. package/src/rich-text-editor/actions.d.ts +1 -0
  56. package/src/rich-text-editor/actions.js +1 -0
  57. package/src/rich-text-editor/base/constant.d.ts +10 -0
  58. package/src/rich-text-editor/base/constant.js +10 -0
  59. package/src/rich-text-editor/base/enum.d.ts +0 -4
  60. package/src/rich-text-editor/base/interface.d.ts +48 -6
  61. package/src/rich-text-editor/base/rich-text-editor-model.d.ts +13 -7
  62. package/src/rich-text-editor/base/rich-text-editor.d.ts +27 -7
  63. package/src/rich-text-editor/base/rich-text-editor.js +42 -12
  64. package/src/rich-text-editor/base/util.js +2 -2
  65. package/src/rich-text-editor/formatter/formatter.js +7 -5
  66. package/src/rich-text-editor/models/default-locale.js +14 -2
  67. package/src/rich-text-editor/models/items.d.ts +2 -1
  68. package/src/rich-text-editor/models/items.js +188 -1
  69. package/src/rich-text-editor/models/toolbar-settings-model.d.ts +212 -9
  70. package/src/rich-text-editor/models/toolbar-settings.d.ts +209 -11
  71. package/src/rich-text-editor/models/toolbar-settings.js +23 -6
  72. package/src/rich-text-editor/renderer/audio-module.js +3 -3
  73. package/src/rich-text-editor/renderer/iframe-content-renderer.js +1 -1
  74. package/src/rich-text-editor/renderer/image-module.js +11 -6
  75. package/src/rich-text-editor/renderer/toolbar-renderer.d.ts +2 -0
  76. package/src/rich-text-editor/renderer/toolbar-renderer.js +7 -2
  77. package/src/rich-text-editor/renderer/video-module.js +14 -9
  78. package/styles/bootstrap-dark.css +299 -137
  79. package/styles/bootstrap.css +305 -140
  80. package/styles/bootstrap4.css +304 -133
  81. package/styles/bootstrap5-dark.css +310 -165
  82. package/styles/bootstrap5.css +310 -165
  83. package/styles/fabric-dark.css +297 -136
  84. package/styles/fabric.css +294 -133
  85. package/styles/fluent-dark.css +311 -170
  86. package/styles/fluent.css +311 -170
  87. package/styles/highcontrast-light.css +289 -128
  88. package/styles/highcontrast.css +296 -135
  89. package/styles/material-dark.css +295 -129
  90. package/styles/material.css +300 -134
  91. package/styles/material3-dark.css +3082 -0
  92. package/styles/material3-dark.scss +3 -0
  93. package/styles/material3.css +3138 -0
  94. package/styles/material3.scss +3 -0
  95. package/styles/rich-text-editor/_bootstrap-dark-definition.scss +54 -12
  96. package/styles/rich-text-editor/_bootstrap-definition.scss +57 -13
  97. package/styles/rich-text-editor/_bootstrap4-definition.scss +50 -7
  98. package/styles/rich-text-editor/_bootstrap5-definition.scss +56 -13
  99. package/styles/rich-text-editor/_fabric-dark-definition.scss +53 -10
  100. package/styles/rich-text-editor/_fabric-definition.scss +52 -9
  101. package/styles/rich-text-editor/_fluent-definition.scss +56 -15
  102. package/styles/rich-text-editor/_fusionnew-definition.scss +46 -4
  103. package/styles/rich-text-editor/_highcontrast-definition.scss +52 -9
  104. package/styles/rich-text-editor/_highcontrast-light-definition.scss +48 -5
  105. package/styles/rich-text-editor/_layout.scss +280 -68
  106. package/styles/rich-text-editor/_material-dark-definition.scss +48 -5
  107. package/styles/rich-text-editor/_material-definition.scss +50 -6
  108. package/styles/rich-text-editor/_material3-dark-definition.scss +1 -0
  109. package/styles/rich-text-editor/_material3-definition.scss +262 -0
  110. package/styles/rich-text-editor/_tailwind-definition.scss +63 -23
  111. package/styles/rich-text-editor/_theme.scss +103 -19
  112. package/styles/rich-text-editor/bootstrap-dark.css +299 -137
  113. package/styles/rich-text-editor/bootstrap.css +305 -140
  114. package/styles/rich-text-editor/bootstrap4.css +304 -133
  115. package/styles/rich-text-editor/bootstrap5-dark.css +310 -165
  116. package/styles/rich-text-editor/bootstrap5.css +310 -165
  117. package/styles/rich-text-editor/fabric-dark.css +297 -136
  118. package/styles/rich-text-editor/fabric.css +294 -133
  119. package/styles/rich-text-editor/fluent-dark.css +311 -170
  120. package/styles/rich-text-editor/fluent.css +311 -170
  121. package/styles/rich-text-editor/highcontrast-light.css +289 -128
  122. package/styles/rich-text-editor/highcontrast.css +296 -135
  123. package/styles/rich-text-editor/icons/_bootstrap-dark.scss +1 -1
  124. package/styles/rich-text-editor/icons/_bootstrap.scss +1 -1
  125. package/styles/rich-text-editor/icons/_bootstrap4.scss +1 -1
  126. package/styles/rich-text-editor/icons/_bootstrap5.scss +1 -1
  127. package/styles/rich-text-editor/icons/_fabric-dark.scss +1 -1
  128. package/styles/rich-text-editor/icons/_fabric.scss +1 -1
  129. package/styles/rich-text-editor/icons/_fluent.scss +1 -1
  130. package/styles/rich-text-editor/icons/_fusionnew.scss +1 -1
  131. package/styles/rich-text-editor/icons/_highcontrast-light.scss +1 -1
  132. package/styles/rich-text-editor/icons/_highcontrast.scss +1 -1
  133. package/styles/rich-text-editor/icons/_material-dark.scss +1 -1
  134. package/styles/rich-text-editor/icons/_material.scss +1 -1
  135. package/styles/rich-text-editor/icons/_material3-dark.scss +1 -0
  136. package/styles/rich-text-editor/icons/_material3.scss +1 -1
  137. package/styles/rich-text-editor/icons/_tailwind.scss +1 -1
  138. package/styles/rich-text-editor/material-dark.css +295 -129
  139. package/styles/rich-text-editor/material.css +300 -134
  140. package/styles/rich-text-editor/material3-dark.css +3082 -0
  141. package/styles/rich-text-editor/material3-dark.scss +5 -0
  142. package/styles/rich-text-editor/material3.css +3138 -0
  143. package/styles/rich-text-editor/material3.scss +5 -0
  144. package/styles/rich-text-editor/tailwind-dark.css +313 -157
  145. package/styles/rich-text-editor/tailwind.css +313 -157
  146. package/styles/tailwind-dark.css +313 -157
  147. package/styles/tailwind.css +313 -157
@@ -3,6 +3,7 @@ import * as EVENTS from '../../common/constant';
3
3
  import { SelectionCommands } from '../plugin';
4
4
  var FormatPainterActions = /** @class */ (function () {
5
5
  function FormatPainterActions(parent, options) {
6
+ this.INVALID_TAGS = ['A', 'AUDIO', 'IMG', 'VIDEO', 'IFRAME'];
6
7
  this.parent = parent;
7
8
  this.settings = options;
8
9
  this.addEventListener();
@@ -10,8 +11,43 @@ var FormatPainterActions = /** @class */ (function () {
10
11
  }
11
12
  FormatPainterActions.prototype.addEventListener = function () {
12
13
  this.parent.observer.on(EVENTS.FORMAT_PAINTER_ACTIONS, this.actionHandler, this);
14
+ this.parent.observer.on(EVENTS.MODEL_CHANGED_PLUGIN, this.onPropertyChanged, this);
15
+ };
16
+ FormatPainterActions.prototype.onPropertyChanged = function (prop) {
17
+ if (prop && prop.module === 'formatPainter') {
18
+ if (!isNOU(prop.newProp.formatPainterSettings.allowedFormats)) {
19
+ this.settings.allowedFormats = prop.newProp.formatPainterSettings.allowedFormats;
20
+ }
21
+ if (!isNOU(prop.newProp.formatPainterSettings.deniedFormats)) {
22
+ this.settings.deniedFormats = prop.newProp.formatPainterSettings.deniedFormats;
23
+ this.setDeniedFormats();
24
+ }
25
+ }
26
+ };
27
+ FormatPainterActions.prototype.removeEventListener = function () {
28
+ this.parent.observer.off(EVENTS.FORMAT_PAINTER_ACTIONS, this.actionHandler);
29
+ this.parent.observer.off(EVENTS.MODEL_CHANGED_PLUGIN, this.onPropertyChanged);
30
+ };
31
+ /**
32
+ * Destroys the format painter.
33
+ *
34
+ * @function destroy
35
+ * @returns {void}
36
+ * @hidden
37
+
38
+ */
39
+ FormatPainterActions.prototype.destroy = function () {
40
+ this.removeEventListener();
41
+ this.INVALID_TAGS = null;
42
+ this.copyCollection = null;
43
+ this.deniedFormatsCollection = null;
44
+ this.newElem = null;
45
+ this.newElemLastChild = null;
46
+ this.settings = null;
47
+ this.parent = null;
13
48
  };
14
49
  FormatPainterActions.prototype.actionHandler = function (args) {
50
+ this.settings.allowedContext = ['Text', 'List', 'Table'];
15
51
  if (!isNOU(args) && !isNOU(args.item) && !isNOU(args.item.formatPainterAction)) {
16
52
  switch (args.item.formatPainterAction) {
17
53
  case 'format-copy':
@@ -24,6 +60,19 @@ var FormatPainterActions = /** @class */ (function () {
24
60
  this.escapeAction();
25
61
  break;
26
62
  }
63
+ this.callBack(args);
64
+ }
65
+ };
66
+ FormatPainterActions.prototype.callBack = function (event) {
67
+ if (event.callBack) {
68
+ event.callBack({
69
+ requestType: 'FormatPainter',
70
+ action: event.item.formatPainterAction,
71
+ event: event.event,
72
+ editorMode: 'HTML',
73
+ range: this.parent.nodeSelection.getRange(this.parent.currentDocument),
74
+ elements: this.parent.nodeSelection.getSelectedNodes(this.parent.currentDocument)
75
+ });
27
76
  }
28
77
  };
29
78
  FormatPainterActions.prototype.generateElement = function () {
@@ -78,7 +127,6 @@ var FormatPainterActions = /** @class */ (function () {
78
127
  return;
79
128
  }
80
129
  this.insertFormatNode(this.newElem, this.newElemLastChild);
81
- this.parent.undoRedoManager.saveData();
82
130
  };
83
131
  FormatPainterActions.prototype.removeDeniedFormats = function (parentElement) {
84
132
  if (!isNOU(this.deniedFormatsCollection) && this.deniedFormatsCollection.length > 0) {
@@ -127,13 +175,23 @@ var FormatPainterActions = /** @class */ (function () {
127
175
  FormatPainterActions.prototype.copyAction = function () {
128
176
  var copyCollection = [];
129
177
  var range = this.parent.nodeSelection.getRange(document);
130
- var parentElem = range.startContainer.parentElement;
178
+ var domSelection = this.parent.nodeSelection;
179
+ var nodes = range.collapsed ? domSelection.getSelectionNodeCollection(range) :
180
+ domSelection.getSelectionNodeCollectionBr(range);
181
+ if (nodes.length === 0 && domSelection.getSelectionNodeCollectionBr(range).length === 0) {
182
+ return;
183
+ }
184
+ else {
185
+ nodes = nodes.length === 0 ? domSelection.getSelectionNodeCollectionBr(range) : nodes;
186
+ }
187
+ var parentElem = nodes[0].parentElement;
131
188
  var currentContext = this.findCurrentContext(parentElem);
132
- var allowedRulesArray = this.settings.allowedFormats.split(';');
189
+ var allowedRulesArray = this.settings.allowedFormats.indexOf(';') > -1 ? this.settings.allowedFormats.split(';') :
190
+ [this.settings.allowedFormats];
133
191
  for (var i = 0; i < allowedRulesArray.length; i++) {
134
192
  allowedRulesArray[i] = allowedRulesArray[i].trim();
135
193
  }
136
- var _a = this.getRangeParentElem(currentContext, range), rangeParentElem = _a[0], context = _a[1];
194
+ var _a = this.getRangeParentElem(currentContext, parentElem), rangeParentElem = _a[0], context = _a[1];
137
195
  if (currentContext === null) {
138
196
  currentContext = context;
139
197
  }
@@ -178,8 +236,8 @@ var FormatPainterActions = /** @class */ (function () {
178
236
  }
179
237
  this.generateElement();
180
238
  };
181
- FormatPainterActions.prototype.getRangeParentElem = function (currentContext, range) {
182
- var startContainer = range.startContainer;
239
+ FormatPainterActions.prototype.getRangeParentElem = function (currentContext, rangeParent) {
240
+ var startContainer = rangeParent;
183
241
  var rangeParentELem;
184
242
  if (startContainer.nodeType === 3) {
185
243
  startContainer = startContainer.parentElement;
@@ -199,7 +257,7 @@ var FormatPainterActions = /** @class */ (function () {
199
257
  break;
200
258
  }
201
259
  if (isNOU(rangeParentELem)) {
202
- var nearBlockParentName = this.getNearestBlockParentElement(range);
260
+ var nearBlockParentName = this.getNearestBlockParentElement(rangeParent);
203
261
  if (!isNOU(nearBlockParentName) && nearBlockParentName !== 'UL' &&
204
262
  nearBlockParentName !== 'OL' && nearBlockParentName !== 'LI') {
205
263
  rangeParentELem = closest(startContainer, nearBlockParentName);
@@ -211,8 +269,8 @@ var FormatPainterActions = /** @class */ (function () {
211
269
  }
212
270
  return [rangeParentELem, currentContext];
213
271
  };
214
- FormatPainterActions.prototype.getNearestBlockParentElement = function (range) {
215
- var node = range.commonAncestorContainer;
272
+ FormatPainterActions.prototype.getNearestBlockParentElement = function (rangeParent) {
273
+ var node = rangeParent;
216
274
  if (node.nodeType === 3) {
217
275
  node = node.parentNode;
218
276
  }
@@ -255,29 +313,32 @@ var FormatPainterActions = /** @class */ (function () {
255
313
  }
256
314
  };
257
315
  FormatPainterActions.prototype.validateELementTag = function (node) {
258
- var INVALID_TAGS = ['A', 'AUDIO', 'IMG', 'VIDEO', 'IFRAME'];
259
316
  if (node.nodeType === 3) {
260
317
  node = node.parentElement;
261
318
  }
262
- return INVALID_TAGS.indexOf(node.tagName) > -1;
319
+ return this.INVALID_TAGS.indexOf(node.tagName) > -1;
263
320
  };
264
321
  FormatPainterActions.prototype.findCurrentContext = function (parentElem) {
265
- if (closest(parentElem, 'td') || closest(parentElem, 'tr') || closest(parentElem, 'tbody')) {
266
- return 'Table';
322
+ if (closest(parentElem, 'p')) {
323
+ return 'Text';
267
324
  }
268
325
  else if (closest(parentElem, 'li')) {
269
326
  return 'List';
270
327
  }
271
- else if (closest(parentElem, 'p')) {
272
- return 'Text';
328
+ else if (closest(parentElem, 'td') || closest(parentElem, 'tr') || closest(parentElem, 'th')) {
329
+ return 'Table';
273
330
  }
274
331
  return null;
275
332
  };
276
333
  FormatPainterActions.prototype.insertFormatNode = function (elem, lastChild) {
334
+ var clonedElem = elem.cloneNode(true);
335
+ if (!this.isBlockElement(elem)) {
336
+ var newBlockElem = createElement('P');
337
+ newBlockElem.appendChild(elem);
338
+ clonedElem = newBlockElem.cloneNode(true);
339
+ }
277
340
  var endNode = this.parent.editableElement;
278
341
  var docElement = this.parent.currentDocument;
279
- var domSelection = this.parent.nodeSelection;
280
- var clonedElem = elem.cloneNode(true);
281
342
  var childElem = clonedElem.firstChild;
282
343
  var inlineElement;
283
344
  while (childElem) {
@@ -294,107 +355,183 @@ var FormatPainterActions = /** @class */ (function () {
294
355
  lastChild: lastChild
295
356
  };
296
357
  SelectionCommands.applyFormat(docElement, null, endNode, 'P', 'formatPainter', null, formatValues);
297
- var isFullNodeSelected;
298
358
  var range = this.parent.nodeSelection.getRange(docElement);
299
359
  var isCollapsed = range.collapsed;
300
- var nodes = range.collapsed ? domSelection.getSelectionNodeCollection(range) :
301
- domSelection.getSelectionNodeCollectionBr(range);
302
- if (nodes.length === 1) {
303
- while (!this.isBlockElement(nodes[0])) {
304
- nodes[0] = nodes[0].parentElement;
305
- }
306
- isFullNodeSelected = nodes[0].textContent.trim() === range.commonAncestorContainer.wholeText.trim();
360
+ var blockNodes = this.parent.domNode.blockNodes();
361
+ var isFullNodeSelected = false;
362
+ if (blockNodes.length === 1) {
363
+ isFullNodeSelected = blockNodes[0].textContent.trim() === range.toString().trim();
307
364
  }
308
- if (this.isBlockElement(elem) && isCollapsed || nodes.length > 1 || isFullNodeSelected) {
309
- this.insertBlockNode(elem, range, docElement, endNode, nodes);
365
+ if (this.isBlockElement(clonedElem) && isCollapsed || blockNodes.length > 1 || isFullNodeSelected) {
366
+ this.insertBlockNode(clonedElem, range, docElement, blockNodes);
310
367
  }
311
368
  };
312
- FormatPainterActions.prototype.insertBlockNode = function (element, range, docElement, endNode, nodes) {
369
+ FormatPainterActions.prototype.insertBlockNode = function (element, range, docElement, nodes) {
313
370
  var domSelection = this.parent.nodeSelection;
371
+ var saveSelection = domSelection.save(range, docElement);
372
+ this.parent.domNode.setMarker(saveSelection);
314
373
  var listElement; // To clone to multiple list elements
315
374
  var cloneListParentNode;
375
+ var sameListType = false;
316
376
  if (element.nodeName === 'UL' || element.nodeName === 'OL') {
317
377
  cloneListParentNode = element.cloneNode(true);
318
378
  listElement = cloneListParentNode.firstChild;
319
379
  }
320
- var textNode = range.startContainer; // To set cursor position
380
+ var cloneElementNode = isNOU(cloneListParentNode) ? element : element.firstChild;
321
381
  for (var index = 0; index < nodes.length; index++) {
322
- var lastTextNode = nodes[index];
323
- if (nodes[index].nodeType === 3) {
324
- nodes[index] = nodes[index].parentElement;
325
- }
326
- while (!this.isBlockElement(nodes[index])) {
327
- nodes[index] = nodes[index].parentElement;
328
- }
329
- var cloneParentNode = void 0;
330
- if (!isNOU(cloneListParentNode)) {
331
- cloneParentNode = listElement.cloneNode(true);
332
- }
333
- else {
334
- cloneParentNode = element.cloneNode(true);
382
+ if (this.INVALID_TAGS.indexOf(nodes[index].nodeName) > -1 ||
383
+ nodes[index].querySelectorAll('a,img,audio,video,iframe').length > 0) {
384
+ continue;
335
385
  }
386
+ var cloneParentNode = cloneElementNode.cloneNode(false);
336
387
  // Appending all the child elements
337
388
  while (nodes[index].firstChild) {
338
- if (cloneParentNode.nodeName === 'LI') {
389
+ if (nodes[index].textContent.trim().length !== 0) {
339
390
  cloneParentNode.appendChild(nodes[index].firstChild);
340
391
  }
341
392
  else {
342
- // Except list nodes other block nodes replaced here
343
- if (nodes[index].nodeType === 3) {
344
- cloneParentNode.appendChild(nodes[index].firstChild);
345
- }
346
- else {
347
- cloneParentNode.innerHTML = nodes[index].innerHTML;
348
- nodes[index].innerHTML = '';
349
- }
350
- nodes[index] = nodes[index].parentNode.replaceChild(cloneParentNode, nodes[index]);
393
+ nodes[index].removeChild(nodes[index].firstChild);
351
394
  }
352
395
  }
353
- if (cloneParentNode.nodeName === 'LI') {
354
- // Appending the li nodes to the ol or ul node
355
- cloneListParentNode.append(cloneParentNode);
356
- if (index === 0) {
357
- var nodeName = nodes[index].nodeName;
358
- nodes[index] = nodes[index].parentNode.replaceChild(cloneListParentNode, nodes[index]);
359
- var parent_1 = nodeName === 'LI' ? cloneListParentNode.parentElement
360
- : cloneListParentNode;
361
- // Splicing and then inserting the node to previous element sibling of the Listparent.parent
362
- this.parent.nodeCutter.SplitNode(range, parent_1, true);
363
- if (!isNOU(parent_1.previousElementSibling)) {
364
- parent_1.parentNode.insertBefore(cloneListParentNode, parent_1.nextElementSibling);
365
- }
366
- else {
367
- parent_1.parentElement.insertBefore(cloneListParentNode, parent_1);
368
- }
396
+ if (nodes[index].nodeName === 'TD' || nodes[index].nodeName === 'TH') {
397
+ if (isNOU(cloneListParentNode)) {
398
+ nodes[index].appendChild(cloneParentNode);
399
+ continue;
400
+ }
401
+ else if (index === 0 && !isNOU(cloneListParentNode)) {
402
+ nodes[index].appendChild(cloneListParentNode);
403
+ cloneListParentNode.appendChild(cloneParentNode);
404
+ continue;
405
+ }
406
+ else {
407
+ nodes[index].appendChild(cloneParentNode);
408
+ continue;
369
409
  }
370
- detach(nodes[index]);
410
+ }
411
+ if (!isNOU(cloneListParentNode)) {
412
+ sameListType = this.isSameListType(element, nodes[index]);
413
+ }
414
+ if (cloneParentNode.nodeName === 'LI' && !sameListType) {
415
+ this.insertNewList(range, nodes, index, cloneListParentNode, cloneParentNode);
416
+ }
417
+ else if (sameListType) {
418
+ this.insertSameList(nodes, index, cloneListParentNode, cloneParentNode);
419
+ }
420
+ else {
421
+ nodes[index].parentNode.replaceChild(cloneParentNode, nodes[index]);
371
422
  }
372
423
  /**Removing the inserted block node in list and appending to previous element sibling */
373
424
  if (cloneParentNode.nodeName !== 'LI' && (cloneParentNode.parentElement.nodeName === 'OL' ||
374
425
  cloneParentNode.parentElement.nodeName === 'UL')) {
375
- var parent_2 = cloneParentNode.parentElement;
426
+ var parent_1 = cloneParentNode.parentElement;
376
427
  // Cutting single ul or ol to two ul or ol based on the range
377
- this.parent.nodeCutter.SplitNode(range, parent_2, true);
378
- if (!isNOU(parent_2.previousElementSibling)) {
379
- parent_2.previousElementSibling.after(cloneParentNode);
428
+ this.parent.nodeCutter.SplitNode(range, parent_1, true);
429
+ if (!isNOU(parent_1.previousElementSibling)) {
430
+ parent_1.previousElementSibling.after(cloneParentNode);
431
+ // To remove the nested list items out of the block element
432
+ if (cloneParentNode.childNodes.length > 1) {
433
+ for (var j = 0; j < cloneParentNode.childNodes.length; j++) {
434
+ var currentChild = cloneParentNode.childNodes[j];
435
+ if (currentChild.nodeName === 'OL' || currentChild.nodeName === 'UL') {
436
+ cloneParentNode.after(currentChild);
437
+ }
438
+ }
439
+ }
380
440
  }
381
441
  else {
382
- parent_2.parentElement.prepend(cloneParentNode);
442
+ parent_1.parentElement.prepend(cloneParentNode);
383
443
  }
384
444
  }
385
- nodes[index] = lastTextNode;
386
445
  }
387
446
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions
388
447
  !isNOU(listElement) ? detach(listElement) : false;
389
448
  this.cleanEmptyLists();
390
- if (nodes.length > 1) {
391
- var startSelectNode = nodes[0];
392
- var endSelectNode = nodes[nodes.length - 1];
393
- domSelection.setSelectionText(docElement, startSelectNode, endSelectNode, 0, endSelectNode.textContent.length);
449
+ var save = this.parent.domNode.saveMarker(saveSelection, null);
450
+ save.restore();
451
+ };
452
+ FormatPainterActions.prototype.insertNewList = function (range, nodes, index, cloneListParentNode, cloneParentNode) {
453
+ // Appending the li nodes to the ol or ul node
454
+ if (index === 0) {
455
+ var nodeName = nodes[index].nodeName;
456
+ nodes[index] = nodes[index].parentNode.replaceChild(cloneListParentNode, nodes[index]);
457
+ var parent_2 = nodeName === 'LI' ? cloneListParentNode.parentElement
458
+ : cloneListParentNode;
459
+ // Splicing and then inserting the node to previous element sibling of the Listparent.parent
460
+ this.parent.nodeCutter.SplitNode(range, parent_2, true);
461
+ if (nodes[index].nodeName === 'LI' && !isNOU(parent_2)) {
462
+ cloneListParentNode.append(cloneParentNode);
463
+ if (!isNOU(parent_2.parentNode)) {
464
+ parent_2.parentNode.insertBefore(cloneListParentNode, parent_2);
465
+ }
466
+ }
467
+ else {
468
+ if (!isNOU(parent_2)) {
469
+ if (!isNOU(parent_2.previousElementSibling) && parent_2.previousElementSibling.nodeName === cloneListParentNode.nodeName) {
470
+ var currentParent = parent_2.previousElementSibling;
471
+ currentParent.append(cloneParentNode);
472
+ while (currentParent.firstChild) {
473
+ cloneListParentNode.append(currentParent.firstChild);
474
+ }
475
+ }
476
+ else if (!isNOU(parent_2.nextElementSibling) && parent_2.nextElementSibling.nodeName === cloneListParentNode.nodeName) {
477
+ var currentParent = parent_2.nextElementSibling;
478
+ currentParent.prepend(cloneParentNode);
479
+ while (currentParent.firstChild) {
480
+ cloneListParentNode.append(currentParent.firstChild);
481
+ }
482
+ }
483
+ else {
484
+ cloneListParentNode.append(cloneParentNode);
485
+ }
486
+ }
487
+ else {
488
+ cloneListParentNode.append(cloneParentNode);
489
+ }
490
+ }
491
+ }
492
+ else {
493
+ cloneListParentNode.append(cloneParentNode);
494
+ }
495
+ this.detachEmptyBlockNodes(nodes[index]);
496
+ };
497
+ FormatPainterActions.prototype.insertSameList = function (nodes, index, cloneListParentNode, cloneParentNode) {
498
+ if (index === 0) {
499
+ if (!isNOU(nodes[index].parentNode) && (nodes[index].parentNode.nodeName === 'UL' || nodes[index].parentNode.nodeName === 'OL')) {
500
+ // append the nodes[index].parentNode.childNodes to the clonelistparentnode
501
+ if (nodes.length === 1) {
502
+ // When clicked with cursor in the single list item
503
+ while (cloneParentNode.firstChild) {
504
+ nodes[index].append(cloneParentNode.firstChild);
505
+ }
506
+ for (var i = 0; i < nodes[index].parentNode.childNodes.length; i++) {
507
+ var currentChild = nodes[index].parentNode.childNodes[i];
508
+ cloneListParentNode.append(currentChild.cloneNode(true));
509
+ }
510
+ }
511
+ else {
512
+ cloneListParentNode.append(cloneParentNode);
513
+ }
514
+ // replace the older ol and ul with new ol and ul of clonelistparentnode
515
+ nodes[index].parentNode.parentNode.replaceChild(cloneListParentNode, nodes[index].parentNode);
516
+ }
394
517
  }
395
518
  else {
396
- domSelection.setCursorPoint(docElement, textNode, textNode.textContent.length);
519
+ cloneListParentNode.append(cloneParentNode);
520
+ }
521
+ this.detachEmptyBlockNodes(nodes[index]);
522
+ };
523
+ FormatPainterActions.prototype.isSameListType = function (element, node) {
524
+ var isSameListType = false;
525
+ var nearestListNode = closest(node, 'ol, ul');
526
+ if (!isNOU(nearestListNode) && nearestListNode.querySelectorAll('li').length > 0) {
527
+ if (nearestListNode.nodeName === element.nodeName) {
528
+ isSameListType = true;
529
+ }
530
+ else {
531
+ isSameListType = false;
532
+ }
397
533
  }
534
+ return isSameListType;
398
535
  };
399
536
  FormatPainterActions.prototype.cleanEmptyLists = function () {
400
537
  var listElem = this.parent.editableElement.querySelectorAll('ol, ul');
@@ -409,7 +546,8 @@ var FormatPainterActions = /** @class */ (function () {
409
546
  if (isNOU(this.settings) || isNOU(this.settings.deniedFormats)) {
410
547
  return;
411
548
  }
412
- var deniedFormats = this.settings.deniedFormats.split(';');
549
+ var deniedFormats = this.settings.deniedFormats.indexOf(';') > -1 ? this.settings.deniedFormats.split(';') :
550
+ [this.settings.deniedFormats];
413
551
  var length = deniedFormats.length;
414
552
  for (var i = 0; i < length; i++) {
415
553
  var formatString = deniedFormats[i];
@@ -423,6 +561,11 @@ var FormatPainterActions = /** @class */ (function () {
423
561
  }
424
562
  this.deniedFormatsCollection = deniedFormatsCollection;
425
563
  };
564
+ FormatPainterActions.prototype.detachEmptyBlockNodes = function (node) {
565
+ if (!isNOU(node) && node.textContent.trim() === '') {
566
+ detach(node);
567
+ }
568
+ };
426
569
  FormatPainterActions.prototype.makeDeniedFormatsCollection = function (value) {
427
570
  var openParenIndex = value.indexOf('(');
428
571
  var closeParenIndex = value.indexOf(')');
@@ -478,7 +478,12 @@ var InsertHtml = /** @class */ (function () {
478
478
  InsertHtml.removeEmptyElements = function (element) {
479
479
  var emptyElements = element.querySelectorAll(':empty');
480
480
  for (var i = 0; i < emptyElements.length; i++) {
481
- if (CONSTANT.SELF_CLOSING_TAGS.indexOf(emptyElements[i].tagName.toLowerCase()) < 0) {
481
+ var lineWithDiv = true;
482
+ if (emptyElements[i].tagName === 'DIV') {
483
+ lineWithDiv = emptyElements[i].style.borderBottom === 'none' ||
484
+ emptyElements[i].style.borderBottom === '' ? true : false;
485
+ }
486
+ if (CONSTANT.SELF_CLOSING_TAGS.indexOf(emptyElements[i].tagName.toLowerCase()) < 0 && lineWithDiv) {
482
487
  var detachableElement = this.findDetachEmptyElem(emptyElements[i]);
483
488
  if (!isNOU(detachableElement)) {
484
489
  detach(detachableElement);
@@ -75,7 +75,7 @@ var LinkCommand = /** @class */ (function () {
75
75
  var domSelection = new NodeSelection();
76
76
  var range = domSelection.getRange(this.parent.currentDocument);
77
77
  if (range.endContainer.nodeName === '#text' && range.startContainer.textContent.length === (range.endOffset + 1) &&
78
- range.endContainer.textContent.charAt(range.endOffset) === ' ' && range.endContainer.nextSibling.nodeName === 'A') {
78
+ range.endContainer.textContent.charAt(range.endOffset) === ' ' && (!isNOU(range.endContainer.nextSibling) && range.endContainer.nextSibling.nodeName === 'A')) {
79
79
  domSelection.setSelectionText(this.parent.currentDocument, range.startContainer, range.endContainer, range.startOffset, range.endOffset + 1);
80
80
  range = domSelection.getRange(this.parent.currentDocument);
81
81
  }
@@ -20,6 +20,9 @@ export declare class MsWordPaste {
20
20
  private listContents;
21
21
  private addEventListener;
22
22
  private wordCleanup;
23
+ private cleanList;
24
+ private insertAfter;
25
+ private findClosestListElem;
23
26
  private addListClass;
24
27
  private addTableBorderClass;
25
28
  private imageConversion;
@@ -73,6 +73,8 @@ var MsWordPaste = /** @class */ (function () {
73
73
  listNodes[0].parentElement.tagName !== 'OL') {
74
74
  this.listConverter(listNodes);
75
75
  }
76
+ this.cleanList(elm, 'UL');
77
+ this.cleanList(elm, 'OL');
76
78
  this.styleCorrection(elm, wordPasteStyleConfig);
77
79
  this.removingComments(elm);
78
80
  this.removeUnwantedElements(elm);
@@ -98,11 +100,38 @@ var MsWordPaste = /** @class */ (function () {
98
100
  e.callBack(elm.innerHTML);
99
101
  }
100
102
  };
103
+ MsWordPaste.prototype.cleanList = function (elm, listTag) {
104
+ var replacableElem = elm.querySelectorAll(listTag + ' div');
105
+ for (var j = replacableElem.length - 1; j >= 0; j--) {
106
+ var parentElem = replacableElem[j].parentNode;
107
+ while (replacableElem[j].firstChild) {
108
+ parentElem.insertBefore(replacableElem[j].firstChild, replacableElem[j]);
109
+ }
110
+ var closestListElem = this.findClosestListElem(replacableElem[j]);
111
+ if (closestListElem) {
112
+ this.insertAfter(replacableElem[j], closestListElem);
113
+ }
114
+ }
115
+ };
116
+ MsWordPaste.prototype.insertAfter = function (newNode, referenceNode) {
117
+ referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
118
+ };
119
+ MsWordPaste.prototype.findClosestListElem = function (listElem) {
120
+ var closestListElem;
121
+ while (!isNOU(listElem)) {
122
+ listElem = !isNOU(listElem.closest('ul')) && listElem.tagName !== 'UL' ?
123
+ listElem.closest('ul') : (listElem.tagName !== 'OL' ? listElem.closest('ol') : null);
124
+ closestListElem = !isNOU(listElem) ? listElem : closestListElem;
125
+ }
126
+ return closestListElem;
127
+ };
101
128
  MsWordPaste.prototype.addListClass = function (elm) {
102
129
  var allNodes = elm.querySelectorAll('*');
103
130
  for (var index = 0; index < allNodes.length; index++) {
104
131
  if (!isNOU(allNodes[index].getAttribute('style')) && allNodes[index].getAttribute('style').replace(/ /g, '').replace('\n', '').indexOf('mso-list:l') >= 0 &&
105
- allNodes[index].className.toLowerCase().indexOf('msolistparagraph') === -1 && allNodes[index].tagName.charAt(0) !== 'H') {
132
+ allNodes[index].className.toLowerCase().indexOf('msolistparagraph') === -1 &&
133
+ allNodes[index].tagName.charAt(0) !== 'H' && allNodes[index].tagName !== 'LI' &&
134
+ allNodes[index].tagName !== 'OL' && allNodes[index].tagName !== 'UL') {
106
135
  allNodes[index].classList.add('msolistparagraph');
107
136
  }
108
137
  }
@@ -131,7 +160,7 @@ var MsWordPaste = /** @class */ (function () {
131
160
  imgElem[i].getAttribute('v:shapes').indexOf('Picture') < 0 &&
132
161
  imgElem[i].getAttribute('v:shapes').indexOf('圖片') < 0 &&
133
162
  imgElem[i].getAttribute('v:shapes').indexOf('Grafik') < 0 &&
134
- imgElem[i].getAttribute('v:shapes').indexOf('Image') < 0 &&
163
+ imgElem[i].getAttribute('v:shapes').toLowerCase().indexOf('image') < 0 &&
135
164
  imgElem[i].getAttribute('v:shapes').indexOf('Graphic') < 0) {
136
165
  detach(imgElem[i]);
137
166
  }
@@ -226,7 +255,7 @@ var MsWordPaste = /** @class */ (function () {
226
255
  MsWordPaste.prototype.hexConversion = function (rtfData) {
227
256
  // eslint-disable-next-line
228
257
  var picHead = /\{\\pict[\s\S]+?\\bliptag\-?\d+(\\blipupi\-?\d+)?(\{\\\*\\blipuid\s?[\da-fA-F]+)?[\s\}]*?/;
229
- // eslint-disable-next-line
258
+ // eslint-disable-next-line security/detect-non-literal-regexp
230
259
  var pic = new RegExp('(?:(' + picHead.source + '))([\\da-fA-F\\s]+)\\}', 'g');
231
260
  var fullImg = rtfData.match(pic);
232
261
  var imgType;
@@ -290,9 +319,9 @@ var MsWordPaste = /** @class */ (function () {
290
319
  MsWordPaste.prototype.removeUnwantedElements = function (elm) {
291
320
  var innerElement = elm.innerHTML;
292
321
  for (var i = 0; i < this.removableElements.length; i++) {
293
- // eslint-disable-next-line
322
+ // eslint-disable-next-line security/detect-non-literal-regexp
294
323
  var regExpStartElem = new RegExp('<' + this.removableElements[i] + '>', 'g');
295
- // eslint-disable-next-line
324
+ // eslint-disable-next-line security/detect-non-literal-regexp
296
325
  var regExpEndElem = new RegExp('</' + this.removableElements[i] + '>', 'g');
297
326
  innerElement = innerElement.replace(regExpStartElem, '');
298
327
  innerElement = innerElement.replace(regExpEndElem, '');
@@ -335,9 +364,14 @@ var MsWordPaste = /** @class */ (function () {
335
364
  !isNOU(emptyElements[i].closest('td').querySelector('.MsoNormal'))) {
336
365
  emptyElements[i].innerHTML = '-';
337
366
  }
367
+ var lineWithDiv = true;
368
+ if (emptyElements[i].tagName === 'DIV') {
369
+ lineWithDiv = emptyElements[i].style.borderBottom === 'none' ||
370
+ emptyElements[i].style.borderBottom === '' ? true : false;
371
+ }
338
372
  if (emptyElements[i].tagName !== 'IMG' && emptyElements[i].tagName !== 'BR' &&
339
373
  emptyElements[i].tagName !== 'IFRAME' && emptyElements[i].tagName !== 'TD' &&
340
- emptyElements[i].tagName !== 'HR') {
374
+ emptyElements[i].tagName !== 'HR' && lineWithDiv) {
341
375
  var detachableElement = this.findDetachEmptyElem(emptyElements[i]);
342
376
  if (!isNOU(detachableElement)) {
343
377
  detach(detachableElement);
@@ -466,7 +500,6 @@ var MsWordPaste = /** @class */ (function () {
466
500
  elm.innerHTML = innerElement;
467
501
  };
468
502
  MsWordPaste.prototype.cleanUp = function (node, listNodes) {
469
- // eslint-disable-next-line
470
503
  var tempCleaner = [];
471
504
  var prevflagState;
472
505
  var allNodes = node.querySelectorAll('*');
@@ -667,7 +700,7 @@ var MsWordPaste = /** @class */ (function () {
667
700
  break;
668
701
  }
669
702
  }
670
- if (!isNOU(prevList) && index != 0 &&
703
+ if (!isNOU(prevList) && index !== 0 &&
671
704
  collection[index - 1].listType !== collection[index].listType &&
672
705
  !isNormalList) {
673
706
  prevList = null;
@@ -714,12 +747,31 @@ var MsWordPaste = /** @class */ (function () {
714
747
  temp.style.listStyleType = collection[index].listStyleTypeName;
715
748
  }
716
749
  else {
717
- root.appendChild(temp = createElement(collection[index].listType));
718
- prevList = createElement('li');
719
- prevList.appendChild(pElement);
720
- temp.appendChild(prevList);
721
- temp.setAttribute('level', collection[index].nestedLevel.toString());
722
- temp.style.listStyleType = collection[index].listStyleTypeName;
750
+ if (collection[index].nestedLevel > pLevel && isNormalList) {
751
+ var initialNode = void 0;
752
+ initialNode = createElement(collection[index].listType);
753
+ prevList = createElement('li');
754
+ initialNode.appendChild(prevList);
755
+ initialNode.style.listStyleType = 'none';
756
+ for (var j = 0; j < collection[index].nestedLevel - 1; j++) {
757
+ prevList.appendChild(temp = createElement(collection[index].listType));
758
+ prevList = createElement('li');
759
+ temp.appendChild(prevList);
760
+ temp.style.listStyleType = 'none';
761
+ }
762
+ prevList.appendChild(pElement);
763
+ root.appendChild(initialNode);
764
+ temp.setAttribute('level', collection[index].nestedLevel.toString());
765
+ temp.style.listStyleType = collection[index].listStyleTypeName;
766
+ }
767
+ else {
768
+ root.appendChild(temp = createElement(collection[index].listType));
769
+ prevList = createElement('li');
770
+ prevList.appendChild(pElement);
771
+ temp.appendChild(prevList);
772
+ temp.setAttribute('level', collection[index].nestedLevel.toString());
773
+ temp.style.listStyleType = collection[index].listStyleTypeName;
774
+ }
723
775
  }
724
776
  }
725
777
  else if (collection[index].nestedLevel === 1) {
@@ -1,4 +1,4 @@
1
- import { FormatPainterValue } from '../plugin';
1
+ import { FormatPainterValue } from '../base/interface';
2
2
  export declare class SelectionCommands {
3
3
  static enterAction: string;
4
4
  /**
@@ -28,4 +28,5 @@ export declare class SelectionCommands {
28
28
  private static GetFormatNode;
29
29
  private static updateStyles;
30
30
  private static insertFormatPainterElem;
31
+ private static formatPainterCleanup;
31
32
  }