jodit 4.15.6 → 4.15.7

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 (62) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/es2015/jodit.css +1 -1
  3. package/es2015/jodit.fat.min.js +3 -3
  4. package/es2015/jodit.js +64 -8
  5. package/es2015/jodit.min.js +3 -3
  6. package/es2015/plugins/debug/debug.css +1 -1
  7. package/es2015/plugins/debug/debug.js +1 -1
  8. package/es2015/plugins/debug/debug.min.js +1 -1
  9. package/es2015/plugins/speech-recognize/speech-recognize.css +1 -1
  10. package/es2015/plugins/speech-recognize/speech-recognize.js +1 -1
  11. package/es2015/plugins/speech-recognize/speech-recognize.min.js +1 -1
  12. package/es2018/jodit.fat.min.js +3 -3
  13. package/es2018/jodit.min.js +3 -3
  14. package/es2018/plugins/debug/debug.min.js +1 -1
  15. package/es2018/plugins/speech-recognize/speech-recognize.min.js +1 -1
  16. package/es2021/jodit.css +1 -1
  17. package/es2021/jodit.fat.min.js +3 -3
  18. package/es2021/jodit.js +63 -8
  19. package/es2021/jodit.min.js +3 -3
  20. package/es2021/plugins/debug/debug.css +1 -1
  21. package/es2021/plugins/debug/debug.js +1 -1
  22. package/es2021/plugins/debug/debug.min.js +1 -1
  23. package/es2021/plugins/speech-recognize/speech-recognize.css +1 -1
  24. package/es2021/plugins/speech-recognize/speech-recognize.js +1 -1
  25. package/es2021/plugins/speech-recognize/speech-recognize.min.js +1 -1
  26. package/es2021.en/jodit.css +1 -1
  27. package/es2021.en/jodit.fat.min.js +3 -3
  28. package/es2021.en/jodit.js +63 -8
  29. package/es2021.en/jodit.min.js +3 -3
  30. package/es2021.en/plugins/debug/debug.css +1 -1
  31. package/es2021.en/plugins/debug/debug.js +1 -1
  32. package/es2021.en/plugins/debug/debug.min.js +1 -1
  33. package/es2021.en/plugins/speech-recognize/speech-recognize.css +1 -1
  34. package/es2021.en/plugins/speech-recognize/speech-recognize.js +1 -1
  35. package/es2021.en/plugins/speech-recognize/speech-recognize.min.js +1 -1
  36. package/es5/jodit.css +2 -2
  37. package/es5/jodit.fat.min.js +2 -2
  38. package/es5/jodit.js +105 -42
  39. package/es5/jodit.min.css +2 -2
  40. package/es5/jodit.min.js +2 -2
  41. package/es5/plugins/debug/debug.css +1 -1
  42. package/es5/plugins/debug/debug.js +1 -1
  43. package/es5/plugins/debug/debug.min.js +1 -1
  44. package/es5/plugins/speech-recognize/speech-recognize.css +1 -1
  45. package/es5/plugins/speech-recognize/speech-recognize.js +1 -1
  46. package/es5/plugins/speech-recognize/speech-recognize.min.js +1 -1
  47. package/es5/polyfills.fat.min.js +1 -1
  48. package/es5/polyfills.js +1 -1
  49. package/es5/polyfills.min.js +1 -1
  50. package/esm/config.d.ts +10 -0
  51. package/esm/core/constants.js +1 -1
  52. package/esm/plugins/clean-html/clean-html.d.ts +7 -3
  53. package/esm/plugins/clean-html/clean-html.js +37 -0
  54. package/esm/plugins/clean-html/config.d.ts +10 -0
  55. package/esm/plugins/clean-html/config.js +1 -0
  56. package/esm/plugins/drag-and-drop-element/drag-and-drop-element.d.ts +1 -0
  57. package/esm/plugins/drag-and-drop-element/drag-and-drop-element.js +19 -4
  58. package/package.json +1 -1
  59. package/types/config.d.ts +10 -0
  60. package/types/plugins/clean-html/clean-html.d.ts +7 -3
  61. package/types/plugins/clean-html/config.d.ts +10 -0
  62. package/types/plugins/drag-and-drop-element/drag-and-drop-element.d.ts +1 -0
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * jodit - Jodit is an awesome and useful wysiwyg editor with filebrowser
3
3
  * Author: Chupurnov <chupurnov@gmail.com> (https://xdsoft.net/jodit/)
4
- * Version: v4.15.6
4
+ * Version: v4.15.7
5
5
  * Url: https://xdsoft.net/jodit/
6
6
  * License(s): MIT
7
7
  */
@@ -1779,7 +1779,7 @@ __webpack_require__.r(__webpack_exports__);
1779
1779
  * ```
1780
1780
  * @packageDocumentation
1781
1781
  * @module constants
1782
- */ const APP_VERSION = "4.15.6";
1782
+ */ const APP_VERSION = "4.15.7";
1783
1783
  // prettier-ignore
1784
1784
  const ES = "es2021";
1785
1785
  const IS_ES_MODERN = true;
@@ -28255,7 +28255,8 @@ jodit_core_ui_icon__WEBPACK_IMPORTED_MODULE_5__.Icon.set('class-span', (_class_s
28255
28255
 
28256
28256
  /**
28257
28257
  * Clean HTML after removeFormat and insertHorizontalRule command
28258
- */ class cleanHtml extends jodit_core_plugin_plugin__WEBPACK_IMPORTED_MODULE_7__.Plugin {
28258
+ */ const TRAILING_BR_BLOCKS = 'p, div, li, td, th, h1, h2, h3, h4, h5, h6, blockquote';
28259
+ class cleanHtml extends jodit_core_plugin_plugin__WEBPACK_IMPORTED_MODULE_7__.Plugin {
28259
28260
  /** @override */ afterInit(jodit) {}
28260
28261
  get isEditMode() {
28261
28262
  return !(this.j.isInDestruct || !this.j.isEditorMode() || this.j.getReadOnly());
@@ -28314,6 +28315,7 @@ jodit_core_ui_icon__WEBPACK_IMPORTED_MODULE_5__.Icon.set('class-span', (_class_s
28314
28315
  * opt-in via `cleanHTML.collapseEmptyValueToEmptyString`. See #1149
28315
28316
  */ onAfterGetValueFromEditor(data) {
28316
28317
  this.__singleQuotesInFontFamily(data);
28318
+ this.__removeTrailingBr(data);
28317
28319
  if (!this.j.o.cleanHTML.collapseEmptyValueToEmptyString) {
28318
28320
  return;
28319
28321
  }
@@ -28328,7 +28330,38 @@ jodit_core_ui_icon__WEBPACK_IMPORTED_MODULE_5__.Icon.set('class-span', (_class_s
28328
28330
  * `style="font-family: "Open Sans", …"` — broken markup. Single quotes
28329
28331
  * survive that round trip. Names that already contain an apostrophe are
28330
28332
  * left alone.
28331
- */ __singleQuotesInFontFamily(data) {
28333
+ */ /**
28334
+ * Drop a `<br>` that is the last node of a block (or of the value) and
28335
+ * follows other content — the caret placeholder browsers leave behind
28336
+ * after typing into an empty block. An empty block (`<p><br></p>`) and a
28337
+ * deliberate empty line (`text<br><br>`) are kept.
28338
+ */ __removeTrailingBr(data) {
28339
+ if (!this.j.o.cleanHTML.removeTrailingBr || !/<br/i.test(data.value)) {
28340
+ return;
28341
+ }
28342
+ const box = this.j.c.div();
28343
+ box.innerHTML = data.value;
28344
+ const blocks = [
28345
+ box,
28346
+ ...box.querySelectorAll(TRAILING_BR_BLOCKS)
28347
+ ];
28348
+ blocks.forEach((block)=>{
28349
+ const last = block.lastChild;
28350
+ if (!jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.isTag(last, 'br')) {
28351
+ return;
28352
+ }
28353
+ const prev = last.previousSibling;
28354
+ if (!prev || jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.isTag(prev, 'br')) {
28355
+ return;
28356
+ }
28357
+ if (jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.isText(prev) && !prev.nodeValue?.trim() && !prev.previousSibling) {
28358
+ return;
28359
+ }
28360
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.safeRemove(last);
28361
+ });
28362
+ data.value = box.innerHTML;
28363
+ }
28364
+ __singleQuotesInFontFamily(data) {
28332
28365
  if (!this.j.o.cleanHTML.singleQuotesInFontFamily || !data.value.includes('&quot;')) {
28333
28366
  return;
28334
28367
  }
@@ -28415,6 +28448,7 @@ jodit_config__WEBPACK_IMPORTED_MODULE_1__.Config.prototype.cleanHTML = {
28415
28448
  fillEmptyParagraph: true,
28416
28449
  collapseEmptyValueToEmptyString: false,
28417
28450
  singleQuotesInFontFamily: true,
28451
+ removeTrailingBr: false,
28418
28452
  replaceNBSP: true,
28419
28453
  replaceOldTags: {
28420
28454
  i: 'em',
@@ -30197,6 +30231,11 @@ var DragState = /*#__PURE__*/ (/* unused pure expression or super */ null && (fu
30197
30231
  this.state = 2;
30198
30232
  }
30199
30233
  this.j.e.fire('hidePopup hideResizer');
30234
+ // The ghost lives in the top document (position: fixed), but the
30235
+ // mousemove comes from the editor document. In iframe mode those are
30236
+ // different viewports, so the iframe's own offset has to be added or
30237
+ // the ghost trails the pointer by exactly that distance (#1455).
30238
+ const offset = this.__ghostOffset();
30200
30239
  if (!this.draggable.parentNode) {
30201
30240
  const target = (0,jodit_core_helpers__WEBPACK_IMPORTED_MODULE_5__.dataBind)(this.draggable, 'target');
30202
30241
  (0,jodit_core_helpers__WEBPACK_IMPORTED_MODULE_5__.css)(this.draggable, {
@@ -30206,19 +30245,35 @@ var DragState = /*#__PURE__*/ (/* unused pure expression or super */ null && (fu
30206
30245
  position: 'fixed',
30207
30246
  opacity: 0.7,
30208
30247
  display: 'inline-block',
30209
- left: event.clientX,
30210
- top: event.clientY,
30248
+ left: event.clientX + offset.left,
30249
+ top: event.clientY + offset.top,
30211
30250
  width: target?.offsetWidth ?? 100,
30212
30251
  height: target?.offsetHeight ?? 100
30213
30252
  });
30214
30253
  jodit_core_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.append((0,jodit_core_global__WEBPACK_IMPORTED_MODULE_4__.getContainer)(this.j, dragAndDropElement), this.draggable);
30215
30254
  }
30216
30255
  ;(0,jodit_core_helpers__WEBPACK_IMPORTED_MODULE_5__.css)(this.draggable, {
30217
- left: event.clientX,
30218
- top: event.clientY
30256
+ left: event.clientX + offset.left,
30257
+ top: event.clientY + offset.top
30219
30258
  });
30259
+ // The caret goes into the editor document, so it keeps the raw
30260
+ // (iframe-relative) coordinates.
30220
30261
  this.j.s.insertCursorAtPoint(event.clientX, event.clientY);
30221
30262
  }
30263
+ __ghostOffset() {
30264
+ const iframe = this.j.iframe;
30265
+ if (!iframe) {
30266
+ return {
30267
+ left: 0,
30268
+ top: 0
30269
+ };
30270
+ }
30271
+ const rect = iframe.getBoundingClientRect();
30272
+ return {
30273
+ left: rect.left,
30274
+ top: rect.top
30275
+ };
30276
+ }
30222
30277
  /**
30223
30278
  * Mouseup handler in any place
30224
30279
  */ onDragEnd() {