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.
Files changed (315) hide show
  1. package/CONTRIBUTING.md +170 -22
  2. package/{LICENSE.txt → LICENSE} +9 -9
  3. package/README.md +168 -30
  4. package/dist/suneditor.min.css +1 -1
  5. package/dist/suneditor.min.js +1 -1
  6. package/package.json +47 -21
  7. package/src/assets/design/color.css +121 -0
  8. package/src/assets/design/index.css +3 -0
  9. package/src/assets/design/size.css +35 -0
  10. package/src/assets/design/typography.css +37 -0
  11. package/src/assets/icons/defaultIcons.js +232 -0
  12. package/src/assets/suneditor-contents.css +181 -46
  13. package/src/assets/suneditor.css +1403 -650
  14. package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
  15. package/src/core/base/eventHandlers/handler_ww_clipboard.js +23 -4
  16. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +49 -10
  17. package/src/core/base/eventHandlers/handler_ww_key_input.js +422 -224
  18. package/src/core/base/eventHandlers/handler_ww_mouse.js +83 -36
  19. package/src/core/base/eventManager.js +520 -179
  20. package/src/core/base/history.js +95 -41
  21. package/src/core/class/char.js +26 -11
  22. package/src/core/class/component.js +345 -137
  23. package/src/core/class/format.js +683 -519
  24. package/src/core/class/html.js +485 -305
  25. package/src/core/class/menu.js +133 -47
  26. package/src/core/class/nodeTransform.js +90 -71
  27. package/src/core/class/offset.js +408 -92
  28. package/src/core/class/selection.js +216 -106
  29. package/src/core/class/shortcuts.js +68 -8
  30. package/src/core/class/toolbar.js +106 -116
  31. package/src/core/class/ui.js +422 -0
  32. package/src/core/class/viewer.js +178 -74
  33. package/src/core/editor.js +496 -389
  34. package/src/core/section/actives.js +123 -27
  35. package/src/core/section/constructor.js +615 -206
  36. package/src/core/section/context.js +28 -23
  37. package/src/core/section/documentType.js +561 -0
  38. package/src/editorInjector/_classes.js +19 -5
  39. package/src/editorInjector/_core.js +71 -7
  40. package/src/editorInjector/index.js +63 -1
  41. package/src/events.js +622 -0
  42. package/src/helper/clipboard.js +59 -0
  43. package/src/helper/converter.js +202 -26
  44. package/src/helper/dom/domCheck.js +304 -0
  45. package/src/helper/dom/domQuery.js +669 -0
  46. package/src/helper/dom/domUtils.js +557 -0
  47. package/src/helper/dom/index.js +12 -0
  48. package/src/helper/env.js +46 -56
  49. package/src/helper/index.js +10 -4
  50. package/src/helper/keyCodeMap.js +183 -0
  51. package/src/helper/numbers.js +12 -8
  52. package/src/helper/unicode.js +9 -5
  53. package/src/langs/ckb.js +74 -4
  54. package/src/langs/cs.js +72 -2
  55. package/src/langs/da.js +73 -3
  56. package/src/langs/de.js +73 -4
  57. package/src/langs/en.js +23 -3
  58. package/src/langs/es.js +73 -4
  59. package/src/langs/fa.js +75 -3
  60. package/src/langs/fr.js +73 -3
  61. package/src/langs/he.js +73 -4
  62. package/src/langs/hu.js +230 -0
  63. package/src/langs/index.js +7 -3
  64. package/src/langs/it.js +70 -1
  65. package/src/langs/ja.js +72 -4
  66. package/src/langs/km.js +230 -0
  67. package/src/langs/ko.js +22 -2
  68. package/src/langs/lv.js +74 -5
  69. package/src/langs/nl.js +73 -4
  70. package/src/langs/pl.js +73 -4
  71. package/src/langs/pt_br.js +70 -1
  72. package/src/langs/ro.js +74 -5
  73. package/src/langs/ru.js +73 -4
  74. package/src/langs/se.js +73 -4
  75. package/src/langs/tr.js +73 -1
  76. package/src/langs/{ua.js → uk.js} +75 -6
  77. package/src/langs/ur.js +77 -8
  78. package/src/langs/zh_cn.js +74 -5
  79. package/src/modules/ApiManager.js +77 -54
  80. package/src/modules/Browser.js +667 -0
  81. package/src/modules/ColorPicker.js +162 -102
  82. package/src/modules/Controller.js +273 -142
  83. package/src/modules/Figure.js +925 -484
  84. package/src/modules/FileManager.js +121 -69
  85. package/src/modules/HueSlider.js +113 -61
  86. package/src/modules/Modal.js +291 -122
  87. package/src/modules/ModalAnchorEditor.js +383 -234
  88. package/src/modules/SelectMenu.js +270 -168
  89. package/src/modules/_DragHandle.js +2 -1
  90. package/src/modules/index.js +3 -3
  91. package/src/plugins/browser/audioGallery.js +83 -0
  92. package/src/plugins/browser/fileBrowser.js +103 -0
  93. package/src/plugins/browser/fileGallery.js +83 -0
  94. package/src/plugins/browser/imageGallery.js +81 -0
  95. package/src/plugins/browser/videoGallery.js +103 -0
  96. package/src/plugins/command/blockquote.js +40 -27
  97. package/src/plugins/command/exportPDF.js +134 -0
  98. package/src/plugins/command/fileUpload.js +229 -162
  99. package/src/plugins/command/list_bulleted.js +83 -47
  100. package/src/plugins/command/list_numbered.js +83 -47
  101. package/src/plugins/dropdown/align.js +66 -54
  102. package/src/plugins/dropdown/backgroundColor.js +63 -49
  103. package/src/plugins/dropdown/font.js +71 -47
  104. package/src/plugins/dropdown/fontColor.js +63 -48
  105. package/src/plugins/dropdown/formatBlock.js +70 -33
  106. package/src/plugins/dropdown/hr.js +92 -51
  107. package/src/plugins/dropdown/layout.js +37 -26
  108. package/src/plugins/dropdown/lineHeight.js +54 -38
  109. package/src/plugins/dropdown/list.js +60 -45
  110. package/src/plugins/dropdown/paragraphStyle.js +51 -30
  111. package/src/plugins/dropdown/table.js +2003 -813
  112. package/src/plugins/dropdown/template.js +38 -26
  113. package/src/plugins/dropdown/textStyle.js +43 -31
  114. package/src/plugins/field/mention.js +147 -86
  115. package/src/plugins/index.js +32 -6
  116. package/src/plugins/input/fontSize.js +161 -108
  117. package/src/plugins/input/pageNavigator.js +70 -0
  118. package/src/plugins/modal/audio.js +358 -173
  119. package/src/plugins/modal/drawing.js +531 -0
  120. package/src/plugins/modal/embed.js +886 -0
  121. package/src/plugins/modal/image.js +674 -362
  122. package/src/plugins/modal/link.js +100 -71
  123. package/src/plugins/modal/math.js +367 -167
  124. package/src/plugins/modal/video.js +691 -335
  125. package/src/plugins/popup/anchor.js +222 -0
  126. package/src/suneditor.js +50 -13
  127. package/src/themes/dark.css +122 -0
  128. package/src/typedef.js +130 -0
  129. package/types/assets/icons/defaultIcons.d.ts +153 -0
  130. package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
  131. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
  132. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
  133. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
  134. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
  135. package/types/core/base/eventManager.d.ts +385 -0
  136. package/types/core/base/history.d.ts +81 -0
  137. package/types/core/class/char.d.ts +60 -0
  138. package/types/core/class/component.d.ts +212 -0
  139. package/types/core/class/format.d.ts +616 -0
  140. package/types/core/class/html.d.ts +422 -0
  141. package/types/core/class/menu.d.ts +126 -0
  142. package/types/core/class/nodeTransform.d.ts +93 -0
  143. package/types/core/class/offset.d.ts +522 -0
  144. package/types/core/class/selection.d.ts +188 -0
  145. package/types/core/class/shortcuts.d.ts +142 -0
  146. package/types/core/class/toolbar.d.ts +189 -0
  147. package/types/core/class/ui.d.ts +164 -0
  148. package/types/core/class/viewer.d.ts +140 -0
  149. package/types/core/editor.d.ts +610 -0
  150. package/types/core/section/actives.d.ts +46 -0
  151. package/types/core/section/constructor.d.ts +777 -0
  152. package/types/core/section/context.d.ts +45 -0
  153. package/types/core/section/documentType.d.ts +178 -0
  154. package/types/editorInjector/_classes.d.ts +41 -0
  155. package/types/editorInjector/_core.d.ts +92 -0
  156. package/types/editorInjector/index.d.ts +71 -0
  157. package/types/events.d.ts +273 -0
  158. package/types/helper/clipboard.d.ts +12 -0
  159. package/types/helper/converter.d.ts +197 -0
  160. package/types/helper/dom/domCheck.d.ts +189 -0
  161. package/types/helper/dom/domQuery.d.ts +223 -0
  162. package/types/helper/dom/domUtils.d.ts +226 -0
  163. package/types/helper/dom/index.d.ts +9 -0
  164. package/types/helper/env.d.ts +132 -0
  165. package/types/helper/index.d.ts +174 -0
  166. package/types/helper/keyCodeMap.d.ts +110 -0
  167. package/types/helper/numbers.d.ts +46 -0
  168. package/types/helper/unicode.d.ts +28 -0
  169. package/types/index.d.ts +120 -0
  170. package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +173 -103
  171. package/types/langs/ckb.d.ts +3 -0
  172. package/types/langs/cs.d.ts +3 -0
  173. package/types/langs/da.d.ts +3 -0
  174. package/types/langs/de.d.ts +3 -0
  175. package/types/langs/en.d.ts +3 -0
  176. package/types/langs/es.d.ts +3 -0
  177. package/types/langs/fa.d.ts +3 -0
  178. package/types/langs/fr.d.ts +3 -0
  179. package/types/langs/he.d.ts +3 -0
  180. package/types/langs/hu.d.ts +3 -0
  181. package/types/langs/index.d.ts +54 -0
  182. package/types/langs/it.d.ts +3 -0
  183. package/types/langs/ja.d.ts +3 -0
  184. package/types/langs/km.d.ts +3 -0
  185. package/types/langs/ko.d.ts +3 -0
  186. package/types/langs/lv.d.ts +3 -0
  187. package/types/langs/nl.d.ts +3 -0
  188. package/types/langs/pl.d.ts +3 -0
  189. package/types/langs/pt_br.d.ts +3 -0
  190. package/types/langs/ro.d.ts +3 -0
  191. package/types/langs/ru.d.ts +3 -0
  192. package/types/langs/se.d.ts +3 -0
  193. package/types/langs/tr.d.ts +3 -0
  194. package/types/langs/uk.d.ts +3 -0
  195. package/types/langs/ur.d.ts +3 -0
  196. package/types/langs/zh_cn.d.ts +3 -0
  197. package/types/modules/ApiManager.d.ts +125 -0
  198. package/types/modules/Browser.d.ts +326 -0
  199. package/types/modules/ColorPicker.d.ts +131 -0
  200. package/types/modules/Controller.d.ts +251 -0
  201. package/types/modules/Figure.d.ts +517 -0
  202. package/types/modules/FileManager.d.ts +202 -0
  203. package/types/modules/HueSlider.d.ts +136 -0
  204. package/types/modules/Modal.d.ts +111 -0
  205. package/types/modules/ModalAnchorEditor.d.ts +236 -0
  206. package/types/modules/SelectMenu.d.ts +194 -0
  207. package/types/modules/_DragHandle.d.ts +7 -0
  208. package/types/modules/index.d.ts +26 -0
  209. package/types/plugins/browser/audioGallery.d.ts +55 -0
  210. package/types/plugins/browser/fileBrowser.d.ts +64 -0
  211. package/types/plugins/browser/fileGallery.d.ts +55 -0
  212. package/types/plugins/browser/imageGallery.d.ts +51 -0
  213. package/types/plugins/browser/videoGallery.d.ts +57 -0
  214. package/types/plugins/command/blockquote.d.ts +28 -0
  215. package/types/plugins/command/exportPDF.d.ts +46 -0
  216. package/types/plugins/command/fileUpload.d.ts +156 -0
  217. package/types/plugins/command/list_bulleted.d.ts +46 -0
  218. package/types/plugins/command/list_numbered.d.ts +46 -0
  219. package/types/plugins/dropdown/align.d.ts +60 -0
  220. package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
  221. package/types/plugins/dropdown/font.d.ts +54 -0
  222. package/types/plugins/dropdown/fontColor.d.ts +63 -0
  223. package/types/plugins/dropdown/formatBlock.d.ts +54 -0
  224. package/types/plugins/dropdown/hr.d.ts +71 -0
  225. package/types/plugins/dropdown/layout.d.ts +40 -0
  226. package/types/plugins/dropdown/lineHeight.d.ts +50 -0
  227. package/types/plugins/dropdown/list.d.ts +39 -0
  228. package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
  229. package/types/plugins/dropdown/table.d.ts +627 -0
  230. package/types/plugins/dropdown/template.d.ts +40 -0
  231. package/types/plugins/dropdown/textStyle.d.ts +41 -0
  232. package/types/plugins/field/mention.d.ts +102 -0
  233. package/types/plugins/index.d.ts +107 -0
  234. package/types/plugins/input/fontSize.d.ts +170 -0
  235. package/types/plugins/input/pageNavigator.d.ts +28 -0
  236. package/types/plugins/modal/audio.d.ts +269 -0
  237. package/types/plugins/modal/drawing.d.ts +246 -0
  238. package/types/plugins/modal/embed.d.ts +387 -0
  239. package/types/plugins/modal/image.d.ts +451 -0
  240. package/types/plugins/modal/link.d.ts +128 -0
  241. package/types/plugins/modal/math.d.ts +193 -0
  242. package/types/plugins/modal/video.d.ts +485 -0
  243. package/types/plugins/popup/anchor.d.ts +56 -0
  244. package/types/suneditor.d.ts +51 -0
  245. package/types/typedef.d.ts +233 -0
  246. package/.eslintignore +0 -7
  247. package/.eslintrc.json +0 -64
  248. package/src/assets/icons/_default.js +0 -194
  249. package/src/core/base/events.js +0 -320
  250. package/src/core/class/notice.js +0 -42
  251. package/src/helper/domUtils.js +0 -1177
  252. package/src/modules/FileBrowser.js +0 -271
  253. package/src/plugins/command/exportPdf.js +0 -168
  254. package/src/plugins/fileBrowser/imageGallery.js +0 -81
  255. package/src/themes/test.css +0 -61
  256. package/typings/CommandPlugin.d.ts +0 -8
  257. package/typings/DialogPlugin.d.ts +0 -20
  258. package/typings/FileBrowserPlugin.d.ts +0 -30
  259. package/typings/Module.d.ts +0 -15
  260. package/typings/Plugin.d.ts +0 -42
  261. package/typings/SubmenuPlugin.d.ts +0 -8
  262. package/typings/_classes.d.ts +0 -17
  263. package/typings/_colorPicker.d.ts +0 -60
  264. package/typings/_core.d.ts +0 -55
  265. package/typings/align.d.ts +0 -5
  266. package/typings/audio.d.ts +0 -5
  267. package/typings/backgroundColor.d.ts +0 -5
  268. package/typings/blockquote.d.ts +0 -5
  269. package/typings/char.d.ts +0 -39
  270. package/typings/component.d.ts +0 -38
  271. package/typings/context.d.ts +0 -39
  272. package/typings/converter.d.ts +0 -33
  273. package/typings/dialog.d.ts +0 -28
  274. package/typings/domUtils.d.ts +0 -361
  275. package/typings/editor.d.ts +0 -7
  276. package/typings/editor.ts +0 -542
  277. package/typings/env.d.ts +0 -70
  278. package/typings/eventManager.d.ts +0 -37
  279. package/typings/events.d.ts +0 -262
  280. package/typings/fileBrowser.d.ts +0 -42
  281. package/typings/fileManager.d.ts +0 -67
  282. package/typings/font.d.ts +0 -5
  283. package/typings/fontColor.d.ts +0 -5
  284. package/typings/fontSize.d.ts +0 -5
  285. package/typings/format.d.ts +0 -191
  286. package/typings/formatBlock.d.ts +0 -5
  287. package/typings/history.d.ts +0 -48
  288. package/typings/horizontalRule.d.ts +0 -5
  289. package/typings/image.d.ts +0 -5
  290. package/typings/imageGallery.d.ts +0 -5
  291. package/typings/index.d.ts +0 -21
  292. package/typings/index.modules.d.ts +0 -11
  293. package/typings/index.plugins.d.ts +0 -58
  294. package/typings/lineHeight.d.ts +0 -5
  295. package/typings/link.d.ts +0 -5
  296. package/typings/list.d.ts +0 -5
  297. package/typings/math.d.ts +0 -5
  298. package/typings/mediaContainer.d.ts +0 -25
  299. package/typings/mention.d.ts +0 -5
  300. package/typings/node.d.ts +0 -57
  301. package/typings/notice.d.ts +0 -16
  302. package/typings/numbers.d.ts +0 -29
  303. package/typings/offset.d.ts +0 -24
  304. package/typings/options.d.ts +0 -589
  305. package/typings/paragraphStyle.d.ts +0 -5
  306. package/typings/resizing.d.ts +0 -141
  307. package/typings/selection.d.ts +0 -94
  308. package/typings/shortcuts.d.ts +0 -13
  309. package/typings/suneditor.d.ts +0 -9
  310. package/typings/table.d.ts +0 -5
  311. package/typings/template.d.ts +0 -5
  312. package/typings/textStyle.d.ts +0 -5
  313. package/typings/toolbar.d.ts +0 -32
  314. package/typings/unicode.d.ts +0 -25
  315. 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 { domUtils } from '../../helper';
3
-
4
- const Blockquote = function (editor) {
5
- EditorInjector.call(this, editor);
6
- // plugin basic properties
7
- this.title = this.lang.tag_blockquote;
8
- this.icon = 'blockquote';
9
-
10
- // members
11
- this.quoteTag = domUtils.createElement('BLOCKQUOTE');
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
- * @override core
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
- domUtils.addClass(target, 'active');
36
+ dom.utils.addClass(target, 'active');
24
37
  return true;
25
38
  }
26
39
 
27
- domUtils.removeClass(target, 'active');
40
+ dom.utils.removeClass(target, 'active');
28
41
  return false;
29
- },
42
+ }
30
43
 
31
44
  /**
32
- * @override core
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 = domUtils.getParentElement(this.selection.getNode(), 'blockquote');
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;