suneditor 2.47.5 → 2.47.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.
- package/LICENSE.txt +20 -20
- package/README.md +1625 -1613
- package/dist/css/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +2 -2
- package/example.md +586 -586
- package/package.json +71 -71
- package/src/assets/css/suneditor-contents.css +561 -561
- package/src/assets/css/suneditor.css +2 -2
- package/src/assets/defaultIcons.js +103 -103
- package/src/lang/Lang.d.ts +143 -143
- package/src/lang/ckb.d.ts +4 -4
- package/src/lang/ckb.js +187 -187
- package/src/lang/cs.d.ts +4 -4
- package/src/lang/cs.js +187 -187
- package/src/lang/da.d.ts +4 -4
- package/src/lang/da.js +191 -191
- package/src/lang/de.d.ts +4 -4
- package/src/lang/de.js +188 -188
- package/src/lang/en.d.ts +4 -4
- package/src/lang/en.js +187 -187
- package/src/lang/es.d.ts +4 -4
- package/src/lang/es.js +187 -187
- package/src/lang/fa.d.ts +4 -4
- package/src/lang/fa.js +187 -187
- package/src/lang/fr.d.ts +4 -4
- package/src/lang/fr.js +188 -188
- package/src/lang/he.d.ts +4 -4
- package/src/lang/he.js +188 -188
- package/src/lang/hu.d.ts +5 -5
- package/src/lang/hu.js +188 -188
- package/src/lang/index.d.ts +25 -24
- package/src/lang/index.js +30 -27
- package/src/lang/it.d.ts +4 -4
- package/src/lang/it.js +188 -188
- package/src/lang/ja.d.ts +4 -4
- package/src/lang/ja.js +187 -187
- package/src/lang/km.d.ts +5 -0
- package/src/lang/km.js +188 -0
- package/src/lang/ko.d.ts +4 -4
- package/src/lang/ko.js +187 -187
- package/src/lang/lv.d.ts +4 -4
- package/src/lang/lv.js +187 -187
- package/src/lang/nl.d.ts +4 -4
- package/src/lang/nl.js +187 -187
- package/src/lang/pl.d.ts +4 -4
- package/src/lang/pl.js +187 -187
- package/src/lang/pt_br.d.ts +4 -4
- package/src/lang/pt_br.js +189 -189
- package/src/lang/ro.d.ts +4 -4
- package/src/lang/ro.js +187 -187
- package/src/lang/ru.d.ts +4 -4
- package/src/lang/ru.js +187 -187
- package/src/lang/se.d.ts +4 -4
- package/src/lang/se.js +191 -191
- package/src/lang/tr.d.ts +5 -5
- package/src/lang/tr.js +191 -191
- package/src/lang/ua.d.ts +5 -5
- package/src/lang/ua.js +188 -188
- package/src/lang/ur.d.ts +4 -4
- package/src/lang/ur.js +187 -187
- package/src/lang/zh_cn.d.ts +4 -4
- package/src/lang/zh_cn.js +187 -187
- package/src/lib/constructor.js +0 -0
- package/src/lib/context.d.ts +42 -42
- package/src/lib/context.js +0 -0
- package/src/lib/core.d.ts +1135 -1135
- package/src/lib/core.js +9 -3
- package/src/lib/history.d.ts +48 -48
- package/src/lib/history.js +218 -218
- package/src/lib/util.d.ts +677 -677
- package/src/lib/util.js +1 -1
- package/src/options.d.ts +621 -620
- package/src/plugins/CommandPlugin.d.ts +7 -7
- package/src/plugins/DialogPlugin.d.ts +19 -19
- package/src/plugins/FileBrowserPlugin.d.ts +29 -29
- package/src/plugins/Module.d.ts +14 -14
- package/src/plugins/Plugin.d.ts +41 -41
- package/src/plugins/SubmenuPlugin.d.ts +7 -7
- package/src/plugins/command/blockquote.d.ts +4 -4
- package/src/plugins/command/blockquote.js +46 -46
- package/src/plugins/dialog/audio.d.ts +4 -4
- package/src/plugins/dialog/audio.js +557 -558
- package/src/plugins/dialog/image.d.ts +4 -4
- package/src/plugins/dialog/image.js +1126 -1127
- package/src/plugins/dialog/link.d.ts +4 -4
- package/src/plugins/dialog/link.js +223 -223
- package/src/plugins/dialog/math.d.ts +4 -4
- package/src/plugins/dialog/math.js +300 -300
- package/src/plugins/dialog/video.d.ts +4 -4
- package/src/plugins/dialog/video.js +989 -989
- package/src/plugins/fileBrowser/imageGallery.d.ts +4 -4
- package/src/plugins/fileBrowser/imageGallery.js +64 -64
- package/src/plugins/index.d.ts +79 -79
- package/src/plugins/index.js +32 -32
- package/src/plugins/modules/_anchor.js +461 -461
- package/src/plugins/modules/_colorPicker.d.ts +59 -59
- package/src/plugins/modules/_colorPicker.js +0 -0
- package/src/plugins/modules/_notice.d.ts +20 -20
- package/src/plugins/modules/_notice.js +72 -72
- package/src/plugins/modules/_selectMenu.js +118 -118
- package/src/plugins/modules/component.d.ts +24 -24
- package/src/plugins/modules/component.js +80 -80
- package/src/plugins/modules/dialog.d.ts +27 -27
- package/src/plugins/modules/dialog.js +174 -174
- package/src/plugins/modules/fileBrowser.d.ts +41 -41
- package/src/plugins/modules/fileBrowser.js +377 -377
- package/src/plugins/modules/fileManager.d.ts +66 -66
- package/src/plugins/modules/fileManager.js +325 -325
- package/src/plugins/modules/index.d.ts +10 -10
- package/src/plugins/modules/index.js +8 -8
- package/src/plugins/modules/resizing.d.ts +153 -153
- package/src/plugins/modules/resizing.js +902 -902
- package/src/plugins/submenu/align.d.ts +4 -4
- package/src/plugins/submenu/align.js +160 -160
- package/src/plugins/submenu/font.d.ts +4 -4
- package/src/plugins/submenu/font.js +123 -123
- package/src/plugins/submenu/fontColor.d.ts +4 -4
- package/src/plugins/submenu/fontColor.js +0 -0
- package/src/plugins/submenu/fontSize.d.ts +4 -4
- package/src/plugins/submenu/fontSize.js +112 -112
- package/src/plugins/submenu/formatBlock.d.ts +4 -4
- package/src/plugins/submenu/formatBlock.js +273 -273
- package/src/plugins/submenu/hiliteColor.d.ts +4 -4
- package/src/plugins/submenu/hiliteColor.js +0 -0
- package/src/plugins/submenu/horizontalRule.d.ts +4 -4
- package/src/plugins/submenu/horizontalRule.js +98 -98
- package/src/plugins/submenu/lineHeight.d.ts +4 -4
- package/src/plugins/submenu/lineHeight.js +104 -104
- package/src/plugins/submenu/list.d.ts +4 -4
- package/src/plugins/submenu/list.js +456 -456
- package/src/plugins/submenu/paragraphStyle.d.ts +4 -4
- package/src/plugins/submenu/paragraphStyle.js +135 -135
- package/src/plugins/submenu/table.d.ts +4 -4
- package/src/plugins/submenu/template.d.ts +4 -4
- package/src/plugins/submenu/template.js +71 -71
- package/src/plugins/submenu/textStyle.d.ts +4 -4
- package/src/plugins/submenu/textStyle.js +167 -167
- package/src/suneditor.d.ts +9 -9
- package/src/suneditor.js +75 -75
- package/src/suneditor_build.js +20 -17
- package/README_V3_TEMP.md +0 -630
package/src/lib/core.js
CHANGED
|
@@ -1214,6 +1214,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
|
|
|
1214
1214
|
if (util.isWysiwygDiv(range.commonAncestorContainer)) selectionNode = range.commonAncestorContainer.children[range.startOffset] || range.commonAncestorContainer;
|
|
1215
1215
|
else selectionNode = range.commonAncestorContainer;
|
|
1216
1216
|
} else {
|
|
1217
|
+
// extentNode - Firefox legacy
|
|
1217
1218
|
selectionNode = selection.extentNode || selection.anchorNode;
|
|
1218
1219
|
}
|
|
1219
1220
|
|
|
@@ -1659,6 +1660,8 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
|
|
|
1659
1660
|
// line breaker
|
|
1660
1661
|
this._lineBreaker.style.display = 'none';
|
|
1661
1662
|
const container = util.getParentElement(element, util.isComponent);
|
|
1663
|
+
if (!container) return;
|
|
1664
|
+
|
|
1662
1665
|
const t_style = context.element.lineBreaker_t.style;
|
|
1663
1666
|
const b_style = context.element.lineBreaker_b.style;
|
|
1664
1667
|
const target = this.context.resizing.resizeContainer.style.display === 'block' ? this.context.resizing.resizeContainer : element;
|
|
@@ -5275,7 +5278,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
|
|
|
5275
5278
|
case '%':
|
|
5276
5279
|
return (pxSize * 0.0625).toFixed(2) + to;
|
|
5277
5280
|
case 'pt':
|
|
5278
|
-
return math.
|
|
5281
|
+
return math.round(pxSize / 1.333) + to;
|
|
5279
5282
|
default: // px
|
|
5280
5283
|
return pxSize + to;
|
|
5281
5284
|
}
|
|
@@ -5415,6 +5418,9 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
|
|
|
5415
5418
|
value += '<!-- ' + n.textContent + ' -->';
|
|
5416
5419
|
} else if (!util.isFormatElement(n) && !util.isRangeFormatElement(n) && !util.isComponent(n) && !/meta/i.test(n.nodeName)) {
|
|
5417
5420
|
if (!f) f = util.createElement(options.defaultTag);
|
|
5421
|
+
if (util.isTextStyleElement(n)) {
|
|
5422
|
+
(n).removeAttribute('style');
|
|
5423
|
+
}
|
|
5418
5424
|
f.appendChild(n);
|
|
5419
5425
|
i--; len--;
|
|
5420
5426
|
} else {
|
|
@@ -5950,7 +5956,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
|
|
|
5950
5956
|
if (k === 'all') {
|
|
5951
5957
|
allAttr = getRegList(_wAttr[k], defaultAttr);
|
|
5952
5958
|
} else {
|
|
5953
|
-
tagsAttr[k] = new wRegExp('\\s(?:' + getRegList(_wAttr[k],
|
|
5959
|
+
tagsAttr[k] = new wRegExp('\\s(?:' + getRegList(_wAttr[k], defaultAttr) + ')' + regEndStr, 'ig');
|
|
5954
5960
|
}
|
|
5955
5961
|
}
|
|
5956
5962
|
}
|
|
@@ -7308,7 +7314,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
|
|
|
7308
7314
|
if (range.startContainer !== range.endContainer) core.removeNode();
|
|
7309
7315
|
|
|
7310
7316
|
let next = util.getArrayItem(formatEl.children, util.isList, false);
|
|
7311
|
-
next = next || formatEl.nextElementSibling || rangeEl.parentNode.nextElementSibling;
|
|
7317
|
+
next = next || formatEl.nextElementSibling || (rangeEl.parentNode ? rangeEl.parentNode.nextElementSibling : null);
|
|
7312
7318
|
if (next && (util.isList(next) || util.getArrayItem(next.children, util.isList, false))) {
|
|
7313
7319
|
e.preventDefault();
|
|
7314
7320
|
|
package/src/lib/history.d.ts
CHANGED
|
@@ -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;
|
package/src/lib/history.js
CHANGED
|
@@ -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 = editor.wysiwyg.innerHTML;
|
|
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 = editor.wysiwyg.innerHTML;
|
|
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
|
}
|