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
@@ -1,73 +1,104 @@
1
1
  import EditorInjector from '../../editorInjector';
2
2
  import ColorPicker from '../../modules/ColorPicker';
3
- import { domUtils } from '../../helper';
3
+ import { dom } from '../../helper';
4
4
 
5
- const BackgroundColor = function (editor, pluginOptions) {
6
- EditorInjector.call(this, editor);
7
- // plugin basic properties
8
- this.title = this.lang.backgroundColor;
9
- this.icon = 'background_color';
5
+ /**
6
+ * @class
7
+ * @description Text background color plugin
8
+ */
9
+ class BackgroundColor extends EditorInjector {
10
+ static key = 'backgroundColor';
11
+ static type = 'dropdown-free';
12
+ static className = '';
10
13
 
11
- // create HTML
12
- const menu = CreateHTML();
14
+ /**
15
+ * @constructor
16
+ * @param {__se__EditorCore} editor - The root editor instance
17
+ * @param {Object} pluginOptions
18
+ * @param {Array<string|{value: string, name: string}>} pluginOptions.items - Color list
19
+ * @param {number} pluginOptions.splitNum - Number of colors per line
20
+ * @param {boolean} pluginOptions.disableHEXInput - Disable HEX input
21
+ */
22
+ constructor(editor, pluginOptions) {
23
+ super(editor);
24
+ // plugin basic properties
25
+ this.title = this.lang.backgroundColor;
26
+ this.icon = 'background_color';
27
+
28
+ // create HTML
29
+ const menu = CreateHTML();
30
+
31
+ // members
32
+ this.colorPicker = new ColorPicker(this, 'backgroundColor', {
33
+ colorList: pluginOptions.items,
34
+ splitNum: pluginOptions.splitNum,
35
+ disableHEXInput: pluginOptions.disableHEXInput,
36
+ hueSliderOptions: { controllerOptions: { parents: [menu], isOutsideForm: true } }
37
+ });
38
+
39
+ // itit
40
+ menu.appendChild(this.colorPicker.target);
41
+ this.menu.initDropdownTarget(BackgroundColor, menu);
42
+ }
43
+
44
+ /**
45
+ * @editorMethod Editor.EventManager
46
+ * @description Executes the method that is called whenever the cursor position changes.
47
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
48
+ * @param {?HTMLElement=} target - The plugin's toolbar button element
49
+ * @returns {boolean} - Whether the plugin is active
50
+ */
51
+ active(element, target) {
52
+ const colorHelper = /** @type {SVGPathElement} */ (target.querySelector('path.se-svg-color-helper'));
53
+ if (!colorHelper) return false;
13
54
 
14
- // members
15
- this.colorPicker = new ColorPicker(this, 'backgroundColor', {
16
- colorList: pluginOptions.items,
17
- splitNum: pluginOptions.splitNum,
18
- disableHEXInput: pluginOptions.disableHEXInput,
19
- hueSliderOptions: { controllerOptions: { parents: [menu], isOutsideForm: true } }
20
- });
55
+ if (!element) {
56
+ colorHelper.style.color = '';
57
+ } else if (element.style.backgroundColor.length > 0) {
58
+ colorHelper.style.color = element.style.backgroundColor;
59
+ return true;
60
+ }
21
61
 
22
- // itit
23
- menu.appendChild(this.colorPicker.target);
24
- this.menu.initDropdownTarget(BackgroundColor, menu);
25
- };
62
+ return false;
63
+ }
26
64
 
27
- BackgroundColor.key = 'backgroundColor';
28
- BackgroundColor.type = 'dropdown-free';
29
- BackgroundColor.className = '';
30
- BackgroundColor.prototype = {
31
65
  /**
32
- * @override dropdown
66
+ * @editorMethod Modules.Dropdown
67
+ * @description Executes the method that is called when a plugin's "dropdown" menu is opened.
68
+ * @param {HTMLElement} target Line element at the current cursor position
33
69
  */
34
70
  on(target) {
35
71
  this.colorPicker.init(this.selection.getNode(), target);
36
- },
72
+ }
37
73
 
38
74
  /**
39
- * @Override dropdown
75
+ * @editorMethod Modules.Dropdown
76
+ * @description Executes the method that is called when a plugin's "dropdown" menu is closed.
40
77
  */
41
78
  off() {
42
79
  this.colorPicker.hueSliderClose();
43
- },
80
+ }
44
81
 
45
82
  /**
46
- * @override ColorPicker
83
+ * @editorMethod Modules.ColorPicker
84
+ * @description Executes the method called when a button of "ColorPicker" module is clicked.
85
+ * - This plugin is by applying the "ColorPicker" module globally to the "dropdown" menu, the default "action" method is not called.
86
+ * @param {string} color - Color code (hex)
47
87
  */
48
- colorPickerAction(value) {
49
- this.action(value);
50
- },
51
-
52
- /**
53
- * @override core
54
- */
55
- action(value) {
56
- if (value) {
57
- const newNode = domUtils.createElement('SPAN', { style: 'background-color: ' + value + ';' });
58
- this.format.applyTextStyle(newNode, ['background-color'], null, null);
88
+ colorPickerAction(color) {
89
+ if (color) {
90
+ const newNode = dom.utils.createElement('SPAN', { style: 'background-color: ' + color + ';' });
91
+ this.format.applyInlineElement(newNode, { stylesToModify: ['background-color'], nodesToRemove: null, strictRemove: null });
59
92
  } else {
60
- this.format.applyTextStyle(null, ['background-color'], ['span'], true);
93
+ this.format.applyInlineElement(null, { stylesToModify: ['background-color'], nodesToRemove: ['span'], strictRemove: true });
61
94
  }
62
95
 
63
96
  this.menu.dropdownOff();
64
- },
65
-
66
- constructor: BackgroundColor
67
- };
97
+ }
98
+ }
68
99
 
69
100
  function CreateHTML() {
70
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
101
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
71
102
  }
72
103
 
73
104
  export default BackgroundColor;
@@ -1,31 +1,48 @@
1
1
  import EditorInjector from '../../editorInjector';
2
- import { domUtils } from '../../helper';
3
-
4
- const Font = function (editor, pluginOptions) {
5
- EditorInjector.call(this, editor);
6
- // plugin basic properties
7
- this.title = this.lang.font;
8
- this.inner = '<span class="se-txt">' + this.lang.font + '</span>' + this.icons.arrow_down;
9
-
10
- // create HTML
11
- const fontList = pluginOptions.items || ['Arial', 'Comic Sans MS', 'Courier New', 'Impact', 'Georgia', 'tahoma', 'Trebuchet MS', 'Verdana'];
12
- const menu = CreateHTML(editor, fontList);
13
-
14
- // members
15
- this.currentFont = '';
16
- this.fontList = menu.querySelectorAll('ul li button');
17
- this.fontArray = fontList;
18
-
19
- // init
20
- this.menu.initDropdownTarget(Font, menu);
21
- };
22
-
23
- Font.key = 'font';
24
- Font.type = 'dropdown';
25
- Font.className = 'se-btn-select se-btn-tool-font';
26
- Font.prototype = {
2
+ import { dom } from '../../helper';
3
+
4
+ /**
5
+ * @class
6
+ * @description Text font plugin
7
+ */
8
+ class Font extends EditorInjector {
9
+ static key = 'font';
10
+ static type = 'dropdown';
11
+ static className = 'se-btn-select se-btn-tool-font';
12
+
27
13
  /**
28
- * @override core
14
+ * @constructor
15
+ * @param {__se__EditorCore} editor - The root editor instance
16
+ * @param {Object} pluginOptions
17
+ * @param {Array<string>} pluginOptions.items - Font list
18
+ * @param {number} pluginOptions.splitNum - Number of colors per line
19
+ * @param {boolean} pluginOptions.disableHEXInput - Disable HEX input
20
+ */
21
+ constructor(editor, pluginOptions) {
22
+ super(editor);
23
+ // plugin basic properties
24
+ this.title = this.lang.font;
25
+ this.inner = '<span class="se-txt">' + this.lang.font + '</span>' + this.icons.arrow_down;
26
+
27
+ // create HTML
28
+ const fontList = pluginOptions.items || ['Arial', 'Comic Sans MS', 'Courier New', 'Impact', 'Georgia', 'tahoma', 'Trebuchet MS', 'Verdana'];
29
+ const menu = CreateHTML(editor, fontList);
30
+
31
+ // members
32
+ this.currentFont = '';
33
+ this.fontList = menu.querySelectorAll('ul li button');
34
+ this.fontArray = fontList;
35
+
36
+ // init
37
+ this.menu.initDropdownTarget(Font, menu);
38
+ }
39
+
40
+ /**
41
+ * @editorMethod Editor.EventManager
42
+ * @description Executes the method that is called whenever the cursor position changes.
43
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
44
+ * @param {?HTMLElement=} target - The plugin's toolbar button element
45
+ * @returns {boolean} - Whether the plugin is active
29
46
  */
30
47
  active(element, target) {
31
48
  const targetText = target.querySelector('.se-txt');
@@ -33,20 +50,22 @@ Font.prototype = {
33
50
 
34
51
  if (!element) {
35
52
  const font = this.status.hasFocus ? this.editor.frameContext.get('wwComputedStyle').fontFamily : this.lang.font;
36
- domUtils.changeTxt(targetText, font);
37
- domUtils.changeTxt(tooltip, this.status.hasFocus ? this.lang.font + (font ? ' (' + font + ')' : '') : font);
53
+ dom.utils.changeTxt(targetText, font);
54
+ dom.utils.changeTxt(tooltip, this.status.hasFocus ? this.lang.font + (font ? ' (' + font + ')' : '') : font);
38
55
  } else if (element?.style.fontFamily.length > 0) {
39
56
  const selectFont = element.style.fontFamily.replace(/["']/g, '');
40
- domUtils.changeTxt(targetText, selectFont);
41
- domUtils.changeTxt(tooltip, this.lang.font + ' (' + selectFont + ')');
57
+ dom.utils.changeTxt(targetText, selectFont);
58
+ dom.utils.changeTxt(tooltip, this.lang.font + ' (' + selectFont + ')');
42
59
  return true;
43
60
  }
44
61
 
45
62
  return false;
46
- },
63
+ }
47
64
 
48
65
  /**
49
- * @override dropdown
66
+ * @editorMethod Modules.Dropdown
67
+ * @description Executes the method that is called when a plugin's dropdown menu is opened.
68
+ * @param {HTMLElement} target Line element at the current cursor position
50
69
  */
51
70
  on(target) {
52
71
  const fontList = this.fontList;
@@ -55,44 +74,49 @@ Font.prototype = {
55
74
  if (currentFont !== this.currentFont) {
56
75
  for (let i = 0, len = fontList.length; i < len; i++) {
57
76
  if (currentFont === (fontList[i].getAttribute('data-command') || '').replace(/'|"/g, '')) {
58
- domUtils.addClass(fontList[i], 'active');
77
+ dom.utils.addClass(fontList[i], 'active');
59
78
  } else {
60
- domUtils.removeClass(fontList[i], 'active');
79
+ dom.utils.removeClass(fontList[i], 'active');
61
80
  }
62
81
  }
63
82
 
64
83
  this.currentFont = currentFont;
65
84
  }
66
- },
85
+ }
67
86
 
68
87
  /**
69
- * @override core
70
- * @param {Element} target Target command button
88
+ * @editorMethod Editor.core
89
+ * @description Executes the main execution method of the plugin.
90
+ * - Called when an item in the "dropdown" menu is clicked.
91
+ * @param {HTMLElement} target - The plugin's toolbar button element
92
+ * @returns {Promise<void>}
71
93
  */
72
- action(target) {
94
+ async action(target) {
73
95
  let value = target.getAttribute('data-command');
74
96
  if (value) {
75
97
  if (/[\s\d\W]/.test(value) && !/^['"].*['"]$/.test(value)) {
76
98
  value = `"${value}"`;
77
99
  }
78
- const newNode = domUtils.createElement('SPAN', { style: 'font-family: ' + value + ';' });
79
- this.format.applyTextStyle(newNode, ['font-family'], null, null);
100
+
101
+ // before event
102
+ if ((await this.triggerEvent('onFontActionBefore', { value })) === false) return;
103
+
104
+ const newNode = dom.utils.createElement('SPAN', { style: 'font-family: ' + value + ';' });
105
+ this.format.applyInlineElement(newNode, { stylesToModify: ['font-family'], nodesToRemove: null, strictRemove: null });
80
106
  } else {
81
- this.format.applyTextStyle(null, ['font-family'], ['span'], true);
107
+ this.format.applyInlineElement(null, { stylesToModify: ['font-family'], nodesToRemove: ['span'], strictRemove: true });
82
108
  }
83
109
 
84
110
  this.menu.dropdownOff();
85
- },
86
-
87
- constructor: Font
88
- };
111
+ }
112
+ }
89
113
 
90
114
  function CreateHTML({ lang }, fontList) {
91
115
  let list = /*html*/ `
92
116
  <div class="se-list-inner">
93
117
  <ul class="se-list-basic">
94
118
  <li>
95
- <button type="button" class="se-btn se-btn-list default_value" title="${lang.default}" aria-label="${lang.default}">(${lang.default})</button>
119
+ <button type="button" class="se-btn se-btn-list default_value" data-command="" title="${lang.default}" aria-label="${lang.default}">(${lang.default})</button>
96
120
  </li>`;
97
121
 
98
122
  for (let i = 0, len = fontList.length, font, text; i < len; i++) {
@@ -107,7 +131,7 @@ function CreateHTML({ lang }, fontList) {
107
131
  </ul>
108
132
  </div>`;
109
133
 
110
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-font-family' }, list);
134
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-font-family' }, list);
111
135
  }
112
136
 
113
137
  export default Font;
@@ -1,73 +1,105 @@
1
1
  import EditorInjector from '../../editorInjector';
2
2
  import ColorPicker from '../../modules/ColorPicker';
3
- import { domUtils } from '../../helper';
3
+ import { dom } from '../../helper';
4
4
 
5
- const FontColor = function (editor, pluginOptions) {
6
- EditorInjector.call(this, editor);
7
- // plugin basic properties
8
- this.title = this.lang.fontColor;
9
- this.icon = 'font_color';
5
+ /**
6
+ * @class
7
+ * @description Font color plugin
8
+ */
9
+ class FontColor extends EditorInjector {
10
+ static key = 'fontColor';
11
+ static type = 'dropdown-free';
12
+ static className = '';
10
13
 
11
- // create HTML
12
- const menu = CreateHTML();
14
+ /**
15
+ * @constructor
16
+ * @param {__se__EditorCore} editor - The root editor instance
17
+ * @param {Object} pluginOptions
18
+ * @param {Array<string|{value: string, name: string}>} pluginOptions.items - Color list
19
+ * @param {number} pluginOptions.splitNum - Number of colors per line
20
+ * @param {boolean} pluginOptions.disableHEXInput - Disable HEX input
21
+ */
22
+ constructor(editor, pluginOptions) {
23
+ super(editor);
24
+ // plugin basic properties
25
+ this.title = this.lang.fontColor;
26
+ this.icon = 'font_color';
13
27
 
14
- // members
15
- this.colorPicker = new ColorPicker(this, 'color', {
16
- colorList: pluginOptions.items,
17
- splitNum: pluginOptions.splitNum,
18
- disableHEXInput: pluginOptions.disableHEXInput,
19
- hueSliderOptions: { controllerOptions: { parents: [menu], isOutsideForm: true } }
20
- });
28
+ // create HTML
29
+ const menu = CreateHTML();
21
30
 
22
- // itit
23
- menu.appendChild(this.colorPicker.target);
24
- this.menu.initDropdownTarget(FontColor, menu);
25
- };
31
+ // members
32
+ this.colorPicker = new ColorPicker(this, 'color', {
33
+ colorList: pluginOptions.items,
34
+ splitNum: pluginOptions.splitNum,
35
+ disableHEXInput: pluginOptions.disableHEXInput,
36
+ hueSliderOptions: { controllerOptions: { parents: [menu], isOutsideForm: true } }
37
+ });
38
+
39
+ // itit
40
+ menu.appendChild(this.colorPicker.target);
41
+ this.menu.initDropdownTarget(FontColor, menu);
42
+ }
26
43
 
27
- FontColor.key = 'fontColor';
28
- FontColor.type = 'dropdown-free';
29
- FontColor.className = '';
30
- FontColor.prototype = {
31
44
  /**
32
- * @override dropdown
45
+ * @editorMethod Editor.EventManager
46
+ * @description Executes the method that is called whenever the cursor position changes.
47
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
48
+ * @param {?HTMLElement=} target - The plugin's toolbar button element
49
+ * @returns {boolean} - Whether the plugin is active
33
50
  */
34
- on(target) {
35
- this.colorPicker.init(this.selection.getNode(), target);
36
- },
51
+ active(element, target) {
52
+ /** @type {HTMLElement} */
53
+ const colorHelper = target.querySelector('.se-svg-color-helper');
54
+ if (!colorHelper) return false;
55
+
56
+ if (!element) {
57
+ colorHelper.style.color = '';
58
+ } else if (element?.style.color.length > 0) {
59
+ colorHelper.style.color = element.style.color;
60
+ return true;
61
+ }
62
+
63
+ return false;
64
+ }
37
65
 
38
66
  /**
39
- * @Override dropdown
67
+ * @editorMethod Modules.Dropdown
68
+ * @description Executes the method that is called when a plugin's dropdown menu is opened.
69
+ * @param {HTMLElement} target Line element at the current cursor position
40
70
  */
41
- onDropdownClose() {
42
- this.colorPicker.hueSliderClose();
43
- },
71
+ on(target) {
72
+ this.colorPicker.init(this.selection.getNode(), target);
73
+ }
44
74
 
45
75
  /**
46
- * @override ColorPicker
76
+ * @editorMethod Modules.Dropdown
77
+ * @Override Executes the method that is called when a plugin's dropdown menu is closed.
47
78
  */
48
- colorPickerAction(value) {
49
- this.action(value);
50
- },
79
+ off() {
80
+ this.colorPicker.hueSliderClose();
81
+ }
51
82
 
52
83
  /**
53
- * @override core
84
+ * @editorMethod Modules.ColorPicker
85
+ * @description Executes the method called when a button of "ColorPicker" module is clicked.
86
+ * - This plugin is by applying the "ColorPicker" module globally to the "dropdown" menu, the default "action" method is not called.
87
+ * @param {string} color - Color code (hex)
54
88
  */
55
- action(value) {
56
- if (value) {
57
- const newNode = domUtils.createElement('SPAN', { style: 'color: ' + value + ';' });
58
- this.format.applyTextStyle(newNode, ['color'], null, null);
89
+ colorPickerAction(color) {
90
+ if (color) {
91
+ const newNode = dom.utils.createElement('SPAN', { style: 'color: ' + color + ';' });
92
+ this.format.applyInlineElement(newNode, { stylesToModify: ['color'], nodesToRemove: null, strictRemove: null });
59
93
  } else {
60
- this.format.applyTextStyle(null, ['color'], ['span'], true);
94
+ this.format.applyInlineElement(null, { stylesToModify: ['color'], nodesToRemove: ['span'], strictRemove: true });
61
95
  }
62
96
 
63
97
  this.menu.dropdownOff();
64
- },
65
-
66
- constructor: FontColor
67
- };
98
+ }
99
+ }
68
100
 
69
101
  function CreateHTML() {
70
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
102
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
71
103
  }
72
104
 
73
105
  export default FontColor;
@@ -1,50 +1,78 @@
1
1
  import EditorInjector from '../../editorInjector';
2
- import { domUtils } from '../../helper';
2
+ import { dom } from '../../helper';
3
+
4
+ const HEADER_KEYCODE = new Map([
5
+ ['Digit1', 'h1'],
6
+ ['Digit2', 'h2'],
7
+ ['Digit3', 'h3'],
8
+ ['Digit4', 'h4'],
9
+ ['Digit5', 'h5'],
10
+ ['Digit6', 'h6']
11
+ ]);
12
+
13
+ /**
14
+ * @typedef {import('../../core/class/shortcuts').ShortcutInfo} ShortcutInfo
15
+ */
16
+
17
+ /**
18
+ * @class
19
+ * @description FormatBlock Plugin (P, BLOCKQUOTE, PRE, H1, H2...)
20
+ */
21
+ class FormatBlock extends EditorInjector {
22
+ static key = 'formatBlock';
23
+ static type = 'dropdown';
24
+ static className = 'se-btn-select se-btn-tool-format';
3
25
 
4
- const FormatBlock = function (editor, pluginOptions) {
5
- EditorInjector.call(this, editor);
6
- // plugin basic properties
7
- this.title = this.lang.formats;
8
- this.inner = '<span class="se-txt">' + this.lang.formats + '</span>' + this.icons.arrow_down;
26
+ /**
27
+ * @constructor
28
+ * @param {__se__EditorCore} editor - The root editor instance
29
+ * @param {Object} pluginOptions
30
+ * @param {Array<string>} pluginOptions.items - Format list
31
+ */
32
+ constructor(editor, pluginOptions) {
33
+ super(editor);
34
+ // plugin basic properties
35
+ this.title = this.lang.formats;
36
+ this.inner = '<span class="se-txt">' + this.lang.formats + '</span>' + this.icons.arrow_down;
9
37
 
10
- // create HTML
11
- const menu = CreateHTML(editor, pluginOptions.items);
38
+ // create HTML
39
+ const menu = CreateHTML(editor, pluginOptions.items);
12
40
 
13
- // members
14
- this.formatList = menu.querySelectorAll('li button');
15
- this.currentFormat = '';
41
+ // members
42
+ this.formatList = menu.querySelectorAll('li button');
43
+ this.currentFormat = '';
16
44
 
17
- // init
18
- this.menu.initDropdownTarget(FormatBlock, menu);
19
- };
45
+ // init
46
+ this.menu.initDropdownTarget(FormatBlock, menu);
47
+ }
20
48
 
21
- FormatBlock.key = 'formatBlock';
22
- FormatBlock.type = 'dropdown';
23
- FormatBlock.className = 'se-btn-select se-btn-tool-format';
24
- FormatBlock.prototype = {
25
49
  /**
26
- * @override core
50
+ * @editorMethod Editor.EventManager
51
+ * @description Executes the method that is called whenever the cursor position changes.
52
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
53
+ * @param {?HTMLElement=} target - The plugin's toolbar button element
54
+ * @returns {boolean} - Whether the plugin is active
27
55
  */
28
56
  active(element, target) {
29
57
  let formatTitle = this.lang.formats;
30
58
  const targetText = target.querySelector('.se-txt');
31
59
 
32
60
  if (!element) {
33
- domUtils.changeTxt(targetText, formatTitle);
61
+ dom.utils.changeTxt(targetText, formatTitle);
34
62
  } else if (this.format.isLine(element)) {
35
63
  const formatList = this.formatList;
36
64
  const nodeName = element.nodeName.toLowerCase();
37
65
  const className = (element.className.match(/(\s|^)__se__format__[^\s]+/) || [''])[0].trim();
38
66
 
39
67
  for (let i = 0, len = formatList.length, f; i < len; i++) {
40
- f = formatList[i];
68
+ f = /** @type {HTMLButtonElement} */ (formatList[i]);
41
69
  if (nodeName === f.getAttribute('data-value') && className === f.getAttribute('data-class')) {
42
70
  formatTitle = f.title;
43
71
  break;
44
72
  }
45
73
  }
46
74
 
47
- domUtils.changeTxt(targetText, formatTitle);
75
+ dom.utils.changeTxt(targetText, formatTitle);
48
76
  targetText.setAttribute('data-value', nodeName);
49
77
  targetText.setAttribute('data-class', className);
50
78
 
@@ -52,10 +80,12 @@ FormatBlock.prototype = {
52
80
  }
53
81
 
54
82
  return false;
55
- },
83
+ }
56
84
 
57
85
  /**
58
- * @override dropdown
86
+ * @editorMethod Modules.Dropdown
87
+ * @description Executes the method that is called when a plugin's dropdown menu is opened.
88
+ * @param {HTMLElement} target Line element at the current cursor position
59
89
  */
60
90
  on(target) {
61
91
  const formatList = this.formatList;
@@ -66,19 +96,21 @@ FormatBlock.prototype = {
66
96
  for (let i = 0, len = formatList.length, f; i < len; i++) {
67
97
  f = formatList[i];
68
98
  if (currentFormat === f.getAttribute('data-value') + f.getAttribute('data-class')) {
69
- domUtils.addClass(f, 'active');
99
+ dom.utils.addClass(f, 'active');
70
100
  } else {
71
- domUtils.removeClass(f, 'active');
101
+ dom.utils.removeClass(f, 'active');
72
102
  }
73
103
  }
74
104
 
75
105
  this.currentFormat = currentFormat;
76
106
  }
77
- },
107
+ }
78
108
 
79
109
  /**
80
- * @override core
81
- * @param {Element} target Target command button
110
+ * @editorMethod Editor.core
111
+ * @description Executes the main execution method of the plugin.
112
+ * - Called when an item in the "dropdown" menu is clicked.
113
+ * @param {HTMLElement} target - The plugin's toolbar button element
82
114
  */
83
115
  action(target) {
84
116
  // "line"|"br-line"|"block"
@@ -93,10 +125,19 @@ FormatBlock.prototype = {
93
125
  }
94
126
 
95
127
  this.menu.dropdownOff();
96
- },
128
+ }
97
129
 
98
- constructor: FormatBlock
99
- };
130
+ /**
131
+ * @description Create a header tag, call by "shortcut" class
132
+ * - (e.g. shortcuts._h1: ['c+s+49+p~formatBlock.createHeader', ''])
133
+ * @param {ShortcutInfo} params - Information of the shortcut
134
+ */
135
+ createHeader({ keyCode }) {
136
+ const headerName = HEADER_KEYCODE.get(keyCode);
137
+ const tag = dom.utils.createElement(headerName);
138
+ this.format.setLine(tag);
139
+ }
140
+ }
100
141
 
101
142
  function CreateHTML({ lang }, items) {
102
143
  const defaultFormats = ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
@@ -135,7 +176,7 @@ function CreateHTML({ lang }, items) {
135
176
  </ul>
136
177
  </div>`;
137
178
 
138
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
179
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
139
180
  }
140
181
 
141
182
  export default FormatBlock;