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.
- package/LICENSE.txt +20 -20
- package/README.md +1585 -1585
- package/dist/suneditor.min.js +2 -2
- package/package.json +71 -71
- package/src/assets/css/suneditor-contents.css +556 -556
- 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/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 +187 -187
- 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/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/index.d.ts +22 -22
- package/src/lang/index.js +25 -25
- 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/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/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 +1101 -1101
- package/src/lib/core.js +12 -22
- 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 +19 -0
- package/src/options.d.ts +608 -608
- 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 +556 -556
- package/src/plugins/dialog/image.d.ts +4 -4
- package/src/plugins/dialog/image.js +1122 -1122
- 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 +294 -294
- package/src/plugins/dialog/mention.d.ts +5 -5
- package/src/plugins/dialog/mention.js +242 -242
- package/src/plugins/dialog/video.d.ts +4 -4
- package/src/plugins/dialog/video.js +983 -983
- package/src/plugins/fileBrowser/imageGallery.d.ts +4 -4
- package/src/plugins/fileBrowser/imageGallery.js +63 -63
- 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 +82 -82
- 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 +373 -373
- 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 +895 -895
- 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 +120 -120
- 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 +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(
|
|
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
|
-
//
|
|
5347
|
-
if (tagName
|
|
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
|
-
|
|
5353
|
-
|
|
5354
|
-
|
|
5355
|
-
|
|
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) {
|
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 = 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
|
}
|