suneditor 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (306) hide show
  1. package/.eslintrc.json +4 -3
  2. package/CONTRIBUTING.md +4 -2
  3. package/README.md +19 -11
  4. package/README_V3_TEMP.md +705 -0
  5. package/dist/suneditor.min.css +1 -0
  6. package/dist/suneditor.min.js +1 -0
  7. package/example.md +587 -0
  8. package/package.json +15 -9
  9. package/src/assets/icons/_default.js +166 -131
  10. package/src/assets/{suneditor-content.css → suneditor-contents.css} +182 -45
  11. package/src/assets/suneditor.css +1195 -556
  12. package/src/assets/variables.css +138 -0
  13. package/src/core/base/eventHandlers/handler_toolbar.js +35 -14
  14. package/src/core/base/eventHandlers/handler_ww_clipboard.js +29 -4
  15. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +59 -15
  16. package/src/core/base/eventHandlers/handler_ww_key_input.js +426 -212
  17. package/src/core/base/eventHandlers/handler_ww_mouse.js +108 -32
  18. package/src/core/base/eventManager.js +540 -209
  19. package/src/core/base/events.js +616 -320
  20. package/src/core/base/history.js +93 -39
  21. package/src/core/class/char.js +29 -13
  22. package/src/core/class/component.js +332 -145
  23. package/src/core/class/format.js +671 -509
  24. package/src/core/class/html.js +504 -290
  25. package/src/core/class/menu.js +114 -47
  26. package/src/core/class/nodeTransform.js +111 -66
  27. package/src/core/class/offset.js +409 -105
  28. package/src/core/class/selection.js +220 -108
  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 +330 -0
  32. package/src/core/class/viewer.js +178 -74
  33. package/src/core/editor.js +489 -384
  34. package/src/core/section/actives.js +118 -22
  35. package/src/core/section/constructor.js +504 -170
  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/helper/converter.js +137 -19
  42. package/src/helper/dom/domCheck.js +294 -0
  43. package/src/helper/dom/domQuery.js +609 -0
  44. package/src/helper/dom/domUtils.js +533 -0
  45. package/src/helper/dom/index.js +12 -0
  46. package/src/helper/env.js +42 -19
  47. package/src/helper/index.js +7 -4
  48. package/src/helper/keyCodeMap.js +183 -0
  49. package/src/helper/numbers.js +8 -8
  50. package/src/helper/unicode.js +5 -5
  51. package/src/langs/ckb.js +69 -3
  52. package/src/langs/cs.js +67 -1
  53. package/src/langs/da.js +68 -2
  54. package/src/langs/de.js +68 -3
  55. package/src/langs/en.js +29 -1
  56. package/src/langs/es.js +68 -3
  57. package/src/langs/fa.js +70 -2
  58. package/src/langs/fr.js +68 -2
  59. package/src/langs/he.js +68 -3
  60. package/src/langs/hu.js +226 -0
  61. package/src/langs/index.js +3 -2
  62. package/src/langs/it.js +65 -0
  63. package/src/langs/ja.js +68 -3
  64. package/src/langs/ko.js +66 -1
  65. package/src/langs/lv.js +68 -3
  66. package/src/langs/nl.js +68 -3
  67. package/src/langs/pl.js +68 -3
  68. package/src/langs/pt_br.js +65 -0
  69. package/src/langs/ro.js +69 -4
  70. package/src/langs/ru.js +68 -3
  71. package/src/langs/se.js +68 -3
  72. package/src/langs/tr.js +68 -0
  73. package/src/langs/ua.js +68 -3
  74. package/src/langs/ur.js +71 -6
  75. package/src/langs/zh_cn.js +69 -4
  76. package/src/modules/ApiManager.js +77 -54
  77. package/src/modules/Browser.js +667 -0
  78. package/src/modules/ColorPicker.js +162 -102
  79. package/src/modules/Controller.js +233 -136
  80. package/src/modules/Figure.js +913 -489
  81. package/src/modules/FileManager.js +141 -72
  82. package/src/modules/HueSlider.js +113 -61
  83. package/src/modules/Modal.js +292 -113
  84. package/src/modules/ModalAnchorEditor.js +380 -230
  85. package/src/modules/SelectMenu.js +270 -168
  86. package/src/modules/_DragHandle.js +2 -1
  87. package/src/modules/index.js +3 -3
  88. package/src/plugins/browser/audioGallery.js +83 -0
  89. package/src/plugins/browser/fileBrowser.js +103 -0
  90. package/src/plugins/browser/fileGallery.js +83 -0
  91. package/src/plugins/browser/imageGallery.js +81 -0
  92. package/src/plugins/browser/videoGallery.js +103 -0
  93. package/src/plugins/command/blockquote.js +40 -27
  94. package/src/plugins/command/exportPDF.js +134 -0
  95. package/src/plugins/command/fileUpload.js +226 -158
  96. package/src/plugins/command/list_bulleted.js +93 -47
  97. package/src/plugins/command/list_numbered.js +93 -47
  98. package/src/plugins/dropdown/align.js +66 -54
  99. package/src/plugins/dropdown/backgroundColor.js +76 -45
  100. package/src/plugins/dropdown/font.js +71 -47
  101. package/src/plugins/dropdown/fontColor.js +78 -46
  102. package/src/plugins/dropdown/formatBlock.js +74 -33
  103. package/src/plugins/dropdown/hr.js +102 -51
  104. package/src/plugins/dropdown/layout.js +37 -26
  105. package/src/plugins/dropdown/lineHeight.js +54 -38
  106. package/src/plugins/dropdown/list.js +60 -45
  107. package/src/plugins/dropdown/paragraphStyle.js +51 -30
  108. package/src/plugins/dropdown/table.js +1269 -777
  109. package/src/plugins/dropdown/template.js +38 -26
  110. package/src/plugins/dropdown/textStyle.js +43 -31
  111. package/src/plugins/field/mention.js +144 -82
  112. package/src/plugins/index.js +32 -6
  113. package/src/plugins/input/fontSize.js +161 -108
  114. package/src/plugins/input/pageNavigator.js +70 -0
  115. package/src/plugins/modal/audio.js +341 -169
  116. package/src/plugins/modal/drawing.js +530 -0
  117. package/src/plugins/modal/embed.js +886 -0
  118. package/src/plugins/modal/image.js +673 -358
  119. package/src/plugins/modal/link.js +100 -71
  120. package/src/plugins/modal/math.js +384 -168
  121. package/src/plugins/modal/video.js +693 -336
  122. package/src/plugins/popup/anchor.js +222 -0
  123. package/src/suneditor.js +54 -12
  124. package/src/themes/dark.css +85 -0
  125. package/src/typedef.js +86 -0
  126. package/types/assets/icons/_default.d.ts +152 -0
  127. package/types/core/base/eventHandlers/handler_toolbar.d.ts +41 -0
  128. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +40 -0
  129. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +35 -0
  130. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +45 -0
  131. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +39 -0
  132. package/types/core/base/eventManager.d.ts +377 -0
  133. package/types/core/base/events.d.ts +297 -0
  134. package/types/core/base/history.d.ts +81 -0
  135. package/types/core/class/char.d.ts +60 -0
  136. package/types/core/class/component.d.ts +259 -0
  137. package/types/core/class/format.d.ts +615 -0
  138. package/types/core/class/html.d.ts +377 -0
  139. package/types/core/class/menu.d.ts +118 -0
  140. package/types/core/class/nodeTransform.d.ts +93 -0
  141. package/types/core/class/offset.d.ts +512 -0
  142. package/types/core/class/selection.d.ts +188 -0
  143. package/types/core/class/shortcuts.d.ts +142 -0
  144. package/types/core/class/toolbar.d.ts +189 -0
  145. package/types/core/class/ui.d.ts +144 -0
  146. package/types/core/class/viewer.d.ts +140 -0
  147. package/types/core/editor.d.ts +606 -0
  148. package/types/core/section/actives.d.ts +46 -0
  149. package/types/core/section/constructor.d.ts +748 -0
  150. package/types/core/section/context.d.ts +45 -0
  151. package/types/core/section/documentType.d.ts +178 -0
  152. package/types/editorInjector/_classes.d.ts +41 -0
  153. package/types/editorInjector/_core.d.ts +92 -0
  154. package/types/editorInjector/index.d.ts +71 -0
  155. package/types/helper/converter.d.ts +150 -0
  156. package/types/helper/dom/domCheck.d.ts +182 -0
  157. package/types/helper/dom/domQuery.d.ts +214 -0
  158. package/types/helper/dom/domUtils.d.ts +211 -0
  159. package/types/helper/dom/index.d.ts +9 -0
  160. package/types/helper/env.d.ts +149 -0
  161. package/types/helper/index.d.ts +163 -0
  162. package/types/helper/keyCodeMap.d.ts +110 -0
  163. package/types/helper/numbers.d.ts +43 -0
  164. package/types/helper/unicode.d.ts +28 -0
  165. package/types/index.d.ts +0 -0
  166. package/{typings/Lang.d.ts → types/langs/_Lang.d.ts} +170 -103
  167. package/types/langs/ckb.d.ts +384 -0
  168. package/types/langs/cs.d.ts +384 -0
  169. package/types/langs/da.d.ts +384 -0
  170. package/types/langs/de.d.ts +384 -0
  171. package/types/langs/en.d.ts +384 -0
  172. package/types/langs/es.d.ts +384 -0
  173. package/types/langs/fa.d.ts +384 -0
  174. package/types/langs/fr.d.ts +384 -0
  175. package/types/langs/he.d.ts +384 -0
  176. package/types/langs/hu.d.ts +384 -0
  177. package/types/langs/index.d.ts +48 -0
  178. package/types/langs/it.d.ts +384 -0
  179. package/types/langs/ja.d.ts +384 -0
  180. package/types/langs/ko.d.ts +384 -0
  181. package/types/langs/lv.d.ts +384 -0
  182. package/types/langs/nl.d.ts +384 -0
  183. package/types/langs/pl.d.ts +384 -0
  184. package/types/langs/pt_br.d.ts +384 -0
  185. package/types/langs/ro.d.ts +384 -0
  186. package/types/langs/ru.d.ts +384 -0
  187. package/types/langs/se.d.ts +384 -0
  188. package/types/langs/tr.d.ts +384 -0
  189. package/types/langs/ua.d.ts +384 -0
  190. package/types/langs/ur.d.ts +384 -0
  191. package/types/langs/zh_cn.d.ts +384 -0
  192. package/types/modules/ApiManager.d.ts +125 -0
  193. package/types/modules/Browser.d.ts +326 -0
  194. package/types/modules/ColorPicker.d.ts +131 -0
  195. package/types/modules/Controller.d.ts +231 -0
  196. package/types/modules/Figure.d.ts +504 -0
  197. package/types/modules/FileManager.d.ts +202 -0
  198. package/types/modules/HueSlider.d.ts +136 -0
  199. package/types/modules/Modal.d.ts +117 -0
  200. package/types/modules/ModalAnchorEditor.d.ts +236 -0
  201. package/types/modules/SelectMenu.d.ts +194 -0
  202. package/types/modules/_DragHandle.d.ts +7 -0
  203. package/types/modules/index.d.ts +26 -0
  204. package/types/plugins/browser/audioGallery.d.ts +55 -0
  205. package/types/plugins/browser/fileBrowser.d.ts +64 -0
  206. package/types/plugins/browser/fileGallery.d.ts +55 -0
  207. package/types/plugins/browser/imageGallery.d.ts +51 -0
  208. package/types/plugins/browser/videoGallery.d.ts +57 -0
  209. package/types/plugins/command/blockquote.d.ts +28 -0
  210. package/types/plugins/command/exportPDF.d.ts +46 -0
  211. package/types/plugins/command/fileUpload.d.ts +156 -0
  212. package/types/plugins/command/list_bulleted.d.ts +56 -0
  213. package/types/plugins/command/list_numbered.d.ts +56 -0
  214. package/types/plugins/dropdown/align.d.ts +60 -0
  215. package/types/plugins/dropdown/backgroundColor.d.ts +63 -0
  216. package/types/plugins/dropdown/font.d.ts +54 -0
  217. package/types/plugins/dropdown/fontColor.d.ts +63 -0
  218. package/types/plugins/dropdown/formatBlock.d.ts +58 -0
  219. package/types/plugins/dropdown/hr.d.ts +81 -0
  220. package/types/plugins/dropdown/layout.d.ts +40 -0
  221. package/types/plugins/dropdown/lineHeight.d.ts +50 -0
  222. package/types/plugins/dropdown/list.d.ts +39 -0
  223. package/types/plugins/dropdown/paragraphStyle.d.ts +54 -0
  224. package/types/plugins/dropdown/table.d.ts +579 -0
  225. package/types/plugins/dropdown/template.d.ts +40 -0
  226. package/types/plugins/dropdown/textStyle.d.ts +41 -0
  227. package/types/plugins/field/mention.d.ts +102 -0
  228. package/types/plugins/index.d.ts +107 -0
  229. package/types/plugins/input/fontSize.d.ts +170 -0
  230. package/types/plugins/input/pageNavigator.d.ts +28 -0
  231. package/types/plugins/modal/audio.d.ts +269 -0
  232. package/types/plugins/modal/drawing.d.ts +246 -0
  233. package/types/plugins/modal/embed.d.ts +387 -0
  234. package/types/plugins/modal/image.d.ts +451 -0
  235. package/types/plugins/modal/link.d.ts +128 -0
  236. package/types/plugins/modal/math.d.ts +193 -0
  237. package/types/plugins/modal/video.d.ts +485 -0
  238. package/types/plugins/popup/anchor.d.ts +56 -0
  239. package/types/suneditor.d.ts +51 -0
  240. package/types/typedef-global.d.ts +144 -0
  241. package/src/core/class/notice.js +0 -42
  242. package/src/helper/domUtils.js +0 -1177
  243. package/src/modules/FileBrowser.js +0 -271
  244. package/src/plugins/command/exportPdf.js +0 -168
  245. package/src/plugins/fileBrowser/imageGallery.js +0 -81
  246. package/src/themes/test.css +0 -61
  247. package/typings/CommandPlugin.d.ts +0 -8
  248. package/typings/DialogPlugin.d.ts +0 -20
  249. package/typings/FileBrowserPlugin.d.ts +0 -30
  250. package/typings/Module.d.ts +0 -15
  251. package/typings/Plugin.d.ts +0 -42
  252. package/typings/SubmenuPlugin.d.ts +0 -8
  253. package/typings/_classes.d.ts +0 -17
  254. package/typings/_colorPicker.d.ts +0 -60
  255. package/typings/_core.d.ts +0 -55
  256. package/typings/align.d.ts +0 -5
  257. package/typings/audio.d.ts +0 -5
  258. package/typings/backgroundColor.d.ts +0 -5
  259. package/typings/blockquote.d.ts +0 -5
  260. package/typings/char.d.ts +0 -39
  261. package/typings/component.d.ts +0 -38
  262. package/typings/context.d.ts +0 -39
  263. package/typings/converter.d.ts +0 -33
  264. package/typings/dialog.d.ts +0 -28
  265. package/typings/domUtils.d.ts +0 -361
  266. package/typings/editor.d.ts +0 -7
  267. package/typings/editor.ts +0 -542
  268. package/typings/env.d.ts +0 -70
  269. package/typings/eventManager.d.ts +0 -37
  270. package/typings/events.d.ts +0 -262
  271. package/typings/fileBrowser.d.ts +0 -42
  272. package/typings/fileManager.d.ts +0 -67
  273. package/typings/font.d.ts +0 -5
  274. package/typings/fontColor.d.ts +0 -5
  275. package/typings/fontSize.d.ts +0 -5
  276. package/typings/format.d.ts +0 -191
  277. package/typings/formatBlock.d.ts +0 -5
  278. package/typings/history.d.ts +0 -48
  279. package/typings/horizontalRule.d.ts +0 -5
  280. package/typings/image.d.ts +0 -5
  281. package/typings/imageGallery.d.ts +0 -5
  282. package/typings/index.d.ts +0 -21
  283. package/typings/index.modules.d.ts +0 -11
  284. package/typings/index.plugins.d.ts +0 -58
  285. package/typings/lineHeight.d.ts +0 -5
  286. package/typings/link.d.ts +0 -5
  287. package/typings/list.d.ts +0 -5
  288. package/typings/math.d.ts +0 -5
  289. package/typings/mediaContainer.d.ts +0 -25
  290. package/typings/mention.d.ts +0 -5
  291. package/typings/node.d.ts +0 -57
  292. package/typings/notice.d.ts +0 -16
  293. package/typings/numbers.d.ts +0 -29
  294. package/typings/offset.d.ts +0 -24
  295. package/typings/options.d.ts +0 -589
  296. package/typings/paragraphStyle.d.ts +0 -5
  297. package/typings/resizing.d.ts +0 -141
  298. package/typings/selection.d.ts +0 -94
  299. package/typings/shortcuts.d.ts +0 -13
  300. package/typings/suneditor.d.ts +0 -9
  301. package/typings/table.d.ts +0 -5
  302. package/typings/template.d.ts +0 -5
  303. package/typings/textStyle.d.ts +0 -5
  304. package/typings/toolbar.d.ts +0 -32
  305. package/typings/unicode.d.ts +0 -25
  306. package/typings/video.d.ts +0 -5
package/example.md ADDED
@@ -0,0 +1,587 @@
1
+ # Example usage in the framework
2
+ This is just a simple example and is not a complete answer.
3
+ If there are any examples or errors in other frameworks, please participate and correct them.
4
+ - [React](#react-component)
5
+ - [React class](#react-class)
6
+ - [Vue](#vue-component)
7
+
8
+
9
+ ## React Component
10
+
11
+ ### React class
12
+
13
+ ### 1. Editor.tsx
14
+ ```typescript
15
+ import React, { Component, createRef } from "react";
16
+ import suneditor from "suneditor";
17
+ import { en } from "suneditor/src/lang";
18
+ import plugins from "suneditor/src/plugins";
19
+ import CodeMirror from "codemirror";
20
+ import katex from "katex";
21
+ import "suneditor/dist/css/suneditor.min.css";
22
+ import "codemirror/mode/htmlmixed/htmlmixed";
23
+ import "codemirror/lib/codemirror.css";
24
+ import "katex/dist/katex.min.css";
25
+ import "./Editor.scss"
26
+
27
+
28
+ interface Props {
29
+ contents?: string;
30
+ onBlur?: Function;
31
+ onSave: Function;
32
+ }
33
+
34
+ interface State {
35
+ imageList: any[];
36
+ selectedImages: any[];
37
+ imageSize: string;
38
+ }
39
+
40
+ class Editor extends Component<Props, State> {
41
+ txtArea: any;
42
+ editor: any;
43
+
44
+ constructor(props: any) {
45
+ super(props);
46
+ this.txtArea = createRef();
47
+ this.state = {
48
+ imageList: [],
49
+ selectedImages: [],
50
+ imageSize: "0KB",
51
+ };
52
+ }
53
+
54
+ componentDidMount() {
55
+ const editor: any = this.editor = suneditor.create(this.txtArea.current, {
56
+ plugins: plugins,
57
+ lang: en,
58
+ callBackSave: (contents: string) => this.props.onSave(contents),
59
+ codeMirror: CodeMirror,
60
+ stickyToolbar: 0,
61
+ katex: katex,
62
+ width: '100%',
63
+ height: 'auto',
64
+ minHeight: '400px',
65
+ value: this.props.contents,
66
+ // imageUploadUrl: `url`,
67
+ imageMultipleFile: true,
68
+ previewTemplate: `
69
+ <div style="width:auto; max-width:1136px; min-height:400px; margin:auto;">
70
+ {{contents}}
71
+ </div>
72
+ `,
73
+ buttonList: [
74
+ // default
75
+ ['undo', 'redo'],
76
+ ['font', 'fontSize', 'formatBlock'],
77
+ ['paragraphStyle', 'blockquote'],
78
+ ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'],
79
+ ['fontColor', 'hiliteColor', 'textStyle'],
80
+ ['removeFormat'],
81
+ ['outdent', 'indent'],
82
+ ['align', 'horizontalRule', 'list', 'lineHeight'],
83
+ ['table', 'link', 'image', 'video'],
84
+ ['fullScreen', 'showBlocks', 'codeView'],
85
+ ['preview'],
86
+ ['save'],
87
+ // responsive
88
+ ['%1161', [
89
+ ['undo', 'redo'],
90
+ [':p-Formats-default.more_paragraph', 'font', 'fontSize', 'formatBlock', 'paragraphStyle', 'blockquote'],
91
+ ['bold', 'underline', 'italic', 'strike', 'subscript', 'superscript'],
92
+ ['fontColor', 'hiliteColor', 'textStyle'],
93
+ ['removeFormat'],
94
+ ['outdent', 'indent'],
95
+ ['align', 'horizontalRule', 'list', 'lineHeight'],
96
+ ['-right', 'save'],
97
+ ['-right', ':i-Etc-default.more_vertical', 'fullScreen', 'showBlocks', 'codeView', 'preview'],
98
+ ['-right', ':r-Table&Media-default.more_plus', 'table', 'link', 'image', 'video'],
99
+ ]],
100
+ ['%893', [
101
+ ['undo', 'redo'],
102
+ [':p-Formats-default.more_paragraph', 'font', 'fontSize', 'formatBlock', 'paragraphStyle', 'blockquote'],
103
+ ['bold', 'underline', 'italic', 'strike'],
104
+ [':t-Fonts-default.more_text', 'subscript', 'superscript', 'fontColor', 'hiliteColor', 'textStyle'],
105
+ ['removeFormat'],
106
+ ['outdent', 'indent'],
107
+ ['align', 'horizontalRule', 'list', 'lineHeight'],
108
+ ['-right', 'save'],
109
+ ['-right', ':i-Etc-default.more_vertical', 'fullScreen', 'showBlocks', 'codeView', 'preview'],
110
+ ['-right', ':r-Table&Media-default.more_plus', 'table', 'link', 'image', 'video'],
111
+ ]],
112
+ ['%855', [
113
+ ['undo', 'redo'],
114
+ [':p-Formats-default.more_paragraph', 'font', 'fontSize', 'formatBlock', 'paragraphStyle', 'blockquote'],
115
+ [':t-Fonts-default.more_text', 'bold', 'underline', 'italic', 'strike', 'subscript', 'superscript', 'fontColor', 'hiliteColor', 'textStyle'],
116
+ ['removeFormat'],
117
+ ['outdent', 'indent'],
118
+ ['align', 'horizontalRule', 'list', 'lineHeight'],
119
+ [':r-Table&Media-default.more_plus', 'table', 'link', 'image', 'video'],
120
+ ['-right', 'save'],
121
+ ['-right', ':i-Etc-default.more_vertical', 'fullScreen', 'showBlocks', 'codeView', 'preview'],
122
+ ]],
123
+ ['%563', [
124
+ ['undo', 'redo'],
125
+ [':p-Formats-default.more_paragraph', 'font', 'fontSize', 'formatBlock', 'paragraphStyle', 'blockquote'],
126
+ [':t-Fonts-default.more_text', 'bold', 'underline', 'italic', 'strike', 'subscript', 'superscript', 'fontColor', 'hiliteColor', 'textStyle'],
127
+ ['removeFormat'],
128
+ ['outdent', 'indent'],
129
+ [':e-List&Line-default.more_horizontal', 'align', 'horizontalRule', 'list', 'lineHeight'],
130
+ [':r-Table&Media-default.more_plus', 'table', 'link', 'image', 'video'],
131
+ ['-right', 'save'],
132
+ ['-right', ':i-Etc-default.more_vertical', 'fullScreen', 'showBlocks', 'codeView', 'preview'],
133
+ ]],
134
+ ['%458', [
135
+ ['undo', 'redo'],
136
+ [':p-Formats-default.more_paragraph', 'font', 'fontSize', 'formatBlock', 'paragraphStyle', 'blockquote'],
137
+ [':t-Fonts-default.more_text', 'bold', 'underline', 'italic', 'strike', 'subscript', 'superscript', 'fontColor', 'hiliteColor', 'textStyle', 'removeFormat'],
138
+ [':e-List&Line-default.more_horizontal', 'outdent', 'indent', 'align', 'horizontalRule', 'list', 'lineHeight'],
139
+ [':r-Table&Media-default.more_plus', 'table', 'link', 'image', 'video'],
140
+ ['-right', 'save'],
141
+ ['-right', ':i-Etc-default.more_vertical', 'fullScreen', 'showBlocks', 'codeView', 'preview'],
142
+ ]]
143
+ ]
144
+ });
145
+
146
+ editor.onBlur = () => {
147
+ if (typeof this.props.onBlur === 'function') this.props.onBlur()
148
+ }
149
+
150
+ editor.onImageUpload = this.imageUpload.bind(this);
151
+ // editor.onVideoUpload = videoUpload;
152
+ }
153
+
154
+ componentDidUpdate(prevProps: any) {
155
+ if (this.props.contents !== prevProps.contents) {
156
+ this.editor.setContents(this.props.contents);
157
+ this.editor.core.history.reset(true);
158
+ }
159
+ }
160
+
161
+ componentWillUnmount() {
162
+ if (this.editor) this.editor.destroy();
163
+ }
164
+
165
+ // image, video
166
+ findIndex(arr: any[], index: number) {
167
+ let idx = -1;
168
+
169
+ arr.some(function (a, i) {
170
+ if ((typeof a === 'number' ? a : a.index) === index) {
171
+ idx = i;
172
+ return true;
173
+ }
174
+ return false;
175
+ })
176
+
177
+ return idx;
178
+ }
179
+
180
+ imageUpload(targetElement: Element, index: number, state: string, imageInfo: Record<string, string>, remainingFilesCount: number) {
181
+ if (state === 'delete') {
182
+ this.state.imageList.splice(this.findIndex(this.state.imageList, index), 1)
183
+ this.setState({
184
+ imageList: this.state.imageList
185
+ })
186
+ } else {
187
+ if (state === 'create') {
188
+ const imageList = this.state.imageList;
189
+ imageList.push(imageInfo)
190
+ this.setState({
191
+ imageList: imageList
192
+ })
193
+ } else { // update
194
+ //
195
+ }
196
+ }
197
+
198
+ if (remainingFilesCount === 0) {
199
+ this.setImageList()
200
+ }
201
+ }
202
+
203
+ setImageList() {
204
+ const imageList = this.state.imageList;
205
+ let size = 0;
206
+
207
+ for (let i = 0; i < imageList.length; i++) {
208
+ size += Number((imageList[i].size / 1000).toFixed(1));
209
+ }
210
+
211
+ this.setState({
212
+ imageSize: size.toFixed(1) + 'KB'
213
+ })
214
+ }
215
+
216
+ selectImage(evt: any, type: string, index: number) {
217
+ evt.preventDefault();
218
+ evt.stopPropagation();
219
+ this.state.imageList[this.findIndex(this.state.imageList, index)][type]();
220
+ }
221
+
222
+ checkImage(index: number) {
223
+ const selectedImages = this.state.selectedImages;
224
+ const currentImageIdx = this.findIndex(selectedImages, index)
225
+
226
+ if (currentImageIdx > -1) {
227
+ selectedImages.splice(currentImageIdx, 1)
228
+ } else {
229
+ selectedImages.push(index)
230
+ }
231
+
232
+ this.setState({
233
+ selectedImages: selectedImages
234
+ })
235
+ }
236
+
237
+ deleteCheckedImages() {
238
+ const iamgesInfo = this.editor.getImagesInfo();
239
+
240
+ for (let i = 0; i < iamgesInfo.length; i++) {
241
+ if (this.state.selectedImages.indexOf(iamgesInfo[i].index as number) > -1) {
242
+ iamgesInfo[i].delete();
243
+ i--;
244
+ }
245
+ }
246
+
247
+ this.setState({
248
+ selectedImages: [],
249
+ })
250
+ }
251
+
252
+ fileUploadToEditor(e: any) {
253
+ if (e.target.files) {
254
+ this.editor.insertImage(e.target.files)
255
+ e.target.value = ''
256
+ }
257
+ }
258
+
259
+ render() {
260
+ return <div>
261
+ <textarea ref={this.txtArea} />
262
+ <div className="component-list">
263
+ <div className="file-list-info">
264
+ <span>Attach files</span>
265
+ <span className="xefu-btn">
266
+ <span className="files-text">Images</span>
267
+ </span>
268
+ <input type="file" id="files_upload" accept=".jpg, .jpeg, .png, .ico, .tif, .tiff, .gif, .bmp, .raw" multiple className="files-text files-input" onChange={(e: any) => this.fileUploadToEditor(e)} />
269
+ <span id="image_size" className="total-size text-small-2">{this.state.imageSize}</span>
270
+ <button className="btn btn-md btn-danger" id="image_remove" disabled={this.state.selectedImages.length === 0} onClick={() => this.deleteCheckedImages()}>삭제</button>
271
+ </div>
272
+ <div className="file-list">
273
+ <ul id="image_list">
274
+ {
275
+ this.state.imageList.map((v, i) => {
276
+ return <li key={i} onClick={() => this.checkImage(v.index)} className={this.state.selectedImages.includes(v.index) ? "checked" : ""}>
277
+ <div>
278
+ <div className="image-wrapper"><img src={v.src} /></div>
279
+ </div>
280
+ <a onClick={(evt: any) => this.selectImage(evt, "select", v.index)} className="image-size">{(v.size / 1000).toFixed(1)}KB</a>
281
+ <div className="image-check"><svg aria-hidden="true" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg=""><path fill="currentColor" d="M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"></path></svg></div>
282
+ </li>
283
+ })
284
+ }
285
+ </ul>
286
+ </div>
287
+ </div>
288
+ </div>;
289
+ }
290
+ }
291
+
292
+ export default Editor;
293
+ ```
294
+
295
+ ### 2 PostEdit.tsx
296
+ ```typescript
297
+ import React, { Component, createRef } from "react";
298
+ import Editor from "./Editor";
299
+
300
+ interface Props {}
301
+
302
+ interface State {
303
+ content: string;
304
+ }
305
+
306
+ class PostEdit extends Component<Props, State> {
307
+ editorRef: any = createRef();
308
+
309
+ constructor(props: Props) {
310
+ super(props);
311
+ this.state = {
312
+ content: "Test",
313
+ };
314
+ }
315
+
316
+ save() {
317
+ const contents = this.editorRef.current.editor.getContents();
318
+ console.log("save", contents);
319
+ }
320
+
321
+ render() {
322
+ return (
323
+ <div>
324
+ <Editor ref={this.editorRef} contents={this.state.content} onSave={this.save.bind(this)}></Editor>
325
+
326
+ <button onClick={() => this.save()}>
327
+ <span>Save</span>
328
+ </button>
329
+ </div>
330
+ );
331
+ }
332
+ }
333
+
334
+ export default PostEdit;
335
+
336
+ ```
337
+
338
+ ### 3. Editor file component Scss
339
+ ```scss
340
+ .sun-editor .se-dialog .se-dialog-inner .se-dialog-content {
341
+ margin: 100px auto !important;
342
+ }
343
+ .sun-editor .se-wrapper .se-wrapper-wysiwyg {
344
+ padding-bottom: 200px !important;
345
+ }
346
+
347
+ .sun-editor-editable .se-component.__se__float-left {
348
+ margin: 0 0 10px 0;
349
+ }
350
+ .sun-editor-editable .se-component.__se__float-right {
351
+ margin: 0 0 10px 0;
352
+ }
353
+
354
+ .sun-editor-editable a {
355
+ color: #004cff !important;
356
+ text-decoration: none !important;
357
+ }
358
+
359
+ // image list
360
+ /** image list */
361
+ .component-list {
362
+ display: flex;
363
+ box-sizing: border-box;
364
+ position: relative;
365
+ width: 100%;
366
+ margin: 10px 0 10px 0;
367
+ padding: 4px;
368
+ background: #fff;
369
+ }
370
+
371
+ .xefu-btn {
372
+ display: inline-block;
373
+ *display: inline;
374
+ margin: 0;
375
+ padding: 0 12px !important;
376
+ height: 24px !important;
377
+ overflow: visible;
378
+ border: 1px solid #bbb;
379
+ border-radius: 2px;
380
+ text-decoration: none !important;
381
+ text-align: center;
382
+ vertical-align: top;
383
+ line-height: 24px !important;
384
+ font-family: inherit;
385
+ font-size: 12px;
386
+ color: #333;
387
+ *zoom: 1;
388
+ cursor: pointer;
389
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
390
+ background-color: #f5f5f5;
391
+ *background-color: #e6e6e6;
392
+ background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
393
+ background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
394
+ background-image: -webkit-gradient(top, #ffffff, #e6e6e6);
395
+ background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
396
+ background-image: linear-gradient(top, #ffffff, #e6e6e6);
397
+ background-repeat: repeat-x;
398
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#e6e6e6',GradientType=0);
399
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
400
+ }
401
+
402
+ .component-list .files-text {
403
+ display: inline-block;
404
+ margin: 0 -12px !important;
405
+ padding: 0 12px !important;
406
+ overflow: visible;
407
+ width: auto;
408
+ height: 24px;
409
+ border: 0;
410
+ vertical-align: top;
411
+ text-decoration: none !important;
412
+ line-height: 24px;
413
+ font-family: inherit;
414
+ font-size: 12px;
415
+ color: #333;
416
+ cursor: pointer;
417
+ background: 0 0;
418
+ }
419
+
420
+ .component-list .files-input {
421
+ position: absolute;
422
+ width: 86px;
423
+ left: 26px;
424
+ top: 27px;
425
+ opacity: 0;
426
+ -ms-filter: "alpha(opacity=0)";
427
+ font-size: 8px !important;
428
+ direction: ltr;
429
+ cursor: pointer;
430
+ }
431
+
432
+ .component-list * {
433
+ box-sizing: border-box;
434
+ }
435
+
436
+ .component-list button {
437
+ margin: 0 !important;
438
+ }
439
+
440
+ .component-list .file-list-info {
441
+ float: left;
442
+ white-space: nowrap;
443
+ padding: 10px;
444
+ background: #f5f5f5;
445
+ border: 1px solid #ccc;
446
+ }
447
+
448
+ .component-list .file-list-info span {
449
+ display: block;
450
+ width: 100%;
451
+ margin: 12px 0;
452
+ }
453
+
454
+ .component-list .file-list-info .total-size {
455
+ color: #333;
456
+ }
457
+
458
+ .component-list .file-list {
459
+ padding: 0 0 0 0;
460
+ margin: 0 0 0 10px;
461
+ border: none;
462
+ }
463
+
464
+ .component-list .file-list ul {
465
+ margin: 0;
466
+ padding: 0;
467
+ height: auto;
468
+ width: 100%;
469
+ background-color: #f5f5f5;
470
+ border: 1px solid #ccc;
471
+ }
472
+
473
+ .component-list .file-list ul li {
474
+ position: relative;
475
+ display: inline-block;
476
+ margin: 3px;
477
+ width: auto;
478
+ height: auto;
479
+ border: 3px solid #fff;
480
+ }
481
+
482
+ .component-list .file-list ul li .image-wrapper {
483
+ width: 54px;
484
+ height: auto;
485
+ }
486
+
487
+ .component-list .file-list ul li .file-wrapper {
488
+ cursor: default;
489
+ width: 70px;
490
+ height: 21px;
491
+ font-size: 11px;
492
+ overflow: hidden;
493
+ text-overflow: ellipsis;
494
+ white-space: pre;
495
+ word-break: break-all;
496
+ padding-top: 4px;
497
+ }
498
+ .component-list .file-list ul li .file-wrapper svg {
499
+ vertical-align: sub;
500
+ }
501
+
502
+ .component-list .file-list ul li.checked {
503
+ border: 3px solid #dc3545;
504
+ }
505
+
506
+ .component-list .file-list ul li img {
507
+ width: 100%;
508
+ height: auto;
509
+ }
510
+
511
+ .component-list .file-list ul li .image-size {
512
+ color: #666;
513
+ font-size: 10px;
514
+ }
515
+
516
+ .component-list .file-list ul li .image-check {
517
+ position: absolute;
518
+ height: 12px;
519
+ width: 12px;
520
+ top: 0;
521
+ left: auto;
522
+ right: 0;
523
+ margin: 0;
524
+ padding: 1px 0 1px 2px;
525
+ border: 0;
526
+ border-radius: 0 0 0 5px;
527
+ outline: none;
528
+ background-color: #dc3545;
529
+ }
530
+
531
+ .component-list .file-list ul li.checked .image-check {
532
+ display: block;
533
+ }
534
+
535
+ .component-list .file-list ul li:not(.checked) .image-check {
536
+ display: none;
537
+ }
538
+
539
+ .component-list .file-list ul li .image-check svg {
540
+ display: inline-block;
541
+ font-size: 10px;
542
+ height: 1em;
543
+ width: 1em;
544
+ overflow: visible;
545
+ vertical-align: 0.875em;
546
+ margin: 0;
547
+ padding: 0;
548
+ color: #fff;
549
+ }
550
+
551
+ /** video */
552
+ .component-list .component-file-list {
553
+ width: 100%;
554
+ padding: 0 0 0 0;
555
+ margin: 0 0 0 10px;
556
+ border: none;
557
+ }
558
+ .component-list .component-file-list ul {
559
+ margin: 0;
560
+ padding: 0;
561
+ height: auto;
562
+ width: 100%;
563
+ background-color: #f5f5f5;
564
+ border: 1px solid #ccc;
565
+ }
566
+ .component-list .component-file-list ul li {
567
+ position: relative;
568
+ display: inline-block;
569
+ width: 100%;
570
+ height: 24px;
571
+ margin: 0;
572
+ border: 0;
573
+ overflow: hidden;
574
+ }
575
+ .component-list .component-file-list ul li button {
576
+ width: 30px;
577
+ height: 24px;
578
+ padding: 0;
579
+ }
580
+ .component-list .component-file-list ul li a {
581
+ color: #333;
582
+ }
583
+
584
+ ```
585
+
586
+
587
+ ## Vue Component
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "suneditor",
3
- "version": "3.0.0-alpha.2",
3
+ "version": "3.0.0-alpha.20",
4
4
  "description": "Vanilla javascript based WYSIWYG web editor",
5
5
  "author": "Yi JiHong",
6
6
  "license": "MIT",
7
7
  "main": "src/suneditor.js",
8
+ "types": "types/index.d.ts",
8
9
  "sideEffects": [
9
10
  "./src/assets/css/*.css"
10
11
  ],
12
+ "engines": {
13
+ "node": ">=14.0.0"
14
+ },
11
15
  "scripts": {
12
16
  "dev": "webpack-dev-server --config webpack/dev.js",
13
17
  "start": "npm run dev",
@@ -15,8 +19,9 @@
15
19
  "build:prod": "cross-env NODE_ENV=production webpack --config webpack/builder.js",
16
20
  "lint": "eslint src",
17
21
  "lint:fix-js": "npx eslint \"src/**/*.js\" --fix",
18
- "lint:fix-ts": "npx eslint \"typings/**/*.ts\" --fix",
19
- "lint:fix-all": "npx eslint \"src/**/*.js\" \"typings/**/*.ts\" --fix",
22
+ "lint:fix-ts": "npx eslint \"types/**/*.ts\" --fix",
23
+ "lint:fix-all": "npx eslint \"src/**/*.js\" \"types/**/*.ts\" --fix",
24
+ "ts-build": "npx tsc && npm run lint:fix-ts",
20
25
  "test": "karma start",
21
26
  "update-browserslist": "npx browserslist@latest --update-db"
22
27
  },
@@ -32,13 +37,12 @@
32
37
  "**/.*",
33
38
  "node_modules"
34
39
  ],
35
- "types": "typings/index.d.ts",
36
40
  "devDependencies": {
37
41
  "@babel/core": "^7.22.1",
38
42
  "@codemirror/lang-html": "^6.4.3",
39
43
  "@codemirror/lang-javascript": "^6.1.8",
40
- "@typescript-eslint/eslint-plugin": "^7.1.1",
41
- "@typescript-eslint/parser": "^7.1.1",
44
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
45
+ "@typescript-eslint/parser": "^7.18.0",
42
46
  "@webpack-cli/serve": "^2.0.4",
43
47
  "babel-loader": "^9.1.2",
44
48
  "clean-webpack-plugin": "^4.0.0",
@@ -53,9 +57,8 @@
53
57
  "eslint-plugin-prettier": "^4.2.1",
54
58
  "file-loader": "^6.2.0",
55
59
  "html-webpack-plugin": "^5.5.1",
56
- "html2canvas": "^1.4.1",
57
60
  "jasmine": "^5.0.0",
58
- "jspdf": "^2.5.1",
61
+ "jsdoc": "^4.0.4",
59
62
  "karma": "^6.4.2",
60
63
  "karma-chrome-launcher": "^3.2.0",
61
64
  "karma-firefox-launcher": "^2.1.2",
@@ -64,8 +67,11 @@
64
67
  "karma-safari-launcher": "^1.0.0",
65
68
  "karma-webpack": "^5.0.0",
66
69
  "katex": "^0.16.7",
70
+ "mathjax-full": "^3.2.2",
67
71
  "mini-css-extract-plugin": "^2.7.6",
68
72
  "prettier": "^2.8.8",
73
+ "terser-webpack-plugin": "^5.3.10",
74
+ "typescript": "^5.7.3",
69
75
  "url-loader": "^4.1.1",
70
76
  "webpack": "^5.84.1",
71
77
  "webpack-cli": "^5.1.1",
@@ -92,4 +98,4 @@
92
98
  "javascript",
93
99
  "vanillajs"
94
100
  ]
95
- }
101
+ }