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.
- package/LICENSE.txt +20 -20
- package/README.md +1585 -1585
- package/dist/css/suneditor.min.css +1 -1
- 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 +17 -27
- 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
|
@@ -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.
|
|
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(
|
|
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
|
-
//
|
|
5346
|
-
if (tagName
|
|
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
|
-
|
|
5352
|
-
|
|
5353
|
-
|
|
5354
|
-
|
|
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--;
|
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
|
}
|