suneditor 3.0.0-alpha.9 → 3.0.0-beta.2
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/CONTRIBUTING.md +170 -22
- package/{LICENSE.txt → LICENSE} +9 -9
- package/README.md +168 -30
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +47 -21
- package/src/assets/design/color.css +121 -0
- package/src/assets/design/index.css +3 -0
- package/src/assets/design/size.css +35 -0
- package/src/assets/design/typography.css +37 -0
- package/src/assets/icons/defaultIcons.js +232 -0
- package/src/assets/suneditor-contents.css +181 -46
- package/src/assets/suneditor.css +1403 -650
- package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
- package/src/core/base/eventHandlers/handler_ww_clipboard.js +23 -4
- package/src/core/base/eventHandlers/handler_ww_dragDrop.js +49 -10
- package/src/core/base/eventHandlers/handler_ww_key_input.js +422 -224
- package/src/core/base/eventHandlers/handler_ww_mouse.js +83 -36
- package/src/core/base/eventManager.js +520 -179
- package/src/core/base/history.js +95 -41
- package/src/core/class/char.js +26 -11
- package/src/core/class/component.js +345 -137
- package/src/core/class/format.js +683 -519
- package/src/core/class/html.js +485 -305
- package/src/core/class/menu.js +133 -47
- package/src/core/class/nodeTransform.js +90 -71
- package/src/core/class/offset.js +408 -92
- package/src/core/class/selection.js +216 -106
- package/src/core/class/shortcuts.js +68 -8
- package/src/core/class/toolbar.js +106 -116
- package/src/core/class/ui.js +422 -0
- package/src/core/class/viewer.js +178 -74
- package/src/core/editor.js +496 -389
- package/src/core/section/actives.js +123 -27
- package/src/core/section/constructor.js +615 -206
- package/src/core/section/context.js +28 -23
- package/src/core/section/documentType.js +561 -0
- package/src/editorInjector/_classes.js +19 -5
- package/src/editorInjector/_core.js +71 -7
- package/src/editorInjector/index.js +63 -1
- package/src/events.js +622 -0
- package/src/helper/clipboard.js +59 -0
- package/src/helper/converter.js +202 -26
- package/src/helper/dom/domCheck.js +304 -0
- package/src/helper/dom/domQuery.js +669 -0
- package/src/helper/dom/domUtils.js +557 -0
- package/src/helper/dom/index.js +12 -0
- package/src/helper/env.js +46 -56
- package/src/helper/index.js +10 -4
- package/src/helper/keyCodeMap.js +183 -0
- package/src/helper/numbers.js +12 -8
- package/src/helper/unicode.js +9 -5
- package/src/langs/ckb.js +74 -4
- package/src/langs/cs.js +72 -2
- package/src/langs/da.js +73 -3
- package/src/langs/de.js +73 -4
- package/src/langs/en.js +23 -3
- package/src/langs/es.js +73 -4
- package/src/langs/fa.js +75 -3
- package/src/langs/fr.js +73 -3
- package/src/langs/he.js +73 -4
- package/src/langs/hu.js +230 -0
- package/src/langs/index.js +7 -3
- package/src/langs/it.js +70 -1
- package/src/langs/ja.js +72 -4
- package/src/langs/km.js +230 -0
- package/src/langs/ko.js +22 -2
- package/src/langs/lv.js +74 -5
- package/src/langs/nl.js +73 -4
- package/src/langs/pl.js +73 -4
- package/src/langs/pt_br.js +70 -1
- package/src/langs/ro.js +74 -5
- package/src/langs/ru.js +73 -4
- package/src/langs/se.js +73 -4
- package/src/langs/tr.js +73 -1
- package/src/langs/{ua.js → uk.js} +75 -6
- package/src/langs/ur.js +77 -8
- package/src/langs/zh_cn.js +74 -5
- package/src/modules/ApiManager.js +77 -54
- package/src/modules/Browser.js +667 -0
- package/src/modules/ColorPicker.js +162 -102
- package/src/modules/Controller.js +273 -142
- package/src/modules/Figure.js +925 -484
- package/src/modules/FileManager.js +121 -69
- package/src/modules/HueSlider.js +113 -61
- package/src/modules/Modal.js +291 -122
- package/src/modules/ModalAnchorEditor.js +383 -234
- package/src/modules/SelectMenu.js +270 -168
- package/src/modules/_DragHandle.js +2 -1
- package/src/modules/index.js +3 -3
- package/src/plugins/browser/audioGallery.js +83 -0
- package/src/plugins/browser/fileBrowser.js +103 -0
- package/src/plugins/browser/fileGallery.js +83 -0
- package/src/plugins/browser/imageGallery.js +81 -0
- package/src/plugins/browser/videoGallery.js +103 -0
- package/src/plugins/command/blockquote.js +40 -27
- package/src/plugins/command/exportPDF.js +134 -0
- package/src/plugins/command/fileUpload.js +229 -162
- package/src/plugins/command/list_bulleted.js +83 -47
- package/src/plugins/command/list_numbered.js +83 -47
- package/src/plugins/dropdown/align.js +66 -54
- package/src/plugins/dropdown/backgroundColor.js +63 -49
- package/src/plugins/dropdown/font.js +71 -47
- package/src/plugins/dropdown/fontColor.js +63 -48
- package/src/plugins/dropdown/formatBlock.js +70 -33
- package/src/plugins/dropdown/hr.js +92 -51
- package/src/plugins/dropdown/layout.js +37 -26
- package/src/plugins/dropdown/lineHeight.js +54 -38
- package/src/plugins/dropdown/list.js +60 -45
- package/src/plugins/dropdown/paragraphStyle.js +51 -30
- package/src/plugins/dropdown/table.js +2003 -813
- package/src/plugins/dropdown/template.js +38 -26
- package/src/plugins/dropdown/textStyle.js +43 -31
- package/src/plugins/field/mention.js +147 -86
- package/src/plugins/index.js +32 -6
- package/src/plugins/input/fontSize.js +161 -108
- package/src/plugins/input/pageNavigator.js +70 -0
- package/src/plugins/modal/audio.js +358 -173
- package/src/plugins/modal/drawing.js +531 -0
- package/src/plugins/modal/embed.js +886 -0
- package/src/plugins/modal/image.js +674 -362
- package/src/plugins/modal/link.js +100 -71
- package/src/plugins/modal/math.js +367 -167
- package/src/plugins/modal/video.js +691 -335
- package/src/plugins/popup/anchor.js +222 -0
- package/src/suneditor.js +50 -13
- package/src/themes/dark.css +122 -0
- package/src/typedef.js +130 -0
- package/types/assets/icons/defaultIcons.d.ts +153 -0
- package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
- package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
- package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
- package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
- package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
- package/types/core/base/eventManager.d.ts +385 -0
- package/types/core/base/history.d.ts +81 -0
- package/types/core/class/char.d.ts +60 -0
- package/types/core/class/component.d.ts +212 -0
- package/types/core/class/format.d.ts +616 -0
- package/types/core/class/html.d.ts +422 -0
- package/types/core/class/menu.d.ts +126 -0
- package/types/core/class/nodeTransform.d.ts +93 -0
- package/types/core/class/offset.d.ts +522 -0
- package/types/core/class/selection.d.ts +188 -0
- package/types/core/class/shortcuts.d.ts +142 -0
- package/types/core/class/toolbar.d.ts +189 -0
- package/types/core/class/ui.d.ts +164 -0
- package/types/core/class/viewer.d.ts +140 -0
- package/types/core/editor.d.ts +610 -0
- package/types/core/section/actives.d.ts +46 -0
- package/types/core/section/constructor.d.ts +777 -0
- package/types/core/section/context.d.ts +45 -0
- package/types/core/section/documentType.d.ts +178 -0
- package/types/editorInjector/_classes.d.ts +41 -0
- package/types/editorInjector/_core.d.ts +92 -0
- package/types/editorInjector/index.d.ts +71 -0
- package/types/events.d.ts +273 -0
- package/types/helper/clipboard.d.ts +12 -0
- package/types/helper/converter.d.ts +197 -0
- package/types/helper/dom/domCheck.d.ts +189 -0
- package/types/helper/dom/domQuery.d.ts +223 -0
- package/types/helper/dom/domUtils.d.ts +226 -0
- package/types/helper/dom/index.d.ts +9 -0
- package/types/helper/env.d.ts +132 -0
- package/types/helper/index.d.ts +174 -0
- package/types/helper/keyCodeMap.d.ts +110 -0
- package/types/helper/numbers.d.ts +46 -0
- package/types/helper/unicode.d.ts +28 -0
- package/types/index.d.ts +120 -0
- package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +173 -103
- package/types/langs/ckb.d.ts +3 -0
- package/types/langs/cs.d.ts +3 -0
- package/types/langs/da.d.ts +3 -0
- package/types/langs/de.d.ts +3 -0
- package/types/langs/en.d.ts +3 -0
- package/types/langs/es.d.ts +3 -0
- package/types/langs/fa.d.ts +3 -0
- package/types/langs/fr.d.ts +3 -0
- package/types/langs/he.d.ts +3 -0
- package/types/langs/hu.d.ts +3 -0
- package/types/langs/index.d.ts +54 -0
- package/types/langs/it.d.ts +3 -0
- package/types/langs/ja.d.ts +3 -0
- package/types/langs/km.d.ts +3 -0
- package/types/langs/ko.d.ts +3 -0
- package/types/langs/lv.d.ts +3 -0
- package/types/langs/nl.d.ts +3 -0
- package/types/langs/pl.d.ts +3 -0
- package/types/langs/pt_br.d.ts +3 -0
- package/types/langs/ro.d.ts +3 -0
- package/types/langs/ru.d.ts +3 -0
- package/types/langs/se.d.ts +3 -0
- package/types/langs/tr.d.ts +3 -0
- package/types/langs/uk.d.ts +3 -0
- package/types/langs/ur.d.ts +3 -0
- package/types/langs/zh_cn.d.ts +3 -0
- package/types/modules/ApiManager.d.ts +125 -0
- package/types/modules/Browser.d.ts +326 -0
- package/types/modules/ColorPicker.d.ts +131 -0
- package/types/modules/Controller.d.ts +251 -0
- package/types/modules/Figure.d.ts +517 -0
- package/types/modules/FileManager.d.ts +202 -0
- package/types/modules/HueSlider.d.ts +136 -0
- package/types/modules/Modal.d.ts +111 -0
- package/types/modules/ModalAnchorEditor.d.ts +236 -0
- package/types/modules/SelectMenu.d.ts +194 -0
- package/types/modules/_DragHandle.d.ts +7 -0
- package/types/modules/index.d.ts +26 -0
- package/types/plugins/browser/audioGallery.d.ts +55 -0
- package/types/plugins/browser/fileBrowser.d.ts +64 -0
- package/types/plugins/browser/fileGallery.d.ts +55 -0
- package/types/plugins/browser/imageGallery.d.ts +51 -0
- package/types/plugins/browser/videoGallery.d.ts +57 -0
- package/types/plugins/command/blockquote.d.ts +28 -0
- package/types/plugins/command/exportPDF.d.ts +46 -0
- package/types/plugins/command/fileUpload.d.ts +156 -0
- package/types/plugins/command/list_bulleted.d.ts +46 -0
- package/types/plugins/command/list_numbered.d.ts +46 -0
- package/types/plugins/dropdown/align.d.ts +60 -0
- package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
- package/types/plugins/dropdown/font.d.ts +54 -0
- package/types/plugins/dropdown/fontColor.d.ts +63 -0
- package/types/plugins/dropdown/formatBlock.d.ts +54 -0
- package/types/plugins/dropdown/hr.d.ts +71 -0
- package/types/plugins/dropdown/layout.d.ts +40 -0
- package/types/plugins/dropdown/lineHeight.d.ts +50 -0
- package/types/plugins/dropdown/list.d.ts +39 -0
- package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
- package/types/plugins/dropdown/table.d.ts +627 -0
- package/types/plugins/dropdown/template.d.ts +40 -0
- package/types/plugins/dropdown/textStyle.d.ts +41 -0
- package/types/plugins/field/mention.d.ts +102 -0
- package/types/plugins/index.d.ts +107 -0
- package/types/plugins/input/fontSize.d.ts +170 -0
- package/types/plugins/input/pageNavigator.d.ts +28 -0
- package/types/plugins/modal/audio.d.ts +269 -0
- package/types/plugins/modal/drawing.d.ts +246 -0
- package/types/plugins/modal/embed.d.ts +387 -0
- package/types/plugins/modal/image.d.ts +451 -0
- package/types/plugins/modal/link.d.ts +128 -0
- package/types/plugins/modal/math.d.ts +193 -0
- package/types/plugins/modal/video.d.ts +485 -0
- package/types/plugins/popup/anchor.d.ts +56 -0
- package/types/suneditor.d.ts +51 -0
- package/types/typedef.d.ts +233 -0
- package/.eslintignore +0 -7
- package/.eslintrc.json +0 -64
- package/src/assets/icons/_default.js +0 -194
- package/src/core/base/events.js +0 -320
- package/src/core/class/notice.js +0 -42
- package/src/helper/domUtils.js +0 -1177
- package/src/modules/FileBrowser.js +0 -271
- package/src/plugins/command/exportPdf.js +0 -168
- package/src/plugins/fileBrowser/imageGallery.js +0 -81
- package/src/themes/test.css +0 -61
- package/typings/CommandPlugin.d.ts +0 -8
- package/typings/DialogPlugin.d.ts +0 -20
- package/typings/FileBrowserPlugin.d.ts +0 -30
- package/typings/Module.d.ts +0 -15
- package/typings/Plugin.d.ts +0 -42
- package/typings/SubmenuPlugin.d.ts +0 -8
- package/typings/_classes.d.ts +0 -17
- package/typings/_colorPicker.d.ts +0 -60
- package/typings/_core.d.ts +0 -55
- package/typings/align.d.ts +0 -5
- package/typings/audio.d.ts +0 -5
- package/typings/backgroundColor.d.ts +0 -5
- package/typings/blockquote.d.ts +0 -5
- package/typings/char.d.ts +0 -39
- package/typings/component.d.ts +0 -38
- package/typings/context.d.ts +0 -39
- package/typings/converter.d.ts +0 -33
- package/typings/dialog.d.ts +0 -28
- package/typings/domUtils.d.ts +0 -361
- package/typings/editor.d.ts +0 -7
- package/typings/editor.ts +0 -542
- package/typings/env.d.ts +0 -70
- package/typings/eventManager.d.ts +0 -37
- package/typings/events.d.ts +0 -262
- package/typings/fileBrowser.d.ts +0 -42
- package/typings/fileManager.d.ts +0 -67
- package/typings/font.d.ts +0 -5
- package/typings/fontColor.d.ts +0 -5
- package/typings/fontSize.d.ts +0 -5
- package/typings/format.d.ts +0 -191
- package/typings/formatBlock.d.ts +0 -5
- package/typings/history.d.ts +0 -48
- package/typings/horizontalRule.d.ts +0 -5
- package/typings/image.d.ts +0 -5
- package/typings/imageGallery.d.ts +0 -5
- package/typings/index.d.ts +0 -21
- package/typings/index.modules.d.ts +0 -11
- package/typings/index.plugins.d.ts +0 -58
- package/typings/lineHeight.d.ts +0 -5
- package/typings/link.d.ts +0 -5
- package/typings/list.d.ts +0 -5
- package/typings/math.d.ts +0 -5
- package/typings/mediaContainer.d.ts +0 -25
- package/typings/mention.d.ts +0 -5
- package/typings/node.d.ts +0 -57
- package/typings/notice.d.ts +0 -16
- package/typings/numbers.d.ts +0 -29
- package/typings/offset.d.ts +0 -24
- package/typings/options.d.ts +0 -589
- package/typings/paragraphStyle.d.ts +0 -5
- package/typings/resizing.d.ts +0 -141
- package/typings/selection.d.ts +0 -94
- package/typings/shortcuts.d.ts +0 -13
- package/typings/suneditor.d.ts +0 -9
- package/typings/table.d.ts +0 -5
- package/typings/template.d.ts +0 -5
- package/typings/textStyle.d.ts +0 -5
- package/typings/toolbar.d.ts +0 -32
- package/typings/unicode.d.ts +0 -25
- package/typings/video.d.ts +0 -5
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { Browser } from '../../modules';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {import('../../modules/Browser').BrowserFile} BrowserFile_audioGallery
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @class
|
|
10
|
+
* @extends EditorInjector
|
|
11
|
+
* @description Audio gallery plugin
|
|
12
|
+
*/
|
|
13
|
+
class AudioGallery extends EditorInjector {
|
|
14
|
+
static key = 'audioGallery';
|
|
15
|
+
static type = 'browser';
|
|
16
|
+
static className = '';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @constructor
|
|
20
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
21
|
+
* @param {Object} pluginOptions
|
|
22
|
+
* @param {Array<*>=} pluginOptions.data - direct data without server calls
|
|
23
|
+
* @param {string} pluginOptions.url - server request url
|
|
24
|
+
* @param {Object<string, string>=} pluginOptions.headers - server request headers
|
|
25
|
+
* @param {string|((item: BrowserFile_audioGallery) => string)} pluginOptions.thumbnail - default thumbnail
|
|
26
|
+
*/
|
|
27
|
+
constructor(editor, pluginOptions) {
|
|
28
|
+
// plugin bisic properties
|
|
29
|
+
super(editor);
|
|
30
|
+
this.title = this.lang.audioGallery;
|
|
31
|
+
this.icon = 'audio_gallery';
|
|
32
|
+
|
|
33
|
+
// members
|
|
34
|
+
this.onSelectfunction = null;
|
|
35
|
+
|
|
36
|
+
// modules
|
|
37
|
+
const thumbnail = typeof pluginOptions.thumbnail === 'string' ? pluginOptions.thumbnail : this.icons.audio_thumbnail;
|
|
38
|
+
this.browser = new Browser(this, {
|
|
39
|
+
title: this.lang.audioGallery,
|
|
40
|
+
data: pluginOptions.data,
|
|
41
|
+
url: pluginOptions.url,
|
|
42
|
+
headers: pluginOptions.headers,
|
|
43
|
+
selectorHandler: this.#SetItem.bind(this),
|
|
44
|
+
columnSize: 4,
|
|
45
|
+
className: 'se-audio-gallery',
|
|
46
|
+
thumbnail: typeof pluginOptions.thumbnail === 'function' ? pluginOptions.thumbnail : () => thumbnail
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @editorMethod Modules.Browser
|
|
52
|
+
* @description Executes the method that is called when a "Browser" module's is opened.
|
|
53
|
+
* @param {?(targe: Node) => *=} onSelectfunction method to be executed after selecting an item in the gallery
|
|
54
|
+
*/
|
|
55
|
+
open(onSelectfunction) {
|
|
56
|
+
this.onSelectfunction = onSelectfunction;
|
|
57
|
+
this.browser.open();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @editorMethod Modules.Browser
|
|
62
|
+
* @description Executes the method that is called when a "Browser" module's is closed.
|
|
63
|
+
*/
|
|
64
|
+
close() {
|
|
65
|
+
this.onSelectfunction = null;
|
|
66
|
+
this.browser.close();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @description Set browser item
|
|
71
|
+
* @param {HTMLElement} target - Target element
|
|
72
|
+
*/
|
|
73
|
+
#SetItem(target) {
|
|
74
|
+
if (this.onSelectfunction) {
|
|
75
|
+
this.onSelectfunction(target);
|
|
76
|
+
} else {
|
|
77
|
+
this.plugins.audio.init();
|
|
78
|
+
this.plugins.audio.submitURL(target.getAttribute('data-command'));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export default AudioGallery;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { Browser } from '../../modules';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {import('../../modules/Browser').BrowserFile} BrowserFile_fileBrowser
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @class
|
|
10
|
+
* @extends EditorInjector
|
|
11
|
+
* @description File browser plugin. Can contain any media type.
|
|
12
|
+
*/
|
|
13
|
+
class FileBrowser extends EditorInjector {
|
|
14
|
+
static key = 'fileBrowser';
|
|
15
|
+
static type = 'browser';
|
|
16
|
+
static className = '';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @constructor
|
|
20
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
21
|
+
* @param {Object} pluginOptions
|
|
22
|
+
* @param {Object<string, *>|Array<*>=} pluginOptions.data - direct data without server calls
|
|
23
|
+
* @param {string} pluginOptions.url - server request url
|
|
24
|
+
* @param {Object<string, string>=} pluginOptions.headers - server request headers
|
|
25
|
+
* @param {string|((item: BrowserFile_fileBrowser) => string)} pluginOptions.thumbnail - default thumbnail
|
|
26
|
+
* @param {Array<string>} pluginOptions.props - additional tag names
|
|
27
|
+
*/
|
|
28
|
+
constructor(editor, pluginOptions) {
|
|
29
|
+
// plugin bisic properties
|
|
30
|
+
super(editor);
|
|
31
|
+
this.title = this.lang.fileBrowser;
|
|
32
|
+
this.icon = 'file_browser';
|
|
33
|
+
|
|
34
|
+
// members
|
|
35
|
+
this.onSelectfunction = null;
|
|
36
|
+
|
|
37
|
+
// modules
|
|
38
|
+
const thumbnail = { video: this.icons.video_thumbnail, audio: this.icons.audio_thumbnail, file: this.icons.file_thumbnail };
|
|
39
|
+
const defaultThumbnail = this.icons.file_thumbnail;
|
|
40
|
+
this.browser = new Browser(this, {
|
|
41
|
+
title: this.lang.fileBrowser,
|
|
42
|
+
data: pluginOptions.data,
|
|
43
|
+
url: pluginOptions.url,
|
|
44
|
+
headers: pluginOptions.headers,
|
|
45
|
+
selectorHandler: this.#SetItem.bind(this),
|
|
46
|
+
columnSize: 4,
|
|
47
|
+
className: 'se-file-browser',
|
|
48
|
+
thumbnail: typeof pluginOptions.thumbnail === 'function' ? pluginOptions.thumbnail : (item) => thumbnail[item.type] || defaultThumbnail,
|
|
49
|
+
props: [...new Set((pluginOptions.props ?? []).concat(['frame']))]
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @editorMethod Modules.Browser
|
|
55
|
+
* @description Executes the method that is called when a "Browser" module's is opened.
|
|
56
|
+
* @param {?(targe: Node) => *=} onSelectfunction method to be executed after selecting an item in the gallery
|
|
57
|
+
*/
|
|
58
|
+
open(onSelectfunction) {
|
|
59
|
+
this.onSelectfunction = onSelectfunction;
|
|
60
|
+
this.browser.open();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @editorMethod Modules.Browser
|
|
65
|
+
* @description Executes the method that is called when a "Browser" module's is closed.
|
|
66
|
+
*/
|
|
67
|
+
close() {
|
|
68
|
+
this.onSelectfunction = null;
|
|
69
|
+
this.browser.close();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @description Set browser item
|
|
74
|
+
* @param {HTMLElement} target - Target element
|
|
75
|
+
*/
|
|
76
|
+
#SetItem(target) {
|
|
77
|
+
if (this.onSelectfunction) {
|
|
78
|
+
this.onSelectfunction(target);
|
|
79
|
+
} else {
|
|
80
|
+
const type = target.getAttribute('data-type');
|
|
81
|
+
switch (type) {
|
|
82
|
+
case 'image': {
|
|
83
|
+
this.plugins.imageGallery.browser.selectorHandler(target);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case 'video': {
|
|
87
|
+
this.plugins.videoGallery.browser.selectorHandler(target);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
case 'audio': {
|
|
91
|
+
this.plugins.audioGallery.browser.selectorHandler(target);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 'file': {
|
|
95
|
+
this.plugins.fileGallery.browser.selectorHandler(target);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export default FileBrowser;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { Browser } from '../../modules';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {import('../../modules/Browser').BrowserFile} BrowserFile_fileGallery
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @class
|
|
10
|
+
* @extends EditorInjector
|
|
11
|
+
* @description File gallery plugin
|
|
12
|
+
*/
|
|
13
|
+
class FileGallery extends EditorInjector {
|
|
14
|
+
static key = 'fileGallery';
|
|
15
|
+
static type = 'browser';
|
|
16
|
+
static className = '';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @constructor
|
|
20
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
21
|
+
* @param {Object} pluginOptions
|
|
22
|
+
* @param {Array<*>=} pluginOptions.data - direct data without server calls
|
|
23
|
+
* @param {string} pluginOptions.url - server request url
|
|
24
|
+
* @param {Object<string, string>=} pluginOptions.headers - server request headers
|
|
25
|
+
* @param {string|((item: BrowserFile_fileGallery) => string)} pluginOptions.thumbnail - default thumbnail
|
|
26
|
+
*/
|
|
27
|
+
constructor(editor, pluginOptions) {
|
|
28
|
+
// plugin bisic properties
|
|
29
|
+
super(editor);
|
|
30
|
+
this.title = this.lang.fileGallery;
|
|
31
|
+
this.icon = 'file_gallery';
|
|
32
|
+
|
|
33
|
+
// members
|
|
34
|
+
this.onSelectfunction = null;
|
|
35
|
+
|
|
36
|
+
// modules
|
|
37
|
+
const thumbnail = typeof pluginOptions.thumbnail === 'string' ? pluginOptions.thumbnail : this.icons.file_thumbnail;
|
|
38
|
+
this.browser = new Browser(this, {
|
|
39
|
+
title: this.lang.fileGallery,
|
|
40
|
+
data: pluginOptions.data,
|
|
41
|
+
url: pluginOptions.url,
|
|
42
|
+
headers: pluginOptions.headers,
|
|
43
|
+
selectorHandler: this.#SetItem.bind(this),
|
|
44
|
+
columnSize: 4,
|
|
45
|
+
className: 'se-file-gallery',
|
|
46
|
+
thumbnail: typeof pluginOptions.thumbnail === 'function' ? pluginOptions.thumbnail : () => thumbnail
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @editorMethod Modules.Browser
|
|
52
|
+
* @description Executes the method that is called when a "Browser" module's is opened.
|
|
53
|
+
* @param {?(targe: Node) => *=} onSelectfunction method to be executed after selecting an item in the gallery
|
|
54
|
+
*/
|
|
55
|
+
open(onSelectfunction) {
|
|
56
|
+
this.onSelectfunction = onSelectfunction;
|
|
57
|
+
this.browser.open();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @editorMethod Modules.Browser
|
|
62
|
+
* @description Executes the method that is called when a "Browser" module's is closed.
|
|
63
|
+
*/
|
|
64
|
+
close() {
|
|
65
|
+
this.onSelectfunction = null;
|
|
66
|
+
this.browser.close();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @description Set browser item
|
|
71
|
+
* @param {HTMLElement} target - Target element
|
|
72
|
+
*/
|
|
73
|
+
#SetItem(target) {
|
|
74
|
+
if (this.onSelectfunction) {
|
|
75
|
+
this.onSelectfunction(target);
|
|
76
|
+
} else {
|
|
77
|
+
const file = { name: target.getAttribute('data-name'), size: 0 };
|
|
78
|
+
this.plugins.fileUpload.create(target.getAttribute('data-command'), file, true);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export default FileGallery;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { Browser } from '../../modules';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
* @extends EditorInjector
|
|
7
|
+
* @description Image gallery plugin
|
|
8
|
+
*/
|
|
9
|
+
class ImageGallery extends EditorInjector {
|
|
10
|
+
static key = 'imageGallery';
|
|
11
|
+
static type = 'browser';
|
|
12
|
+
static className = '';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @constructor
|
|
16
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
17
|
+
* @param {Object} pluginOptions
|
|
18
|
+
* @param {Array<*>=} pluginOptions.data - direct data without server calls
|
|
19
|
+
* @param {string=} pluginOptions.url - server request url
|
|
20
|
+
* @param {Object<string, string>=} pluginOptions.headers - server request headers
|
|
21
|
+
*/
|
|
22
|
+
constructor(editor, pluginOptions) {
|
|
23
|
+
// plugin bisic properties
|
|
24
|
+
super(editor);
|
|
25
|
+
this.title = this.lang.imageGallery;
|
|
26
|
+
this.icon = 'image_gallery';
|
|
27
|
+
|
|
28
|
+
// members
|
|
29
|
+
this.onSelectfunction = null;
|
|
30
|
+
|
|
31
|
+
// modules
|
|
32
|
+
this.browser = new Browser(this, {
|
|
33
|
+
title: this.lang.imageGallery,
|
|
34
|
+
data: pluginOptions.data,
|
|
35
|
+
url: pluginOptions.url,
|
|
36
|
+
headers: pluginOptions.headers,
|
|
37
|
+
selectorHandler: this.#SetItem.bind(this),
|
|
38
|
+
columnSize: 4,
|
|
39
|
+
className: 'se-image-gallery'
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// members
|
|
43
|
+
this.width = this.plugins.image.pluginOptions.defaultWidth === 'auto' ? '' : this.plugins.image.pluginOptions.defaultWidth;
|
|
44
|
+
this.height = this.plugins.image.pluginOptions.defaultHeight === 'auto' ? '' : this.plugins.image.pluginOptions.defaultHeight;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @editorMethod Modules.Browser
|
|
49
|
+
* @description Executes the method that is called when a "Browser" module's is opened.
|
|
50
|
+
* @param {?(targe: Node) => *=} onSelectfunction method to be executed after selecting an item in the gallery
|
|
51
|
+
*/
|
|
52
|
+
open(onSelectfunction) {
|
|
53
|
+
this.onSelectfunction = onSelectfunction;
|
|
54
|
+
this.browser.open();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @editorMethod Modules.Browser
|
|
59
|
+
* @description Executes the method that is called when a "Browser" module's is closed.
|
|
60
|
+
*/
|
|
61
|
+
close() {
|
|
62
|
+
this.onSelectfunction = null;
|
|
63
|
+
this.browser.close();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @description Set browser item
|
|
68
|
+
* @param {HTMLImageElement} target - Target element
|
|
69
|
+
*/
|
|
70
|
+
#SetItem(target) {
|
|
71
|
+
if (this.onSelectfunction) {
|
|
72
|
+
this.onSelectfunction(target);
|
|
73
|
+
} else {
|
|
74
|
+
const file = { name: target.getAttribute('data-name'), size: 0 };
|
|
75
|
+
this.plugins.image.init();
|
|
76
|
+
this.plugins.image.create(target.getAttribute('data-command'), null, this.width, this.height, 'none', file, target.alt);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export default ImageGallery;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { Browser } from '../../modules';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {import('../../modules/Browser').BrowserFile} BrowserFile_videoGallery
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @class
|
|
10
|
+
* @extends EditorInjector
|
|
11
|
+
* @description Video gallery plugin
|
|
12
|
+
*/
|
|
13
|
+
class VideoGallery extends EditorInjector {
|
|
14
|
+
static key = 'videoGallery';
|
|
15
|
+
static type = 'browser';
|
|
16
|
+
static className = '';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @constructor
|
|
20
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
21
|
+
* @param {Object} pluginOptions
|
|
22
|
+
* @param {Array<*>=} pluginOptions.data - direct data without server calls
|
|
23
|
+
* @param {string=} pluginOptions.url - server request url
|
|
24
|
+
* @param {Object<string, string>=} pluginOptions.headers - server request headers
|
|
25
|
+
* @param {string|((item: BrowserFile_videoGallery) => string)} pluginOptions.thumbnail - default thumbnail
|
|
26
|
+
*/
|
|
27
|
+
constructor(editor, pluginOptions) {
|
|
28
|
+
// plugin bisic properties
|
|
29
|
+
super(editor);
|
|
30
|
+
this.title = this.lang.videoGallery;
|
|
31
|
+
this.icon = 'video_gallery';
|
|
32
|
+
|
|
33
|
+
// members
|
|
34
|
+
this.onSelectfunction = null;
|
|
35
|
+
|
|
36
|
+
// modules
|
|
37
|
+
const thumbnail = typeof pluginOptions.thumbnail === 'string' ? pluginOptions.thumbnail : this.icons.video_thumbnail;
|
|
38
|
+
this.browser = new Browser(this, {
|
|
39
|
+
title: this.lang.videoGallery,
|
|
40
|
+
data: pluginOptions.data,
|
|
41
|
+
url: pluginOptions.url,
|
|
42
|
+
headers: pluginOptions.headers,
|
|
43
|
+
selectorHandler: this.#SetItem.bind(this),
|
|
44
|
+
columnSize: 4,
|
|
45
|
+
className: 'se-video-gallery',
|
|
46
|
+
thumbnail: typeof pluginOptions.thumbnail === 'function' ? pluginOptions.thumbnail : () => thumbnail,
|
|
47
|
+
props: ['frame']
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// members
|
|
51
|
+
this.width = this.plugins.video.pluginOptions.defaultWidth === 'auto' ? '' : this.plugins.video.pluginOptions.defaultWidth;
|
|
52
|
+
this.height = this.plugins.video.pluginOptions.defaultHeight === 'auto' ? '' : this.plugins.video.pluginOptions.defaultHeight;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @editorMethod Modules.Browser
|
|
57
|
+
* @description Executes the method that is called when a "Browser" module's is opened.
|
|
58
|
+
* @param {?(targe: Node) => *=} onSelectfunction method to be executed after selecting an item in the gallery
|
|
59
|
+
*/
|
|
60
|
+
open(onSelectfunction) {
|
|
61
|
+
this.onSelectfunction = onSelectfunction;
|
|
62
|
+
this.browser.open();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @editorMethod Modules.Browser
|
|
67
|
+
* @description Executes the method that is called when a "Browser" module's is closed.
|
|
68
|
+
*/
|
|
69
|
+
close() {
|
|
70
|
+
this.onSelectfunction = null;
|
|
71
|
+
this.browser.close();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @description Set browser item
|
|
76
|
+
* @param {HTMLElement} target - Target element
|
|
77
|
+
*/
|
|
78
|
+
#SetItem(target) {
|
|
79
|
+
if (this.onSelectfunction) {
|
|
80
|
+
this.onSelectfunction(target);
|
|
81
|
+
} else {
|
|
82
|
+
let url = target.getAttribute('data-command');
|
|
83
|
+
const processUrl = this.plugins.video.findProcessUrl(url);
|
|
84
|
+
if (processUrl) {
|
|
85
|
+
url = processUrl.url;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const file = { name: target.getAttribute('data-name'), size: 0 };
|
|
89
|
+
this.plugins.video.init();
|
|
90
|
+
this.plugins.video.create(
|
|
91
|
+
this.plugins.video[target.getAttribute('data-frame') === 'iframe' ? 'createIframeTag' : 'createVideoTag']({ poster: target.getAttribute('data-thumbnail') }),
|
|
92
|
+
url,
|
|
93
|
+
null,
|
|
94
|
+
this.width,
|
|
95
|
+
this.height,
|
|
96
|
+
false,
|
|
97
|
+
file
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export default VideoGallery;
|
|
@@ -1,47 +1,60 @@
|
|
|
1
1
|
import EditorInjector from '../../editorInjector';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Blockquote.key = 'blockquote';
|
|
15
|
-
Blockquote.type = 'command';
|
|
16
|
-
Blockquote.className = '';
|
|
17
|
-
Blockquote.prototype = {
|
|
2
|
+
import { dom } from '../../helper';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
* @description Blockquote plugin
|
|
7
|
+
*/
|
|
8
|
+
class Blockquote extends EditorInjector {
|
|
9
|
+
static key = 'blockquote';
|
|
10
|
+
static type = 'command';
|
|
11
|
+
static className = '';
|
|
12
|
+
|
|
18
13
|
/**
|
|
19
|
-
* @
|
|
14
|
+
* @constructor
|
|
15
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
16
|
+
*/
|
|
17
|
+
constructor(editor) {
|
|
18
|
+
super(editor);
|
|
19
|
+
// plugin basic properties
|
|
20
|
+
this.title = this.lang.tag_blockquote;
|
|
21
|
+
this.icon = 'blockquote';
|
|
22
|
+
|
|
23
|
+
// members
|
|
24
|
+
this.quoteTag = dom.utils.createElement('BLOCKQUOTE');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @editorMethod Editor.EventManager
|
|
29
|
+
* @description Executes the method that is called whenever the cursor position changes.
|
|
30
|
+
* @param {?HTMLElement=} element - Node element where the cursor is currently located
|
|
31
|
+
* @param {?HTMLElement=} target - The plugin's toolbar button element
|
|
32
|
+
* @returns {boolean} - Whether the plugin is active
|
|
20
33
|
*/
|
|
21
34
|
active(element, target) {
|
|
22
35
|
if (/blockquote/i.test(element?.nodeName)) {
|
|
23
|
-
|
|
36
|
+
dom.utils.addClass(target, 'active');
|
|
24
37
|
return true;
|
|
25
38
|
}
|
|
26
39
|
|
|
27
|
-
|
|
40
|
+
dom.utils.removeClass(target, 'active');
|
|
28
41
|
return false;
|
|
29
|
-
}
|
|
42
|
+
}
|
|
30
43
|
|
|
31
44
|
/**
|
|
32
|
-
* @
|
|
45
|
+
* @editorMethod Editor.core
|
|
46
|
+
* @description Executes the main execution method of the plugin.
|
|
47
|
+
* - It is executed by clicking a toolbar "command" button or calling an API.
|
|
33
48
|
*/
|
|
34
49
|
action() {
|
|
35
|
-
const currentBlockquote =
|
|
50
|
+
const currentBlockquote = dom.query.getParentElement(this.selection.getNode(), 'blockquote');
|
|
36
51
|
|
|
37
52
|
if (currentBlockquote) {
|
|
38
|
-
this.format.removeBlock(currentBlockquote, null, null, false, false);
|
|
53
|
+
this.format.removeBlock(currentBlockquote, { selectedFormats: null, newBlockElement: null, shouldDelete: false, skipHistory: false });
|
|
39
54
|
} else {
|
|
40
55
|
this.format.applyBlock(this.quoteTag.cloneNode(false));
|
|
41
56
|
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
constructor: Blockquote
|
|
45
|
-
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
46
59
|
|
|
47
60
|
export default Blockquote;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import EditorInjector from '../../editorInjector';
|
|
2
|
+
import { dom, env } from '../../helper';
|
|
3
|
+
import { ApiManager } from '../../modules';
|
|
4
|
+
|
|
5
|
+
const { _w, _d } = env;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @class
|
|
9
|
+
* @description Export PDF plugin
|
|
10
|
+
*/
|
|
11
|
+
class ExportPDF extends EditorInjector {
|
|
12
|
+
static key = 'exportPDF';
|
|
13
|
+
static type = 'command';
|
|
14
|
+
static className = 'se-component-enabled';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @constructor
|
|
18
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
19
|
+
* @param {Object} pluginOptions - plugin options
|
|
20
|
+
* @param {string} pluginOptions.apiUrl - server request url
|
|
21
|
+
* @param {string} pluginOptions.fileName - file name
|
|
22
|
+
*/
|
|
23
|
+
constructor(editor, pluginOptions) {
|
|
24
|
+
super(editor);
|
|
25
|
+
// plugin basic properties
|
|
26
|
+
this.title = this.lang.exportPDF;
|
|
27
|
+
this.icon = 'PDF';
|
|
28
|
+
|
|
29
|
+
// plugin options
|
|
30
|
+
this.apiUrl = pluginOptions.apiUrl;
|
|
31
|
+
this.fileName = pluginOptions.fileName || 'suneditor-pdf';
|
|
32
|
+
|
|
33
|
+
// option check
|
|
34
|
+
if (!this.apiUrl) {
|
|
35
|
+
console.warn('[SUNEDITOR.plugins.exportPDF.error] Requires exportPDF."apiUrl" options.');
|
|
36
|
+
} else {
|
|
37
|
+
this.apiManager = new ApiManager(this, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
url: this.apiUrl,
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json'
|
|
42
|
+
},
|
|
43
|
+
responseType: 'blob'
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @editorMethod Editor.core
|
|
50
|
+
* @description Executes the main execution method of the plugin.
|
|
51
|
+
* - It is executed by clicking a toolbar "command" button or calling an API.
|
|
52
|
+
* @returns {Promise<void>}
|
|
53
|
+
*/
|
|
54
|
+
async action() {
|
|
55
|
+
if (!this.apiUrl) {
|
|
56
|
+
console.warn('[SUNEDITOR.plugins.exportPDF.error] Requires exportPDF."apiUrl" options.');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
this.ui.showLoading();
|
|
61
|
+
let ww = null;
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const standardWW = this.editor.frameContext.get('documentTypePageMirror') || this.editor.frameContext.get('wysiwygFrame');
|
|
65
|
+
const editableDiv = dom.utils.createElement('div', { class: standardWW.className }, standardWW.innerHTML);
|
|
66
|
+
ww = dom.utils.createElement('div', { style: `position: absolute; top: -10000px; left: -10000px; width: 21cm; columns: 21cm; height: auto;` }, editableDiv);
|
|
67
|
+
|
|
68
|
+
const innerPadding = this._w.getComputedStyle(standardWW).padding;
|
|
69
|
+
const inlineWW = dom.utils.applyInlineStylesAll(editableDiv, true, this.options.get('allUsedStyles'));
|
|
70
|
+
inlineWW.style.padding = inlineWW.style.paddingTop = inlineWW.style.paddingBottom = inlineWW.style.paddingLeft = inlineWW.style.paddingRight = '0';
|
|
71
|
+
ww.innerHTML = `
|
|
72
|
+
<style>
|
|
73
|
+
@page {
|
|
74
|
+
size: A4;
|
|
75
|
+
margin: ${innerPadding};
|
|
76
|
+
}
|
|
77
|
+
</style>
|
|
78
|
+
${inlineWW.outerHTML}`;
|
|
79
|
+
|
|
80
|
+
_d.body.appendChild(ww);
|
|
81
|
+
|
|
82
|
+
// before event
|
|
83
|
+
if ((await this.triggerEvent('onExportPDFBefore', { target: ww })) === false) return;
|
|
84
|
+
|
|
85
|
+
// at server
|
|
86
|
+
await this._createByServer(ww);
|
|
87
|
+
return;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error('[SUNEDITOR.plugins.exportPDF.error]', error.message);
|
|
90
|
+
} finally {
|
|
91
|
+
dom.utils.removeItem(ww);
|
|
92
|
+
this.ui.hideLoading();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @private
|
|
98
|
+
* @description Sends the editor content to the server for PDF generation.
|
|
99
|
+
* @param {HTMLElement} ww - A temporary container holding the formatted editor content.
|
|
100
|
+
* @returns {Promise<void>} Resolves when the PDF file is successfully downloaded.
|
|
101
|
+
* @throws {Error} Throws an error if the server response indicates a failure.
|
|
102
|
+
*/
|
|
103
|
+
async _createByServer(ww) {
|
|
104
|
+
const data = {
|
|
105
|
+
fileName: this.fileName,
|
|
106
|
+
htmlContent: ww.innerHTML
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const xhr = await this.apiManager.asyncCall({ data: JSON.stringify(data) });
|
|
110
|
+
|
|
111
|
+
if (xhr.status !== 200) {
|
|
112
|
+
const res = !xhr.responseText ? xhr : JSON.parse(xhr.responseText);
|
|
113
|
+
throw Error(`[SUNEDITOR.plugins.exportPDF.error] ${res.errorMessage}`);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const blob = new Blob([xhr.response], { type: 'application/pdf' });
|
|
117
|
+
const contentDisposition = xhr.getResponseHeader('Content-Disposition');
|
|
118
|
+
const downloadUrl = URL.createObjectURL(blob);
|
|
119
|
+
const filename = (contentDisposition.match(/filename="([^"]+)/) || [])[1] || this.fileName + '.pdf';
|
|
120
|
+
const a = dom.utils.createElement('A', { href: downloadUrl, download: filename, style: 'display: none;' }, null);
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
_d.body.appendChild(a);
|
|
124
|
+
a.click();
|
|
125
|
+
} finally {
|
|
126
|
+
_w.setTimeout(() => {
|
|
127
|
+
dom.utils.removeItem(a);
|
|
128
|
+
URL.revokeObjectURL(downloadUrl);
|
|
129
|
+
}, 100);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export default ExportPDF;
|