suneditor 2.47.10 → 2.47.11
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 -1625
- package/dist/suneditor.min.js +2 -2
- package/example.md +586 -586
- package/package.json +82 -82
- package/src/assets/css/suneditor-contents.css +561 -561
- package/src/assets/css/suneditor.css +0 -0
- 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 -25
- package/src/lang/index.js +30 -30
- 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 +4 -4
- package/src/lang/km.js +187 -187
- 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 +3 -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 +0 -0
- package/src/options.d.ts +621 -621
- 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 -557
- package/src/plugins/dialog/image.d.ts +4 -4
- package/src/plugins/dialog/image.js +1126 -1126
- 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 -20
package/src/lib/core.js
CHANGED
|
@@ -4764,7 +4764,7 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
|
|
|
4764
4764
|
* @private
|
|
4765
4765
|
*/
|
|
4766
4766
|
_setCodeDataToEditor: function () {
|
|
4767
|
-
const code_html = this._getCodeView();
|
|
4767
|
+
const code_html = this._deleteDisallowedTags(this._getCodeView());
|
|
4768
4768
|
|
|
4769
4769
|
if (options.fullPage) {
|
|
4770
4770
|
const parseDocument = this._parser.parseFromString(code_html, 'text/html');
|
|
@@ -5901,9 +5901,9 @@ export default function (context, pluginCallButtons, plugins, lang, options, _re
|
|
|
5901
5901
|
return this.test(v) ? v : '';
|
|
5902
5902
|
}.bind(options.allowedClassNames);
|
|
5903
5903
|
|
|
5904
|
-
const sPrefix = (options.__allowedScriptTag ? '' : 'script|');
|
|
5904
|
+
const sPrefix = (options.__allowedScriptTag ? '' : 'script|') + 'style|meta|link|[a-z]+:[a-z]+';
|
|
5905
5905
|
this.__scriptTagRegExp = new wRegExp('<(script)[^>]*>([\\s\\S]*?)<\\/\\1>|<script[^>]*\\/?>', 'gi');
|
|
5906
|
-
this.__disallowedTagsRegExp = new wRegExp('<(' + sPrefix + '
|
|
5906
|
+
this.__disallowedTagsRegExp = new wRegExp('<(' + sPrefix + ')[^>]*>([\\s\\S]*?)<\\/\\1>|<(' + sPrefix + ')[^>]*\\/?>', 'gi');
|
|
5907
5907
|
this.__disallowedTagNameRegExp = new wRegExp('^(' + sPrefix + 'meta|link|style|[a-z]+\:[a-z]+)$', 'i');
|
|
5908
5908
|
this.__allowedScriptRegExp = new wRegExp('^' + (options.__allowedScriptTag ? 'script' : '') + '$', 'i');
|
|
5909
5909
|
|
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
|
}
|