jodit 4.13.22 → 4.13.24

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 (57) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/es2015/jodit.css +1 -1
  3. package/es2015/jodit.fat.min.js +3 -3
  4. package/es2015/jodit.js +34 -7
  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 +4 -4
  18. package/es2021/jodit.js +35 -7
  19. package/es2021/jodit.min.js +4 -4
  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 +4 -4
  28. package/es2021.en/jodit.js +35 -7
  29. package/es2021.en/jodit.min.js +4 -4
  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 +36 -7
  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/core/constants.js +1 -1
  51. package/esm/core/selection/style/api/wrap.d.ts +2 -1
  52. package/esm/core/selection/style/api/wrap.js +12 -2
  53. package/esm/core/selection/style/transactions.js +18 -4
  54. package/esm/plugins/clean-html/helpers/visitor/filters/remove-empty-text-node.js +7 -1
  55. package/esm/plugins/clean-html/helpers/visitor/filters/remove-inv-text-nodes.js +4 -1
  56. package/package.json +1 -1
  57. package/types/core/selection/style/api/wrap.d.ts +2 -1
package/es2015/jodit.js CHANGED
@@ -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.13.22
4
+ * Version: v4.13.24
5
5
  * Url: https://xdsoft.net/jodit/
6
6
  * License(s): MIT
7
7
  */
@@ -1849,7 +1849,7 @@ __webpack_require__.r(__webpack_exports__);
1849
1849
  * ```
1850
1850
  * @packageDocumentation
1851
1851
  * @module constants
1852
- */ const APP_VERSION = "4.13.22";
1852
+ */ const APP_VERSION = "4.13.24";
1853
1853
  // prettier-ignore
1854
1854
  const ES = "es2015";
1855
1855
  const IS_ES_MODERN = true;
@@ -12060,6 +12060,7 @@ if (jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.globalDocument) {
12060
12060
  "use strict";
12061
12061
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12062
12062
  /* harmony export */ FiniteStateMachine: function() { return /* reexport safe */ _finite_state_machine__WEBPACK_IMPORTED_MODULE_1__.FiniteStateMachine; },
12063
+ /* harmony export */ WRAP_NODES: function() { return /* reexport safe */ _wrap__WEBPACK_IMPORTED_MODULE_13__.WRAP_NODES; },
12063
12064
  /* harmony export */ extractSelectedPart: function() { return /* reexport safe */ _extract__WEBPACK_IMPORTED_MODULE_0__.extractSelectedPart; },
12064
12065
  /* harmony export */ getSuitChild: function() { return /* reexport safe */ _get_suit_child__WEBPACK_IMPORTED_MODULE_2__.getSuitChild; },
12065
12066
  /* harmony export */ getSuitParent: function() { return /* reexport safe */ _get_suit_parent__WEBPACK_IMPORTED_MODULE_3__.getSuitParent; },
@@ -12726,6 +12727,7 @@ function toggleAttribute(jodit, value, elm, key, dry, mode) {
12726
12727
 
12727
12728
  "use strict";
12728
12729
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12730
+ /* harmony export */ WRAP_NODES: function() { return /* binding */ WRAP_NODES; },
12729
12731
  /* harmony export */ wrap: function() { return /* binding */ wrap; }
12730
12732
  /* harmony export */ });
12731
12733
  /* harmony import */ var jodit_core_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(27795);
@@ -12780,7 +12782,7 @@ const WRAP_NODES = new Set([
12780
12782
  * otherwise it wraps free text in an element.
12781
12783
  */ function findOrCreateWrapper(commitStyle, font, jodit) {
12782
12784
  if (commitStyle.elementIsBlock) {
12783
- const box = jodit_core_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.up(font, (node)=>jodit_core_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock(node) && !jodit_core_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(node, WRAP_NODES), jodit.editor);
12785
+ const box = jodit_core_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.up(font, (node)=>jodit_core_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock(node) && !jodit_core_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(node, WRAP_NODES) && !hasBlockChildren(node), jodit.editor);
12784
12786
  if (box) {
12785
12787
  return box;
12786
12788
  }
@@ -12789,6 +12791,13 @@ const WRAP_NODES = new Set([
12789
12791
  (0,jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_1__.attr)(font, 'size', null);
12790
12792
  return font;
12791
12793
  }
12794
+ /**
12795
+ * A block that itself contains block-level children is a layout container:
12796
+ * replacing it wholesale would merge all its blocks into the new element,
12797
+ * so the selection must be wrapped in a new block inside it instead.
12798
+ */ function hasBlockChildren(node) {
12799
+ return Array.from(node.childNodes).some((child)=>jodit_core_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock(child));
12800
+ }
12792
12801
 
12793
12802
 
12794
12803
  /***/ }),
@@ -13162,12 +13171,23 @@ const transactions = {
13162
13171
  },
13163
13172
  [states.UNWRAP]: {
13164
13173
  exec (value) {
13165
- if (value.element.attributes.length && jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.isTag(value.element, value.style.element)) {
13174
+ const { element, style, jodit } = value;
13175
+ if (element.attributes.length && jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.isTag(element, style.element)) {
13176
+ return (0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__._)({}, value), {
13177
+ next: states.REPLACE_DEFAULT
13178
+ });
13179
+ }
13180
+ // Unwrapping a block inside a container (e.g. an h3 inside a div)
13181
+ // leaves bare inline content there: the wrapNodes plugin restores
13182
+ // paragraphs only at the editor root. Replace such a block with
13183
+ // the default tag instead.
13184
+ const parent = element.parentElement;
13185
+ if (style.elementIsBlock && !style.elementIsDefault && parent && parent !== jodit.editor && jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.isBlock(parent) && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.isTag(parent, jodit_core_selection_style_api__WEBPACK_IMPORTED_MODULE_5__.WRAP_NODES)) {
13166
13186
  return (0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__._)({}, value), {
13167
13187
  next: states.REPLACE_DEFAULT
13168
13188
  });
13169
13189
  }
13170
- jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.unwrap(value.element);
13190
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.unwrap(element);
13171
13191
  return (0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__._)({}, value), {
13172
13192
  mode: jodit_core_selection_style_constants__WEBPACK_IMPORTED_MODULE_6__.UNWRAP,
13173
13193
  next: states.END
@@ -28683,7 +28703,11 @@ __webpack_require__.r(__webpack_exports__);
28683
28703
  * @private
28684
28704
  */ function removeEmptyTextNode(jodit, node, hadEffect, arg, argi, currentNode) {
28685
28705
  if (jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isText(node) && !node.nodeValue) {
28686
- if (node === currentNode && jodit.s.isCollapsed()) {
28706
+ // Restore the caret only while the editor owns focus. The walker runs
28707
+ // asynchronously, so the user may have already tabbed away — moving the
28708
+ // selection here would call `focus()` and steal focus back from the
28709
+ // element the user navigated to (e.g. Shift+Tab accessibility flow).
28710
+ if (node === currentNode && jodit.s.isFocused() && jodit.s.isCollapsed()) {
28687
28711
  jodit.s.setCursorAfter(node);
28688
28712
  }
28689
28713
  jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.safeRemove(node);
@@ -28726,7 +28750,10 @@ __webpack_require__.r(__webpack_exports__);
28726
28750
  return hadEffect;
28727
28751
  }
28728
28752
  node.nodeValue = node.nodeValue.replace((0,jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.INVISIBLE_SPACE_REG_EXP)(), '');
28729
- if (node === currentNode && jodit.s.isCollapsed()) {
28753
+ // Same guard as in `removeEmptyTextNode`: the walker is asynchronous, so
28754
+ // never move the selection (it re-focuses the editor) once the user has
28755
+ // moved focus elsewhere.
28756
+ if (node === currentNode && jodit.s.isFocused() && jodit.s.isCollapsed()) {
28730
28757
  jodit.s.setCursorAfter(node);
28731
28758
  }
28732
28759
  if (!node.nodeValue) {