suneditor 2.44.6 → 2.44.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE.txt +20 -20
  2. package/README.md +1585 -1585
  3. package/dist/suneditor.min.js +2 -2
  4. package/package.json +71 -71
  5. package/src/assets/css/suneditor-contents.css +556 -556
  6. package/src/assets/css/suneditor.css +0 -0
  7. package/src/assets/defaultIcons.js +103 -103
  8. package/src/lang/Lang.d.ts +143 -143
  9. package/src/lang/ckb.d.ts +4 -4
  10. package/src/lang/ckb.js +187 -187
  11. package/src/lang/da.d.ts +4 -4
  12. package/src/lang/da.js +191 -191
  13. package/src/lang/de.d.ts +4 -4
  14. package/src/lang/de.js +187 -187
  15. package/src/lang/en.d.ts +4 -4
  16. package/src/lang/en.js +187 -187
  17. package/src/lang/es.d.ts +4 -4
  18. package/src/lang/es.js +187 -187
  19. package/src/lang/fr.d.ts +4 -4
  20. package/src/lang/fr.js +188 -188
  21. package/src/lang/he.d.ts +4 -4
  22. package/src/lang/he.js +188 -188
  23. package/src/lang/index.d.ts +22 -22
  24. package/src/lang/index.js +25 -25
  25. package/src/lang/it.d.ts +4 -4
  26. package/src/lang/it.js +188 -188
  27. package/src/lang/ja.d.ts +4 -4
  28. package/src/lang/ja.js +187 -187
  29. package/src/lang/ko.d.ts +4 -4
  30. package/src/lang/ko.js +187 -187
  31. package/src/lang/lv.d.ts +4 -4
  32. package/src/lang/lv.js +187 -187
  33. package/src/lang/nl.d.ts +4 -4
  34. package/src/lang/nl.js +187 -187
  35. package/src/lang/pl.d.ts +4 -4
  36. package/src/lang/pl.js +187 -187
  37. package/src/lang/pt_br.d.ts +4 -4
  38. package/src/lang/pt_br.js +189 -189
  39. package/src/lang/ro.d.ts +4 -4
  40. package/src/lang/ro.js +187 -187
  41. package/src/lang/ru.d.ts +4 -4
  42. package/src/lang/ru.js +187 -187
  43. package/src/lang/se.d.ts +4 -4
  44. package/src/lang/se.js +191 -191
  45. package/src/lang/ua.d.ts +5 -5
  46. package/src/lang/ua.js +188 -188
  47. package/src/lang/ur.d.ts +4 -4
  48. package/src/lang/ur.js +187 -187
  49. package/src/lang/zh_cn.d.ts +4 -4
  50. package/src/lang/zh_cn.js +187 -187
  51. package/src/lib/constructor.js +0 -0
  52. package/src/lib/context.d.ts +42 -42
  53. package/src/lib/context.js +0 -0
  54. package/src/lib/core.d.ts +1101 -1101
  55. package/src/lib/core.js +12 -22
  56. package/src/lib/history.d.ts +48 -48
  57. package/src/lib/history.js +218 -218
  58. package/src/lib/util.d.ts +677 -677
  59. package/src/lib/util.js +19 -0
  60. package/src/options.d.ts +608 -608
  61. package/src/plugins/CommandPlugin.d.ts +7 -7
  62. package/src/plugins/DialogPlugin.d.ts +19 -19
  63. package/src/plugins/FileBrowserPlugin.d.ts +29 -29
  64. package/src/plugins/Module.d.ts +14 -14
  65. package/src/plugins/Plugin.d.ts +41 -41
  66. package/src/plugins/SubmenuPlugin.d.ts +7 -7
  67. package/src/plugins/command/blockquote.d.ts +4 -4
  68. package/src/plugins/command/blockquote.js +46 -46
  69. package/src/plugins/dialog/audio.d.ts +4 -4
  70. package/src/plugins/dialog/audio.js +556 -556
  71. package/src/plugins/dialog/image.d.ts +4 -4
  72. package/src/plugins/dialog/image.js +1122 -1122
  73. package/src/plugins/dialog/link.d.ts +4 -4
  74. package/src/plugins/dialog/link.js +223 -223
  75. package/src/plugins/dialog/math.d.ts +4 -4
  76. package/src/plugins/dialog/math.js +294 -294
  77. package/src/plugins/dialog/mention.d.ts +5 -5
  78. package/src/plugins/dialog/mention.js +242 -242
  79. package/src/plugins/dialog/video.d.ts +4 -4
  80. package/src/plugins/dialog/video.js +983 -983
  81. package/src/plugins/fileBrowser/imageGallery.d.ts +4 -4
  82. package/src/plugins/fileBrowser/imageGallery.js +63 -63
  83. package/src/plugins/index.d.ts +79 -79
  84. package/src/plugins/index.js +32 -32
  85. package/src/plugins/modules/_anchor.js +461 -461
  86. package/src/plugins/modules/_colorPicker.d.ts +59 -59
  87. package/src/plugins/modules/_colorPicker.js +0 -0
  88. package/src/plugins/modules/_notice.d.ts +20 -20
  89. package/src/plugins/modules/_notice.js +72 -72
  90. package/src/plugins/modules/_selectMenu.js +118 -118
  91. package/src/plugins/modules/component.d.ts +24 -24
  92. package/src/plugins/modules/component.js +82 -82
  93. package/src/plugins/modules/dialog.d.ts +27 -27
  94. package/src/plugins/modules/dialog.js +174 -174
  95. package/src/plugins/modules/fileBrowser.d.ts +41 -41
  96. package/src/plugins/modules/fileBrowser.js +373 -373
  97. package/src/plugins/modules/fileManager.d.ts +66 -66
  98. package/src/plugins/modules/fileManager.js +325 -325
  99. package/src/plugins/modules/index.d.ts +10 -10
  100. package/src/plugins/modules/index.js +8 -8
  101. package/src/plugins/modules/resizing.d.ts +153 -153
  102. package/src/plugins/modules/resizing.js +895 -895
  103. package/src/plugins/submenu/align.d.ts +4 -4
  104. package/src/plugins/submenu/align.js +160 -160
  105. package/src/plugins/submenu/font.d.ts +4 -4
  106. package/src/plugins/submenu/font.js +120 -120
  107. package/src/plugins/submenu/fontColor.d.ts +4 -4
  108. package/src/plugins/submenu/fontColor.js +0 -0
  109. package/src/plugins/submenu/fontSize.d.ts +4 -4
  110. package/src/plugins/submenu/fontSize.js +112 -112
  111. package/src/plugins/submenu/formatBlock.d.ts +4 -4
  112. package/src/plugins/submenu/formatBlock.js +273 -273
  113. package/src/plugins/submenu/hiliteColor.d.ts +4 -4
  114. package/src/plugins/submenu/hiliteColor.js +0 -0
  115. package/src/plugins/submenu/horizontalRule.d.ts +4 -4
  116. package/src/plugins/submenu/horizontalRule.js +98 -98
  117. package/src/plugins/submenu/lineHeight.d.ts +4 -4
  118. package/src/plugins/submenu/lineHeight.js +104 -104
  119. package/src/plugins/submenu/list.d.ts +4 -4
  120. package/src/plugins/submenu/list.js +456 -456
  121. package/src/plugins/submenu/paragraphStyle.d.ts +4 -4
  122. package/src/plugins/submenu/paragraphStyle.js +135 -135
  123. package/src/plugins/submenu/table.d.ts +4 -4
  124. package/src/plugins/submenu/template.d.ts +4 -4
  125. package/src/plugins/submenu/template.js +71 -71
  126. package/src/plugins/submenu/textStyle.d.ts +4 -4
  127. package/src/plugins/submenu/textStyle.js +167 -167
  128. package/src/suneditor.d.ts +9 -9
  129. package/src/suneditor.js +75 -75
  130. package/src/suneditor_build.js +17 -17
package/src/lib/core.js CHANGED
@@ -5221,8 +5221,8 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5221
5221
  _convertFontSize: function (to, size) {
5222
5222
  const math = this._w.Math;
5223
5223
  const value = size.match(/(\d+(?:\.\d+)?)(.+)/);
5224
- const sizeNum = value[1] * 1;
5225
- const from = value[2];
5224
+ const sizeNum = value ? value[1] * 1 : util.fontValueMap[size];
5225
+ const from = value ? value[2] : 'rem';
5226
5226
  let pxSize = sizeNum;
5227
5227
 
5228
5228
  if (/em/.test(from)) {
@@ -5263,7 +5263,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5263
5263
  const allowedStyle = [];
5264
5264
  for (let i = 0, len = style.length, r; i < len; i++) {
5265
5265
  r = style[i].match(/([a-zA-Z0-9-]+)(:)([^:]+$)/);
5266
- if (r && !/inherit|initial/i.test(r[3])) {
5266
+ if (r && !/inherit|initial|revert|unset/i.test(r[3])) {
5267
5267
  const k = util.kebabToCamelCase(r[1].trim());
5268
5268
  const v = this.wwComputedStyle[k].replace(/"/g, '');
5269
5269
  const c = r[3].trim();
@@ -5274,7 +5274,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5274
5274
  case 'fontSize':
5275
5275
  if (!options.plugins.fontSize) continue;
5276
5276
  if (!this._cleanStyleRegExp.fontSizeUnit.test(r[0])) {
5277
- r[0] = r[0].replace(this._w.RegExp('\\d+' + r[0].match(/\d+(.+$)/)[1]), this._convertFontSize.bind(this, options.fontSizeUnit));
5277
+ r[0] = r[0].replace((r[0].match(/:\s*([^;]+)/) || [])[1], this._convertFontSize.bind(this, options.fontSizeUnit));
5278
5278
  }
5279
5279
  break;
5280
5280
  case 'color':
@@ -5323,7 +5323,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5323
5323
  else v = m.match(lowLevelCheck ? this._attributesWhitelistRegExp : this._attributesWhitelistRegExp_all_data);
5324
5324
 
5325
5325
  // attribute
5326
- if (lowLevelCheck) {
5326
+ if (lowLevelCheck || tagName === 'span') {
5327
5327
  if (tagName === 'a') {
5328
5328
  const sv = m.match(/(?:(?:id|name)\s*=\s*(?:"|')[^"']*(?:"|'))/g);
5329
5329
  if (sv) {
@@ -5343,27 +5343,17 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5343
5343
  else if (sv && !v.some(function (v) { return /^style/.test(v.trim()); })) v.push(sv[0]);
5344
5344
  }
5345
5345
 
5346
- // img
5347
- if (tagName === 'img') {
5348
- let w = '', h = '';
5346
+ // figure
5347
+ if (util.isFigures(tagName)) {
5349
5348
  const sv = m.match(/style\s*=\s*(?:"|')[^"']*(?:"|')/);
5350
5349
  if (!v) v = [];
5351
5350
  if (sv) {
5352
- w = sv[0].match(/width:(.+);/);
5353
- w = util.getNumber(w ? w[1] : '', -1) || '';
5354
- h = sv[0].match(/height:(.+);/);
5355
- h = util.getNumber(h ? h[1] : '', -1) || '';
5356
- }
5357
-
5358
- if (!w || !h) {
5359
- const avw = m.match(/width\s*=\s*((?:"|')[^"']*(?:"|'))/);
5360
- const avh = m.match(/height\s*=\s*((?:"|')[^"']*(?:"|'))/);
5361
- if (avw || avh) {
5362
- w = !w ? util.getNumber(avw ? avw[1] : '') || '' : w;
5363
- h = !h ? util.getNumber(avh ? avh[1] : '') || '' : h;
5364
- }
5351
+ const wsize = sv[0].match(/width\s?:\s?(\d+)(px|%)/);
5352
+ const hsize = sv[0].match(/height\s?:\s?(\d+)(px|%)/);
5353
+ const w_ = wsize && wsize[1] && wsize[2] ? wsize[1] + wsize[2] : 'auto';
5354
+ const h_ = hsize && hsize[1] && hsize[2] ? hsize[1] + hsize[2] : 'auto';
5355
+ v.push('style="width:'+ w_ + '; height:'+ h_ + ';"');
5365
5356
  }
5366
- v.push('data-origin="' + (w + ',' + h) + '"');
5367
5357
  }
5368
5358
 
5369
5359
  if (v) {
@@ -1,48 +1,48 @@
1
- import { Core } from "./core";
2
-
3
- export interface History {
4
- /**
5
- * @description History stack
6
- */
7
- stack: any[];
8
- /**
9
- * @description Saving the current status to the history object stack
10
- * If "delay" is true, it will be saved after (options.historyStackDelayTime || 400) miliseconds
11
- * If the function is called again with the "delay" argument true before it is saved, the delay time is renewal
12
- * You can specify the delay time by sending a number.
13
- * @param {Boolean} delay If true, Add stack without delay time.
14
- */
15
- push: (delay: boolean | number) => void;
16
- /**
17
- * @description Undo function
18
- */
19
- undo: () => void;
20
- /**
21
- * @description Redo function
22
- */
23
- redo: () => void;
24
- /**
25
- * @description Go to the history stack for that index.
26
- * If "index" is -1, go to the last stack
27
- * @param {Number} index Stack index
28
- */
29
- go: (index: number) => void;
30
-
31
- /**
32
- * @description Get the current history stack index.
33
- * @returns
34
- */
35
- getCurrentIndex: () => number;
36
-
37
- /**
38
- * @description Reset the history object
39
- */
40
- reset: (ignoreChangeEvent: any) => void;
41
- /**
42
- * @description Remove all stacks and remove the timeout function.
43
- * @private
44
- */
45
- _destroy: () => void;
46
- }
47
-
48
- export default function _default(core: Core, change: any): History;
1
+ import { Core } from "./core";
2
+
3
+ export interface History {
4
+ /**
5
+ * @description History stack
6
+ */
7
+ stack: any[];
8
+ /**
9
+ * @description Saving the current status to the history object stack
10
+ * If "delay" is true, it will be saved after (options.historyStackDelayTime || 400) miliseconds
11
+ * If the function is called again with the "delay" argument true before it is saved, the delay time is renewal
12
+ * You can specify the delay time by sending a number.
13
+ * @param {Boolean} delay If true, Add stack without delay time.
14
+ */
15
+ push: (delay: boolean | number) => void;
16
+ /**
17
+ * @description Undo function
18
+ */
19
+ undo: () => void;
20
+ /**
21
+ * @description Redo function
22
+ */
23
+ redo: () => void;
24
+ /**
25
+ * @description Go to the history stack for that index.
26
+ * If "index" is -1, go to the last stack
27
+ * @param {Number} index Stack index
28
+ */
29
+ go: (index: number) => void;
30
+
31
+ /**
32
+ * @description Get the current history stack index.
33
+ * @returns
34
+ */
35
+ getCurrentIndex: () => number;
36
+
37
+ /**
38
+ * @description Reset the history object
39
+ */
40
+ reset: (ignoreChangeEvent: any) => void;
41
+ /**
42
+ * @description Remove all stacks and remove the timeout function.
43
+ * @private
44
+ */
45
+ _destroy: () => void;
46
+ }
47
+
48
+ export default function _default(core: Core, change: any): History;
@@ -1,219 +1,219 @@
1
- /*
2
- * wysiwyg web editor
3
- *
4
- * suneditor.js
5
- * Copyright 2019 JiHong Lee.
6
- * MIT license.
7
- */
8
- 'use strict';
9
-
10
- export default function (core, change) {
11
- const _w = core._w;
12
- const util = core.util;
13
- const delayTime = core.options.historyStackDelayTime;
14
- let editor = core.context.element;
15
- let undo = core.context.tool.undo;
16
- let redo = core.context.tool.redo;
17
-
18
- let pushDelay = null;
19
- let stackIndex = 0;
20
- let stack = [];
21
-
22
- function setContentsFromStack () {
23
- const item = stack[stackIndex];
24
- editor.wysiwyg.innerHTML = item.contents;
25
-
26
- core.setRange(util.getNodeFromPath(item.s.path, editor.wysiwyg), item.s.offset, util.getNodeFromPath(item.e.path, editor.wysiwyg), item.e.offset);
27
- core.focus();
28
-
29
- if (stack.length <= 1) {
30
- if (undo) undo.setAttribute('disabled', true);
31
- if (redo) redo.setAttribute('disabled', true);
32
- } else {
33
- if (stackIndex === 0) {
34
- if (undo) undo.setAttribute('disabled', true);
35
- if (redo) redo.removeAttribute('disabled');
36
- } else if (stackIndex === stack.length - 1) {
37
- if (undo) undo.removeAttribute('disabled');
38
- if (redo) redo.setAttribute('disabled', true);
39
- } else {
40
- if (undo) undo.removeAttribute('disabled');
41
- if (redo) redo.removeAttribute('disabled');
42
- }
43
- }
44
-
45
- core.controllersOff();
46
- core._checkComponents();
47
- core._setCharCount();
48
- core._resourcesStateChange();
49
-
50
- // onChange
51
- change();
52
- }
53
-
54
- function pushStack () {
55
- core._checkComponents();
56
- const current = core.getContents(true);
57
- if (!current || (!!stack[stackIndex] && current === stack[stackIndex].contents)) return;
58
-
59
- stackIndex++;
60
- const range = core._variable._range;
61
-
62
- if (stack.length > stackIndex) {
63
- stack = stack.slice(0, stackIndex);
64
- if (redo) redo.setAttribute('disabled', true);
65
- }
66
-
67
- if (!range) {
68
- stack[stackIndex] = {
69
- contents: current,
70
- s: { path: [0, 0], offset: [0, 0] },
71
- e: { path: 0, offset: 0 }
72
- };
73
- } else {
74
- stack[stackIndex] = {
75
- contents: current,
76
- s: {
77
- path: util.getNodePath(range.startContainer, null, null),
78
- offset: range.startOffset
79
- },
80
- e: {
81
- path: util.getNodePath(range.endContainer, null, null),
82
- offset: range.endOffset
83
- }
84
- };
85
- }
86
-
87
- if (stackIndex === 1 && undo) undo.removeAttribute('disabled');
88
-
89
- core._setCharCount();
90
- // onChange
91
- change();
92
- }
93
-
94
- return {
95
- /**
96
- * @description History stack
97
- */
98
- stack: stack,
99
-
100
- /**
101
- * @description Saving the current status to the history object stack
102
- * If "delay" is true, it will be saved after (options.historyStackDelayTime || 400) miliseconds
103
- * If the function is called again with the "delay" argument true before it is saved, the delay time is renewal
104
- * You can specify the delay time by sending a number.
105
- * @param {Boolean|Number} delay If true, Add stack without delay time.
106
- */
107
- push: function (delay) {
108
- _w.setTimeout(core._resourcesStateChange.bind(core));
109
- const time = typeof delay === 'number' ? (delay > 0 ? delay : 0) : (!delay ? 0 : delayTime);
110
-
111
- if (!time || pushDelay) {
112
- _w.clearTimeout(pushDelay);
113
- if (!time) {
114
- pushStack();
115
- return;
116
- }
117
- }
118
-
119
- pushDelay = _w.setTimeout(function () {
120
- _w.clearTimeout(pushDelay);
121
- pushDelay = null;
122
- pushStack();
123
- }, time);
124
- },
125
-
126
- /**
127
- * @description Undo function
128
- */
129
- undo: function () {
130
- if (stackIndex > 0) {
131
- stackIndex--;
132
- setContentsFromStack();
133
- }
134
- },
135
-
136
- /**
137
- * @description Redo function
138
- */
139
- redo: function () {
140
- if (stack.length - 1 > stackIndex) {
141
- stackIndex++;
142
- setContentsFromStack();
143
- }
144
- },
145
-
146
- /**
147
- * @description Go to the history stack for that index.
148
- * If "index" is -1, go to the last stack
149
- */
150
- go: function (index) {
151
- stackIndex = index < 0 ? (stack.length - 1) : index;
152
- setContentsFromStack();
153
- },
154
-
155
- /**
156
- * @description Get the current history stack index.
157
- * @returns {Number} Current Stack index
158
- */
159
- getCurrentIndex: function () {
160
- return stackIndex;
161
- },
162
-
163
- /**
164
- * @description Reset the history object
165
- */
166
- reset: function (ignoreChangeEvent) {
167
- if (undo) undo.setAttribute('disabled', true);
168
- if (redo) redo.setAttribute('disabled', true);
169
- core._variable.isChanged = false;
170
- if (core.context.tool.save) core.context.tool.save.setAttribute('disabled', true);
171
-
172
- stack.splice(0);
173
- stackIndex = 0;
174
-
175
- // pushStack
176
- stack[stackIndex] = {
177
- contents: core.getContents(true),
178
- s: {
179
- path: [0, 0],
180
- offset: 0
181
- },
182
- e: {
183
- path: [0, 0],
184
- offset: 0
185
- }
186
- };
187
-
188
- if (!ignoreChangeEvent) change();
189
- },
190
-
191
- /**
192
- * @description Reset the disabled state of the buttons to fit the current stack.
193
- * @private
194
- */
195
- _resetCachingButton: function () {
196
- editor = core.context.element;
197
- undo = core.context.tool.undo;
198
- redo = core.context.tool.redo;
199
-
200
- if (stackIndex === 0) {
201
- if (undo) undo.setAttribute('disabled', true);
202
- if (redo && stackIndex === stack.length - 1) redo.setAttribute('disabled', true);
203
- core._variable.isChanged = false;
204
- if (core.context.tool.save) core.context.tool.save.setAttribute('disabled', true);
205
- } else if (stackIndex === stack.length - 1) {
206
- if (redo) redo.setAttribute('disabled', true);
207
- }
208
- },
209
-
210
- /**
211
- * @description Remove all stacks and remove the timeout function.
212
- * @private
213
- */
214
- _destroy: function () {
215
- if (pushDelay) _w.clearTimeout(pushDelay);
216
- stack = null;
217
- }
218
- };
1
+ /*
2
+ * wysiwyg web editor
3
+ *
4
+ * suneditor.js
5
+ * Copyright 2019 JiHong Lee.
6
+ * MIT license.
7
+ */
8
+ 'use strict';
9
+
10
+ export default function (core, change) {
11
+ const _w = core._w;
12
+ const util = core.util;
13
+ const delayTime = core.options.historyStackDelayTime;
14
+ let editor = core.context.element;
15
+ let undo = core.context.tool.undo;
16
+ let redo = core.context.tool.redo;
17
+
18
+ let pushDelay = null;
19
+ let stackIndex = 0;
20
+ let stack = [];
21
+
22
+ function setContentsFromStack () {
23
+ const item = stack[stackIndex];
24
+ editor.wysiwyg.innerHTML = item.contents;
25
+
26
+ core.setRange(util.getNodeFromPath(item.s.path, editor.wysiwyg), item.s.offset, util.getNodeFromPath(item.e.path, editor.wysiwyg), item.e.offset);
27
+ core.focus();
28
+
29
+ if (stack.length <= 1) {
30
+ if (undo) undo.setAttribute('disabled', true);
31
+ if (redo) redo.setAttribute('disabled', true);
32
+ } else {
33
+ if (stackIndex === 0) {
34
+ if (undo) undo.setAttribute('disabled', true);
35
+ if (redo) redo.removeAttribute('disabled');
36
+ } else if (stackIndex === stack.length - 1) {
37
+ if (undo) undo.removeAttribute('disabled');
38
+ if (redo) redo.setAttribute('disabled', true);
39
+ } else {
40
+ if (undo) undo.removeAttribute('disabled');
41
+ if (redo) redo.removeAttribute('disabled');
42
+ }
43
+ }
44
+
45
+ core.controllersOff();
46
+ core._checkComponents();
47
+ core._setCharCount();
48
+ core._resourcesStateChange();
49
+
50
+ // onChange
51
+ change();
52
+ }
53
+
54
+ function pushStack () {
55
+ core._checkComponents();
56
+ const current = core.getContents(true);
57
+ if (!current || (!!stack[stackIndex] && current === stack[stackIndex].contents)) return;
58
+
59
+ stackIndex++;
60
+ const range = core._variable._range;
61
+
62
+ if (stack.length > stackIndex) {
63
+ stack = stack.slice(0, stackIndex);
64
+ if (redo) redo.setAttribute('disabled', true);
65
+ }
66
+
67
+ if (!range) {
68
+ stack[stackIndex] = {
69
+ contents: current,
70
+ s: { path: [0, 0], offset: [0, 0] },
71
+ e: { path: 0, offset: 0 }
72
+ };
73
+ } else {
74
+ stack[stackIndex] = {
75
+ contents: current,
76
+ s: {
77
+ path: util.getNodePath(range.startContainer, null, null),
78
+ offset: range.startOffset
79
+ },
80
+ e: {
81
+ path: util.getNodePath(range.endContainer, null, null),
82
+ offset: range.endOffset
83
+ }
84
+ };
85
+ }
86
+
87
+ if (stackIndex === 1 && undo) undo.removeAttribute('disabled');
88
+
89
+ core._setCharCount();
90
+ // onChange
91
+ change();
92
+ }
93
+
94
+ return {
95
+ /**
96
+ * @description History stack
97
+ */
98
+ stack: stack,
99
+
100
+ /**
101
+ * @description Saving the current status to the history object stack
102
+ * If "delay" is true, it will be saved after (options.historyStackDelayTime || 400) miliseconds
103
+ * If the function is called again with the "delay" argument true before it is saved, the delay time is renewal
104
+ * You can specify the delay time by sending a number.
105
+ * @param {Boolean|Number} delay If true, Add stack without delay time.
106
+ */
107
+ push: function (delay) {
108
+ _w.setTimeout(core._resourcesStateChange.bind(core));
109
+ const time = typeof delay === 'number' ? (delay > 0 ? delay : 0) : (!delay ? 0 : delayTime);
110
+
111
+ if (!time || pushDelay) {
112
+ _w.clearTimeout(pushDelay);
113
+ if (!time) {
114
+ pushStack();
115
+ return;
116
+ }
117
+ }
118
+
119
+ pushDelay = _w.setTimeout(function () {
120
+ _w.clearTimeout(pushDelay);
121
+ pushDelay = null;
122
+ pushStack();
123
+ }, time);
124
+ },
125
+
126
+ /**
127
+ * @description Undo function
128
+ */
129
+ undo: function () {
130
+ if (stackIndex > 0) {
131
+ stackIndex--;
132
+ setContentsFromStack();
133
+ }
134
+ },
135
+
136
+ /**
137
+ * @description Redo function
138
+ */
139
+ redo: function () {
140
+ if (stack.length - 1 > stackIndex) {
141
+ stackIndex++;
142
+ setContentsFromStack();
143
+ }
144
+ },
145
+
146
+ /**
147
+ * @description Go to the history stack for that index.
148
+ * If "index" is -1, go to the last stack
149
+ */
150
+ go: function (index) {
151
+ stackIndex = index < 0 ? (stack.length - 1) : index;
152
+ setContentsFromStack();
153
+ },
154
+
155
+ /**
156
+ * @description Get the current history stack index.
157
+ * @returns {Number} Current Stack index
158
+ */
159
+ getCurrentIndex: function () {
160
+ return stackIndex;
161
+ },
162
+
163
+ /**
164
+ * @description Reset the history object
165
+ */
166
+ reset: function (ignoreChangeEvent) {
167
+ if (undo) undo.setAttribute('disabled', true);
168
+ if (redo) redo.setAttribute('disabled', true);
169
+ core._variable.isChanged = false;
170
+ if (core.context.tool.save) core.context.tool.save.setAttribute('disabled', true);
171
+
172
+ stack.splice(0);
173
+ stackIndex = 0;
174
+
175
+ // pushStack
176
+ stack[stackIndex] = {
177
+ contents: core.getContents(true),
178
+ s: {
179
+ path: [0, 0],
180
+ offset: 0
181
+ },
182
+ e: {
183
+ path: [0, 0],
184
+ offset: 0
185
+ }
186
+ };
187
+
188
+ if (!ignoreChangeEvent) change();
189
+ },
190
+
191
+ /**
192
+ * @description Reset the disabled state of the buttons to fit the current stack.
193
+ * @private
194
+ */
195
+ _resetCachingButton: function () {
196
+ editor = core.context.element;
197
+ undo = core.context.tool.undo;
198
+ redo = core.context.tool.redo;
199
+
200
+ if (stackIndex === 0) {
201
+ if (undo) undo.setAttribute('disabled', true);
202
+ if (redo && stackIndex === stack.length - 1) redo.setAttribute('disabled', true);
203
+ core._variable.isChanged = false;
204
+ if (core.context.tool.save) core.context.tool.save.setAttribute('disabled', true);
205
+ } else if (stackIndex === stack.length - 1) {
206
+ if (redo) redo.setAttribute('disabled', true);
207
+ }
208
+ },
209
+
210
+ /**
211
+ * @description Remove all stacks and remove the timeout function.
212
+ * @private
213
+ */
214
+ _destroy: function () {
215
+ if (pushDelay) _w.clearTimeout(pushDelay);
216
+ stack = null;
217
+ }
218
+ };
219
219
  }