jodit 4.2.27 → 4.2.32

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 (156) hide show
  1. package/.nvmrc +1 -1
  2. package/CHANGELOG.md +104 -5
  3. package/es2015/jodit.css +11 -1
  4. package/es2015/jodit.fat.min.css +1 -1
  5. package/es2015/jodit.fat.min.js +2 -2
  6. package/es2015/jodit.js +330 -230
  7. package/es2015/jodit.min.css +1 -1
  8. package/es2015/jodit.min.js +2 -2
  9. package/es2015/plugins/debug/debug.js +1 -1
  10. package/es2015/plugins/debug/debug.min.js +1 -1
  11. package/es2015/plugins/speech-recognize/speech-recognize.css +1 -1
  12. package/es2015/plugins/speech-recognize/speech-recognize.js +25 -18
  13. package/es2015/plugins/speech-recognize/speech-recognize.min.js +2 -2
  14. package/es2018/jodit.css +11 -1
  15. package/es2018/jodit.fat.min.css +1 -1
  16. package/es2018/jodit.fat.min.js +2 -2
  17. package/es2018/jodit.js +324 -224
  18. package/es2018/jodit.min.css +1 -1
  19. package/es2018/jodit.min.js +2 -2
  20. package/es2018/plugins/debug/debug.js +1 -1
  21. package/es2018/plugins/debug/debug.min.js +1 -1
  22. package/es2018/plugins/speech-recognize/speech-recognize.css +1 -1
  23. package/es2018/plugins/speech-recognize/speech-recognize.js +25 -18
  24. package/es2018/plugins/speech-recognize/speech-recognize.min.js +2 -2
  25. package/es2021/jodit.css +11 -1
  26. package/es2021/jodit.fat.min.css +1 -1
  27. package/es2021/jodit.fat.min.js +2 -2
  28. package/es2021/jodit.js +324 -224
  29. package/es2021/jodit.min.css +1 -1
  30. package/es2021/jodit.min.js +2 -2
  31. package/es2021/plugins/debug/debug.js +1 -1
  32. package/es2021/plugins/debug/debug.min.js +1 -1
  33. package/es2021/plugins/speech-recognize/speech-recognize.css +1 -1
  34. package/es2021/plugins/speech-recognize/speech-recognize.js +25 -18
  35. package/es2021/plugins/speech-recognize/speech-recognize.min.js +2 -2
  36. package/es2021.en/jodit.css +11 -1
  37. package/es2021.en/jodit.fat.min.css +1 -1
  38. package/es2021.en/jodit.fat.min.js +2 -2
  39. package/es2021.en/jodit.js +299 -218
  40. package/es2021.en/jodit.min.css +1 -1
  41. package/es2021.en/jodit.min.js +2 -2
  42. package/es2021.en/plugins/debug/debug.js +1 -1
  43. package/es2021.en/plugins/debug/debug.min.js +1 -1
  44. package/es2021.en/plugins/speech-recognize/speech-recognize.css +1 -1
  45. package/es2021.en/plugins/speech-recognize/speech-recognize.js +25 -18
  46. package/es2021.en/plugins/speech-recognize/speech-recognize.min.js +2 -2
  47. package/es5/164.fat.min.js +10 -0
  48. package/es5/164.js +4939 -0
  49. package/es5/164.min.js +10 -0
  50. package/es5/5.fat.min.js +10 -0
  51. package/es5/5.js +76 -0
  52. package/es5/5.min.js +10 -0
  53. package/es5/jodit.css +12 -2
  54. package/es5/jodit.fat.min.css +1 -1
  55. package/es5/jodit.fat.min.js +2 -2
  56. package/es5/jodit.js +753 -5684
  57. package/es5/jodit.min.css +3 -3
  58. package/es5/jodit.min.js +2 -2
  59. package/es5/plugins/debug/debug.js +1 -1
  60. package/es5/plugins/debug/debug.min.js +1 -1
  61. package/es5/plugins/speech-recognize/speech-recognize.css +1 -1
  62. package/es5/plugins/speech-recognize/speech-recognize.js +26 -19
  63. package/es5/plugins/speech-recognize/speech-recognize.min.js +2 -2
  64. package/esm/config.js +3 -7
  65. package/esm/core/async/async.js +2 -1
  66. package/esm/core/constants.d.ts +2 -0
  67. package/esm/core/constants.js +10 -6
  68. package/esm/core/decorators/watch/watch.js +0 -1
  69. package/esm/core/dom/dom.js +2 -2
  70. package/esm/core/event-emitter/event-emitter.js +3 -3
  71. package/esm/core/global.js +13 -3
  72. package/esm/core/helpers/array/to-array.d.ts +1 -6
  73. package/esm/core/helpers/array/to-array.js +1 -1
  74. package/esm/core/helpers/async/set-timeout.d.ts +0 -3
  75. package/esm/core/helpers/async/set-timeout.js +3 -2
  76. package/esm/core/helpers/checker/has-browser-color-picker.d.ts +0 -3
  77. package/esm/core/helpers/checker/has-browser-color-picker.js +2 -1
  78. package/esm/core/helpers/checker/is-url.d.ts +0 -3
  79. package/esm/core/helpers/checker/is-url.js +2 -1
  80. package/esm/core/helpers/html/apply-styles.js +3 -3
  81. package/esm/core/helpers/html/clean-from-word.js +2 -1
  82. package/esm/core/helpers/html/htmlspecialchars.d.ts +0 -3
  83. package/esm/core/helpers/html/htmlspecialchars.js +2 -1
  84. package/esm/core/helpers/normalize/normalize-size.d.ts +1 -1
  85. package/esm/core/helpers/size/get-scroll-parent.js +3 -2
  86. package/esm/core/helpers/utils/complete-url.js +2 -1
  87. package/esm/core/helpers/utils/convert-media-url-to-video-embed.js +2 -1
  88. package/esm/core/helpers/utils/default-language.js +3 -2
  89. package/esm/core/helpers/utils/reset.js +3 -3
  90. package/esm/core/request/ajax.js +2 -1
  91. package/esm/core/selection/selection.js +1 -0
  92. package/esm/core/selection/style/api/has-same-style.js +15 -10
  93. package/esm/core/selection/style/api/toggle-attributes.js +2 -1
  94. package/esm/core/selection/style/commit-style.d.ts +1 -1
  95. package/esm/core/ui/form/inputs/file/file.d.ts +1 -0
  96. package/esm/core/ui/form/inputs/file/file.js +1 -0
  97. package/esm/core/ui/form/validators/input.d.ts +3 -3
  98. package/esm/core/ui/form/validators/select.d.ts +1 -1
  99. package/esm/jodit.js +3 -0
  100. package/esm/modules/file-browser/config.js +9 -1
  101. package/esm/modules/file-browser/data-provider.js +0 -1
  102. package/esm/modules/file-browser/file-browser.js +0 -1
  103. package/esm/modules/table/table.js +0 -1
  104. package/esm/modules/toolbar/button/button.d.ts +1 -1
  105. package/esm/plugins/backspace/cases/check-remove-char.js +1 -0
  106. package/esm/plugins/clean-html/config.d.ts +3 -3
  107. package/esm/plugins/iframe/config.d.ts +15 -3
  108. package/esm/plugins/iframe/config.js +1 -0
  109. package/esm/plugins/iframe/iframe.js +3 -0
  110. package/esm/plugins/indent/helpers.d.ts +1 -1
  111. package/esm/plugins/inline-popup/config/items/a.d.ts +2 -2
  112. package/esm/plugins/inline-popup/config/items/cells.d.ts +1 -1
  113. package/esm/plugins/inline-popup/config/items/img.d.ts +1 -1
  114. package/esm/plugins/search/config.js +2 -2
  115. package/esm/plugins/search/helpers/highlight-text-ranges.js +3 -1
  116. package/esm/plugins/source/editor/engines/ace.d.ts +0 -1
  117. package/esm/plugins/speech-recognize/config.js +1 -1
  118. package/esm/plugins/speech-recognize/helpers/api.d.ts +1 -1
  119. package/esm/plugins/speech-recognize/helpers/api.js +5 -2
  120. package/esm/plugins/speech-recognize/helpers/sound.js +6 -4
  121. package/esm/plugins/stat/config.d.ts +1 -0
  122. package/esm/plugins/stat/config.js +1 -0
  123. package/esm/plugins/stat/stat.js +14 -3
  124. package/esm/plugins/symbols/langs/index.d.ts +2 -1
  125. package/esm/plugins/symbols/langs/index.js +2 -1
  126. package/esm/plugins/symbols/langs/ua.d.ts +1 -0
  127. package/esm/plugins/symbols/langs/ua.js +9 -0
  128. package/esm/polyfills.d.ts +10 -0
  129. package/esm/polyfills.js +54 -0
  130. package/esm/tsconfig.json +1 -1
  131. package/package.json +1 -1
  132. package/types/core/constants.d.ts +2 -0
  133. package/types/core/helpers/array/to-array.d.ts +1 -6
  134. package/types/core/helpers/async/set-timeout.d.ts +0 -3
  135. package/types/core/helpers/checker/has-browser-color-picker.d.ts +0 -3
  136. package/types/core/helpers/checker/is-url.d.ts +0 -3
  137. package/types/core/helpers/html/htmlspecialchars.d.ts +0 -3
  138. package/types/core/helpers/normalize/normalize-size.d.ts +1 -1
  139. package/types/core/selection/style/commit-style.d.ts +1 -1
  140. package/types/core/ui/form/inputs/file/file.d.ts +1 -0
  141. package/types/core/ui/form/validators/input.d.ts +3 -3
  142. package/types/core/ui/form/validators/select.d.ts +1 -1
  143. package/types/modules/toolbar/button/button.d.ts +1 -1
  144. package/types/plugins/clean-html/config.d.ts +3 -3
  145. package/types/plugins/iframe/config.d.ts +15 -3
  146. package/types/plugins/indent/helpers.d.ts +1 -1
  147. package/types/plugins/inline-popup/config/items/a.d.ts +2 -2
  148. package/types/plugins/inline-popup/config/items/cells.d.ts +1 -1
  149. package/types/plugins/inline-popup/config/items/img.d.ts +1 -1
  150. package/types/plugins/source/editor/engines/ace.d.ts +0 -1
  151. package/types/plugins/speech-recognize/helpers/api.d.ts +1 -1
  152. package/types/plugins/stat/config.d.ts +1 -0
  153. package/types/plugins/symbols/langs/index.d.ts +2 -1
  154. package/types/plugins/symbols/langs/ua.d.ts +1 -0
  155. package/types/polyfills.d.ts +10 -0
  156. package/types/tsconfig.json +1 -1
@@ -3,6 +3,7 @@
3
3
  * Released under MIT see LICENSE.txt in the project root for license information.
4
4
  * Copyright (c) 2013-2024 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
5
5
  */
6
+ import { globalDocument } from "../../constants.js";
6
7
  import { Dom } from "../../dom/dom.js";
7
8
  import { css } from "../utils/index.js";
8
9
  export function getScrollParent(node) {
@@ -16,6 +17,6 @@ export function getScrollParent(node) {
16
17
  return node;
17
18
  }
18
19
  return (getScrollParent(node.parentNode) ||
19
- document.scrollingElement ||
20
- document.body);
20
+ globalDocument.scrollingElement ||
21
+ globalDocument.body);
21
22
  }
@@ -3,11 +3,12 @@
3
3
  * Released under MIT see LICENSE.txt in the project root for license information.
4
4
  * Copyright (c) 2013-2024 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
5
5
  */
6
+ import { globalWindow } from "../../constants.js";
6
7
  /**
7
8
  * @module helpers/utils
8
9
  */
9
10
  export const completeUrl = (url) => {
10
- if (window.location.protocol === 'file:' && /^\/\//.test(url)) {
11
+ if (globalWindow.location.protocol === 'file:' && /^\/\//.test(url)) {
11
12
  url = 'https:' + url;
12
13
  }
13
14
  return url;
@@ -6,6 +6,7 @@
6
6
  /**
7
7
  * @module helpers/utils
8
8
  */
9
+ import { globalDocument } from "../../constants.js";
9
10
  import { isURL } from "../checker/is-url.js";
10
11
  import { parseQuery } from "./parse-query.js";
11
12
  /**
@@ -15,7 +16,7 @@ export const convertMediaUrlToVideoEmbed = (url, width = 400, height = 345) => {
15
16
  if (!isURL(url)) {
16
17
  return url;
17
18
  }
18
- const parser = document.createElement('a'), pattern1 = /(?:http?s?:\/\/)?(?:www\.)?(?:vimeo\.com)\/?(.+)/g;
19
+ const parser = globalDocument.createElement('a'), pattern1 = /(?:http?s?:\/\/)?(?:www\.)?(?:vimeo\.com)\/?(.+)/g;
19
20
  parser.href = url;
20
21
  if (!width) {
21
22
  width = 400;
@@ -6,6 +6,7 @@
6
6
  /**
7
7
  * @module helpers/utils
8
8
  */
9
+ import { globalDocument } from "../../constants.js";
9
10
  import { isString } from "../checker/is-string.js";
10
11
  /**
11
12
  * Try define user language
@@ -14,8 +15,8 @@ export const defaultLanguage = (language, defaultLanguage = 'en') => {
14
15
  if (language !== 'auto' && isString(language)) {
15
16
  return language;
16
17
  }
17
- if (document.documentElement && document.documentElement.lang) {
18
- return document.documentElement.lang;
18
+ if (globalDocument.documentElement && globalDocument.documentElement.lang) {
19
+ return globalDocument.documentElement.lang;
19
20
  }
20
21
  if (navigator.language) {
21
22
  return navigator.language.substring(0, 2);
@@ -3,7 +3,7 @@
3
3
  * Released under MIT see LICENSE.txt in the project root for license information.
4
4
  * Copyright (c) 2013-2024 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
5
5
  */
6
- import { IS_PROD } from "../../constants.js";
6
+ import { globalDocument, IS_PROD } from "../../constants.js";
7
7
  import { isFunction } from "../checker/is-function.js";
8
8
  import { get } from "./get.js";
9
9
  const map = {};
@@ -17,10 +17,10 @@ const map = {};
17
17
  */
18
18
  export function reset(key) {
19
19
  if (!(key in map)) {
20
- const iframe = document.createElement('iframe');
20
+ const iframe = globalDocument.createElement('iframe');
21
21
  try {
22
22
  iframe.src = 'about:blank';
23
- document.body.appendChild(iframe);
23
+ globalDocument.body.appendChild(iframe);
24
24
  if (!iframe.contentWindow) {
25
25
  return null;
26
26
  }
@@ -14,6 +14,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
14
14
  return c > 3 && r && Object.defineProperty(target, key, r), r;
15
15
  };
16
16
  import { Async } from "../async/index.js";
17
+ import { globalWindow } from "../constants.js";
17
18
  import { autobind } from "../decorators/autobind/autobind.js";
18
19
  import { buildQuery, ConfigProto, isFunction, isPlainObject, isString, parseQuery } from "../helpers/index.js";
19
20
  import * as error from "../helpers/utils/error/index.js";
@@ -42,7 +43,7 @@ export class Ajax {
42
43
  return this.o.queryBuild.call(this, obj, prefix);
43
44
  }
44
45
  if (isString(obj) ||
45
- obj instanceof window.FormData ||
46
+ obj instanceof globalWindow.FormData ||
46
47
  (typeof obj === 'object' && obj != null && isFunction(obj.append))) {
47
48
  return obj;
48
49
  }
@@ -593,6 +593,7 @@ export class Selection {
593
593
  /**
594
594
  * Call callback for all selection node
595
595
  */
596
+ // eslint-disable-next-line complexity
596
597
  eachSelection(callback) {
597
598
  const sel = this.sel;
598
599
  if (!sel || !sel.rangeCount) {
@@ -3,6 +3,7 @@
3
3
  * Released under MIT see LICENSE.txt in the project root for license information.
4
4
  * Copyright (c) 2013-2024 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
5
5
  */
6
+ import { globalDocument } from "../../../constants.js";
6
7
  import { Dom } from "../../../dom/dom.js";
7
8
  import { isVoid } from "../../../helpers/checker/is-void.js";
8
9
  import { normalizeCssValue } from "../../../helpers/normalize/normalize-css-value.js";
@@ -29,11 +30,13 @@ export function hasSameStyle(elm, rules) {
29
30
  .toLowerCase() === value.toString().toLowerCase());
30
31
  }));
31
32
  }
32
- const elm = document.createElement('div');
33
- elm.style.color = 'red';
34
- assert(hasSameStyle(elm, { color: 'red' }), 'Style test');
35
- assert(hasSameStyle(elm, { fontSize: null }), 'Style test');
36
- assert(hasSameStyle(elm, { fontSize: '' }), 'Style test');
33
+ if (globalDocument) {
34
+ const elm = globalDocument.createElement('div');
35
+ elm.style.color = 'red';
36
+ assert(hasSameStyle(elm, { color: 'red' }), 'Style test');
37
+ assert(hasSameStyle(elm, { fontSize: null }), 'Style test');
38
+ assert(hasSameStyle(elm, { fontSize: '' }), 'Style test');
39
+ }
37
40
  /**
38
41
  * Element has the similar styles keys
39
42
  */
@@ -45,8 +48,10 @@ export function hasSameStyleKeys(elm, rules) {
45
48
  return value !== '';
46
49
  }));
47
50
  }
48
- const elm2 = document.createElement('div');
49
- elm2.style.color = 'red';
50
- assert(hasSameStyleKeys(elm2, { color: 'red' }), 'Style test');
51
- assert(!hasSameStyleKeys(elm2, { font: 'Arial', color: 'red' }), 'Style test');
52
- assert(!hasSameStyleKeys(elm2, { border: '1px solid #ccc' }), 'Style test');
51
+ if (globalDocument) {
52
+ const elm2 = globalDocument.createElement('div');
53
+ elm2.style.color = 'red';
54
+ assert(hasSameStyleKeys(elm2, { color: 'red' }), 'Style test');
55
+ assert(!hasSameStyleKeys(elm2, { font: 'Arial', color: 'red' }), 'Style test');
56
+ assert(!hasSameStyleKeys(elm2, { border: '1px solid #ccc' }), 'Style test');
57
+ }
@@ -3,6 +3,7 @@
3
3
  * Released under MIT see LICENSE.txt in the project root for license information.
4
4
  * Copyright (c) 2013-2024 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
5
5
  */
6
+ import { globalDocument } from "../../../constants.js";
6
7
  import { Dom } from "../../../dom/dom.js";
7
8
  import { getContainer } from "../../../global.js";
8
9
  import { isBoolean, isNumber, isPlainObject, isString } from "../../../helpers/checker/index.js";
@@ -129,7 +130,7 @@ function getShadowRoot(jodit) {
129
130
  return dataBind(jodit, 'shadowRoot');
130
131
  }
131
132
  const container = getContainer(jodit);
132
- const iframe = document.createElement('iframe');
133
+ const iframe = globalDocument.createElement('iframe');
133
134
  css(iframe, {
134
135
  width: 0,
135
136
  height: 0,
@@ -23,7 +23,7 @@ export declare class CommitStyle implements ICommitStyle {
23
23
  */
24
24
  get isElementCommit(): boolean;
25
25
  get defaultTag(): HTMLTagNames;
26
- get elementIsDefault(): Boolean;
26
+ get elementIsDefault(): boolean;
27
27
  constructor(options: IStyleOptions);
28
28
  apply(jodit: IJodit): void;
29
29
  }
@@ -13,6 +13,7 @@ export declare class UIFileInput extends UIInput {
13
13
  private button;
14
14
  state: UIInput['state'] & {
15
15
  onlyImages: boolean;
16
+ tooltip?: string;
16
17
  };
17
18
  /** @override */
18
19
  className(): string;
@@ -23,6 +23,7 @@ let UIFileInput = class UIFileInput extends UIInput {
23
23
  }
24
24
  createContainer(options) {
25
25
  this.button = new UIButton(this.j, {
26
+ tooltip: options.tooltip,
26
27
  icon: {
27
28
  name: 'plus'
28
29
  }
@@ -6,12 +6,12 @@
6
6
  /**
7
7
  * @module ui/form
8
8
  */
9
- import type { IUIInput, IUIInputValidator } from "../../../../types";
9
+ import type { IUIInputValidator } from "../../../../types";
10
10
  /**
11
11
  * Input is required
12
12
  */
13
- export declare const required: IUIInputValidator<IUIInput>;
13
+ export declare const required: IUIInputValidator;
14
14
  /**
15
15
  * Input value should be valid URL
16
16
  */
17
- export declare const url: IUIInputValidator<IUIInput>;
17
+ export declare const url: IUIInputValidator;
@@ -10,4 +10,4 @@ import type { IUIInputValidator } from "../../../../types";
10
10
  /**
11
11
  * Select is required
12
12
  */
13
- export declare const required: IUIInputValidator<import("../../../../types").IUIInput>;
13
+ export declare const required: IUIInputValidator;
package/esm/jodit.js CHANGED
@@ -844,6 +844,9 @@ let Jodit = Jodit_1 = class Jodit extends ViewWithToolbar {
844
844
  }
845
845
  }
846
846
  catch (e) {
847
+ if (!IS_PROD) {
848
+ throw e;
849
+ }
847
850
  this.destruct();
848
851
  throw e;
849
852
  }
@@ -220,10 +220,12 @@ Config.prototype.filebrowser = {
220
220
  Config.prototype.controls.filebrowser = {
221
221
  upload: {
222
222
  icon: 'plus',
223
+ tooltip: 'Upload file',
223
224
  isInput: true,
224
225
  isDisabled: (browser) => !browser.dataProvider.canI('FileUpload'),
225
- getContent: (filebrowser) => {
226
+ getContent: (filebrowser, btnInt) => {
226
227
  const btn = new UIFileInput(filebrowser, {
228
+ tooltip: btnInt.control.tooltip,
227
229
  onlyImages: filebrowser.state.onlyImages
228
230
  });
229
231
  filebrowser.e.fire('bindUploader.filebrowser', btn.container);
@@ -232,6 +234,7 @@ Config.prototype.controls.filebrowser = {
232
234
  },
233
235
  remove: {
234
236
  icon: 'bin',
237
+ tooltip: 'Remove file',
235
238
  isDisabled: (browser) => {
236
239
  return (!browser.state.activeElements.length ||
237
240
  !browser.dataProvider.canI('FileRemove'));
@@ -241,11 +244,13 @@ Config.prototype.controls.filebrowser = {
241
244
  }
242
245
  },
243
246
  update: {
247
+ tooltip: 'Update file list',
244
248
  exec: (editor) => {
245
249
  editor.e.fire('update.filebrowser');
246
250
  }
247
251
  },
248
252
  select: {
253
+ tooltip: 'Select file',
249
254
  icon: 'check',
250
255
  isDisabled: (browser) => !browser.state.activeElements.length,
251
256
  exec: (editor) => {
@@ -253,6 +258,7 @@ Config.prototype.controls.filebrowser = {
253
258
  }
254
259
  },
255
260
  edit: {
261
+ tooltip: 'Edit image',
256
262
  icon: 'pencil',
257
263
  isDisabled: (browser) => {
258
264
  const selected = browser.state.activeElements;
@@ -266,6 +272,7 @@ Config.prototype.controls.filebrowser = {
266
272
  }
267
273
  },
268
274
  tiles: {
275
+ tooltip: 'Tiles view',
269
276
  icon: 'th',
270
277
  isActive: (filebrowser) => filebrowser.state.view === 'tiles',
271
278
  exec: (filebrowser) => {
@@ -273,6 +280,7 @@ Config.prototype.controls.filebrowser = {
273
280
  }
274
281
  },
275
282
  list: {
283
+ tooltip: 'List view',
276
284
  icon: 'th-list',
277
285
  isActive: (filebrowser) => filebrowser.state.view === 'list',
278
286
  exec: (filebrowser) => {
@@ -354,7 +354,6 @@ let DataProvider = class DataProvider {
354
354
  data: {}
355
355
  };
356
356
  }
357
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
358
357
  const query = this.o[type];
359
358
  if (query.data === undefined) {
360
359
  query.data = {
@@ -41,7 +41,6 @@ let FileBrowser = class FileBrowser extends ViewWithToolbar {
41
41
  get dataProvider() {
42
42
  return makeDataProvider(this, this.options);
43
43
  }
44
- // eslint-disable-next-line no-unused-vars
45
44
  onSelect(callback) {
46
45
  return () => {
47
46
  if (this.state.activeElements.length) {
@@ -36,7 +36,6 @@ export class Table extends ViewComponent {
36
36
  const selector = cssPath(td);
37
37
  selector && selectors.push(selector);
38
38
  });
39
- // eslint-disable-next-line no-prototype-builtins
40
39
  style.innerHTML = selectors.length
41
40
  ? selectors.join(',') +
42
41
  `{${this.jodit.options.table.selectionCellStyle}}`
@@ -20,7 +20,7 @@ export declare class ToolbarButton<T extends IViewBased = IViewBased> extends UI
20
20
  theme: string;
21
21
  currentValue: string;
22
22
  hasTrigger: boolean;
23
- size: "small" | "tiny" | "xsmall" | "middle" | "large";
23
+ size: "tiny" | "xsmall" | "small" | "middle" | "large";
24
24
  name: string;
25
25
  value: string | number | boolean;
26
26
  variant: import("../../../types").ButtonVariant;
@@ -20,6 +20,7 @@ import { findMostNestedNeighbor } from "../helpers.js";
20
20
  * ```
21
21
  * @private
22
22
  */
23
+ // eslint-disable-next-line complexity
23
24
  export function checkRemoveChar(jodit, fakeNode, backspace, mode) {
24
25
  const step = backspace ? -1 : 1;
25
26
  const anotherSibling = Dom.sibling(fakeNode, !backspace);
@@ -19,9 +19,9 @@ declare module 'jodit/config' {
19
19
  removeEmptyElements: boolean;
20
20
  replaceOldTags: IDictionary<HTMLTagNames> | false;
21
21
  /**
22
- * Use iframe[sandbox] to paste HTML code into the editor to check it for safety
23
- * Allows you not to run scripts and handlers, but it works much slower
24
- * @example
22
+ * You can use an iframe with the sandbox attribute to safely paste and test HTML code.
23
+ * It prevents scripts and handlers from running, but it does slow things down.
24
+ *
25
25
  * ```javascript
26
26
  * Jodit.make('#editor', {
27
27
  * cleanHTML: {
@@ -22,7 +22,7 @@ declare module 'jodit/config' {
22
22
  *
23
23
  * @example
24
24
  * ```javascript
25
- * new Jodit('#editor', {
25
+ * Jodit.make('#editor', {
26
26
  * iframe: true,
27
27
  * iframeBaseUrl: 'https://xdsoft.net/jodit/docs/',
28
28
  * });
@@ -41,7 +41,7 @@ declare module 'jodit/config' {
41
41
  * Custom style to be used inside the iframe to display content.
42
42
  * @example
43
43
  * ```javascript
44
- * new Jodit('#editor', {
44
+ * Jodit.make('#editor', {
45
45
  * iframe: true,
46
46
  * iframeStyle: 'html{margin: 0px;}',
47
47
  * })
@@ -53,13 +53,25 @@ declare module 'jodit/config' {
53
53
  *
54
54
  * @example
55
55
  * ```javascript
56
- * new Jodit('#editor', {
56
+ * Jodit.make('#editor', {
57
57
  * iframe: true,
58
58
  * iframeCSSLinks: ['styles/default.css'],
59
59
  * })
60
60
  * ```
61
61
  */
62
62
  iframeCSSLinks: string[];
63
+ /**
64
+ * Custom sandbox attribute for the iframe.
65
+ * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox
66
+ * ```javascript
67
+ * Jodit.make('#editor', {
68
+ * iframe: true,
69
+ * iframeSandbox: 'allow-same-origin allow-scripts'
70
+ * });
71
+ * ```
72
+ * Empty string value means that all restrictions are enabled.
73
+ */
74
+ iframeSandbox: string | null;
63
75
  }
64
76
  }
65
77
  export {};
@@ -78,3 +78,4 @@ Config.prototype.iframeStyle =
78
78
  '-ms-user-select: none' +
79
79
  '}';
80
80
  Config.prototype.iframeCSSLinks = [];
81
+ Config.prototype.iframeSandbox = null;
@@ -61,6 +61,9 @@ export function iframe(editor) {
61
61
  iframe.setAttribute('allowtransparency', 'true');
62
62
  iframe.setAttribute('tabindex', opt.tabIndex.toString());
63
63
  iframe.setAttribute('frameborder', '0');
64
+ if (opt.iframeSandbox != null) {
65
+ iframe.setAttribute('sandbox', opt.iframeSandbox);
66
+ }
64
67
  editor.workplace.appendChild(iframe);
65
68
  editor.iframe = iframe;
66
69
  const result = editor.e.fire('generateDocumentStructure.iframe', null, editor);
@@ -7,4 +7,4 @@
7
7
  * Get style rule key for current direction
8
8
  * @internal
9
9
  */
10
- export declare const getKey: (direction: string, box: HTMLElement) => 'marginLeft' | 'marginRight' | 'paddingLeft' | 'paddingRight';
10
+ export declare const getKey: (direction: string, box: HTMLElement) => "marginLeft" | "marginRight" | "paddingLeft" | "paddingRight";
@@ -6,6 +6,6 @@
6
6
  /**
7
7
  * @module plugins/inline-popup
8
8
  */
9
- import type { IControlType, IJodit } from "../../../../types";
10
- declare const _default: (string | IControlType<IJodit | import("../../../../types").IViewBased<import("../../../../types").IViewOptions> | import("../../../../types").IFileBrowser<import("../../../../types").IFileBrowserOptions>, import("../../../../types").IToolbarButton>)[];
9
+ import type { IControlType } from "../../../../types";
10
+ declare const _default: Array<IControlType | string>;
11
11
  export default _default;
@@ -7,5 +7,5 @@
7
7
  * @module plugins/inline-popup
8
8
  */
9
9
  import type { IControlType } from "../../../../types";
10
- declare const _default: (string | IControlType<import("../../../../types").IJodit | import("../../../../types").IViewBased<import("../../../../types").IViewOptions> | import("../../../../types").IFileBrowser<import("../../../../types").IFileBrowserOptions>, import("../../../../types").IToolbarButton>)[];
10
+ declare const _default: Array<IControlType | string>;
11
11
  export default _default;
@@ -8,5 +8,5 @@
8
8
  */
9
9
  import type { IControlType, IJodit } from "../../../../types";
10
10
  export declare const align: IControlType<IJodit>;
11
- declare const _default: (string | IControlType<IJodit | import("../../../../types").IViewBased<import("../../../../types").IViewOptions> | import("../../../../types").IFileBrowser<import("../../../../types").IFileBrowserOptions>, import("../../../../types").IToolbarButton>)[];
11
+ declare const _default: Array<IControlType | string>;
12
12
  export default _default;
@@ -3,6 +3,7 @@
3
3
  * Released under MIT see LICENSE.txt in the project root for license information.
4
4
  * Copyright (c) 2013-2024 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
5
5
  */
6
+ import { globalWindow } from "../../core/constants.js";
6
7
  import { Icon } from "../../core/ui/icon.js";
7
8
  import { Config } from "../../config.js";
8
9
  import "./interface.js";
@@ -10,8 +11,7 @@ import searchIcon from "./search.svg.js";
10
11
  Config.prototype.useSearch = true;
11
12
  Config.prototype.search = {
12
13
  lazyIdleTimeout: 0,
13
- // @ts-ignore Because Highlight is not defined in the types TS 5.3.3
14
- useCustomHighlightAPI: typeof window.Highlight !== 'undefined'
14
+ useCustomHighlightAPI: globalWindow && typeof globalWindow.Highlight !== 'undefined'
15
15
  };
16
16
  Icon.set('search', searchIcon);
17
17
  Config.prototype.controls.find = {
@@ -3,6 +3,7 @@
3
3
  * Released under MIT see LICENSE.txt in the project root for license information.
4
4
  * Copyright (c) 2013-2024 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
5
5
  */
6
+ import { globalWindow } from "../../../core/constants.js";
6
7
  import { Dom } from "../../../core/dom/dom.js";
7
8
  import { $$ } from "../../../core/helpers/utils/selector.js";
8
9
  /**
@@ -73,7 +74,8 @@ function isSelectionWrapper(node) {
73
74
  function checkNativeSelectionMethod(jodit, rng, restRanges) {
74
75
  if (jodit.o.search.useCustomHighlightAPI &&
75
76
  // @ts-ignore Because Highlight is not defined in the types TS 5.3.3
76
- typeof window.Highlight !== 'undefined') {
77
+ globalWindow &&
78
+ typeof globalWindow.Highlight !== 'undefined') {
77
79
  const ranges = [rng, ...restRanges].map(rng => {
78
80
  const range = jodit.selection.createRange();
79
81
  range.setStart(rng.startContainer, rng.startOffset);
@@ -1,4 +1,3 @@
1
- /// <reference types="ace" />
2
1
  /*!
3
2
  * Jodit Editor (https://xdsoft.net/jodit/)
4
3
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -55,7 +55,7 @@ Config.prototype.controls.speechRecognize = {
55
55
  api = new RecognizeManager(jodit.async, nativeApi);
56
56
  api.lang = isString(lang)
57
57
  ? lang
58
- : attr(jodit.od.documentElement, 'lang') ?? undefined;
58
+ : (attr(jodit.od.documentElement, 'lang') ?? undefined);
59
59
  api.continuous = continuous;
60
60
  api.interimResults = interimResults;
61
61
  api.sound = sound;
@@ -7,4 +7,4 @@
7
7
  * @module plugins/speech-recognize
8
8
  */
9
9
  import type { ISpeechRecognizeConstructor } from "../interface";
10
- export declare const SpeechRecognition: ISpeechRecognizeConstructor;
10
+ export declare const SpeechRecognition: ISpeechRecognizeConstructor | undefined;
@@ -3,5 +3,8 @@
3
3
  * Released under MIT see LICENSE.txt in the project root for license information.
4
4
  * Copyright (c) 2013-2024 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
5
5
  */
6
- export const SpeechRecognition = window.SpeechRecognition ||
7
- window.webkitSpeechRecognition;
6
+ import { globalWindow } from "../../../core/constants.js";
7
+ export const SpeechRecognition = globalWindow
8
+ ? globalWindow.SpeechRecognition ||
9
+ globalWindow.webkitSpeechRecognition
10
+ : undefined;
@@ -6,18 +6,20 @@
6
6
  /**
7
7
  * @module plugins/speech-recognize
8
8
  */
9
+ import { globalWindow } from "../../../core/constants.js";
9
10
  import { PII } from "../constants.js";
10
11
  /**
11
12
  * @internal
12
13
  */
13
14
  export function sound({ sec = 0.1, frequency = PII, gain = 0.1, type = 'sine' } = {}) {
14
- if (typeof window.AudioContext === 'undefined' &&
15
- typeof window.webkitAudioContext === 'undefined') {
15
+ if (!globalWindow ||
16
+ (typeof globalWindow.AudioContext === 'undefined' &&
17
+ typeof globalWindow.webkitAudioContext === 'undefined')) {
16
18
  return;
17
19
  }
18
20
  // one context per document
19
- const context = new (window.AudioContext ||
20
- window.webkitAudioContext)();
21
+ const context = new (globalWindow.AudioContext ||
22
+ globalWindow.webkitAudioContext)();
21
23
  const vol = context.createGain();
22
24
  const osc = context.createOscillator();
23
25
  osc.type = type;
@@ -7,6 +7,7 @@ declare module 'jodit/config' {
7
7
  interface Config {
8
8
  showCharsCounter: boolean;
9
9
  countHTMLChars: boolean;
10
+ countTextSpaces: boolean;
10
11
  showWordsCounter: boolean;
11
12
  }
12
13
  }
@@ -9,4 +9,5 @@
9
9
  import { Config } from "../../config.js";
10
10
  Config.prototype.showCharsCounter = true;
11
11
  Config.prototype.countHTMLChars = false;
12
+ Config.prototype.countTextSpaces = false;
12
13
  Config.prototype.showWordsCounter = true;
@@ -29,9 +29,20 @@ export class stat extends Plugin {
29
29
  this.calc = this.j.async.throttle(() => {
30
30
  const text = this.j.text;
31
31
  if (this.j.o.showCharsCounter && this.charCounter) {
32
- const chars = this.j.o.countHTMLChars
33
- ? this.j.value
34
- : text.replace(SPACE_REG_EXP(), '');
32
+ let chars;
33
+ if (this.j.o.countHTMLChars) {
34
+ chars = this.j.value;
35
+ }
36
+ else {
37
+ if (this.j.o.countTextSpaces) {
38
+ chars = text
39
+ .replace(INVISIBLE_SPACE_REG_EXP(), '')
40
+ .replace(/[\r\n]/g, '');
41
+ }
42
+ else {
43
+ chars = text.replace(SPACE_REG_EXP(), '');
44
+ }
45
+ }
35
46
  this.charCounter.textContent = this.j.i18n('Chars: %d', chars.length);
36
47
  }
37
48
  if (this.j.o.showWordsCounter && this.wordCounter) {
@@ -22,6 +22,7 @@ import * as pl from "./pl.js";
22
22
  import * as pt_br from "./pt_br.js";
23
23
  import * as ru from "./ru.js";
24
24
  import * as tr from "./tr.js";
25
+ import * as ua from "./ua.js";
25
26
  import * as zh_cn from "./zh_cn.js";
26
27
  import * as zh_tw from "./zh_tw.js";
27
- export { ar, cs_cz, de, es, fa, fi, fr, he, hu, id, it, ja, ko, mn, nl, pl, pt_br, ru, tr, zh_cn, zh_tw };
28
+ export { ar, cs_cz, de, es, fa, fi, fr, he, hu, id, it, ja, ko, mn, nl, pl, pt_br, ru, tr, ua, zh_cn, zh_tw };
@@ -22,6 +22,7 @@ import * as pl from "./pl.js";
22
22
  import * as pt_br from "./pt_br.js";
23
23
  import * as ru from "./ru.js";
24
24
  import * as tr from "./tr.js";
25
+ import * as ua from "./ua.js";
25
26
  import * as zh_cn from "./zh_cn.js";
26
27
  import * as zh_tw from "./zh_tw.js";
27
- export { ar, cs_cz, de, es, fa, fi, fr, he, hu, id, it, ja, ko, mn, nl, pl, pt_br, ru, tr, zh_cn, zh_tw };
28
+ export { ar, cs_cz, de, es, fa, fi, fr, he, hu, id, it, ja, ko, mn, nl, pl, pt_br, ru, tr, ua, zh_cn, zh_tw };
@@ -0,0 +1 @@
1
+ export let symbols: string;