suneditor 2.44.5 → 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 (131) hide show
  1. package/LICENSE.txt +20 -20
  2. package/README.md +1585 -1585
  3. package/dist/css/suneditor.min.css +1 -1
  4. package/dist/suneditor.min.js +2 -2
  5. package/package.json +71 -71
  6. package/src/assets/css/suneditor-contents.css +556 -556
  7. package/src/assets/css/suneditor.css +0 -0
  8. package/src/assets/defaultIcons.js +103 -103
  9. package/src/lang/Lang.d.ts +143 -143
  10. package/src/lang/ckb.d.ts +4 -4
  11. package/src/lang/ckb.js +187 -187
  12. package/src/lang/da.d.ts +4 -4
  13. package/src/lang/da.js +191 -191
  14. package/src/lang/de.d.ts +4 -4
  15. package/src/lang/de.js +187 -187
  16. package/src/lang/en.d.ts +4 -4
  17. package/src/lang/en.js +187 -187
  18. package/src/lang/es.d.ts +4 -4
  19. package/src/lang/es.js +187 -187
  20. package/src/lang/fr.d.ts +4 -4
  21. package/src/lang/fr.js +188 -188
  22. package/src/lang/he.d.ts +4 -4
  23. package/src/lang/he.js +188 -188
  24. package/src/lang/index.d.ts +22 -22
  25. package/src/lang/index.js +25 -25
  26. package/src/lang/it.d.ts +4 -4
  27. package/src/lang/it.js +188 -188
  28. package/src/lang/ja.d.ts +4 -4
  29. package/src/lang/ja.js +187 -187
  30. package/src/lang/ko.d.ts +4 -4
  31. package/src/lang/ko.js +187 -187
  32. package/src/lang/lv.d.ts +4 -4
  33. package/src/lang/lv.js +187 -187
  34. package/src/lang/nl.d.ts +4 -4
  35. package/src/lang/nl.js +187 -187
  36. package/src/lang/pl.d.ts +4 -4
  37. package/src/lang/pl.js +187 -187
  38. package/src/lang/pt_br.d.ts +4 -4
  39. package/src/lang/pt_br.js +189 -189
  40. package/src/lang/ro.d.ts +4 -4
  41. package/src/lang/ro.js +187 -187
  42. package/src/lang/ru.d.ts +4 -4
  43. package/src/lang/ru.js +187 -187
  44. package/src/lang/se.d.ts +4 -4
  45. package/src/lang/se.js +191 -191
  46. package/src/lang/ua.d.ts +5 -5
  47. package/src/lang/ua.js +188 -188
  48. package/src/lang/ur.d.ts +4 -4
  49. package/src/lang/ur.js +187 -187
  50. package/src/lang/zh_cn.d.ts +4 -4
  51. package/src/lang/zh_cn.js +187 -187
  52. package/src/lib/constructor.js +0 -0
  53. package/src/lib/context.d.ts +42 -42
  54. package/src/lib/context.js +0 -0
  55. package/src/lib/core.d.ts +1101 -1101
  56. package/src/lib/core.js +17 -27
  57. package/src/lib/history.d.ts +48 -48
  58. package/src/lib/history.js +218 -218
  59. package/src/lib/util.d.ts +677 -677
  60. package/src/lib/util.js +19 -0
  61. package/src/options.d.ts +608 -608
  62. package/src/plugins/CommandPlugin.d.ts +7 -7
  63. package/src/plugins/DialogPlugin.d.ts +19 -19
  64. package/src/plugins/FileBrowserPlugin.d.ts +29 -29
  65. package/src/plugins/Module.d.ts +14 -14
  66. package/src/plugins/Plugin.d.ts +41 -41
  67. package/src/plugins/SubmenuPlugin.d.ts +7 -7
  68. package/src/plugins/command/blockquote.d.ts +4 -4
  69. package/src/plugins/command/blockquote.js +46 -46
  70. package/src/plugins/dialog/audio.d.ts +4 -4
  71. package/src/plugins/dialog/audio.js +556 -556
  72. package/src/plugins/dialog/image.d.ts +4 -4
  73. package/src/plugins/dialog/image.js +1122 -1122
  74. package/src/plugins/dialog/link.d.ts +4 -4
  75. package/src/plugins/dialog/link.js +223 -223
  76. package/src/plugins/dialog/math.d.ts +4 -4
  77. package/src/plugins/dialog/math.js +294 -294
  78. package/src/plugins/dialog/mention.d.ts +5 -5
  79. package/src/plugins/dialog/mention.js +242 -242
  80. package/src/plugins/dialog/video.d.ts +4 -4
  81. package/src/plugins/dialog/video.js +983 -983
  82. package/src/plugins/fileBrowser/imageGallery.d.ts +4 -4
  83. package/src/plugins/fileBrowser/imageGallery.js +63 -63
  84. package/src/plugins/index.d.ts +79 -79
  85. package/src/plugins/index.js +32 -32
  86. package/src/plugins/modules/_anchor.js +461 -461
  87. package/src/plugins/modules/_colorPicker.d.ts +59 -59
  88. package/src/plugins/modules/_colorPicker.js +0 -0
  89. package/src/plugins/modules/_notice.d.ts +20 -20
  90. package/src/plugins/modules/_notice.js +72 -72
  91. package/src/plugins/modules/_selectMenu.js +118 -118
  92. package/src/plugins/modules/component.d.ts +24 -24
  93. package/src/plugins/modules/component.js +82 -82
  94. package/src/plugins/modules/dialog.d.ts +27 -27
  95. package/src/plugins/modules/dialog.js +174 -174
  96. package/src/plugins/modules/fileBrowser.d.ts +41 -41
  97. package/src/plugins/modules/fileBrowser.js +373 -373
  98. package/src/plugins/modules/fileManager.d.ts +66 -66
  99. package/src/plugins/modules/fileManager.js +325 -325
  100. package/src/plugins/modules/index.d.ts +10 -10
  101. package/src/plugins/modules/index.js +8 -8
  102. package/src/plugins/modules/resizing.d.ts +153 -153
  103. package/src/plugins/modules/resizing.js +895 -895
  104. package/src/plugins/submenu/align.d.ts +4 -4
  105. package/src/plugins/submenu/align.js +160 -160
  106. package/src/plugins/submenu/font.d.ts +4 -4
  107. package/src/plugins/submenu/font.js +120 -120
  108. package/src/plugins/submenu/fontColor.d.ts +4 -4
  109. package/src/plugins/submenu/fontColor.js +0 -0
  110. package/src/plugins/submenu/fontSize.d.ts +4 -4
  111. package/src/plugins/submenu/fontSize.js +112 -112
  112. package/src/plugins/submenu/formatBlock.d.ts +4 -4
  113. package/src/plugins/submenu/formatBlock.js +273 -273
  114. package/src/plugins/submenu/hiliteColor.d.ts +4 -4
  115. package/src/plugins/submenu/hiliteColor.js +0 -0
  116. package/src/plugins/submenu/horizontalRule.d.ts +4 -4
  117. package/src/plugins/submenu/horizontalRule.js +98 -98
  118. package/src/plugins/submenu/lineHeight.d.ts +4 -4
  119. package/src/plugins/submenu/lineHeight.js +104 -104
  120. package/src/plugins/submenu/list.d.ts +4 -4
  121. package/src/plugins/submenu/list.js +456 -456
  122. package/src/plugins/submenu/paragraphStyle.d.ts +4 -4
  123. package/src/plugins/submenu/paragraphStyle.js +135 -135
  124. package/src/plugins/submenu/table.d.ts +4 -4
  125. package/src/plugins/submenu/template.d.ts +4 -4
  126. package/src/plugins/submenu/template.js +71 -71
  127. package/src/plugins/submenu/textStyle.d.ts +4 -4
  128. package/src/plugins/submenu/textStyle.js +167 -167
  129. package/src/suneditor.d.ts +9 -9
  130. package/src/suneditor.js +75 -75
  131. package/src/suneditor_build.js +17 -17
package/src/lib/core.js CHANGED
@@ -5082,11 +5082,10 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5082
5082
  setContents: function (html) {
5083
5083
  this.removeRange();
5084
5084
 
5085
- const convertValue = (html === null || html === undefined) ? '' : this.cleanHTML(html, null, null);
5086
- this._resetComponents();
5087
-
5085
+ const convertValue = (html === null || html === undefined) ? '' : this.convertContentsForEditor(html, null, null);
5088
5086
  if (!this._variable.isCodeView) {
5089
5087
  context.element.wysiwyg.innerHTML = convertValue;
5088
+ this._resetComponents();
5090
5089
  // history stack
5091
5090
  this.history.push(false);
5092
5091
  } else {
@@ -5103,6 +5102,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5103
5102
  if (!options.iframe) return false;
5104
5103
  if (ctx.head) this._wd.head.innerHTML = ctx.head.replace(/<script[\s\S]*>[\s\S]*<\/script>/gi, '');
5105
5104
  if (ctx.body) this._wd.body.innerHTML = this.convertContentsForEditor(ctx.body);
5105
+ this._resetComponents();
5106
5106
  },
5107
5107
 
5108
5108
  /**
@@ -5153,6 +5153,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5153
5153
  // element
5154
5154
  if (node.nodeType === 1) {
5155
5155
  if (util._disallowedTags(node)) return '';
5156
+ if (/__se__tag/.test(node.className)) return node.outerHTML;
5156
5157
 
5157
5158
  const ch = util.getListChildNodes(node, function(current) { return util.isSpanWithoutAttr(current) && !util.getParentElement(current, util.isNotCheckingNode); }) || [];
5158
5159
  for (let i = ch.length - 1; i >= 0; i--) {
@@ -5220,8 +5221,8 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5220
5221
  _convertFontSize: function (to, size) {
5221
5222
  const math = this._w.Math;
5222
5223
  const value = size.match(/(\d+(?:\.\d+)?)(.+)/);
5223
- const sizeNum = value[1] * 1;
5224
- const from = value[2];
5224
+ const sizeNum = value ? value[1] * 1 : util.fontValueMap[size];
5225
+ const from = value ? value[2] : 'rem';
5225
5226
  let pxSize = sizeNum;
5226
5227
 
5227
5228
  if (/em/.test(from)) {
@@ -5262,7 +5263,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5262
5263
  const allowedStyle = [];
5263
5264
  for (let i = 0, len = style.length, r; i < len; i++) {
5264
5265
  r = style[i].match(/([a-zA-Z0-9-]+)(:)([^:]+$)/);
5265
- if (r && !/inherit|initial/i.test(r[3])) {
5266
+ if (r && !/inherit|initial|revert|unset/i.test(r[3])) {
5266
5267
  const k = util.kebabToCamelCase(r[1].trim());
5267
5268
  const v = this.wwComputedStyle[k].replace(/"/g, '');
5268
5269
  const c = r[3].trim();
@@ -5273,7 +5274,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5273
5274
  case 'fontSize':
5274
5275
  if (!options.plugins.fontSize) continue;
5275
5276
  if (!this._cleanStyleRegExp.fontSizeUnit.test(r[0])) {
5276
- 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));
5277
5278
  }
5278
5279
  break;
5279
5280
  case 'color':
@@ -5322,7 +5323,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5322
5323
  else v = m.match(lowLevelCheck ? this._attributesWhitelistRegExp : this._attributesWhitelistRegExp_all_data);
5323
5324
 
5324
5325
  // attribute
5325
- if (lowLevelCheck) {
5326
+ if (lowLevelCheck || tagName === 'span') {
5326
5327
  if (tagName === 'a') {
5327
5328
  const sv = m.match(/(?:(?:id|name)\s*=\s*(?:"|')[^"']*(?:"|'))/g);
5328
5329
  if (sv) {
@@ -5342,27 +5343,17 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5342
5343
  else if (sv && !v.some(function (v) { return /^style/.test(v.trim()); })) v.push(sv[0]);
5343
5344
  }
5344
5345
 
5345
- // img
5346
- if (tagName === 'img') {
5347
- let w = '', h = '';
5346
+ // figure
5347
+ if (util.isFigures(tagName)) {
5348
5348
  const sv = m.match(/style\s*=\s*(?:"|')[^"']*(?:"|')/);
5349
5349
  if (!v) v = [];
5350
5350
  if (sv) {
5351
- w = sv[0].match(/width:(.+);/);
5352
- w = util.getNumber(w ? w[1] : '', -1) || '';
5353
- h = sv[0].match(/height:(.+);/);
5354
- h = util.getNumber(h ? h[1] : '', -1) || '';
5355
- }
5356
-
5357
- if (!w || !h) {
5358
- const avw = m.match(/width\s*=\s*((?:"|')[^"']*(?:"|'))/);
5359
- const avh = m.match(/height\s*=\s*((?:"|')[^"']*(?:"|'))/);
5360
- if (avw || avh) {
5361
- w = !w ? util.getNumber(avw ? avw[1] : '') || '' : w;
5362
- h = !h ? util.getNumber(avh ? avh[1] : '') || '' : h;
5363
- }
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_ + ';"');
5364
5356
  }
5365
- v.push('data-origin="' + (w + ',' + h) + '"');
5366
5357
  }
5367
5358
 
5368
5359
  if (v) {
@@ -5457,7 +5448,6 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5457
5448
  */
5458
5449
  cleanHTML: function (html, whitelist, blacklist) {
5459
5450
  html = this._deleteDisallowedTags(this._parser.parseFromString(html, 'text/html').body.innerHTML).replace(/(<[a-zA-Z0-9\-]+)[^>]*(?=>)/g, this._cleanTags.bind(this, true));
5460
-
5461
5451
  const dom = _d.createRange().createContextualFragment(html);
5462
5452
  try {
5463
5453
  util._consistencyCheckOfHTML(dom, this._htmlCheckWhitelistRegExp, this._htmlCheckBlacklistRegExp, true);
@@ -5536,7 +5526,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
5536
5526
  for (let i = 0, t; i < domTree.length; i++) {
5537
5527
  t = domTree[i];
5538
5528
 
5539
- if (!util.isFormatElement(t) && !util.isRangeFormatElement(t) && !util.isComponent(t) && !util.isMedia(t) && t.nodeType !== 8) {
5529
+ if (!util.isFormatElement(t) && !util.isRangeFormatElement(t) && !util.isComponent(t) && !util.isMedia(t) && t.nodeType !== 8 && !/__se__tag/.test(t.className)) {
5540
5530
  if (!p) p = util.createElement(options.defaultTag);
5541
5531
  p.appendChild(t);
5542
5532
  i--;
@@ -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
  }