suneditor 2.46.2 → 3.0.0-alpha.1
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/.eslintignore +7 -0
- package/.eslintrc.json +64 -0
- package/CONTRIBUTING.md +36 -0
- package/LICENSE.txt +1 -1
- package/README.md +174 -805
- package/dist/suneditor.min.css +1 -0
- package/dist/suneditor.min.js +1 -2
- package/package.json +96 -69
- package/src/assets/icons/_default.js +194 -0
- package/src/assets/suneditor-content.css +646 -0
- package/src/assets/suneditor.css +3378 -0
- package/src/core/base/eventHandlers/handler_toolbar.js +114 -0
- package/src/core/base/eventHandlers/handler_ww_clipboard.js +31 -0
- package/src/core/base/eventHandlers/handler_ww_dragDrop.js +69 -0
- package/src/core/base/eventHandlers/handler_ww_key_input.js +975 -0
- package/src/core/base/eventHandlers/handler_ww_mouse.js +118 -0
- package/src/core/base/eventManager.js +1115 -0
- package/src/core/base/events.js +320 -0
- package/src/core/base/history.js +301 -0
- package/src/core/class/char.js +146 -0
- package/src/core/class/component.js +627 -0
- package/src/core/class/format.js +3255 -0
- package/src/core/class/html.js +1621 -0
- package/src/core/class/menu.js +260 -0
- package/src/core/class/nodeTransform.js +379 -0
- package/src/core/class/notice.js +42 -0
- package/src/core/class/offset.js +578 -0
- package/src/core/class/selection.js +508 -0
- package/src/core/class/shortcuts.js +38 -0
- package/src/core/class/toolbar.js +440 -0
- package/src/core/class/viewer.js +646 -0
- package/src/core/editor.js +1593 -0
- package/src/core/section/actives.js +107 -0
- package/src/core/section/constructor.js +1237 -0
- package/src/core/section/context.js +97 -0
- package/src/editorInjector/_classes.js +22 -0
- package/src/editorInjector/_core.js +28 -0
- package/src/editorInjector/index.js +13 -0
- package/src/helper/converter.js +313 -0
- package/src/helper/domUtils.js +1177 -0
- package/src/helper/env.js +250 -0
- package/src/helper/index.js +19 -0
- package/src/helper/numbers.js +68 -0
- package/src/helper/unicode.js +43 -0
- package/src/langs/ckb.js +161 -0
- package/src/langs/cs.js +161 -0
- package/src/langs/da.js +161 -0
- package/src/langs/de.js +162 -0
- package/src/langs/en.js +199 -0
- package/src/langs/es.js +162 -0
- package/src/langs/fa.js +159 -0
- package/src/langs/fr.js +161 -0
- package/src/langs/he.js +162 -0
- package/src/{lang → langs}/index.js +0 -2
- package/src/langs/it.js +162 -0
- package/src/langs/ja.js +162 -0
- package/src/langs/ko.js +162 -0
- package/src/langs/lv.js +162 -0
- package/src/langs/nl.js +162 -0
- package/src/langs/pl.js +162 -0
- package/src/langs/pt_br.js +162 -0
- package/src/langs/ro.js +162 -0
- package/src/langs/ru.js +162 -0
- package/src/langs/se.js +162 -0
- package/src/langs/tr.js +159 -0
- package/src/langs/ua.js +162 -0
- package/src/langs/ur.js +162 -0
- package/src/langs/zh_cn.js +162 -0
- package/src/modules/ApiManager.js +168 -0
- package/src/modules/ColorPicker.js +302 -0
- package/src/modules/Controller.js +315 -0
- package/src/modules/Figure.js +1160 -0
- package/src/modules/FileBrowser.js +271 -0
- package/src/modules/FileManager.js +290 -0
- package/src/modules/HueSlider.js +513 -0
- package/src/modules/Modal.js +177 -0
- package/src/modules/ModalAnchorEditor.js +494 -0
- package/src/modules/SelectMenu.js +447 -0
- package/src/modules/_DragHandle.js +16 -0
- package/src/modules/index.js +14 -0
- package/src/plugins/command/blockquote.js +47 -47
- package/src/plugins/command/exportPdf.js +168 -0
- package/src/plugins/command/fileUpload.js +389 -0
- package/src/plugins/command/list_bulleted.js +112 -0
- package/src/plugins/command/list_numbered.js +115 -0
- package/src/plugins/dropdown/align.js +143 -0
- package/src/plugins/dropdown/backgroundColor.js +73 -0
- package/src/plugins/dropdown/font.js +113 -0
- package/src/plugins/dropdown/fontColor.js +73 -0
- package/src/plugins/dropdown/formatBlock.js +141 -0
- package/src/plugins/dropdown/hr.js +111 -0
- package/src/plugins/dropdown/layout.js +72 -0
- package/src/plugins/dropdown/lineHeight.js +114 -0
- package/src/plugins/dropdown/list.js +107 -0
- package/src/plugins/dropdown/paragraphStyle.js +117 -0
- package/src/plugins/dropdown/table.js +2810 -0
- package/src/plugins/dropdown/template.js +71 -0
- package/src/plugins/dropdown/textStyle.js +137 -0
- package/src/plugins/field/mention.js +172 -0
- package/src/plugins/fileBrowser/imageGallery.js +76 -59
- package/src/plugins/index.js +86 -24
- package/src/plugins/input/fontSize.js +357 -0
- package/src/plugins/modal/audio.js +510 -0
- package/src/plugins/modal/image.js +1062 -0
- package/src/plugins/modal/link.js +211 -0
- package/src/plugins/modal/math.js +347 -0
- package/src/plugins/modal/video.js +870 -0
- package/src/suneditor.js +62 -67
- package/src/themes/test.css +61 -0
- package/typings/CommandPlugin.d.ts +8 -0
- package/typings/DialogPlugin.d.ts +20 -0
- package/typings/FileBrowserPlugin.d.ts +30 -0
- package/typings/Lang.d.ts +124 -0
- package/typings/Module.d.ts +15 -0
- package/typings/Plugin.d.ts +42 -0
- package/typings/SubmenuPlugin.d.ts +8 -0
- package/typings/_classes.d.ts +17 -0
- package/typings/_colorPicker.d.ts +60 -0
- package/typings/_core.d.ts +55 -0
- package/typings/align.d.ts +5 -0
- package/{src/plugins/dialog → typings}/audio.d.ts +1 -1
- package/typings/backgroundColor.d.ts +5 -0
- package/{src/plugins/command → typings}/blockquote.d.ts +1 -1
- package/typings/char.d.ts +39 -0
- package/typings/component.d.ts +38 -0
- package/typings/context.d.ts +39 -0
- package/typings/converter.d.ts +33 -0
- package/typings/dialog.d.ts +28 -0
- package/typings/domUtils.d.ts +361 -0
- package/typings/editor.d.ts +7 -0
- package/typings/editor.ts +542 -0
- package/typings/env.d.ts +70 -0
- package/typings/eventManager.d.ts +37 -0
- package/typings/events.d.ts +262 -0
- package/typings/fileBrowser.d.ts +42 -0
- package/typings/fileManager.d.ts +67 -0
- package/typings/font.d.ts +5 -0
- package/typings/fontColor.d.ts +5 -0
- package/typings/fontSize.d.ts +5 -0
- package/typings/format.d.ts +191 -0
- package/typings/formatBlock.d.ts +5 -0
- package/typings/history.d.ts +48 -0
- package/typings/horizontalRule.d.ts +5 -0
- package/{src/plugins/dialog → typings}/image.d.ts +1 -1
- package/{src/plugins/fileBrowser → typings}/imageGallery.d.ts +1 -1
- package/typings/index.d.ts +21 -0
- package/{src/plugins/modules/index.d.ts → typings/index.modules.d.ts} +3 -3
- package/typings/index.plugins.d.ts +58 -0
- package/typings/lineHeight.d.ts +5 -0
- package/{src/plugins/dialog → typings}/link.d.ts +1 -1
- package/typings/list.d.ts +5 -0
- package/{src/plugins/dialog → typings}/math.d.ts +1 -1
- package/typings/mediaContainer.d.ts +25 -0
- package/typings/node.d.ts +57 -0
- package/typings/notice.d.ts +16 -0
- package/typings/numbers.d.ts +29 -0
- package/typings/offset.d.ts +24 -0
- package/typings/options.d.ts +589 -0
- package/typings/paragraphStyle.d.ts +5 -0
- package/typings/resizing.d.ts +141 -0
- package/typings/selection.d.ts +94 -0
- package/typings/shortcuts.d.ts +13 -0
- package/typings/suneditor.d.ts +9 -0
- package/typings/table.d.ts +5 -0
- package/typings/template.d.ts +5 -0
- package/typings/textStyle.d.ts +5 -0
- package/typings/toolbar.d.ts +32 -0
- package/typings/unicode.d.ts +25 -0
- package/{src/plugins/dialog → typings}/video.d.ts +1 -1
- package/dist/css/suneditor.min.css +0 -1
- package/src/assets/css/suneditor-contents.css +0 -562
- package/src/assets/css/suneditor.css +0 -566
- package/src/assets/defaultIcons.js +0 -103
- package/src/lang/Lang.d.ts +0 -144
- package/src/lang/ckb.d.ts +0 -5
- package/src/lang/ckb.js +0 -188
- package/src/lang/cs.d.ts +0 -5
- package/src/lang/cs.js +0 -188
- package/src/lang/da.d.ts +0 -5
- package/src/lang/da.js +0 -191
- package/src/lang/de.d.ts +0 -5
- package/src/lang/de.js +0 -188
- package/src/lang/en.d.ts +0 -5
- package/src/lang/en.js +0 -188
- package/src/lang/es.d.ts +0 -5
- package/src/lang/es.js +0 -188
- package/src/lang/fa.d.ts +0 -5
- package/src/lang/fa.js +0 -188
- package/src/lang/fr.d.ts +0 -5
- package/src/lang/fr.js +0 -188
- package/src/lang/he.d.ts +0 -5
- package/src/lang/he.js +0 -188
- package/src/lang/index.d.ts +0 -23
- package/src/lang/it.d.ts +0 -5
- package/src/lang/it.js +0 -188
- package/src/lang/ja.d.ts +0 -5
- package/src/lang/ja.js +0 -188
- package/src/lang/ko.d.ts +0 -5
- package/src/lang/ko.js +0 -188
- package/src/lang/lv.d.ts +0 -5
- package/src/lang/lv.js +0 -188
- package/src/lang/nl.d.ts +0 -5
- package/src/lang/nl.js +0 -188
- package/src/lang/pl.d.ts +0 -5
- package/src/lang/pl.js +0 -188
- package/src/lang/pt_br.d.ts +0 -5
- package/src/lang/pt_br.js +0 -189
- package/src/lang/ro.d.ts +0 -5
- package/src/lang/ro.js +0 -188
- package/src/lang/ru.d.ts +0 -5
- package/src/lang/ru.js +0 -188
- package/src/lang/se.d.ts +0 -5
- package/src/lang/se.js +0 -191
- package/src/lang/tr.d.ts +0 -5
- package/src/lang/tr.js +0 -191
- package/src/lang/ua.d.ts +0 -5
- package/src/lang/ua.js +0 -188
- package/src/lang/ur.d.ts +0 -5
- package/src/lang/ur.js +0 -188
- package/src/lang/zh_cn.d.ts +0 -5
- package/src/lang/zh_cn.js +0 -187
- package/src/lib/constructor.js +0 -954
- package/src/lib/context.d.ts +0 -42
- package/src/lib/context.js +0 -71
- package/src/lib/core.d.ts +0 -1135
- package/src/lib/core.js +0 -9395
- package/src/lib/history.d.ts +0 -48
- package/src/lib/history.js +0 -219
- package/src/lib/util.d.ts +0 -678
- package/src/lib/util.js +0 -2131
- package/src/options.d.ts +0 -608
- package/src/plugins/CommandPlugin.d.ts +0 -8
- package/src/plugins/DialogPlugin.d.ts +0 -20
- package/src/plugins/FileBrowserPlugin.d.ts +0 -30
- package/src/plugins/Module.d.ts +0 -15
- package/src/plugins/Plugin.d.ts +0 -42
- package/src/plugins/SubmenuPlugin.d.ts +0 -8
- package/src/plugins/dialog/audio.js +0 -559
- package/src/plugins/dialog/image.js +0 -1126
- package/src/plugins/dialog/link.js +0 -223
- package/src/plugins/dialog/math.js +0 -295
- package/src/plugins/dialog/mention.js +0 -242
- package/src/plugins/dialog/video.js +0 -979
- package/src/plugins/index.d.ts +0 -79
- package/src/plugins/modules/_anchor.js +0 -461
- package/src/plugins/modules/_colorPicker.d.ts +0 -60
- package/src/plugins/modules/_colorPicker.js +0 -201
- package/src/plugins/modules/_notice.d.ts +0 -21
- package/src/plugins/modules/_notice.js +0 -72
- package/src/plugins/modules/_selectMenu.js +0 -119
- package/src/plugins/modules/component.d.ts +0 -25
- package/src/plugins/modules/component.js +0 -81
- package/src/plugins/modules/dialog.d.ts +0 -28
- package/src/plugins/modules/dialog.js +0 -175
- package/src/plugins/modules/fileBrowser.d.ts +0 -42
- package/src/plugins/modules/fileBrowser.js +0 -374
- package/src/plugins/modules/fileManager.d.ts +0 -67
- package/src/plugins/modules/fileManager.js +0 -326
- package/src/plugins/modules/index.js +0 -9
- package/src/plugins/modules/resizing.d.ts +0 -154
- package/src/plugins/modules/resizing.js +0 -903
- package/src/plugins/submenu/align.d.ts +0 -5
- package/src/plugins/submenu/align.js +0 -160
- package/src/plugins/submenu/font.d.ts +0 -5
- package/src/plugins/submenu/font.js +0 -123
- package/src/plugins/submenu/fontColor.d.ts +0 -5
- package/src/plugins/submenu/fontColor.js +0 -101
- package/src/plugins/submenu/fontSize.d.ts +0 -5
- package/src/plugins/submenu/fontSize.js +0 -112
- package/src/plugins/submenu/formatBlock.d.ts +0 -5
- package/src/plugins/submenu/formatBlock.js +0 -273
- package/src/plugins/submenu/hiliteColor.d.ts +0 -5
- package/src/plugins/submenu/hiliteColor.js +0 -102
- package/src/plugins/submenu/horizontalRule.d.ts +0 -5
- package/src/plugins/submenu/horizontalRule.js +0 -98
- package/src/plugins/submenu/lineHeight.d.ts +0 -5
- package/src/plugins/submenu/lineHeight.js +0 -104
- package/src/plugins/submenu/list.d.ts +0 -5
- package/src/plugins/submenu/list.js +0 -456
- package/src/plugins/submenu/paragraphStyle.d.ts +0 -5
- package/src/plugins/submenu/paragraphStyle.js +0 -135
- package/src/plugins/submenu/table.d.ts +0 -5
- package/src/plugins/submenu/table.js +0 -1431
- package/src/plugins/submenu/template.d.ts +0 -5
- package/src/plugins/submenu/template.js +0 -72
- package/src/plugins/submenu/textStyle.d.ts +0 -5
- package/src/plugins/submenu/textStyle.js +0 -167
- package/src/suneditor.d.ts +0 -9
- package/src/suneditor_build.js +0 -18
- /package/{src/plugins/dialog → typings}/mention.d.ts +0 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { get as getNumber } from '../../helper/numbers';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @description Elements and variables you should have
|
|
5
|
+
* @param {Element} editorTargets Target textarea
|
|
6
|
+
* @param {Element} top Editor top area
|
|
7
|
+
* @param {Element} wwFrame Editor wysiwyg frame
|
|
8
|
+
* @param {Element} codeWrapper Editor code view wrapper
|
|
9
|
+
* @param {Element} codeFrame Editor code view frame
|
|
10
|
+
* @param {Element|null} statusbar Editor statusbar
|
|
11
|
+
* @param {any} key root key
|
|
12
|
+
* @returns {Map}
|
|
13
|
+
*/
|
|
14
|
+
export const CreateFrameContext = function (editorTarget, top, wwFrame, codeWrapper, codeFrame, statusbar, key) {
|
|
15
|
+
const m = new Map([
|
|
16
|
+
['key', key],
|
|
17
|
+
['options', editorTarget.options],
|
|
18
|
+
['originElement', editorTarget.target],
|
|
19
|
+
['topArea', top],
|
|
20
|
+
['container', top.querySelector('.se-container')],
|
|
21
|
+
['wrapper', top.querySelector('.se-wrapper')],
|
|
22
|
+
['wysiwygFrame', wwFrame],
|
|
23
|
+
['wysiwyg', wwFrame], // options.iframe ? wwFrame.contentDocument.body : wwFrame
|
|
24
|
+
['codeWrapper', codeWrapper],
|
|
25
|
+
['code', codeFrame],
|
|
26
|
+
['codeNumbers', codeWrapper?.querySelector('.se-code-view-line')],
|
|
27
|
+
['lineBreaker_t', top.querySelector('.se-line-breaker-component-t')],
|
|
28
|
+
['lineBreaker_b', top.querySelector('.se-line-breaker-component-b')],
|
|
29
|
+
['_stickyDummy', top.querySelector('.se-toolbar-sticky-dummy')],
|
|
30
|
+
['_toolbarShadow', top.querySelector('.se-toolbar-shadow')],
|
|
31
|
+
['_minHeight', getNumber(wwFrame.style.minHeight || '65', 0)],
|
|
32
|
+
['isCodeView', false],
|
|
33
|
+
['isFullScreen', false],
|
|
34
|
+
['isReadOnly', false],
|
|
35
|
+
['isDisabled', false],
|
|
36
|
+
['isChanged', -1],
|
|
37
|
+
['historyIndex', -1],
|
|
38
|
+
['savedIndex', -1]
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
if (statusbar) UpdateStatusbarContext(statusbar, m);
|
|
42
|
+
|
|
43
|
+
const placeholder = top.querySelector('.se-placeholder');
|
|
44
|
+
if (placeholder) m.set('placeholder', placeholder);
|
|
45
|
+
|
|
46
|
+
return m;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @description Update statusbar context
|
|
51
|
+
* @param {Element} statusbar Statusbar element
|
|
52
|
+
* @param {FrameContext} mapper FrameContext map
|
|
53
|
+
*/
|
|
54
|
+
export const UpdateStatusbarContext = function (statusbar, mapper) {
|
|
55
|
+
statusbar ? mapper.set('statusbar', statusbar) : mapper.delete('statusbar');
|
|
56
|
+
const navigation = statusbar ? statusbar.querySelector('.se-navigation') : null;
|
|
57
|
+
const charWrapper = statusbar ? statusbar.querySelector('.se-char-counter-wrapper') : null;
|
|
58
|
+
const charCounter = statusbar ? statusbar.querySelector('.se-char-counter-wrapper .se-char-counter') : null;
|
|
59
|
+
navigation ? mapper.set('navigation', navigation) : mapper.delete('navigation');
|
|
60
|
+
charWrapper ? mapper.set('charWrapper', charWrapper) : mapper.delete('charWrapper');
|
|
61
|
+
charCounter ? mapper.set('charCounter', charCounter) : mapper.delete('charCounter');
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @description Common elements and variables you should have
|
|
66
|
+
* @param {Element} toolbar Toolbar frame
|
|
67
|
+
* @param {Element|null} toolbarContainer Toolbar container
|
|
68
|
+
* @param {Element} menuTray menu tray
|
|
69
|
+
* @param {Element|null} subbar sub toolbar
|
|
70
|
+
* @returns {Map}
|
|
71
|
+
*/
|
|
72
|
+
export const CreateContext = function (toolbar, toolbarContainer, menuTray, subbar, statusbarContainer) {
|
|
73
|
+
const m = new Map([
|
|
74
|
+
['menuTray', menuTray],
|
|
75
|
+
['toolbar.main', toolbar],
|
|
76
|
+
['toolbar.buttonTray', toolbar.querySelector('.se-btn-tray')],
|
|
77
|
+
['toolbar._arrow', toolbar.querySelector('.se-arrow')]
|
|
78
|
+
]);
|
|
79
|
+
|
|
80
|
+
if (subbar) {
|
|
81
|
+
m.set('toolbar.sub.main', subbar);
|
|
82
|
+
m.set('toolbar.sub.buttonTray', subbar.querySelector('.se-btn-tray'));
|
|
83
|
+
m.set('toolbar.sub._arrow', subbar.querySelector('.se-arrow'));
|
|
84
|
+
m.set('toolbar.sub._wrapper', subbar.parentElement.parentElement);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (toolbarContainer) {
|
|
88
|
+
m.set('toolbar._wrapper', toolbarContainer.querySelector('.sun-editor'));
|
|
89
|
+
m.set('_stickyDummy', toolbarContainer.querySelector('.se-toolbar-sticky-dummy'));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (statusbarContainer) {
|
|
93
|
+
m.set('statusbar._wrapper', statusbarContainer.querySelector('.sun-editor'));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return m;
|
|
97
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Add all inner classes to the editor;
|
|
3
|
+
* @param {any} editor Editor object
|
|
4
|
+
* @private
|
|
5
|
+
*/
|
|
6
|
+
function ClassInjector(editor) {
|
|
7
|
+
this.char = editor.char;
|
|
8
|
+
this.component = editor.component;
|
|
9
|
+
this.format = editor.format;
|
|
10
|
+
this.html = editor.html;
|
|
11
|
+
this.menu = editor.menu;
|
|
12
|
+
this.nodeTransform = editor.nodeTransform;
|
|
13
|
+
this.notice = editor.notice;
|
|
14
|
+
this.offset = editor.offset;
|
|
15
|
+
this.selection = editor.selection;
|
|
16
|
+
this.shortcuts = editor.shortcuts;
|
|
17
|
+
this.toolbar = editor.toolbar;
|
|
18
|
+
this.viewer = editor.viewer;
|
|
19
|
+
if (editor.subToolbar) this.subToolbar = editor.subToolbar;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default ClassInjector;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Add default properties to the editor core;
|
|
3
|
+
* @param {any} editor Editor's core
|
|
4
|
+
* @private
|
|
5
|
+
*/
|
|
6
|
+
function CoreInjector(editor) {
|
|
7
|
+
// editor root
|
|
8
|
+
this.editor = editor;
|
|
9
|
+
// base
|
|
10
|
+
this.eventManager = editor.eventManager;
|
|
11
|
+
this.history = editor.history;
|
|
12
|
+
this.events = editor.events;
|
|
13
|
+
this.triggerEvent = editor.triggerEvent;
|
|
14
|
+
this.carrierWrapper = editor.carrierWrapper;
|
|
15
|
+
// environment variables
|
|
16
|
+
this.plugins = editor.plugins;
|
|
17
|
+
this.status = editor.status;
|
|
18
|
+
this.context = editor.context;
|
|
19
|
+
this.options = editor.options;
|
|
20
|
+
this.icons = editor.icons;
|
|
21
|
+
this.lang = editor.lang;
|
|
22
|
+
// window, document, shadowRoot
|
|
23
|
+
this._w = editor._w;
|
|
24
|
+
this._d = editor._d;
|
|
25
|
+
this._shadowRoot = editor._shadowRoot;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default CoreInjector;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import CoreInjector from './_core';
|
|
2
|
+
import ClassInjector from './_classes';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @description Initializes and adds inner classes and default properties of the editor.
|
|
6
|
+
* @param {any} editor Editor object
|
|
7
|
+
*/
|
|
8
|
+
function EditorInjector(editor) {
|
|
9
|
+
CoreInjector.call(this, editor);
|
|
10
|
+
ClassInjector.call(this, editor);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default EditorInjector;
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { _d, _w } from './env';
|
|
2
|
+
|
|
3
|
+
const FONT_VALUES_MAP = {
|
|
4
|
+
'xx-small': 1,
|
|
5
|
+
'x-small': 2,
|
|
6
|
+
small: 3,
|
|
7
|
+
medium: 4,
|
|
8
|
+
large: 5,
|
|
9
|
+
'x-large': 6,
|
|
10
|
+
'xx-large': 7,
|
|
11
|
+
'xxx-large': 8
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @description Convert HTML string to HTML Entity
|
|
16
|
+
* @param {string} content
|
|
17
|
+
* @returns {string} Content string
|
|
18
|
+
* @private
|
|
19
|
+
*/
|
|
20
|
+
export function htmlToEntity(content) {
|
|
21
|
+
const ec = {
|
|
22
|
+
'&': '&',
|
|
23
|
+
'\u00A0': ' ',
|
|
24
|
+
"'": ''',
|
|
25
|
+
'"': '"',
|
|
26
|
+
'<': '<',
|
|
27
|
+
'>': '>'
|
|
28
|
+
};
|
|
29
|
+
return content.replace(/&|\u00A0|'|"|<|>/g, (m) => {
|
|
30
|
+
return typeof ec[m] === 'string' ? ec[m] : m;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @description Convert HTML Entity to HTML string
|
|
36
|
+
* @param {string} content Content string
|
|
37
|
+
* @returns {string}
|
|
38
|
+
*/
|
|
39
|
+
export function entityToHTML(content) {
|
|
40
|
+
const ec = {
|
|
41
|
+
'&': '&',
|
|
42
|
+
' ': '\u00A0',
|
|
43
|
+
''': "'",
|
|
44
|
+
'"': '"',
|
|
45
|
+
'<': '<',
|
|
46
|
+
'>': '>'
|
|
47
|
+
};
|
|
48
|
+
return content.replace(/&| |'|"|\$lt;|\$gt;/g, (m) => {
|
|
49
|
+
return typeof ec[m] === 'string' ? ec[m] : m;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @description Debounce function
|
|
55
|
+
* @param {Function} func function
|
|
56
|
+
* @param {number} wait delay ms
|
|
57
|
+
* @returns
|
|
58
|
+
*/
|
|
59
|
+
export function debounce(func, wait) {
|
|
60
|
+
let timeout;
|
|
61
|
+
|
|
62
|
+
return function executedFunction(...args) {
|
|
63
|
+
const later = () => {
|
|
64
|
+
_w.clearTimeout(timeout);
|
|
65
|
+
func(...args);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
_w.clearTimeout(timeout);
|
|
69
|
+
timeout = setTimeout(later, wait);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
* @param {"em"|"rem"|"%"|"pt"|"px"} to Size units to be converted
|
|
76
|
+
* @param {string} size siSize to convert with units (ex: "15rem")
|
|
77
|
+
* @returns {string}
|
|
78
|
+
*/
|
|
79
|
+
export function fontSize(to, size) {
|
|
80
|
+
const value = size.match(/(\d+(?:\.\d+)?)(.+)/);
|
|
81
|
+
const sizeNum = value ? value[1] * 1 : FONT_VALUES_MAP[size];
|
|
82
|
+
const from = value ? value[2] : 'rem';
|
|
83
|
+
let pxSize = sizeNum;
|
|
84
|
+
|
|
85
|
+
if (/em/.test(from)) {
|
|
86
|
+
pxSize = Math.round(sizeNum / 0.0625);
|
|
87
|
+
} else if (from === 'pt') {
|
|
88
|
+
pxSize = Math.round(sizeNum * 1.333);
|
|
89
|
+
} else if (from === '%') {
|
|
90
|
+
pxSize = sizeNum / 100;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
switch (to) {
|
|
94
|
+
case 'em':
|
|
95
|
+
case 'rem':
|
|
96
|
+
return (pxSize * 0.0625).toFixed(2) + to;
|
|
97
|
+
case '%':
|
|
98
|
+
return (pxSize * 0.0625).toFixed(2) * 100 + to;
|
|
99
|
+
case 'pt':
|
|
100
|
+
return Math.floor(pxSize / 1.333) + to;
|
|
101
|
+
default:
|
|
102
|
+
// px
|
|
103
|
+
return pxSize + to;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @description Convert the node list to an array. If not, returns an empty array.
|
|
109
|
+
* @param {NodeList|null} nodeList
|
|
110
|
+
* @returns Array
|
|
111
|
+
*/
|
|
112
|
+
export function nodeListToArray(nodeList) {
|
|
113
|
+
if (!nodeList) return [];
|
|
114
|
+
return Array.prototype.slice.call(nodeList);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @description Returns a new object with keys and values swapped.
|
|
119
|
+
* @param {Object} obj object
|
|
120
|
+
* @returns {Object}
|
|
121
|
+
*/
|
|
122
|
+
export function swapKeyValue(obj) {
|
|
123
|
+
const swappedObj = {};
|
|
124
|
+
|
|
125
|
+
for (const key in obj) {
|
|
126
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
127
|
+
swappedObj[obj[key]] = key;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return swappedObj;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @description Create whitelist RegExp object.
|
|
136
|
+
* Return RegExp format: new RegExp("<\\/?\\b(?!" + list + ")\\b[^>^<]*+>", "gi")
|
|
137
|
+
* @param {string} list Tags list ("br|p|div|pre...")
|
|
138
|
+
* @returns {RegExp}
|
|
139
|
+
*/
|
|
140
|
+
export function createElementWhitelist(list) {
|
|
141
|
+
return new RegExp(`<\\/?\\b(?!\\b${(list || '').replace(/\|/g, '\\b|\\b')}\\b)[^>]*>`, 'gi');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @description Create blacklist RegExp object.
|
|
146
|
+
* Return RegExp format: new RegExp("<\\/?\\b(?:" + list + ")\\b[^>^<]*+>", "gi")
|
|
147
|
+
* @param {string} list Tags list ("br|p|div|pre...")
|
|
148
|
+
* @returns {RegExp}
|
|
149
|
+
*/
|
|
150
|
+
export function createElementBlacklist(list) {
|
|
151
|
+
return new RegExp(`<\\/?\\b(?:\\b${(list || '^').replace(/\|/g, '\\b|\\b')}\\b)[^>]*>`, 'gi');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* @description Function to check hex format color
|
|
156
|
+
* @param {string} str Color value
|
|
157
|
+
*/
|
|
158
|
+
export function isHexColor(str) {
|
|
159
|
+
return /^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test(str);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @description Function to convert hex format to a rgb color
|
|
164
|
+
* @param {string} rgb RGB color format
|
|
165
|
+
* @returns {string}
|
|
166
|
+
*/
|
|
167
|
+
export function rgb2hex(rgba) {
|
|
168
|
+
if (isHexColor(rgba) || !rgba) return rgba;
|
|
169
|
+
|
|
170
|
+
const rgbaMatch = rgba.match(/^rgba?[\s+]?\(([\d]+)[\s+]?,[\s+]?([\d]+)[\s+]?,[\s+]?([\d]+)[\s+]?/i);
|
|
171
|
+
|
|
172
|
+
if (rgbaMatch && rgbaMatch.length >= 4) {
|
|
173
|
+
const r = ('0' + parseInt(rgbaMatch[1], 10).toString(16)).slice(-2);
|
|
174
|
+
const g = ('0' + parseInt(rgbaMatch[2], 10).toString(16)).slice(-2);
|
|
175
|
+
const b = ('0' + parseInt(rgbaMatch[3], 10).toString(16)).slice(-2);
|
|
176
|
+
|
|
177
|
+
let a = '';
|
|
178
|
+
if (rgba.includes('rgba')) {
|
|
179
|
+
const alphaMatch = rgba.match(/[\s+]?([\d]+\.?[\d]*)[\s+]?/i);
|
|
180
|
+
if (alphaMatch) {
|
|
181
|
+
a = ('0' + Math.round(parseFloat(alphaMatch[1]) * 255).toString(16)).slice(-2);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return `#${r}${g}${b}${a}`;
|
|
186
|
+
} else {
|
|
187
|
+
return '';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @description Computes the width as a percentage of the parent's width, and returns this value rounded to two decimal places.
|
|
193
|
+
* @param {Element} target
|
|
194
|
+
* @param {Element|null} parentTarget
|
|
195
|
+
* @returns {number}
|
|
196
|
+
*/
|
|
197
|
+
export function getWidthInPercentage(target, parentTarget) {
|
|
198
|
+
const parent = parentTarget || target.parentElement;
|
|
199
|
+
const parentStyle = _w.getComputedStyle(parent);
|
|
200
|
+
const parentPaddingLeft = _w.parseFloat(parentStyle.paddingLeft);
|
|
201
|
+
const parentPaddingRight = _w.parseFloat(parentStyle.paddingRight);
|
|
202
|
+
const scrollbarWidth = parent.offsetWidth - parent.clientWidth;
|
|
203
|
+
const parentWidth = parent.offsetWidth - parentPaddingLeft - parentPaddingRight - scrollbarWidth;
|
|
204
|
+
const widthInPercentage = (target.offsetWidth / parentWidth) * 100;
|
|
205
|
+
return widthInPercentage;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* @description Converts options-related styles and returns them for each frame.
|
|
210
|
+
* @param {Object.<string, any>} fo frameOptions
|
|
211
|
+
* @param {string} cssText Style string
|
|
212
|
+
* @returns {{top: string, frame: string, editor: string}}
|
|
213
|
+
* @private
|
|
214
|
+
*/
|
|
215
|
+
export function _setDefaultOptionStyle(fo, cssText) {
|
|
216
|
+
let optionStyle = '';
|
|
217
|
+
if (fo.get('height')) optionStyle += 'height:' + fo.get('height') + ';';
|
|
218
|
+
if (fo.get('minHeight')) optionStyle += 'min-height:' + fo.get('minHeight') + ';';
|
|
219
|
+
if (fo.get('maxHeight')) optionStyle += 'max-height:' + fo.get('maxHeight') + ';';
|
|
220
|
+
if (fo.get('width')) optionStyle += 'width:' + fo.get('width') + ';';
|
|
221
|
+
if (fo.get('minWidth')) optionStyle += 'min-width:' + fo.get('minWidth') + ';';
|
|
222
|
+
if (fo.get('maxWidth')) optionStyle += 'max-width:' + fo.get('maxWidth') + ';';
|
|
223
|
+
|
|
224
|
+
let top = '',
|
|
225
|
+
frame = '',
|
|
226
|
+
editor = '';
|
|
227
|
+
cssText = optionStyle + cssText;
|
|
228
|
+
const styleArr = cssText.split(';');
|
|
229
|
+
for (let i = 0, len = styleArr.length, s; i < len; i++) {
|
|
230
|
+
s = styleArr[i].trim();
|
|
231
|
+
if (!s) continue;
|
|
232
|
+
if (/^(min-|max-)?width\s*:/.test(s) || /^(z-index|position|display)\s*:/.test(s)) {
|
|
233
|
+
top += s + ';';
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (/^(min-|max-)?height\s*:/.test(s)) {
|
|
237
|
+
if (/^height/.test(s) && s.split(':')[1].trim() === 'auto') {
|
|
238
|
+
fo.set('height', 'auto');
|
|
239
|
+
}
|
|
240
|
+
frame += s + ';';
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
editor += s + ';';
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return {
|
|
247
|
+
top: top,
|
|
248
|
+
frame: frame,
|
|
249
|
+
editor: editor
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* @description Set default style tag of the iframe
|
|
255
|
+
* @param {Object.<string, any>} options Options
|
|
256
|
+
* @returns {string} "<link rel="stylesheet" href=".." />.."
|
|
257
|
+
*/
|
|
258
|
+
export function _setIframeStyleLinks(linkNames) {
|
|
259
|
+
let tagString = '';
|
|
260
|
+
|
|
261
|
+
if (linkNames) {
|
|
262
|
+
for (let f = 0, len = linkNames.length, path; f < len; f++) {
|
|
263
|
+
path = [];
|
|
264
|
+
|
|
265
|
+
if (/(^https?:\/\/)|(^data:text\/css,)/.test(linkNames[f])) {
|
|
266
|
+
path.push(linkNames[f]);
|
|
267
|
+
} else {
|
|
268
|
+
const CSSFileName = new RegExp(`(^|.*[\\/])${linkNames[f]}(\\..+)?.css((\\??.+?)|\\b)$`, 'i');
|
|
269
|
+
for (let c = _d.getElementsByTagName('link'), i = 0, cLen = c.length, styleTag; i < cLen; i++) {
|
|
270
|
+
styleTag = c[i].href.match(CSSFileName);
|
|
271
|
+
if (styleTag) path.push(styleTag[0]);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (!path || path.length === 0)
|
|
276
|
+
throw '[SUNEDITOR.constructor.iframe.fail] The suneditor CSS files installation path could not be automatically detected. Please set the option property "iframe_cssFileName" before creating editor instances.';
|
|
277
|
+
|
|
278
|
+
for (let i = 0, pLen = path.length; i < pLen; i++) {
|
|
279
|
+
tagString += '<link href="' + path[i] + '" rel="stylesheet">';
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return tagString;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* @description When iframe height options is "auto" return "<style>" tag that required.
|
|
289
|
+
* @param {string} frameHeight height
|
|
290
|
+
* @returns {string} "<style>...</style>"
|
|
291
|
+
*/
|
|
292
|
+
export function _setAutoHeightStyle(frameHeight) {
|
|
293
|
+
return frameHeight === 'auto' ? '<style>\n/** Iframe height auto */\nbody{height: min-content; overflow: hidden;}\n</style>' : '';
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const converter = {
|
|
297
|
+
htmlToEntity,
|
|
298
|
+
entityToHTML,
|
|
299
|
+
debounce,
|
|
300
|
+
fontSize,
|
|
301
|
+
nodeListToArray,
|
|
302
|
+
swapKeyValue,
|
|
303
|
+
createElementWhitelist,
|
|
304
|
+
createElementBlacklist,
|
|
305
|
+
isHexColor,
|
|
306
|
+
rgb2hex,
|
|
307
|
+
getWidthInPercentage,
|
|
308
|
+
_setDefaultOptionStyle,
|
|
309
|
+
_setIframeStyleLinks,
|
|
310
|
+
_setAutoHeightStyle
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
export default converter;
|