jodit-pro 4.12.23 → 4.12.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 (299) hide show
  1. package/es2015/jodit.css +1 -1
  2. package/es2015/jodit.fat.min.js +6 -6
  3. package/es2015/jodit.js +195 -44
  4. package/es2015/jodit.min.js +6 -6
  5. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  6. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  7. package/es2015/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  8. package/es2015/plugins/autocomplete/autocomplete.js +1 -1
  9. package/es2015/plugins/autocomplete/autocomplete.min.js +1 -1
  10. package/es2015/plugins/backup/backup.css +1 -1
  11. package/es2015/plugins/backup/backup.js +1 -1
  12. package/es2015/plugins/backup/backup.min.js +1 -1
  13. package/es2015/plugins/button-generator/button-generator.css +1 -1
  14. package/es2015/plugins/button-generator/button-generator.js +1 -1
  15. package/es2015/plugins/button-generator/button-generator.min.js +1 -1
  16. package/es2015/plugins/change-case/change-case.js +1 -1
  17. package/es2015/plugins/change-case/change-case.min.js +1 -1
  18. package/es2015/plugins/color-picker/color-picker.css +1 -1
  19. package/es2015/plugins/color-picker/color-picker.js +1 -1
  20. package/es2015/plugins/color-picker/color-picker.min.js +1 -1
  21. package/es2015/plugins/emoji/emoji.css +1 -1
  22. package/es2015/plugins/emoji/emoji.js +1 -1
  23. package/es2015/plugins/emoji/emoji.min.js +1 -1
  24. package/es2015/plugins/export-docs/export-docs.js +1 -1
  25. package/es2015/plugins/export-docs/export-docs.min.js +1 -1
  26. package/es2015/plugins/finder/finder.css +1 -1
  27. package/es2015/plugins/finder/finder.js +1 -1
  28. package/es2015/plugins/finder/finder.min.js +1 -1
  29. package/es2015/plugins/google-maps/google-maps.css +1 -1
  30. package/es2015/plugins/google-maps/google-maps.js +1 -1
  31. package/es2015/plugins/google-maps/google-maps.min.js +1 -1
  32. package/es2015/plugins/google-search/google-search.js +1 -1
  33. package/es2015/plugins/google-search/google-search.min.js +1 -1
  34. package/es2015/plugins/highlight-signature/highlight-signature.js +1 -1
  35. package/es2015/plugins/highlight-signature/highlight-signature.min.js +1 -1
  36. package/es2015/plugins/iframe-editor/iframe-editor.css +1 -1
  37. package/es2015/plugins/iframe-editor/iframe-editor.js +1 -1
  38. package/es2015/plugins/iframe-editor/iframe-editor.min.js +1 -1
  39. package/es2015/plugins/keyboard/keyboard.css +1 -1
  40. package/es2015/plugins/keyboard/keyboard.js +1 -1
  41. package/es2015/plugins/keyboard/keyboard.min.js +1 -1
  42. package/es2015/plugins/mobile-view/mobile-view.js +1 -1
  43. package/es2015/plugins/mobile-view/mobile-view.min.js +1 -1
  44. package/es2015/plugins/page-break/page-break.js +1 -1
  45. package/es2015/plugins/page-break/page-break.min.js +1 -1
  46. package/es2015/plugins/paste-code/paste-code.css +1 -1
  47. package/es2015/plugins/paste-code/paste-code.js +1 -1
  48. package/es2015/plugins/paste-code/paste-code.min.js +1 -1
  49. package/es2015/plugins/paste-from-word/paste-from-word.js +1 -1
  50. package/es2015/plugins/paste-from-word/paste-from-word.min.js +1 -1
  51. package/es2015/plugins/show-blocks/show-blocks.js +1 -1
  52. package/es2015/plugins/show-blocks/show-blocks.min.js +1 -1
  53. package/es2015/plugins/style/style.css +1 -1
  54. package/es2015/plugins/style/style.js +1 -1
  55. package/es2015/plugins/style/style.min.js +1 -1
  56. package/es2015/plugins/templates/templates.css +1 -1
  57. package/es2015/plugins/templates/templates.js +1 -1
  58. package/es2015/plugins/templates/templates.min.js +1 -1
  59. package/es2015/plugins/todo-list/todo-list.css +1 -1
  60. package/es2015/plugins/todo-list/todo-list.js +1 -1
  61. package/es2015/plugins/todo-list/todo-list.min.js +1 -1
  62. package/es2015/plugins/translate/translate.css +1 -1
  63. package/es2015/plugins/translate/translate.js +1 -1
  64. package/es2015/plugins/translate/translate.min.js +1 -1
  65. package/es2015/plugins/tune-block/tune-block.css +1 -1
  66. package/es2015/plugins/tune-block/tune-block.js +1 -1
  67. package/es2015/plugins/tune-block/tune-block.min.js +1 -1
  68. package/es2018/jodit.fat.min.js +6 -6
  69. package/es2018/jodit.min.js +6 -6
  70. package/es2018/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  71. package/es2018/plugins/autocomplete/autocomplete.min.js +1 -1
  72. package/es2018/plugins/backup/backup.min.js +1 -1
  73. package/es2018/plugins/button-generator/button-generator.min.js +1 -1
  74. package/es2018/plugins/change-case/change-case.min.js +1 -1
  75. package/es2018/plugins/color-picker/color-picker.min.js +1 -1
  76. package/es2018/plugins/emoji/emoji.min.js +1 -1
  77. package/es2018/plugins/export-docs/export-docs.min.js +1 -1
  78. package/es2018/plugins/finder/finder.min.js +1 -1
  79. package/es2018/plugins/google-maps/google-maps.min.js +1 -1
  80. package/es2018/plugins/google-search/google-search.min.js +1 -1
  81. package/es2018/plugins/highlight-signature/highlight-signature.min.js +1 -1
  82. package/es2018/plugins/iframe-editor/iframe-editor.min.js +1 -1
  83. package/es2018/plugins/keyboard/keyboard.min.js +1 -1
  84. package/es2018/plugins/mobile-view/mobile-view.min.js +1 -1
  85. package/es2018/plugins/page-break/page-break.min.js +1 -1
  86. package/es2018/plugins/paste-code/paste-code.min.js +1 -1
  87. package/es2018/plugins/paste-from-word/paste-from-word.min.js +1 -1
  88. package/es2018/plugins/show-blocks/show-blocks.min.js +1 -1
  89. package/es2018/plugins/style/style.min.js +1 -1
  90. package/es2018/plugins/templates/templates.min.js +1 -1
  91. package/es2018/plugins/todo-list/todo-list.min.js +1 -1
  92. package/es2018/plugins/translate/translate.min.js +1 -1
  93. package/es2018/plugins/tune-block/tune-block.min.js +1 -1
  94. package/es2021/jodit.css +1 -1
  95. package/es2021/jodit.fat.min.js +8 -8
  96. package/es2021/jodit.js +195 -44
  97. package/es2021/jodit.min.js +8 -8
  98. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  99. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  100. package/es2021/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  101. package/es2021/plugins/autocomplete/autocomplete.js +1 -1
  102. package/es2021/plugins/autocomplete/autocomplete.min.js +1 -1
  103. package/es2021/plugins/backup/backup.css +1 -1
  104. package/es2021/plugins/backup/backup.js +1 -1
  105. package/es2021/plugins/backup/backup.min.js +1 -1
  106. package/es2021/plugins/button-generator/button-generator.css +1 -1
  107. package/es2021/plugins/button-generator/button-generator.js +1 -1
  108. package/es2021/plugins/button-generator/button-generator.min.js +1 -1
  109. package/es2021/plugins/change-case/change-case.js +1 -1
  110. package/es2021/plugins/change-case/change-case.min.js +1 -1
  111. package/es2021/plugins/color-picker/color-picker.css +1 -1
  112. package/es2021/plugins/color-picker/color-picker.js +1 -1
  113. package/es2021/plugins/color-picker/color-picker.min.js +1 -1
  114. package/es2021/plugins/emoji/emoji.css +1 -1
  115. package/es2021/plugins/emoji/emoji.js +1 -1
  116. package/es2021/plugins/emoji/emoji.min.js +1 -1
  117. package/es2021/plugins/export-docs/export-docs.js +1 -1
  118. package/es2021/plugins/export-docs/export-docs.min.js +1 -1
  119. package/es2021/plugins/finder/finder.css +1 -1
  120. package/es2021/plugins/finder/finder.js +1 -1
  121. package/es2021/plugins/finder/finder.min.js +1 -1
  122. package/es2021/plugins/google-maps/google-maps.css +1 -1
  123. package/es2021/plugins/google-maps/google-maps.js +1 -1
  124. package/es2021/plugins/google-maps/google-maps.min.js +1 -1
  125. package/es2021/plugins/google-search/google-search.js +1 -1
  126. package/es2021/plugins/google-search/google-search.min.js +1 -1
  127. package/es2021/plugins/highlight-signature/highlight-signature.js +1 -1
  128. package/es2021/plugins/highlight-signature/highlight-signature.min.js +1 -1
  129. package/es2021/plugins/iframe-editor/iframe-editor.css +1 -1
  130. package/es2021/plugins/iframe-editor/iframe-editor.js +1 -1
  131. package/es2021/plugins/iframe-editor/iframe-editor.min.js +1 -1
  132. package/es2021/plugins/keyboard/keyboard.css +1 -1
  133. package/es2021/plugins/keyboard/keyboard.js +1 -1
  134. package/es2021/plugins/keyboard/keyboard.min.js +1 -1
  135. package/es2021/plugins/mobile-view/mobile-view.js +1 -1
  136. package/es2021/plugins/mobile-view/mobile-view.min.js +1 -1
  137. package/es2021/plugins/page-break/page-break.js +1 -1
  138. package/es2021/plugins/page-break/page-break.min.js +1 -1
  139. package/es2021/plugins/paste-code/paste-code.css +1 -1
  140. package/es2021/plugins/paste-code/paste-code.js +1 -1
  141. package/es2021/plugins/paste-code/paste-code.min.js +1 -1
  142. package/es2021/plugins/paste-from-word/paste-from-word.js +1 -1
  143. package/es2021/plugins/paste-from-word/paste-from-word.min.js +1 -1
  144. package/es2021/plugins/show-blocks/show-blocks.js +1 -1
  145. package/es2021/plugins/show-blocks/show-blocks.min.js +1 -1
  146. package/es2021/plugins/style/style.css +1 -1
  147. package/es2021/plugins/style/style.js +1 -1
  148. package/es2021/plugins/style/style.min.js +1 -1
  149. package/es2021/plugins/templates/templates.css +1 -1
  150. package/es2021/plugins/templates/templates.js +1 -1
  151. package/es2021/plugins/templates/templates.min.js +1 -1
  152. package/es2021/plugins/todo-list/todo-list.css +1 -1
  153. package/es2021/plugins/todo-list/todo-list.js +1 -1
  154. package/es2021/plugins/todo-list/todo-list.min.js +1 -1
  155. package/es2021/plugins/translate/translate.css +1 -1
  156. package/es2021/plugins/translate/translate.js +1 -1
  157. package/es2021/plugins/translate/translate.min.js +1 -1
  158. package/es2021/plugins/tune-block/tune-block.css +1 -1
  159. package/es2021/plugins/tune-block/tune-block.js +1 -1
  160. package/es2021/plugins/tune-block/tune-block.min.js +1 -1
  161. package/es2021.en/jodit.css +1 -1
  162. package/es2021.en/jodit.fat.min.js +8 -8
  163. package/es2021.en/jodit.js +195 -44
  164. package/es2021.en/jodit.min.js +8 -8
  165. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  166. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  167. package/es2021.en/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  168. package/es2021.en/plugins/autocomplete/autocomplete.js +1 -1
  169. package/es2021.en/plugins/autocomplete/autocomplete.min.js +1 -1
  170. package/es2021.en/plugins/backup/backup.css +1 -1
  171. package/es2021.en/plugins/backup/backup.js +1 -1
  172. package/es2021.en/plugins/backup/backup.min.js +1 -1
  173. package/es2021.en/plugins/button-generator/button-generator.css +1 -1
  174. package/es2021.en/plugins/button-generator/button-generator.js +1 -1
  175. package/es2021.en/plugins/button-generator/button-generator.min.js +1 -1
  176. package/es2021.en/plugins/change-case/change-case.js +1 -1
  177. package/es2021.en/plugins/change-case/change-case.min.js +1 -1
  178. package/es2021.en/plugins/color-picker/color-picker.css +1 -1
  179. package/es2021.en/plugins/color-picker/color-picker.js +1 -1
  180. package/es2021.en/plugins/color-picker/color-picker.min.js +1 -1
  181. package/es2021.en/plugins/emoji/emoji.css +1 -1
  182. package/es2021.en/plugins/emoji/emoji.js +1 -1
  183. package/es2021.en/plugins/emoji/emoji.min.js +1 -1
  184. package/es2021.en/plugins/export-docs/export-docs.js +1 -1
  185. package/es2021.en/plugins/export-docs/export-docs.min.js +1 -1
  186. package/es2021.en/plugins/finder/finder.css +1 -1
  187. package/es2021.en/plugins/finder/finder.js +1 -1
  188. package/es2021.en/plugins/finder/finder.min.js +1 -1
  189. package/es2021.en/plugins/google-maps/google-maps.css +1 -1
  190. package/es2021.en/plugins/google-maps/google-maps.js +1 -1
  191. package/es2021.en/plugins/google-maps/google-maps.min.js +1 -1
  192. package/es2021.en/plugins/google-search/google-search.js +1 -1
  193. package/es2021.en/plugins/google-search/google-search.min.js +1 -1
  194. package/es2021.en/plugins/highlight-signature/highlight-signature.js +1 -1
  195. package/es2021.en/plugins/highlight-signature/highlight-signature.min.js +1 -1
  196. package/es2021.en/plugins/iframe-editor/iframe-editor.css +1 -1
  197. package/es2021.en/plugins/iframe-editor/iframe-editor.js +1 -1
  198. package/es2021.en/plugins/iframe-editor/iframe-editor.min.js +1 -1
  199. package/es2021.en/plugins/keyboard/keyboard.css +1 -1
  200. package/es2021.en/plugins/keyboard/keyboard.js +1 -1
  201. package/es2021.en/plugins/keyboard/keyboard.min.js +1 -1
  202. package/es2021.en/plugins/mobile-view/mobile-view.js +1 -1
  203. package/es2021.en/plugins/mobile-view/mobile-view.min.js +1 -1
  204. package/es2021.en/plugins/page-break/page-break.js +1 -1
  205. package/es2021.en/plugins/page-break/page-break.min.js +1 -1
  206. package/es2021.en/plugins/paste-code/paste-code.css +1 -1
  207. package/es2021.en/plugins/paste-code/paste-code.js +1 -1
  208. package/es2021.en/plugins/paste-code/paste-code.min.js +1 -1
  209. package/es2021.en/plugins/paste-from-word/paste-from-word.js +1 -1
  210. package/es2021.en/plugins/paste-from-word/paste-from-word.min.js +1 -1
  211. package/es2021.en/plugins/show-blocks/show-blocks.js +1 -1
  212. package/es2021.en/plugins/show-blocks/show-blocks.min.js +1 -1
  213. package/es2021.en/plugins/style/style.css +1 -1
  214. package/es2021.en/plugins/style/style.js +1 -1
  215. package/es2021.en/plugins/style/style.min.js +1 -1
  216. package/es2021.en/plugins/templates/templates.css +1 -1
  217. package/es2021.en/plugins/templates/templates.js +1 -1
  218. package/es2021.en/plugins/templates/templates.min.js +1 -1
  219. package/es2021.en/plugins/todo-list/todo-list.css +1 -1
  220. package/es2021.en/plugins/todo-list/todo-list.js +1 -1
  221. package/es2021.en/plugins/todo-list/todo-list.min.js +1 -1
  222. package/es2021.en/plugins/translate/translate.css +1 -1
  223. package/es2021.en/plugins/translate/translate.js +1 -1
  224. package/es2021.en/plugins/translate/translate.min.js +1 -1
  225. package/es2021.en/plugins/tune-block/tune-block.css +1 -1
  226. package/es2021.en/plugins/tune-block/tune-block.js +1 -1
  227. package/es2021.en/plugins/tune-block/tune-block.min.js +1 -1
  228. package/es5/jodit.css +2 -2
  229. package/es5/jodit.fat.min.js +2 -2
  230. package/es5/jodit.js +214 -50
  231. package/es5/jodit.min.css +2 -2
  232. package/es5/jodit.min.js +2 -2
  233. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.css +1 -1
  234. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.js +1 -1
  235. package/es5/plugins/ai-assistant-pro/ai-assistant-pro.min.js +1 -1
  236. package/es5/plugins/autocomplete/autocomplete.js +1 -1
  237. package/es5/plugins/autocomplete/autocomplete.min.js +1 -1
  238. package/es5/plugins/backup/backup.css +1 -1
  239. package/es5/plugins/backup/backup.js +1 -1
  240. package/es5/plugins/backup/backup.min.js +1 -1
  241. package/es5/plugins/button-generator/button-generator.css +1 -1
  242. package/es5/plugins/button-generator/button-generator.js +1 -1
  243. package/es5/plugins/button-generator/button-generator.min.js +1 -1
  244. package/es5/plugins/change-case/change-case.js +1 -1
  245. package/es5/plugins/change-case/change-case.min.js +1 -1
  246. package/es5/plugins/color-picker/color-picker.css +1 -1
  247. package/es5/plugins/color-picker/color-picker.js +1 -1
  248. package/es5/plugins/color-picker/color-picker.min.js +1 -1
  249. package/es5/plugins/emoji/emoji.css +1 -1
  250. package/es5/plugins/emoji/emoji.js +1 -1
  251. package/es5/plugins/emoji/emoji.min.js +1 -1
  252. package/es5/plugins/export-docs/export-docs.js +1 -1
  253. package/es5/plugins/export-docs/export-docs.min.js +1 -1
  254. package/es5/plugins/finder/finder.css +1 -1
  255. package/es5/plugins/finder/finder.js +1 -1
  256. package/es5/plugins/finder/finder.min.js +1 -1
  257. package/es5/plugins/google-maps/google-maps.css +1 -1
  258. package/es5/plugins/google-maps/google-maps.js +1 -1
  259. package/es5/plugins/google-maps/google-maps.min.js +1 -1
  260. package/es5/plugins/google-search/google-search.js +1 -1
  261. package/es5/plugins/google-search/google-search.min.js +1 -1
  262. package/es5/plugins/highlight-signature/highlight-signature.js +1 -1
  263. package/es5/plugins/highlight-signature/highlight-signature.min.js +1 -1
  264. package/es5/plugins/iframe-editor/iframe-editor.css +1 -1
  265. package/es5/plugins/iframe-editor/iframe-editor.js +1 -1
  266. package/es5/plugins/iframe-editor/iframe-editor.min.js +1 -1
  267. package/es5/plugins/keyboard/keyboard.css +1 -1
  268. package/es5/plugins/keyboard/keyboard.js +1 -1
  269. package/es5/plugins/keyboard/keyboard.min.js +1 -1
  270. package/es5/plugins/mobile-view/mobile-view.js +1 -1
  271. package/es5/plugins/mobile-view/mobile-view.min.js +1 -1
  272. package/es5/plugins/page-break/page-break.js +1 -1
  273. package/es5/plugins/page-break/page-break.min.js +1 -1
  274. package/es5/plugins/paste-code/paste-code.css +1 -1
  275. package/es5/plugins/paste-code/paste-code.js +1 -1
  276. package/es5/plugins/paste-code/paste-code.min.js +1 -1
  277. package/es5/plugins/paste-from-word/paste-from-word.js +1 -1
  278. package/es5/plugins/paste-from-word/paste-from-word.min.js +1 -1
  279. package/es5/plugins/show-blocks/show-blocks.js +1 -1
  280. package/es5/plugins/show-blocks/show-blocks.min.js +1 -1
  281. package/es5/plugins/style/style.css +1 -1
  282. package/es5/plugins/style/style.js +1 -1
  283. package/es5/plugins/style/style.min.js +1 -1
  284. package/es5/plugins/templates/templates.css +1 -1
  285. package/es5/plugins/templates/templates.js +1 -1
  286. package/es5/plugins/templates/templates.min.js +1 -1
  287. package/es5/plugins/todo-list/todo-list.css +1 -1
  288. package/es5/plugins/todo-list/todo-list.js +1 -1
  289. package/es5/plugins/todo-list/todo-list.min.js +1 -1
  290. package/es5/plugins/translate/translate.css +1 -1
  291. package/es5/plugins/translate/translate.js +1 -1
  292. package/es5/plugins/translate/translate.min.js +1 -1
  293. package/es5/plugins/tune-block/tune-block.css +1 -1
  294. package/es5/plugins/tune-block/tune-block.js +1 -1
  295. package/es5/plugins/tune-block/tune-block.min.js +1 -1
  296. package/es5/polyfills.fat.min.js +1 -1
  297. package/es5/polyfills.js +1 -1
  298. package/es5/polyfills.min.js +1 -1
  299. package/package.json +1 -1
package/es5/jodit.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * jodit-pro - PRO Version of Jodit Editor
3
3
  * Author: Chupurnov Valerii <chupurnov@gmail.com>
4
- * Version: v4.12.23
4
+ * Version: v4.12.24
5
5
  * Url: https://xdsoft.net/jodit/pro/
6
6
  * License(s): SEE LICENSE IN LICENSE.md
7
7
  */
@@ -2258,7 +2258,7 @@ function _unsupported_iterable_to_array(o, minLen) {
2258
2258
  if (n === "Map" || n === "Set") return Array.from(n);
2259
2259
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
2260
2260
  }
2261
- var APP_VERSION = "4.12.23";
2261
+ var APP_VERSION = "4.12.24";
2262
2262
  // prettier-ignore
2263
2263
  var ES = "es5";
2264
2264
  var IS_ES_MODERN = false;
@@ -7370,6 +7370,16 @@ function normalizeCSS(s) {
7370
7370
  iframeDoc.open();
7371
7371
  iframeDoc.write(html);
7372
7372
  iframeDoc.close();
7373
+ // Word marks its auto-generated list markers (the literal
7374
+ // bullet/number, e.g. `1.` or `·`) with `mso-list:Ignore`.
7375
+ // They are display-only and must not be imported, otherwise
7376
+ // the marker text leaks into the content. Drop them before any
7377
+ // style normalization strips the `mso-list` hint. See #948
7378
+ _dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.each(iframeDoc.body, function(node) {
7379
+ if (_dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.isElement(node) && /mso-list:\s*ignore/i.test(node.getAttribute('style') || '')) {
7380
+ _dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.safeRemove(node);
7381
+ }
7382
+ });
7373
7383
  try {
7374
7384
  var _loop = function(i) {
7375
7385
  var _loop = function(idx) {
@@ -7468,6 +7478,15 @@ function normalizeCSS(s) {
7468
7478
  _dom_dom_js__WEBPACK_IMPORTED_MODULE_1__.Dom.unwrap(node);
7469
7479
  break;
7470
7480
  default:
7481
+ // Word marks its auto-generated list markers
7482
+ // (the literal bullet/number, e.g. `1.` or `·`)
7483
+ // with `mso-list:Ignore`. They are display-only
7484
+ // and must not be imported, otherwise the marker
7485
+ // text leaks into the content. See #948
7486
+ if (/mso-list:\s*ignore/i.test(node.getAttribute('style') || '')) {
7487
+ marks.push(node);
7488
+ break;
7489
+ }
7471
7490
  (0,_array_to_array_js__WEBPACK_IMPORTED_MODULE_2__.toArray)(node.attributes).forEach(function(attr) {
7472
7491
  if ([
7473
7492
  'src',
@@ -7605,26 +7624,20 @@ function normalizeCSS(s) {
7605
7624
  return;
7606
7625
  }
7607
7626
  var removeEvents = (_a = options.removeEventAttributes) !== null && _a !== void 0 ? _a : options.removeOnError;
7608
- if (removeEvents) {
7609
- removeAllEventAttributes(box);
7610
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.$$)('*', box).forEach(function(elm) {
7611
- return removeAllEventAttributes(elm);
7612
- });
7613
- } else if (options.removeOnError) {
7614
- sanitizeHTMLElement(box, options);
7615
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.$$)('[onerror]', box).forEach(function(elm) {
7616
- return sanitizeHTMLElement(elm, options);
7617
- });
7618
- }
7619
- if (options.safeJavaScriptLink) {
7620
- sanitizeHTMLElement(box, options);
7621
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.$$)('a[href^="javascript"]', box).forEach(function(elm) {
7622
- return sanitizeHTMLElement(elm, options);
7623
- });
7624
- }
7625
- if (options.safeLinksTarget) {
7626
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.$$)('a[target="_blank"]', box).forEach(function(elm) {
7627
- var rel = elm.getAttribute('rel') || '';
7627
+ // Single synchronous traversal of the subtree. Besides removing event
7628
+ // handlers and `javascript:` links, `sanitizeHTMLElement` neutralises
7629
+ // executable `iframe[srcdoc]`, `data:text/html` / SVG `data:` document
7630
+ // sources and dangerous schemes in every URL-bearing attribute.
7631
+ var process = function process(node) {
7632
+ if (!_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isElement(node)) {
7633
+ return;
7634
+ }
7635
+ if (removeEvents) {
7636
+ removeAllEventAttributes(node);
7637
+ }
7638
+ sanitizeHTMLElement(node, options);
7639
+ if (options.safeLinksTarget && node.nodeName === 'A' && node.getAttribute('target') === '_blank') {
7640
+ var rel = node.getAttribute('rel') || '';
7628
7641
  var parts = rel.split(/\s+/).filter(Boolean);
7629
7642
  if (!parts.includes('noopener')) {
7630
7643
  parts.push('noopener');
@@ -7632,9 +7645,11 @@ function normalizeCSS(s) {
7632
7645
  if (!parts.includes('noreferrer')) {
7633
7646
  parts.push('noreferrer');
7634
7647
  }
7635
- (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, 'rel', parts.join(' '));
7636
- });
7637
- }
7648
+ (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(node, 'rel', parts.join(' '));
7649
+ }
7650
+ };
7651
+ process(box);
7652
+ _dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.each(box, process);
7638
7653
  }
7639
7654
  /**
7640
7655
  * Remove all on* event handler attributes from an element
@@ -7672,6 +7687,41 @@ function normalizeCSS(s) {
7672
7687
  }
7673
7688
  return effected;
7674
7689
  }
7690
+ /**
7691
+ * URL-bearing attributes (besides `href`) that can load or execute content.
7692
+ */ var URL_ATTRIBUTES = [
7693
+ 'src',
7694
+ 'data',
7695
+ 'action',
7696
+ 'formaction',
7697
+ 'poster',
7698
+ 'background',
7699
+ 'xlink:href'
7700
+ ];
7701
+ /**
7702
+ * Tags that load their URL as a *document* (scripts inside run). An SVG data
7703
+ * URL is only an XSS vector here — as an `<img>` source it renders inertly.
7704
+ */ var DOCUMENT_EMBED_TAGS = new Set([
7705
+ 'iframe',
7706
+ 'frame',
7707
+ 'object',
7708
+ 'embed'
7709
+ ]);
7710
+ /**
7711
+ * Detects executable / script-bearing URL schemes. The attribute value is
7712
+ * already HTML-entity-decoded by `getAttribute`, so only whitespace and
7713
+ * control characters (which browsers ignore inside a scheme) need stripping.
7714
+ */ function isDangerousUrl(value, tagName) {
7715
+ // eslint-disable-next-line no-control-regex
7716
+ var normalized = value.replace(/[\u0000-\u0020]+/g, '').toLowerCase();
7717
+ if (/^(?:javascript|vbscript|livescript|mocha):/.test(normalized)) {
7718
+ return true;
7719
+ }
7720
+ if (/^data:(?:text\/html|application\/xhtml)/.test(normalized)) {
7721
+ return true;
7722
+ }
7723
+ return /^data:image\/svg/.test(normalized) && DOCUMENT_EMBED_TAGS.has(tagName);
7724
+ }
7675
7725
  function sanitizeHTMLElement(elm) {
7676
7726
  var _ref = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
7677
7727
  safeJavaScriptLink: true,
@@ -7690,6 +7740,39 @@ function sanitizeHTMLElement(elm) {
7690
7740
  (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, 'href', location.protocol + '//' + href);
7691
7741
  effected = true;
7692
7742
  }
7743
+ if (safeJavaScriptLink) {
7744
+ // `srcdoc` runs its content as a full HTML document — drop it entirely.
7745
+ if (elm.hasAttribute('srcdoc')) {
7746
+ (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, 'srcdoc', null);
7747
+ effected = true;
7748
+ }
7749
+ // Strip executable schemes from any other URL-bearing attribute.
7750
+ var tagName = elm.nodeName.toLowerCase();
7751
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7752
+ try {
7753
+ for(var _iterator = URL_ATTRIBUTES[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7754
+ var name = _step.value;
7755
+ var value = elm.getAttribute(name);
7756
+ if (value && isDangerousUrl(value, tagName)) {
7757
+ (0,_utils_index_js__WEBPACK_IMPORTED_MODULE_1__.attr)(elm, name, null);
7758
+ effected = true;
7759
+ }
7760
+ }
7761
+ } catch (err) {
7762
+ _didIteratorError = true;
7763
+ _iteratorError = err;
7764
+ } finally{
7765
+ try {
7766
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7767
+ _iterator.return();
7768
+ }
7769
+ } finally{
7770
+ if (_didIteratorError) {
7771
+ throw _iteratorError;
7772
+ }
7773
+ }
7774
+ }
7775
+ }
7693
7776
  return effected;
7694
7777
  }
7695
7778
 
@@ -7738,7 +7821,7 @@ var ALONE_TAGS = new Set([
7738
7821
  /**
7739
7822
  * Extract plain text from HTML text
7740
7823
  */ function stripTags(html) {
7741
- var doc = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : document, exclude = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null;
7824
+ var doc = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : document, exclude = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null, blockBr = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
7742
7825
  var tmp = doc.createElement('div');
7743
7826
  if ((0,_checker_is_string_js__WEBPACK_IMPORTED_MODULE_1__.isString)(html)) {
7744
7827
  tmp.innerHTML = html;
@@ -7752,7 +7835,7 @@ var ALONE_TAGS = new Set([
7752
7835
  }
7753
7836
  if (exclude && _dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(p, exclude)) {
7754
7837
  var tag = p.nodeName.toLowerCase();
7755
- var text = !_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(p, ALONE_TAGS) ? "%%%jodit-".concat(tag, "%%%").concat(stripTags(p.innerHTML, doc, exclude), "%%%/jodit-").concat(tag, "%%%") : "%%%jodit-single-".concat(tag, "%%%");
7838
+ var text = !_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(p, ALONE_TAGS) ? "%%%jodit-".concat(tag, "%%%").concat(stripTags(p.innerHTML, doc, exclude, blockBr), "%%%/jodit-").concat(tag, "%%%") : "%%%jodit-single-".concat(tag, "%%%");
7756
7839
  _dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.before(p, doc.createTextNode(text));
7757
7840
  _dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.safeRemove(p);
7758
7841
  return;
@@ -7769,7 +7852,11 @@ var ALONE_TAGS = new Set([
7769
7852
  return;
7770
7853
  }
7771
7854
  if (nx) {
7772
- pr.insertBefore(doc.createTextNode(' '), nx);
7855
+ // By default blocks are joined with a single space (single-line
7856
+ // plain text). When `blockBr` is set, separate them with a line
7857
+ // break instead, so paragraph structure survives — e.g. the
7858
+ // "Insert only Text" paste option. See #1232
7859
+ pr.insertBefore(doc.createTextNode(blockBr ? '%%%jodit-single-br%%%' : ' '), nx);
7773
7860
  }
7774
7861
  });
7775
7862
  return restoreTags((0,_string_trim_js__WEBPACK_IMPORTED_MODULE_2__.trim)(tmp.innerText));
@@ -9635,7 +9722,6 @@ function ConfigDeepFlatten(obj) {
9635
9722
  return url;
9636
9723
  }
9637
9724
  var parser = _constants_js__WEBPACK_IMPORTED_MODULE_0__.globalDocument.createElement('a');
9638
- var pattern1 = /(?:http?s?:\/\/)?(?:www\.)?(?:vimeo\.com)\/?(.+)/g;
9639
9725
  parser.href = url;
9640
9726
  if (!width) {
9641
9727
  width = 400;
@@ -9647,19 +9733,43 @@ function ConfigDeepFlatten(obj) {
9647
9733
  switch(parser.hostname){
9648
9734
  case 'www.vimeo.com':
9649
9735
  case 'vimeo.com':
9650
- return pattern1.test(url) ? url.replace(pattern1, '<iframe width="' + width + '" height="' + height + '" src="' + protocol + '//player.vimeo.com/video/$1" frameborder="0" allowfullscreen></iframe>') : url;
9736
+ {
9737
+ // The numeric video id can be preceded by `channels/<name>/` or
9738
+ // `groups/<name>/videos/` and followed by tracking params (e.g.
9739
+ // `?share=copy`). Unlisted videos keep a hash right after the id
9740
+ // (`vimeo.com/<id>/<hash>`). Extract the id (+ hash) from the path
9741
+ // so all of those forms produce a valid embed. See #1209
9742
+ var segments = parser.pathname.split('/').filter(Boolean);
9743
+ var idIndex = segments.findIndex(function(s) {
9744
+ return /^\d+$/.test(s);
9745
+ });
9746
+ if (idIndex === -1) {
9747
+ return url;
9748
+ }
9749
+ var path = segments[idIndex];
9750
+ var hash = segments[idIndex + 1];
9751
+ if (hash && idIndex === 0) {
9752
+ path += '/' + hash;
9753
+ }
9754
+ return '<iframe width="' + width + '" height="' + height + '" src="' + protocol + '//player.vimeo.com/video/' + path + '" frameborder="0" allowfullscreen></iframe>';
9755
+ }
9651
9756
  case 'youtube.com':
9652
9757
  case 'www.youtube.com':
9758
+ case 'm.youtube.com':
9759
+ case 'music.youtube.com':
9653
9760
  case 'youtu.be':
9654
9761
  case 'www.youtu.be':
9655
9762
  {
9656
- var query = parser.search ? (0,_parse_query_js__WEBPACK_IMPORTED_MODULE_2__.parseQuery)(parser.search) : {
9657
- v: parser.pathname.substring(1)
9658
- };
9659
- if (/^embed\/.*/.test(query.v)) {
9660
- query.v = query.v.substring(6);
9661
- }
9662
- return query.v ? '<iframe width="' + width + '" height="' + height + '" src="' + protocol + '//www.youtube.com/embed/' + query.v + '" frameborder="0" allowfullscreen></iframe>' : url;
9763
+ var query = parser.search ? (0,_parse_query_js__WEBPACK_IMPORTED_MODULE_2__.parseQuery)(parser.search) : {};
9764
+ // `youtube.com/watch` keeps the video id in the `v` query
9765
+ // parameter, while the short `youtu.be/<id>` links and the
9766
+ // `/embed/`, `/shorts/`, `/live/` paths keep it in the pathname.
9767
+ // Modern share urls add tracking params (e.g. `?si=`, `?t=`), so
9768
+ // the pathname must still be used as a fallback when there is no
9769
+ // `v`. See #1209
9770
+ var v = query.v || parser.pathname.substring(1);
9771
+ v = v.replace(/^(watch|embed|shorts|live|v)\//, '').replace(/\/$/, '');
9772
+ return v ? '<iframe width="' + width + '" height="' + height + '" src="' + protocol + '//www.youtube.com/embed/' + v + '" frameborder="0" allowfullscreen></iframe>' : url;
9663
9773
  }
9664
9774
  }
9665
9775
  return url;
@@ -25846,6 +25956,23 @@ var Jodit = Jodit_1 = /*#__PURE__*/ function(ViewWithToolbar) {
25846
25956
  }
25847
25957
  _this.synchronizeValues();
25848
25958
  }
25959
+ }).on(this.ow, 'mouseup', function(event) {
25960
+ if (_this.o.readonly || _this.__isSilentChange) {
25961
+ return;
25962
+ }
25963
+ // When a selection is started inside the editor and the
25964
+ // mouse button is released outside of it, the editable
25965
+ // area never receives the `mouseup` event, so the toolbar
25966
+ // state (active buttons) is not recalculated. Re-fire the
25967
+ // event manually for that case while the selection still
25968
+ // belongs to the editor. See #1251
25969
+ var target = event.target;
25970
+ var insideEditor = Boolean(target && (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.isNumber)(target.nodeType) && editor.contains(target));
25971
+ if (insideEditor || !_this.s.isInsideArea) {
25972
+ return;
25973
+ }
25974
+ _this.e.fire('changeSelection');
25975
+ _this.synchronizeValues();
25849
25976
  });
25850
25977
  }
25851
25978
  },
@@ -40819,9 +40946,14 @@ _config_js__WEBPACK_IMPORTED_MODULE_2__.Config.prototype.uploader = {
40819
40946
  insertImageAsBase64URI: false,
40820
40947
  imagesExtensions: [
40821
40948
  'jpg',
40822
- 'png',
40823
40949
  'jpeg',
40824
- 'gif'
40950
+ 'png',
40951
+ 'gif',
40952
+ 'webp',
40953
+ 'bmp',
40954
+ 'svg',
40955
+ 'tiff',
40956
+ 'avif'
40825
40957
  ],
40826
40958
  headers: null,
40827
40959
  data: null,
@@ -46592,8 +46724,9 @@ _config_js__WEBPACK_IMPORTED_MODULE_3__.Config.prototype.controls.brush = {
46592
46724
  var update = function update(key, value) {
46593
46725
  if (value && value !== (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(editor.editor, key).toString()) {
46594
46726
  button.state.icon.fill = value;
46595
- return;
46727
+ return true;
46596
46728
  }
46729
+ return false;
46597
46730
  };
46598
46731
  if (color) {
46599
46732
  var mode = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.dataBind)(button, 'color');
@@ -46603,8 +46736,16 @@ _config_js__WEBPACK_IMPORTED_MODULE_3__.Config.prototype.controls.brush = {
46603
46736
  var current = editor.s.current();
46604
46737
  if (current && !button.state.disabled) {
46605
46738
  var currentBpx = _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(current, _core_dom_dom_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isElement, editor.editor) || editor.editor;
46606
- update('color', (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(currentBpx, 'color').toString());
46607
- update('background-color', (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(currentBpx, 'background-color').toString());
46739
+ // The icon's fill mirrors the current text/background color so the
46740
+ // button reflects the formatting under the caret. Both calls run so
46741
+ // that a background color (the second call) wins over the text color
46742
+ // when both are set. Keep the computed fill instead of resetting it
46743
+ // below. See #195, #182
46744
+ var hasColor = update('color', (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(currentBpx, 'color').toString());
46745
+ var hasBackground = update('background-color', (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_1__.css)(currentBpx, 'background-color').toString());
46746
+ if (hasColor || hasBackground) {
46747
+ return;
46748
+ }
46608
46749
  }
46609
46750
  button.state.icon.fill = '';
46610
46751
  button.state.activated = false;
@@ -50097,7 +50238,8 @@ _config_js__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.commandToHotkeys = {
50097
50238
  'cmd+shift+7'
50098
50239
  ],
50099
50240
  insertUnorderedList: [
50100
- 'ctrl+shift+8, cmd+shift+8'
50241
+ 'ctrl+shift+8',
50242
+ 'cmd+shift+8'
50101
50243
  ],
50102
50244
  selectall: [
50103
50245
  'ctrl+a',
@@ -54299,14 +54441,31 @@ _config_js__WEBPACK_IMPORTED_MODULE_2__.Config.prototype.controls.indent = {
54299
54441
  };
54300
54442
  _config_js__WEBPACK_IMPORTED_MODULE_2__.Config.prototype.controls.outdent = {
54301
54443
  isDisabled: function isDisabled(editor) {
54444
+ var _a;
54302
54445
  var current = editor.s.current();
54303
- if (current) {
54304
- var currentBox = _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(current, _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock, editor.editor);
54305
- if (currentBox) {
54306
- var arrow = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.getKey)(editor.o.direction, currentBox);
54307
- return !currentBox.style[arrow] || parseInt(currentBox.style[arrow], 10) <= 0;
54446
+ if (!current) {
54447
+ return true;
54448
+ }
54449
+ // A list item whose list is nested inside another list item can be
54450
+ // outdented (un-nested) by the `tab` plugin, even without an inline
54451
+ // indent margin. Keep the button enabled in that case. See #1247
54452
+ if ((_a = editor.o.tab) === null || _a === void 0 ? void 0 : _a.tabInsideLiInsertNewList) {
54453
+ var li = _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(current, 'li', editor.editor);
54454
+ if (li) {
54455
+ var list = _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(li, [
54456
+ 'ul',
54457
+ 'ol'
54458
+ ], editor.editor);
54459
+ if (list && _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(list, 'li', editor.editor)) {
54460
+ return false;
54461
+ }
54308
54462
  }
54309
54463
  }
54464
+ var currentBox = _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(current, _core_dom_index_js__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock, editor.editor);
54465
+ if (currentBox) {
54466
+ var arrow = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_5__.getKey)(editor.o.direction, currentBox);
54467
+ return !currentBox.style[arrow] || parseInt(currentBox.style[arrow], 10) <= 0;
54468
+ }
54310
54469
  return true;
54311
54470
  },
54312
54471
  tooltip: 'Decrease Indent'
@@ -58256,7 +58415,7 @@ var pasteFromWord = /*#__PURE__*/ function(Plugin) {
58256
58415
  }
58257
58416
  case _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.INSERT_ONLY_TEXT:
58258
58417
  {
58259
- html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.stripTags)((0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.cleanFromWord)(html));
58418
+ html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.stripTags)((0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_3__.cleanFromWord)(html), this.j.ed, new Set(this.j.o.pasteExcludeStripTags), this.j.o.nl2brInPlainText);
58260
58419
  break;
58261
58420
  }
58262
58421
  }
@@ -59364,10 +59523,15 @@ function _is_native_reflect_construct() {
59364
59523
  html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.cleanFromWord)(html);
59365
59524
  break;
59366
59525
  case _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.INSERT_ONLY_TEXT:
59367
- html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.stripTags)(html, this.j.ed, new Set(this.j.o.pasteExcludeStripTags));
59526
+ html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.stripTags)(html, this.j.ed, new Set(this.j.o.pasteExcludeStripTags), this.j.o.nl2brInPlainText);
59368
59527
  break;
59369
59528
  case _core_constants_js__WEBPACK_IMPORTED_MODULE_0__.INSERT_AS_TEXT:
59370
59529
  html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.htmlspecialchars)(html);
59530
+ // Keep the source line breaks instead of letting the raw
59531
+ // newlines collapse into spaces when rendered. See #1093
59532
+ if (this.j.o.nl2brInPlainText) {
59533
+ html = (0,_core_helpers_index_js__WEBPACK_IMPORTED_MODULE_4__.nl2br)(html);
59534
+ }
59371
59535
  break;
59372
59536
  default:
59373
59537
  {
package/es5/jodit.min.css CHANGED
@@ -1,14 +1,14 @@
1
1
  /*!
2
2
  * jodit-pro - PRO Version of Jodit Editor
3
3
  * Author: Chupurnov Valerii <chupurnov@gmail.com>
4
- * Version: v4.12.23
4
+ * Version: v4.12.24
5
5
  * Url: https://xdsoft.net/jodit/pro/
6
6
  * License(s): SEE LICENSE IN LICENSE.md
7
7
  */
8
8
  /*!
9
9
  * jodit-pro - PRO Version of Jodit Editor
10
10
  * Author: Chupurnov Valerii <chupurnov@gmail.com>
11
- * Version: v4.12.23
11
+ * Version: v4.12.24
12
12
  * Url: https://xdsoft.net/jodit/pro/
13
13
  * License(s): SEE LICENSE IN LICENSE.md
14
14
  */