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,48 +1,66 @@
1
1
  import EditorInjector from '../../editorInjector';
2
- import { domUtils } from '../../helper';
2
+ import { dom } from '../../helper';
3
3
 
4
4
  const DEFAULT_TYPE = 'disc';
5
5
 
6
- const List_bulleted = function (editor) {
7
- // plugin bisic properties
8
- EditorInjector.call(this, editor);
9
- this.title = this.lang.bulletedList;
10
- this.icon = 'list_bulleted';
11
- this.afterButton = domUtils.createElement(
12
- 'button',
13
- { class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': List_bulleted.key, 'data-type': 'dropdown' },
14
- `${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.bulletedList}</span></span>`
15
- );
16
-
17
- // create HTML
18
- const menu = CreateHTML();
19
-
20
- // members
21
- this.listItems = menu.querySelectorAll('li button ul');
22
-
23
- // init
24
- this.menu.initDropdownTarget({ key: List_bulleted.key, type: 'dropdown' }, menu);
25
- };
26
-
27
- List_bulleted.key = 'list_bulleted';
28
- List_bulleted.type = 'command';
29
- List_bulleted.className = 'se-icon-flip-rtl';
30
- List_bulleted.prototype = {
6
+ /**
7
+ * @typedef {import('../../core/class/shortcuts').ShortcutInfo} ShortcutInfo
8
+ */
9
+
10
+ /**
11
+ * @class
12
+ * @description List bulleted plugin, Several types of lists are provided.
13
+ */
14
+ class List_bulleted extends EditorInjector {
15
+ static key = 'list_bulleted';
16
+ static type = 'command';
17
+ static className = 'se-icon-flip-rtl';
18
+
31
19
  /**
32
- * @override core
20
+ * @constructor
21
+ * @param {__se__EditorCore} editor - The root editor instance
22
+ */
23
+ constructor(editor) {
24
+ // plugin bisic properties
25
+ super(editor);
26
+ this.title = this.lang.bulletedList;
27
+ this.icon = 'list_bulleted';
28
+ this.afterItem = dom.utils.createElement(
29
+ 'button',
30
+ { class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': List_bulleted.key, 'data-type': 'dropdown' },
31
+ `${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.bulletedList}</span></span>`
32
+ );
33
+
34
+ // create HTML
35
+ const menu = CreateHTML();
36
+
37
+ // members
38
+ this.listItems = menu.querySelectorAll('li button ul');
39
+
40
+ // init
41
+ this.menu.initDropdownTarget({ key: List_bulleted.key, type: 'dropdown' }, 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
33
50
  */
34
51
  active(element, target) {
35
- if (domUtils.isListCell(element) && /^UL$/i.test(element.parentElement.nodeName)) {
36
- domUtils.addClass(target, 'active');
52
+ if (dom.check.isListCell(element) && /^UL$/i.test(element.parentElement.nodeName)) {
53
+ dom.utils.addClass(target, 'active');
37
54
  return true;
38
55
  }
39
56
 
40
- domUtils.removeClass(target, 'active');
57
+ dom.utils.removeClass(target, 'active');
41
58
  return false;
42
- },
59
+ }
43
60
 
44
61
  /**
45
- * @override dropdown
62
+ * @editorMethod Modules.Dropdown
63
+ * @description Executes the method that is called when a plugin's dropdown menu is opened.
46
64
  */
47
65
  on() {
48
66
  const list = this.listItems;
@@ -50,37 +68,65 @@ List_bulleted.prototype = {
50
68
  const type = el?.style ? el.style.listStyleType || DEFAULT_TYPE : '';
51
69
 
52
70
  for (let i = 0, len = list.length, l; i < len; i++) {
53
- l = list[i];
71
+ l = /** @type {HTMLElement} */ (list[i]);
54
72
  if (type === l.style.listStyleType) {
55
- domUtils.addClass(l.parentElement, 'active');
73
+ dom.utils.addClass(l.parentElement, 'active');
56
74
  } else {
57
- domUtils.removeClass(l.parentElement, 'active');
75
+ dom.utils.removeClass(l.parentElement, 'active');
58
76
  }
59
77
  }
60
- },
78
+ }
61
79
 
62
80
  /**
63
- * @override core
64
- * @param {Element|null} target Target command button
81
+ * @editorMethod Editor.core
82
+ * @description Executes the main execution method of the plugin.
83
+ * - Called when an item in the "dropdown" menu is clicked.
84
+ * @param {HTMLElement} target - The plugin's toolbar button element
65
85
  */
66
86
  action(target) {
67
87
  const el = this.format.getBlock(this.selection.getNode());
68
- const type = target?.querySelector('ul')?.style.listStyleType || '';
88
+ const type = target?.querySelector('ul')?.style.listStyleType;
69
89
 
70
- if (domUtils.isList(el) && type) {
90
+ if (dom.check.isList(el) && type) {
71
91
  el.style.listStyleType = type;
72
92
  } else {
73
- const range = this.format.applyList(`ul:${type}`, null, false);
74
- if (range) this.selection.setRange(range.sc, range.so, range.ec, range.eo);
93
+ this.submit(type);
75
94
  }
76
95
 
77
96
  this.menu.dropdownOff();
97
+ }
98
+
99
+ /**
100
+ * @editorMethod Editor.core
101
+ * @description Executes methods called by shortcut keys.
102
+ * @param {Object} params - Information of the "shortcut" plugin
103
+ * @param {Range} params.range - Range object
104
+ * @param {HTMLElement} params.line - The line element of the current range
105
+ * @param {ShortcutInfo} params.info - Information of the shortcut
106
+ * @param {KeyboardEvent} params.event - Key event object
107
+ * @param {string} params.keyCode - KeyBoardEvent.code
108
+ * @param {__se__EditorCore} params.editor - The root editor instance
109
+ */
110
+ shortcut({ range, info }) {
111
+ const { startContainer } = range;
112
+ if (dom.check.isText(startContainer)) {
113
+ const newText = startContainer.substringData(info.key.length, startContainer.textContent.length - 1);
114
+ startContainer.textContent = newText;
115
+ }
116
+ this.submit();
117
+ }
118
+
119
+ /**
120
+ * @description Add a bulleted list
121
+ * @param {string} [type=""] List type
122
+ */
123
+ submit(type) {
124
+ const range = this.format.applyList(`ul:${type || ''}`, null, false);
125
+ if (range) this.selection.setRange(range.sc, range.so, range.ec, range.eo);
78
126
  this.editor.focus();
79
127
  this.history.push(false);
80
- },
81
-
82
- constructor: List_bulleted
83
- };
128
+ }
129
+ }
84
130
 
85
131
  function CreateHTML() {
86
132
  const html = /*html*/ `
@@ -90,7 +136,7 @@ function CreateHTML() {
90
136
  </ul>
91
137
  </div>`;
92
138
 
93
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, html);
139
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, html);
94
140
  }
95
141
 
96
142
  function _CreateLI(types) {
@@ -1,48 +1,66 @@
1
1
  import EditorInjector from '../../editorInjector';
2
- import { domUtils } from '../../helper';
2
+ import { dom } from '../../helper';
3
3
 
4
4
  const DEFAULT_TYPE = 'decimal';
5
5
 
6
- const List_numbered = function (editor) {
7
- // plugin bisic properties
8
- EditorInjector.call(this, editor);
9
- this.title = this.lang.numberedList;
10
- this.icon = 'list_numbered';
11
- this.afterButton = domUtils.createElement(
12
- 'button',
13
- { class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': List_numbered.key, 'data-type': 'dropdown' },
14
- `${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.numberedList}</span></span>`
15
- );
16
-
17
- // create HTML
18
- const menu = CreateHTML();
19
-
20
- // members
21
- this.listItems = menu.querySelectorAll('li button ol');
22
-
23
- // init
24
- this.menu.initDropdownTarget({ key: List_numbered.key, type: 'dropdown' }, menu);
25
- };
26
-
27
- List_numbered.key = 'list_numbered';
28
- List_numbered.type = 'command';
29
- List_numbered.className = 'se-icon-flip-rtl';
30
- List_numbered.prototype = {
6
+ /**
7
+ * @typedef {import('../../core/class/shortcuts').ShortcutInfo} ShortcutInfo
8
+ */
9
+
10
+ /**
11
+ * @class
12
+ * @description List numbered plugin, Several types of lists are provided.
13
+ */
14
+ class List_numbered extends EditorInjector {
15
+ static key = 'list_numbered';
16
+ static type = 'command';
17
+ static className = 'se-icon-flip-rtl';
18
+
31
19
  /**
32
- * @override core
20
+ * @constructor
21
+ * @param {__se__EditorCore} editor - The root editor instance
22
+ */
23
+ constructor(editor) {
24
+ // plugin bisic properties
25
+ super(editor);
26
+ this.title = this.lang.numberedList;
27
+ this.icon = 'list_numbered';
28
+ this.afterItem = dom.utils.createElement(
29
+ 'button',
30
+ { class: 'se-btn se-tooltip se-sub-arrow-btn', 'data-command': List_numbered.key, 'data-type': 'dropdown' },
31
+ `${this.icons.arrow_down}<span class="se-tooltip-inner"><span class="se-tooltip-text">${this.lang.numberedList}</span></span>`
32
+ );
33
+
34
+ // create HTML
35
+ const menu = CreateHTML();
36
+
37
+ // members
38
+ this.listItems = menu.querySelectorAll('li button ol');
39
+
40
+ // init
41
+ this.menu.initDropdownTarget({ key: List_numbered.key, type: 'dropdown' }, 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
33
50
  */
34
51
  active(element, target) {
35
- if (domUtils.isListCell(element) && /^OL$/i.test(element.parentElement.nodeName)) {
36
- domUtils.addClass(target, 'active');
52
+ if (dom.check.isListCell(element) && /^OL$/i.test(element.parentElement.nodeName)) {
53
+ dom.utils.addClass(target, 'active');
37
54
  return true;
38
55
  }
39
56
 
40
- domUtils.removeClass(target, 'active');
57
+ dom.utils.removeClass(target, 'active');
41
58
  return false;
42
- },
59
+ }
43
60
 
44
61
  /**
45
- * @override dropdown
62
+ * @editorMethod Modules.Dropdown
63
+ * @description Executes the method that is called when a plugin's dropdown menu is opened.
46
64
  */
47
65
  on() {
48
66
  const list = this.listItems;
@@ -50,37 +68,65 @@ List_numbered.prototype = {
50
68
  const type = el?.style ? el.style.listStyleType || DEFAULT_TYPE : '';
51
69
 
52
70
  for (let i = 0, len = list.length, l; i < len; i++) {
53
- l = list[i];
71
+ l = /** @type {HTMLElement} */ (list[i]);
54
72
  if (type === l.style.listStyleType) {
55
- domUtils.addClass(l.parentElement, 'active');
73
+ dom.utils.addClass(l.parentElement, 'active');
56
74
  } else {
57
- domUtils.removeClass(l.parentElement, 'active');
75
+ dom.utils.removeClass(l.parentElement, 'active');
58
76
  }
59
77
  }
60
- },
78
+ }
61
79
 
62
80
  /**
63
- * @override core
64
- * @param {Element|null} target Target command button
81
+ * @editorMethod Editor.core
82
+ * @description Executes the main execution method of the plugin.
83
+ * - Called when an item in the "dropdown" menu is clicked.
84
+ * @param {HTMLElement} target - The plugin's toolbar button element
65
85
  */
66
86
  action(target) {
67
87
  const el = this.format.getBlock(this.selection.getNode());
68
- const type = target?.querySelector('ol')?.style.listStyleType || '';
88
+ const type = target?.querySelector('ol')?.style.listStyleType;
69
89
 
70
- if (domUtils.isList(el) && type) {
90
+ if (dom.check.isList(el) && type) {
71
91
  el.style.listStyleType = type;
72
92
  } else {
73
- const range = this.format.applyList(`ol:${type}`, null, false);
74
- if (range) this.selection.setRange(range.sc, range.so, range.ec, range.eo);
93
+ this.submit(type);
75
94
  }
76
95
 
77
96
  this.menu.dropdownOff();
97
+ }
98
+
99
+ /**
100
+ * @editorMethod Editor.core
101
+ * @description Executes methods called by shortcut keys.
102
+ * @param {Object} params - Information of the "shortcut" plugin
103
+ * @param {Range} params.range - Range object
104
+ * @param {HTMLElement} params.line - The line element of the current range
105
+ * @param {ShortcutInfo} params.info - Information of the shortcut
106
+ * @param {KeyboardEvent} params.event - Key event object
107
+ * @param {string} params.keyCode - KeyBoardEvent.code
108
+ * @param {Object} params.editor - The root editor instance
109
+ */
110
+ shortcut({ range, info }) {
111
+ const { startContainer } = range;
112
+ if (dom.check.isText(startContainer)) {
113
+ const newText = startContainer.substringData(info.key.length, startContainer.textContent.length - 1);
114
+ startContainer.textContent = newText;
115
+ }
116
+ this.submit();
117
+ }
118
+
119
+ /**
120
+ * @description Add a numbered list
121
+ * @param {string} [type=""] List type
122
+ */
123
+ submit(type) {
124
+ const range = this.format.applyList(`ol:${type || ''}`, null, false);
125
+ if (range) this.selection.setRange(range.sc, range.so, range.ec, range.eo);
78
126
  this.editor.focus();
79
127
  this.history.push(false);
80
- },
81
-
82
- constructor: List_numbered
83
- };
128
+ }
129
+ }
84
130
 
85
131
  function CreateHTML() {
86
132
  const html = /*html*/ `
@@ -93,7 +139,7 @@ function CreateHTML() {
93
139
  </ul>
94
140
  </div>`;
95
141
 
96
- return domUtils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, html);
142
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer' }, html);
97
143
  }
98
144
 
99
145
  function _CreateLI(types) {
@@ -1,60 +1,72 @@
1
1
  import EditorInjector from '../../editorInjector';
2
- import { domUtils } from '../../helper';
3
-
4
- const Align = function (editor, pluginOptions) {
5
- // plugin bisic properties
6
- EditorInjector.call(this, editor);
7
- this.title = this.lang.align;
8
- this.icon = this.options.get('_rtl') ? 'align_right' : 'align_left';
9
-
10
- // create HTML
11
- const menu = CreateHTML(editor, pluginOptions.items);
12
- const commandArea = (this._itemMenu = menu.querySelector('ul'));
13
-
14
- // members
15
- this.defaultDir = editor.options.get('_rtl') ? 'right' : 'left';
16
- this.alignIcons = {
17
- justify: editor.icons.align_justify,
18
- left: editor.icons.align_left,
19
- right: editor.icons.align_right,
20
- center: editor.icons.align_center
21
- };
22
- this.alignList = commandArea.querySelectorAll('li button');
23
-
24
- // init
25
- this.menu.initDropdownTarget(Align, menu);
26
- };
27
-
28
- Align.key = 'align';
29
- Align.type = 'dropdown';
30
- Align.className = '';
31
- Align.prototype = {
2
+ import { dom } from '../../helper';
3
+
4
+ /**
5
+ * @class
6
+ * @description Align plugin
7
+ */
8
+ class Align extends EditorInjector {
9
+ static key = 'align';
10
+ static type = 'dropdown';
11
+ static className = '';
12
+
13
+ /**
14
+ * @param {__se__EditorCore} editor - The root editor instance
15
+ * @param {Object} pluginOptions
16
+ * @param {Array.<"right"|"center"|"left"|"justify">} pluginOptions.items - Align items
17
+ */
18
+ constructor(editor, pluginOptions) {
19
+ super(editor);
20
+ this.title = this.lang.align;
21
+ this.icon = this.options.get('_rtl') ? 'align_right' : 'align_left';
22
+
23
+ // create HTML
24
+ const menu = CreateHTML(editor, pluginOptions.items);
25
+ const commandArea = (this._itemMenu = menu.querySelector('ul'));
26
+
27
+ // members
28
+ this.defaultDir = editor.options.get('_rtl') ? 'right' : 'left';
29
+ this.alignIcons = {
30
+ justify: editor.icons.align_justify,
31
+ left: editor.icons.align_left,
32
+ right: editor.icons.align_right,
33
+ center: editor.icons.align_center
34
+ };
35
+ this.alignList = commandArea.querySelectorAll('li button');
36
+
37
+ // init
38
+ this.menu.initDropdownTarget(Align, menu);
39
+ }
40
+
32
41
  /**
33
- * @override core
34
- * @param {Node} element Selection node.
35
- * @param {Element} target Target button.
36
- * @returns {boolean}
42
+ * @editorMethod Editor.EventManager
43
+ * @description Executes the method that is called whenever the cursor position changes.
44
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
45
+ * @param {?HTMLElement=} target - The plugin's toolbar button element
46
+ * @returns {boolean} - Whether the plugin is active
37
47
  */
38
48
  active(element, target) {
39
49
  const targetChild = target.firstElementChild;
40
50
 
41
51
  if (!element) {
42
- domUtils.changeElement(targetChild, this.alignIcons[this.defaultDir]);
52
+ dom.utils.changeElement(targetChild, this.alignIcons[this.defaultDir]);
43
53
  target.removeAttribute('data-focus');
44
54
  } else if (this.format.isLine(element)) {
45
- const textAlign = element.style.textAlign;
55
+ const textAlign = /** @type {HTMLElement} */ (element).style.textAlign;
46
56
  if (textAlign) {
47
- domUtils.changeElement(targetChild, this.alignIcons[textAlign] || this.alignIcons[this.defaultDir]);
57
+ dom.utils.changeElement(targetChild, this.alignIcons[textAlign] || this.alignIcons[this.defaultDir]);
48
58
  target.setAttribute('data-focus', textAlign);
49
59
  return true;
50
60
  }
51
61
  }
52
62
 
53
63
  return false;
54
- },
64
+ }
55
65
 
56
66
  /**
57
- * @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
58
70
  */
59
71
  on(target) {
60
72
  const currentAlign = target.getAttribute('data-focus') || this.defaultDir;
@@ -63,16 +75,17 @@ Align.prototype = {
63
75
  const alignList = this.alignList;
64
76
  for (let i = 0, len = alignList.length; i < len; i++) {
65
77
  if (currentAlign === alignList[i].getAttribute('data-command')) {
66
- domUtils.addClass(alignList[i], 'active');
78
+ dom.utils.addClass(alignList[i], 'active');
67
79
  } else {
68
- domUtils.removeClass(alignList[i], 'active');
80
+ dom.utils.removeClass(alignList[i], 'active');
69
81
  }
70
82
  }
71
- },
83
+ }
72
84
 
73
85
  /**
74
- * @override core
75
- * @param {"rtl"|"ltr"} dir Direction
86
+ * @editorMethod Editor.core
87
+ * @description Executes the method called when the rtl, ltr mode changes. ("editor.setDir")
88
+ * @param {string} dir Direction ("rtl" or "ltr")
76
89
  */
77
90
  setDir(dir) {
78
91
  const _dir = dir === 'rtl' ? 'right' : 'left';
@@ -87,12 +100,13 @@ Align.prototype = {
87
100
  lp.appendChild(rightBtn);
88
101
  rp.appendChild(leftBtn);
89
102
  }
90
- },
103
+ }
91
104
 
92
105
  /**
93
- * @override core
94
- * @param {Element} target Target command button
95
- * @returns
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
96
110
  */
97
111
  action(target) {
98
112
  const value = target.getAttribute('data-command');
@@ -101,17 +115,15 @@ Align.prototype = {
101
115
  const defaultDir = this.defaultDir;
102
116
  const selectedFormsts = this.format.getLines();
103
117
  for (let i = 0, len = selectedFormsts.length; i < len; i++) {
104
- domUtils.setStyle(selectedFormsts[i], 'textAlign', value === defaultDir ? '' : value);
118
+ dom.utils.setStyle(selectedFormsts[i], 'textAlign', value === defaultDir ? '' : value);
105
119
  }
106
120
 
107
121
  this.editor.effectNode = null;
108
122
  this.menu.dropdownOff();
109
123
  this.editor.focus();
110
124
  this.history.push(false);
111
- },
112
-
113
- constructor: Align
114
- };
125
+ }
126
+ }
115
127
 
116
128
  function CreateHTML({ lang, icons, options }, items) {
117
129
  const alignItems = Array.isArray(items) ? items : options.get('_rtl') ? ['right', 'center', 'left', 'justify'] : ['left', 'center', 'right', 'justify'];
@@ -128,7 +140,7 @@ function CreateHTML({ lang, icons, options }, items) {
128
140
  </li>`;
129
141
  }
130
142
 
131
- return domUtils.createElement(
143
+ return dom.utils.createElement(
132
144
  'div',
133
145
  {
134
146
  class: 'se-dropdown se-list-layer se-list-align'