suneditor 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (306) hide show
  1. package/.eslintrc.json +4 -3
  2. package/CONTRIBUTING.md +4 -2
  3. package/README.md +19 -11
  4. package/README_V3_TEMP.md +705 -0
  5. package/dist/suneditor.min.css +1 -0
  6. package/dist/suneditor.min.js +1 -0
  7. package/example.md +587 -0
  8. package/package.json +15 -9
  9. package/src/assets/icons/_default.js +166 -131
  10. package/src/assets/{suneditor-content.css → suneditor-contents.css} +182 -45
  11. package/src/assets/suneditor.css +1195 -556
  12. package/src/assets/variables.css +138 -0
  13. package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
  14. package/src/core/base/eventHandlers/handler_ww_clipboard.js +29 -4
  15. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +59 -15
  16. package/src/core/base/eventHandlers/handler_ww_key_input.js +426 -212
  17. package/src/core/base/eventHandlers/handler_ww_mouse.js +108 -32
  18. package/src/core/base/eventManager.js +540 -209
  19. package/src/core/base/events.js +616 -320
  20. package/src/core/base/history.js +93 -39
  21. package/src/core/class/char.js +29 -13
  22. package/src/core/class/component.js +332 -145
  23. package/src/core/class/format.js +671 -509
  24. package/src/core/class/html.js +504 -290
  25. package/src/core/class/menu.js +114 -47
  26. package/src/core/class/nodeTransform.js +111 -66
  27. package/src/core/class/offset.js +409 -105
  28. package/src/core/class/selection.js +220 -108
  29. package/src/core/class/shortcuts.js +68 -8
  30. package/src/core/class/toolbar.js +106 -116
  31. package/src/core/class/ui.js +330 -0
  32. package/src/core/class/viewer.js +178 -74
  33. package/src/core/editor.js +489 -384
  34. package/src/core/section/actives.js +118 -22
  35. package/src/core/section/constructor.js +504 -170
  36. package/src/core/section/context.js +28 -23
  37. package/src/core/section/documentType.js +561 -0
  38. package/src/editorInjector/_classes.js +19 -5
  39. package/src/editorInjector/_core.js +71 -7
  40. package/src/editorInjector/index.js +63 -1
  41. package/src/helper/converter.js +137 -19
  42. package/src/helper/dom/domCheck.js +294 -0
  43. package/src/helper/dom/domQuery.js +609 -0
  44. package/src/helper/dom/domUtils.js +533 -0
  45. package/src/helper/dom/index.js +12 -0
  46. package/src/helper/env.js +42 -19
  47. package/src/helper/index.js +7 -4
  48. package/src/helper/keyCodeMap.js +183 -0
  49. package/src/helper/numbers.js +8 -8
  50. package/src/helper/unicode.js +5 -5
  51. package/src/langs/ckb.js +69 -3
  52. package/src/langs/cs.js +67 -1
  53. package/src/langs/da.js +68 -2
  54. package/src/langs/de.js +68 -3
  55. package/src/langs/en.js +29 -1
  56. package/src/langs/es.js +68 -3
  57. package/src/langs/fa.js +70 -2
  58. package/src/langs/fr.js +68 -2
  59. package/src/langs/he.js +68 -3
  60. package/src/langs/hu.js +226 -0
  61. package/src/langs/index.js +3 -2
  62. package/src/langs/it.js +65 -0
  63. package/src/langs/ja.js +68 -3
  64. package/src/langs/ko.js +66 -1
  65. package/src/langs/lv.js +68 -3
  66. package/src/langs/nl.js +68 -3
  67. package/src/langs/pl.js +68 -3
  68. package/src/langs/pt_br.js +65 -0
  69. package/src/langs/ro.js +69 -4
  70. package/src/langs/ru.js +68 -3
  71. package/src/langs/se.js +68 -3
  72. package/src/langs/tr.js +68 -0
  73. package/src/langs/ua.js +68 -3
  74. package/src/langs/ur.js +71 -6
  75. package/src/langs/zh_cn.js +69 -4
  76. package/src/modules/ApiManager.js +77 -54
  77. package/src/modules/Browser.js +667 -0
  78. package/src/modules/ColorPicker.js +162 -102
  79. package/src/modules/Controller.js +233 -136
  80. package/src/modules/Figure.js +913 -489
  81. package/src/modules/FileManager.js +141 -72
  82. package/src/modules/HueSlider.js +113 -61
  83. package/src/modules/Modal.js +292 -113
  84. package/src/modules/ModalAnchorEditor.js +380 -230
  85. package/src/modules/SelectMenu.js +270 -168
  86. package/src/modules/_DragHandle.js +2 -1
  87. package/src/modules/index.js +3 -3
  88. package/src/plugins/browser/audioGallery.js +83 -0
  89. package/src/plugins/browser/fileBrowser.js +103 -0
  90. package/src/plugins/browser/fileGallery.js +83 -0
  91. package/src/plugins/browser/imageGallery.js +81 -0
  92. package/src/plugins/browser/videoGallery.js +103 -0
  93. package/src/plugins/command/blockquote.js +40 -27
  94. package/src/plugins/command/exportPDF.js +134 -0
  95. package/src/plugins/command/fileUpload.js +226 -158
  96. package/src/plugins/command/list_bulleted.js +93 -47
  97. package/src/plugins/command/list_numbered.js +93 -47
  98. package/src/plugins/dropdown/align.js +66 -54
  99. package/src/plugins/dropdown/backgroundColor.js +76 -45
  100. package/src/plugins/dropdown/font.js +71 -47
  101. package/src/plugins/dropdown/fontColor.js +78 -46
  102. package/src/plugins/dropdown/formatBlock.js +74 -33
  103. package/src/plugins/dropdown/hr.js +102 -51
  104. package/src/plugins/dropdown/layout.js +37 -26
  105. package/src/plugins/dropdown/lineHeight.js +54 -38
  106. package/src/plugins/dropdown/list.js +60 -45
  107. package/src/plugins/dropdown/paragraphStyle.js +51 -30
  108. package/src/plugins/dropdown/table.js +1269 -777
  109. package/src/plugins/dropdown/template.js +38 -26
  110. package/src/plugins/dropdown/textStyle.js +43 -31
  111. package/src/plugins/field/mention.js +144 -82
  112. package/src/plugins/index.js +32 -6
  113. package/src/plugins/input/fontSize.js +161 -108
  114. package/src/plugins/input/pageNavigator.js +70 -0
  115. package/src/plugins/modal/audio.js +341 -169
  116. package/src/plugins/modal/drawing.js +530 -0
  117. package/src/plugins/modal/embed.js +886 -0
  118. package/src/plugins/modal/image.js +673 -358
  119. package/src/plugins/modal/link.js +100 -71
  120. package/src/plugins/modal/math.js +384 -168
  121. package/src/plugins/modal/video.js +693 -336
  122. package/src/plugins/popup/anchor.js +222 -0
  123. package/src/suneditor.js +54 -12
  124. package/src/themes/dark.css +85 -0
  125. package/src/typedef.js +86 -0
  126. package/types/assets/icons/_default.d.ts +152 -0
  127. package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
  128. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
  129. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
  130. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
  131. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
  132. package/types/core/base/eventManager.d.ts +377 -0
  133. package/types/core/base/events.d.ts +297 -0
  134. package/types/core/base/history.d.ts +81 -0
  135. package/types/core/class/char.d.ts +60 -0
  136. package/types/core/class/component.d.ts +259 -0
  137. package/types/core/class/format.d.ts +615 -0
  138. package/types/core/class/html.d.ts +377 -0
  139. package/types/core/class/menu.d.ts +118 -0
  140. package/types/core/class/nodeTransform.d.ts +93 -0
  141. package/types/core/class/offset.d.ts +512 -0
  142. package/types/core/class/selection.d.ts +188 -0
  143. package/types/core/class/shortcuts.d.ts +142 -0
  144. package/types/core/class/toolbar.d.ts +189 -0
  145. package/types/core/class/ui.d.ts +144 -0
  146. package/types/core/class/viewer.d.ts +140 -0
  147. package/types/core/editor.d.ts +606 -0
  148. package/types/core/section/actives.d.ts +46 -0
  149. package/types/core/section/constructor.d.ts +748 -0
  150. package/types/core/section/context.d.ts +45 -0
  151. package/types/core/section/documentType.d.ts +178 -0
  152. package/types/editorInjector/_classes.d.ts +41 -0
  153. package/types/editorInjector/_core.d.ts +92 -0
  154. package/types/editorInjector/index.d.ts +71 -0
  155. package/types/helper/converter.d.ts +150 -0
  156. package/types/helper/dom/domCheck.d.ts +182 -0
  157. package/types/helper/dom/domQuery.d.ts +214 -0
  158. package/types/helper/dom/domUtils.d.ts +211 -0
  159. package/types/helper/dom/index.d.ts +9 -0
  160. package/types/helper/env.d.ts +149 -0
  161. package/types/helper/index.d.ts +163 -0
  162. package/types/helper/keyCodeMap.d.ts +110 -0
  163. package/types/helper/numbers.d.ts +43 -0
  164. package/types/helper/unicode.d.ts +28 -0
  165. package/types/index.d.ts +0 -0
  166. package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +170 -103
  167. package/types/langs/ckb.d.ts +384 -0
  168. package/types/langs/cs.d.ts +384 -0
  169. package/types/langs/da.d.ts +384 -0
  170. package/types/langs/de.d.ts +384 -0
  171. package/types/langs/en.d.ts +384 -0
  172. package/types/langs/es.d.ts +384 -0
  173. package/types/langs/fa.d.ts +384 -0
  174. package/types/langs/fr.d.ts +384 -0
  175. package/types/langs/he.d.ts +384 -0
  176. package/types/langs/hu.d.ts +384 -0
  177. package/types/langs/index.d.ts +48 -0
  178. package/types/langs/it.d.ts +384 -0
  179. package/types/langs/ja.d.ts +384 -0
  180. package/types/langs/ko.d.ts +384 -0
  181. package/types/langs/lv.d.ts +384 -0
  182. package/types/langs/nl.d.ts +384 -0
  183. package/types/langs/pl.d.ts +384 -0
  184. package/types/langs/pt_br.d.ts +384 -0
  185. package/types/langs/ro.d.ts +384 -0
  186. package/types/langs/ru.d.ts +384 -0
  187. package/types/langs/se.d.ts +384 -0
  188. package/types/langs/tr.d.ts +384 -0
  189. package/types/langs/ua.d.ts +384 -0
  190. package/types/langs/ur.d.ts +384 -0
  191. package/types/langs/zh_cn.d.ts +384 -0
  192. package/types/modules/ApiManager.d.ts +125 -0
  193. package/types/modules/Browser.d.ts +326 -0
  194. package/types/modules/ColorPicker.d.ts +131 -0
  195. package/types/modules/Controller.d.ts +231 -0
  196. package/types/modules/Figure.d.ts +504 -0
  197. package/types/modules/FileManager.d.ts +202 -0
  198. package/types/modules/HueSlider.d.ts +136 -0
  199. package/types/modules/Modal.d.ts +117 -0
  200. package/types/modules/ModalAnchorEditor.d.ts +236 -0
  201. package/types/modules/SelectMenu.d.ts +194 -0
  202. package/types/modules/_DragHandle.d.ts +7 -0
  203. package/types/modules/index.d.ts +26 -0
  204. package/types/plugins/browser/audioGallery.d.ts +55 -0
  205. package/types/plugins/browser/fileBrowser.d.ts +64 -0
  206. package/types/plugins/browser/fileGallery.d.ts +55 -0
  207. package/types/plugins/browser/imageGallery.d.ts +51 -0
  208. package/types/plugins/browser/videoGallery.d.ts +57 -0
  209. package/types/plugins/command/blockquote.d.ts +28 -0
  210. package/types/plugins/command/exportPDF.d.ts +46 -0
  211. package/types/plugins/command/fileUpload.d.ts +156 -0
  212. package/types/plugins/command/list_bulleted.d.ts +56 -0
  213. package/types/plugins/command/list_numbered.d.ts +56 -0
  214. package/types/plugins/dropdown/align.d.ts +60 -0
  215. package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
  216. package/types/plugins/dropdown/font.d.ts +54 -0
  217. package/types/plugins/dropdown/fontColor.d.ts +63 -0
  218. package/types/plugins/dropdown/formatBlock.d.ts +58 -0
  219. package/types/plugins/dropdown/hr.d.ts +81 -0
  220. package/types/plugins/dropdown/layout.d.ts +40 -0
  221. package/types/plugins/dropdown/lineHeight.d.ts +50 -0
  222. package/types/plugins/dropdown/list.d.ts +39 -0
  223. package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
  224. package/types/plugins/dropdown/table.d.ts +579 -0
  225. package/types/plugins/dropdown/template.d.ts +40 -0
  226. package/types/plugins/dropdown/textStyle.d.ts +41 -0
  227. package/types/plugins/field/mention.d.ts +102 -0
  228. package/types/plugins/index.d.ts +107 -0
  229. package/types/plugins/input/fontSize.d.ts +170 -0
  230. package/types/plugins/input/pageNavigator.d.ts +28 -0
  231. package/types/plugins/modal/audio.d.ts +269 -0
  232. package/types/plugins/modal/drawing.d.ts +246 -0
  233. package/types/plugins/modal/embed.d.ts +387 -0
  234. package/types/plugins/modal/image.d.ts +451 -0
  235. package/types/plugins/modal/link.d.ts +128 -0
  236. package/types/plugins/modal/math.d.ts +193 -0
  237. package/types/plugins/modal/video.d.ts +485 -0
  238. package/types/plugins/popup/anchor.d.ts +56 -0
  239. package/types/suneditor.d.ts +51 -0
  240. package/types/typedef-global.d.ts +144 -0
  241. package/src/core/class/notice.js +0 -42
  242. package/src/helper/domUtils.js +0 -1177
  243. package/src/modules/FileBrowser.js +0 -271
  244. package/src/plugins/command/exportPdf.js +0 -168
  245. package/src/plugins/fileBrowser/imageGallery.js +0 -81
  246. package/src/themes/test.css +0 -61
  247. package/typings/CommandPlugin.d.ts +0 -8
  248. package/typings/DialogPlugin.d.ts +0 -20
  249. package/typings/FileBrowserPlugin.d.ts +0 -30
  250. package/typings/Module.d.ts +0 -15
  251. package/typings/Plugin.d.ts +0 -42
  252. package/typings/SubmenuPlugin.d.ts +0 -8
  253. package/typings/_classes.d.ts +0 -17
  254. package/typings/_colorPicker.d.ts +0 -60
  255. package/typings/_core.d.ts +0 -55
  256. package/typings/align.d.ts +0 -5
  257. package/typings/audio.d.ts +0 -5
  258. package/typings/backgroundColor.d.ts +0 -5
  259. package/typings/blockquote.d.ts +0 -5
  260. package/typings/char.d.ts +0 -39
  261. package/typings/component.d.ts +0 -38
  262. package/typings/context.d.ts +0 -39
  263. package/typings/converter.d.ts +0 -33
  264. package/typings/dialog.d.ts +0 -28
  265. package/typings/domUtils.d.ts +0 -361
  266. package/typings/editor.d.ts +0 -7
  267. package/typings/editor.ts +0 -542
  268. package/typings/env.d.ts +0 -70
  269. package/typings/eventManager.d.ts +0 -37
  270. package/typings/events.d.ts +0 -262
  271. package/typings/fileBrowser.d.ts +0 -42
  272. package/typings/fileManager.d.ts +0 -67
  273. package/typings/font.d.ts +0 -5
  274. package/typings/fontColor.d.ts +0 -5
  275. package/typings/fontSize.d.ts +0 -5
  276. package/typings/format.d.ts +0 -191
  277. package/typings/formatBlock.d.ts +0 -5
  278. package/typings/history.d.ts +0 -48
  279. package/typings/horizontalRule.d.ts +0 -5
  280. package/typings/image.d.ts +0 -5
  281. package/typings/imageGallery.d.ts +0 -5
  282. package/typings/index.d.ts +0 -21
  283. package/typings/index.modules.d.ts +0 -11
  284. package/typings/index.plugins.d.ts +0 -58
  285. package/typings/lineHeight.d.ts +0 -5
  286. package/typings/link.d.ts +0 -5
  287. package/typings/list.d.ts +0 -5
  288. package/typings/math.d.ts +0 -5
  289. package/typings/mediaContainer.d.ts +0 -25
  290. package/typings/mention.d.ts +0 -5
  291. package/typings/node.d.ts +0 -57
  292. package/typings/notice.d.ts +0 -16
  293. package/typings/numbers.d.ts +0 -29
  294. package/typings/offset.d.ts +0 -24
  295. package/typings/options.d.ts +0 -589
  296. package/typings/paragraphStyle.d.ts +0 -5
  297. package/typings/resizing.d.ts +0 -141
  298. package/typings/selection.d.ts +0 -94
  299. package/typings/shortcuts.d.ts +0 -13
  300. package/typings/suneditor.d.ts +0 -9
  301. package/typings/table.d.ts +0 -5
  302. package/typings/template.d.ts +0 -5
  303. package/typings/textStyle.d.ts +0 -5
  304. package/typings/toolbar.d.ts +0 -32
  305. package/typings/unicode.d.ts +0 -25
  306. package/typings/video.d.ts +0 -5
@@ -3,14 +3,20 @@
3
3
  */
4
4
 
5
5
  import { _w } from '../../helper/env';
6
- import { getNodeFromPath, getNodePath } from '../../helper/domUtils';
6
+ import { getNodeFromPath, getNodePath } from '../../helper/dom/domQuery';
7
7
  import { numbers } from '../../helper';
8
8
 
9
- export default function (editor) {
9
+ /**
10
+ * @description History stack closure
11
+ * @param {__se__EditorCore} editor - The root editor instance
12
+ */
13
+ export default function History(editor) {
10
14
  const frameRoots = editor.frameRoots;
11
15
  let delayTime = editor.options.get('historyStackDelayTime');
12
16
  let pushDelay = null;
13
17
  let stackIndex, stack, rootStack, rootInitContents;
18
+ let waiting = false;
19
+ let waitingTime = null;
14
20
 
15
21
  function change(fc, index) {
16
22
  if (editor.status.hasFocus) editor.eventManager.applyTagEffect();
@@ -25,6 +31,7 @@ export default function (editor) {
25
31
  function setContentFromStack(increase) {
26
32
  const prevKey = stack[stackIndex];
27
33
  const prevRoot = rootStack[prevKey];
34
+ const fc = editor.frameContext;
28
35
 
29
36
  stackIndex += increase;
30
37
  const rootKey = increase < 0 && prevKey !== stack[stackIndex] && prevRoot.index > 0 ? prevKey : stack[stackIndex];
@@ -60,13 +67,18 @@ export default function (editor) {
60
67
  if (stackIndex < 0) stackIndex = 0;
61
68
  else if (stackIndex >= stack.length) stackIndex = stack.length - 1;
62
69
 
63
- editor._offCurrentController();
64
- editor._checkComponents();
70
+ editor.ui._offCurrentController();
71
+ editor._checkComponents(false);
65
72
  editor.char.display();
66
- editor._resourcesStateChange(editor.frameContext);
73
+ editor._resourcesStateChange(fc);
74
+
75
+ // document type
76
+ if (fc.has('documentType-use-header')) {
77
+ fc.get('documentType').reHeader();
78
+ }
67
79
 
68
80
  // onChange
69
- change(editor.frameContext, root.index);
81
+ change(fc, root.index);
70
82
  }
71
83
 
72
84
  function setStack(content, range, rootKey, increase) {
@@ -126,7 +138,7 @@ export default function (editor) {
126
138
  stack = stack.slice(0, stackIndex + 1);
127
139
  root.value.splice(stackIndex + 1);
128
140
  editor.applyCommandTargets('redo', (e) => {
129
- e.setAttribute('disabled', true);
141
+ e.disabled = true;
130
142
  });
131
143
 
132
144
  for (let i = 0, len = deleteRoot.length; i < len; i++) {
@@ -135,7 +147,7 @@ export default function (editor) {
135
147
  }
136
148
 
137
149
  function pushStack(rootKey, range) {
138
- editor._checkComponents();
150
+ editor._checkComponents(false);
139
151
 
140
152
  const fc = frameRoots.get(rootKey);
141
153
  const current = fc.get('wysiwyg').innerHTML;
@@ -148,7 +160,7 @@ export default function (editor) {
148
160
 
149
161
  if (stackIndex === 1) {
150
162
  editor.applyCommandTargets('undo', (e) => {
151
- e.removeAttribute('disabled');
163
+ e.disabled = false;
152
164
  });
153
165
  }
154
166
 
@@ -159,12 +171,15 @@ export default function (editor) {
159
171
  return {
160
172
  /**
161
173
  * @description Saving the current status to the history object stack
162
- * If "delay" is true, it will be saved after (options.get('historyStackDelayTime') || 400) miliseconds
163
- * If the function is called again with the "delay" argument true before it is saved, the delay time is renewal
164
- * You can specify the delay time by sending a number.
165
- * @param {Boolean|Number} delay If true, Add stack without delay time.
174
+ * - If "delay" is true, it will be saved after (options.get('historyStackDelayTime') || 400) milliseconds.
175
+ * - If the function is called again with the "delay" argument true before it is saved, the delay time is renewed.
176
+ * - You can specify the delay time by sending a number.
177
+ * @param {boolean|number} delay If true, add stack without delay time.
178
+ * @param {*=} [rootKey] The key of the root frame to save history for.
166
179
  */
167
180
  push(delay, rootKey) {
181
+ if (waiting) return;
182
+
168
183
  rootKey = rootKey || editor.status.rootKey;
169
184
  const range = editor.status._range;
170
185
 
@@ -186,6 +201,11 @@ export default function (editor) {
186
201
  }, time);
187
202
  },
188
203
 
204
+ /**
205
+ * @description Immediately saves the current state to the history stack if a delayed save is pending.
206
+ * @param {*} rootKey The key of the root frame.
207
+ * @param {Range} range The selection range object.
208
+ */
189
209
  check(rootKey, range) {
190
210
  if (pushDelay) {
191
211
  _w.clearTimeout(pushDelay);
@@ -195,7 +215,7 @@ export default function (editor) {
195
215
  },
196
216
 
197
217
  /**
198
- * @description Undo function
218
+ * @description Undo function that restores the previous state from the history stack.
199
219
  */
200
220
  undo() {
201
221
  if (stackIndex > 0) {
@@ -204,7 +224,7 @@ export default function (editor) {
204
224
  },
205
225
 
206
226
  /**
207
- * @description Redo function
227
+ * @description Redo function that re-applies a previously undone state from the history stack.
208
228
  */
209
229
  redo() {
210
230
  if (stack.length - 1 > stackIndex) {
@@ -212,24 +232,47 @@ export default function (editor) {
212
232
  }
213
233
  },
214
234
 
235
+ /**
236
+ * @description Overwrites the current state in the history stack with the latest content.
237
+ * @param {string=} [rootKey] The key of the root frame to overwrite.
238
+ */
215
239
  overwrite(rootKey) {
216
240
  setStack(frameRoots.get(rootKey || editor.status.rootKey).get('wysiwyg').innerHTML, null, editor.status.rootKey, 0);
217
241
  },
218
242
 
219
243
  /**
220
- * @description Reset the history object
244
+ * @description Pauses the history stack, preventing new entries from being added for up to 5 seconds.
221
245
  */
222
- reset() {
223
- editor.applyCommandTargets('undo', (e) => {
224
- e.setAttribute('disabled', true);
225
- });
226
- editor.applyCommandTargets('redo', (e) => {
227
- e.setAttribute('disabled', true);
228
- });
246
+ pause() {
247
+ waiting = true;
229
248
 
230
- editor.applyCommandTargets('save', (e) => {
231
- e.setAttribute('disabled', true);
232
- });
249
+ if (waitingTime) {
250
+ _w.clearTimeout(waitingTime);
251
+ waitingTime = null;
252
+ }
253
+ waitingTime = _w.setTimeout(() => {
254
+ waiting = false;
255
+ }, 5000);
256
+ },
257
+
258
+ /**
259
+ * @description Resumes history tracking by allowing new entries to be added to the stack.
260
+ */
261
+ resume() {
262
+ if (waitingTime) {
263
+ _w.clearTimeout(waitingTime);
264
+ waitingTime = null;
265
+ }
266
+ waiting = false;
267
+ },
268
+
269
+ /**
270
+ * @description Resets the history stack and disables related UI buttons.
271
+ */
272
+ reset() {
273
+ editor.applyCommandTargets('undo', (e) => (e.disabled = true));
274
+ editor.applyCommandTargets('redo', (e) => (e.disabled = true));
275
+ editor.applyCommandTargets('save', (e) => (e.disabled = true));
233
276
 
234
277
  editor.applyFrameRoots((e) => e.set('historyIndex', -1));
235
278
  editor.applyFrameRoots((e) => e.set('isChanged', false));
@@ -238,6 +281,7 @@ export default function (editor) {
238
281
  stack = [];
239
282
  rootStack = {};
240
283
  rootInitContents = {};
284
+ waiting = false;
241
285
 
242
286
  const rootKeys = editor.rootKeys;
243
287
  for (let i = 0, len = rootKeys.length; i < len; i++) {
@@ -246,7 +290,9 @@ export default function (editor) {
246
290
  },
247
291
 
248
292
  /**
249
- * @description Reset the disabled state of the buttons to fit the current stack.
293
+ * @description Updates the state of history-related buttons (undo, redo, save) based on the current history stack.
294
+ * @param {*} rootKey The key of the root frame.
295
+ * @param {number} [index] The index of the current history state.
250
296
  */
251
297
  resetButtons(rootKey, index) {
252
298
  const isReset = !numbers.is(index);
@@ -256,42 +302,50 @@ export default function (editor) {
256
302
  const rootLen = root.value.length - 1;
257
303
 
258
304
  editor.applyCommandTargets('undo', (e) => {
259
- if (index > 0 && index <= rootLen) e.removeAttribute('disabled');
260
- else e.setAttribute('disabled', true);
305
+ if (index > 0 && index <= rootLen) e.disabled = false;
306
+ else e.disabled = true;
261
307
  });
262
308
  editor.applyCommandTargets('redo', (e) => {
263
- if (index > -1 && index < rootLen) e.removeAttribute('disabled');
264
- else e.setAttribute('disabled', true);
309
+ if (index > -1 && index < rootLen) e.disabled = false;
310
+ else e.disabled = true;
265
311
  });
266
312
 
267
313
  const savedIndex = target.get('savedIndex');
268
314
  const historyIndex = target.get('historyIndex');
269
- const isChanged = savedIndex > -1 ? savedIndex !== index : isReset ? root.length > 0 : index > 0 && historyIndex !== index;
315
+ const isChanged = savedIndex > -1 ? savedIndex !== index : isReset ? root.index > 0 : index > 0 && historyIndex !== index;
270
316
 
271
317
  target.set('historyIndex', index);
272
318
  target.set('isChanged', isChanged);
273
319
  editor.applyCommandTargets('save', (e) => {
274
- if (isChanged) e.removeAttribute('disabled');
275
- else e.setAttribute('disabled', true);
320
+ if (isChanged) e.disabled = false;
321
+ else e.disabled = true;
276
322
  });
277
323
 
278
324
  editor.triggerEvent('onResetButtons', { rootKey });
279
325
  },
280
326
 
327
+ /**
328
+ * @description Returns the root stack containing the history of each frame.
329
+ * @returns {{content: string, s: {path: number|number[], offset: number|number[]}, e: {path: number|number[], offset: number|number[]}, frame: HTMLElement}} The root stack object.
330
+ * - content: content html string
331
+ * - s: depth info of the "start" range
332
+ * - e: depth info of the "end" range
333
+ * - frame: wysiwyg editable element.
334
+ */
281
335
  getRootStack() {
282
336
  return rootStack;
283
337
  },
284
338
 
285
339
  /**
286
- * @description Reset the delay time.
287
- * @param {number} time millisecond
340
+ * @description Resets the delay time for saving history.
341
+ * @param {number} ms The new delay time in milliseconds.
288
342
  */
289
- resetDelayTime(time) {
290
- delayTime = time;
343
+ resetDelayTime(ms) {
344
+ delayTime = ms;
291
345
  },
292
346
 
293
347
  /**
294
- * @description Remove all stacks and remove the timeout function.
348
+ * @description Clears the entire history stack and cancels any pending save operations.
295
349
  */
296
350
  destroy() {
297
351
  if (pushDelay) _w.clearTimeout(pushDelay);
@@ -4,22 +4,33 @@
4
4
 
5
5
  import CoreInjector from '../../editorInjector/_core';
6
6
  import { _w, isEdge } from '../../helper/env';
7
- import { addClass, removeClass, hasClass } from '../../helper/domUtils';
7
+ import { addClass, removeClass, hasClass } from '../../helper/dom/domUtils';
8
8
 
9
- const Char = function (editor) {
9
+ /**
10
+ * @typedef {Omit<Char & Partial<__se__EditorInjector>, 'char'>} CharThis
11
+ */
12
+
13
+ /**
14
+ * @constructor
15
+ * @this {CharThis}
16
+ * @description character count, character limit, etc. management class
17
+ * @param {__se__EditorCore} editor - The root editor instance
18
+ */
19
+ function Char(editor) {
10
20
  CoreInjector.call(this, editor);
11
- };
21
+ }
12
22
 
13
23
  Char.prototype = {
14
24
  /**
25
+ * @this {CharThis}
15
26
  * @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "html" is added to the current editor.
16
- * @param {Node|String} html Element node or String.
27
+ * @param {Node|string} html Element node or String.
17
28
  * @returns {boolean}
18
29
  */
19
30
  check(html) {
20
31
  const maxCharCount = this.editor.frameOptions.get('charCounter_max');
21
32
  if (maxCharCount) {
22
- const length = this.getLength(typeof html === 'string' ? html : this.editor.frameOptions.get('charCounter_type') === 'byte-html' && html.nodeType === 1 ? html.outerHTML : html.textContent);
33
+ const length = this.getLength(typeof html === 'string' ? html : this.editor.frameOptions.get('charCounter_type') === 'byte-html' && html.nodeType === 1 ? /** @type {HTMLElement} */ (html).outerHTML : html.textContent);
23
34
  if (length > 0 && length + this.getLength() > maxCharCount) {
24
35
  CounterBlink(this.editor.frameContext.get('charWrapper'));
25
36
  return false;
@@ -29,9 +40,10 @@ Char.prototype = {
29
40
  },
30
41
 
31
42
  /**
43
+ * @this {CharThis}
32
44
  * @description Get the [content]'s number of characters or binary data size. (frameOptions.get('charCounter_type'))
33
- * If [content] is undefined, get the current editor's number of characters or binary data size.
34
- * @param {string|undefined} content Content to count. (defalut: this.editor.frameContext.get('wysiwyg'))
45
+ * - If [content] is undefined, get the current editor's number of characters or binary data size.
46
+ * @param {string=} content Content to count. (defalut: this.editor.frameContext.get('wysiwyg'))
35
47
  * @returns {number}
36
48
  */
37
49
  getLength(content) {
@@ -42,6 +54,7 @@ Char.prototype = {
42
54
  },
43
55
 
44
56
  /**
57
+ * @this {CharThis}
45
58
  * @descriptionGets Get the length in bytes of a string.
46
59
  * @param {string} text String text
47
60
  * @returns {number}
@@ -61,7 +74,7 @@ Char.prototype = {
61
74
 
62
75
  return cl + cr;
63
76
  } else {
64
- cl = new TextEncoder('utf-8').encode(text).length;
77
+ cl = new TextEncoder().encode(text).length;
65
78
  cr = 0;
66
79
 
67
80
  if (encodeURIComponent(text).match(/(%0A|%0D)/gi) !== null) {
@@ -73,19 +86,22 @@ Char.prototype = {
73
86
  },
74
87
 
75
88
  /**
89
+ * @this {CharThis}
76
90
  * @description Set the char count to charCounter element textContent.
77
91
  */
78
92
  display() {
79
- if (this.editor.frameContext.has('charCounter')) {
93
+ const charCounter = this.editor.frameContext.get('charCounter');
94
+ if (charCounter) {
80
95
  _w.setTimeout(() => {
81
- this.editor.frameContext.get('charCounter').textContent = this.getLength();
96
+ charCounter.textContent = this.getLength();
82
97
  }, 0);
83
98
  }
84
99
  },
85
100
 
86
101
  /**
102
+ * @this {CharThis}
87
103
  * @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "inputText" is added to the current editor.
88
- * If the current number of characters is greater than "charCounter_max", the excess characters are removed.
104
+ * - If the current number of characters is greater than "charCounter_max", the excess characters are removed.
89
105
  * And call the char.display()
90
106
  * @param {string} inputText Text added.
91
107
  * @returns {boolean}
@@ -130,9 +146,9 @@ Char.prototype = {
130
146
  };
131
147
 
132
148
  /**
133
- * @description The character counter blinks.
134
- * @param charWrapper {Element} this.editor.frameContext.get('charWrapper')
135
149
  * @private
150
+ * @description The character counter blinks.
151
+ * @param {Element} charWrapper this.editor.frameContext.get('charWrapper')
136
152
  */
137
153
  function CounterBlink(charWrapper) {
138
154
  if (charWrapper && !hasClass(charWrapper, 'se-blink')) {