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
@@ -1,90 +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';
13
27
 
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
- });
28
+ // create HTML
29
+ const menu = CreateHTML();
21
30
 
22
- // itit
23
- menu.appendChild(this.colorPicker.target);
24
- this.menu.initDropdownTarget(BackgroundColor, menu);
25
- };
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
+ }
26
43
 
27
- BackgroundColor.key = 'backgroundColor';
28
- BackgroundColor.type = 'dropdown-free';
29
- BackgroundColor.className = '';
30
- BackgroundColor.prototype = {
31
44
  /**
32
- * @override core
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
51
  active(element, target) {
35
- const colorHelper = target.querySelector('.se-svg-color-helper');
52
+ const colorHelper = /** @type {SVGPathElement} */ (target.querySelector('path.se-svg-color-helper'));
36
53
  if (!colorHelper) return false;
37
54
 
38
55
  if (!element) {
39
56
  colorHelper.style.color = '';
40
- } else if (element?.style.backgroundColor.length > 0) {
57
+ } else if (element.style.backgroundColor.length > 0) {
41
58
  colorHelper.style.color = element.style.backgroundColor;
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
  this.colorPicker.init(this.selection.getNode(), target);
53
- },
72
+ }
54
73
 
55
74
  /**
56
- * @Override dropdown
75
+ * @editorMethod Modules.Dropdown
76
+ * @description Executes the method that is called when a plugin's "dropdown" menu is closed.
57
77
  */
58
78
  off() {
59
79
  this.colorPicker.hueSliderClose();
60
- },
61
-
62
- /**
63
- * @override ColorPicker
64
- */
65
- colorPickerAction(value) {
66
- this.action(value);
67
- },
80
+ }
68
81
 
69
82
  /**
70
- * @override core
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)
71
87
  */
72
- action(value) {
73
- if (value) {
74
- const newNode = domUtils.createElement('SPAN', { style: 'background-color: ' + value + ';' });
75
- 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 });
76
92
  } else {
77
- this.format.applyTextStyle(null, ['background-color'], ['span'], true);
93
+ this.format.applyInlineElement(null, { stylesToModify: ['background-color'], nodesToRemove: ['span'], strictRemove: true });
78
94
  }
79
95
 
80
96
  this.menu.dropdownOff();
81
- },
82
-
83
- constructor: BackgroundColor
84
- };
97
+ }
98
+ }
85
99
 
86
100
  function CreateHTML() {
87
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
101
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
88
102
  }
89
103
 
90
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,37 +1,55 @@
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 core
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
51
  active(element, target) {
52
+ /** @type {HTMLElement} */
35
53
  const colorHelper = target.querySelector('.se-svg-color-helper');
36
54
  if (!colorHelper) return false;
37
55
 
@@ -43,48 +61,45 @@ FontColor.prototype = {
43
61
  }
44
62
 
45
63
  return false;
46
- },
64
+ }
47
65
 
48
66
  /**
49
- * @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
50
70
  */
51
71
  on(target) {
52
72
  this.colorPicker.init(this.selection.getNode(), target);
53
- },
73
+ }
54
74
 
55
75
  /**
56
- * @Override dropdown
76
+ * @editorMethod Modules.Dropdown
77
+ * @Override Executes the method that is called when a plugin's dropdown menu is closed.
57
78
  */
58
- onDropdownClose() {
79
+ off() {
59
80
  this.colorPicker.hueSliderClose();
60
- },
61
-
62
- /**
63
- * @override ColorPicker
64
- */
65
- colorPickerAction(value) {
66
- this.action(value);
67
- },
81
+ }
68
82
 
69
83
  /**
70
- * @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)
71
88
  */
72
- action(value) {
73
- if (value) {
74
- const newNode = domUtils.createElement('SPAN', { style: 'color: ' + value + ';' });
75
- 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 });
76
93
  } else {
77
- this.format.applyTextStyle(null, ['color'], ['span'], true);
94
+ this.format.applyInlineElement(null, { stylesToModify: ['color'], nodesToRemove: ['span'], strictRemove: true });
78
95
  }
79
96
 
80
97
  this.menu.dropdownOff();
81
- },
82
-
83
- constructor: FontColor
84
- };
98
+ }
99
+ }
85
100
 
86
101
  function CreateHTML() {
87
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
102
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, null);
88
103
  }
89
104
 
90
105
  export default FontColor;
@@ -1,50 +1,74 @@
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
+ * @class
15
+ * @description FormatBlock Plugin (P, BLOCKQUOTE, PRE, H1, H2...)
16
+ */
17
+ class FormatBlock extends EditorInjector {
18
+ static key = 'formatBlock';
19
+ static type = 'dropdown';
20
+ static className = 'se-btn-select se-btn-tool-format';
3
21
 
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;
22
+ /**
23
+ * @constructor
24
+ * @param {__se__EditorCore} editor - The root editor instance
25
+ * @param {Object} pluginOptions
26
+ * @param {Array<string>} pluginOptions.items - Format list
27
+ */
28
+ constructor(editor, pluginOptions) {
29
+ super(editor);
30
+ // plugin basic properties
31
+ this.title = this.lang.formats;
32
+ this.inner = '<span class="se-txt">' + this.lang.formats + '</span>' + this.icons.arrow_down;
9
33
 
10
- // create HTML
11
- const menu = CreateHTML(editor, pluginOptions.items);
34
+ // create HTML
35
+ const menu = CreateHTML(editor, pluginOptions.items);
12
36
 
13
- // members
14
- this.formatList = menu.querySelectorAll('li button');
15
- this.currentFormat = '';
37
+ // members
38
+ this.formatList = menu.querySelectorAll('li button');
39
+ this.currentFormat = '';
16
40
 
17
- // init
18
- this.menu.initDropdownTarget(FormatBlock, menu);
19
- };
41
+ // init
42
+ this.menu.initDropdownTarget(FormatBlock, menu);
43
+ }
20
44
 
21
- FormatBlock.key = 'formatBlock';
22
- FormatBlock.type = 'dropdown';
23
- FormatBlock.className = 'se-btn-select se-btn-tool-format';
24
- FormatBlock.prototype = {
25
45
  /**
26
- * @override core
46
+ * @editorMethod Editor.EventManager
47
+ * @description Executes the method that is called whenever the cursor position changes.
48
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
49
+ * @param {?HTMLElement=} target - The plugin's toolbar button element
50
+ * @returns {boolean} - Whether the plugin is active
27
51
  */
28
52
  active(element, target) {
29
53
  let formatTitle = this.lang.formats;
30
54
  const targetText = target.querySelector('.se-txt');
31
55
 
32
56
  if (!element) {
33
- domUtils.changeTxt(targetText, formatTitle);
57
+ dom.utils.changeTxt(targetText, formatTitle);
34
58
  } else if (this.format.isLine(element)) {
35
59
  const formatList = this.formatList;
36
60
  const nodeName = element.nodeName.toLowerCase();
37
61
  const className = (element.className.match(/(\s|^)__se__format__[^\s]+/) || [''])[0].trim();
38
62
 
39
63
  for (let i = 0, len = formatList.length, f; i < len; i++) {
40
- f = formatList[i];
64
+ f = /** @type {HTMLButtonElement} */ (formatList[i]);
41
65
  if (nodeName === f.getAttribute('data-value') && className === f.getAttribute('data-class')) {
42
66
  formatTitle = f.title;
43
67
  break;
44
68
  }
45
69
  }
46
70
 
47
- domUtils.changeTxt(targetText, formatTitle);
71
+ dom.utils.changeTxt(targetText, formatTitle);
48
72
  targetText.setAttribute('data-value', nodeName);
49
73
  targetText.setAttribute('data-class', className);
50
74
 
@@ -52,10 +76,12 @@ FormatBlock.prototype = {
52
76
  }
53
77
 
54
78
  return false;
55
- },
79
+ }
56
80
 
57
81
  /**
58
- * @override dropdown
82
+ * @editorMethod Modules.Dropdown
83
+ * @description Executes the method that is called when a plugin's dropdown menu is opened.
84
+ * @param {HTMLElement} target Line element at the current cursor position
59
85
  */
60
86
  on(target) {
61
87
  const formatList = this.formatList;
@@ -66,19 +92,21 @@ FormatBlock.prototype = {
66
92
  for (let i = 0, len = formatList.length, f; i < len; i++) {
67
93
  f = formatList[i];
68
94
  if (currentFormat === f.getAttribute('data-value') + f.getAttribute('data-class')) {
69
- domUtils.addClass(f, 'active');
95
+ dom.utils.addClass(f, 'active');
70
96
  } else {
71
- domUtils.removeClass(f, 'active');
97
+ dom.utils.removeClass(f, 'active');
72
98
  }
73
99
  }
74
100
 
75
101
  this.currentFormat = currentFormat;
76
102
  }
77
- },
103
+ }
78
104
 
79
105
  /**
80
- * @override core
81
- * @param {Element} target Target command button
106
+ * @editorMethod Editor.core
107
+ * @description Executes the main execution method of the plugin.
108
+ * - Called when an item in the "dropdown" menu is clicked.
109
+ * @param {HTMLElement} target - The plugin's toolbar button element
82
110
  */
83
111
  action(target) {
84
112
  // "line"|"br-line"|"block"
@@ -93,10 +121,19 @@ FormatBlock.prototype = {
93
121
  }
94
122
 
95
123
  this.menu.dropdownOff();
96
- },
124
+ }
97
125
 
98
- constructor: FormatBlock
99
- };
126
+ /**
127
+ * @description Create a header tag, call by "shortcut" class
128
+ * - (e.g. shortcuts._h1: ['c+s+49+p~formatBlock.createHeader', ''])
129
+ * @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
130
+ */
131
+ createHeader({ keyCode }) {
132
+ const headerName = HEADER_KEYCODE.get(keyCode);
133
+ const tag = dom.utils.createElement(headerName);
134
+ this.format.setLine(tag);
135
+ }
136
+ }
100
137
 
101
138
  function CreateHTML({ lang }, items) {
102
139
  const defaultFormats = ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
@@ -135,7 +172,7 @@ function CreateHTML({ lang }, items) {
135
172
  </ul>
136
173
  </div>`;
137
174
 
138
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
175
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
139
176
  }
140
177
 
141
178
  export default FormatBlock;